OSDN Git Service

Fix AIX version number in comment.
[pf3gnuchains/gcc-fork.git] / gcc / c-parser.c
1 /* Parser for C and Objective-C.
2    Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3    1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008
4    Free Software Foundation, Inc.
5
6    Parser actions based on the old Bison parser; structure somewhat
7    influenced by and fragments based on the C++ parser.
8
9 This file is part of GCC.
10
11 GCC is free software; you can redistribute it and/or modify it under
12 the terms of the GNU General Public License as published by the Free
13 Software Foundation; either version 3, or (at your option) any later
14 version.
15
16 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
17 WARRANTY; without even the implied warranty of MERCHANTABILITY or
18 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
19 for more details.
20
21 You should have received a copy of the GNU General Public License
22 along with GCC; see the file COPYING3.  If not see
23 <http://www.gnu.org/licenses/>.  */
24
25 /* TODO:
26
27    Make sure all relevant comments, and all relevant code from all
28    actions, brought over from old parser.  Verify exact correspondence
29    of syntax accepted.
30
31    Add testcases covering every input symbol in every state in old and
32    new parsers.
33
34    Include full syntax for GNU C, including erroneous cases accepted
35    with error messages, in syntax productions in comments.
36
37    Make more diagnostics in the front end generally take an explicit
38    location rather than implicitly using input_location.  */
39
40 #include "config.h"
41 #include "system.h"
42 #include "coretypes.h"
43 #include "tm.h"
44 #include "tree.h"
45 #include "rtl.h"
46 #include "langhooks.h"
47 #include "input.h"
48 #include "cpplib.h"
49 #include "timevar.h"
50 #include "c-pragma.h"
51 #include "c-tree.h"
52 #include "flags.h"
53 #include "output.h"
54 #include "toplev.h"
55 #include "ggc.h"
56 #include "c-common.h"
57 #include "vec.h"
58 #include "target.h"
59 #include "cgraph.h"
60
61 \f
62 /* The reserved keyword table.  */
63 struct resword
64 {
65   const char *word;
66   ENUM_BITFIELD(rid) rid : 16;
67   unsigned int disable   : 16;
68 };
69
70 /* Disable mask.  Keywords are disabled if (reswords[i].disable &
71    mask) is _true_.  */
72 #define D_C89   0x01    /* not in C89 */
73 #define D_EXT   0x02    /* GCC extension */
74 #define D_EXT89 0x04    /* GCC extension incorporated in C99 */
75 #define D_OBJC  0x08    /* Objective C only */
76
77 static const struct resword reswords[] =
78 {
79   { "_Bool",            RID_BOOL,       0 },
80   { "_Complex",         RID_COMPLEX,    0 },
81   { "_Decimal32",       RID_DFLOAT32,  D_EXT },
82   { "_Decimal64",       RID_DFLOAT64,  D_EXT },
83   { "_Decimal128",      RID_DFLOAT128, D_EXT },
84   { "_Fract",           RID_FRACT,     D_EXT },
85   { "_Accum",           RID_ACCUM,     D_EXT },
86   { "_Sat",             RID_SAT,       D_EXT },
87   { "__FUNCTION__",     RID_FUNCTION_NAME, 0 },
88   { "__PRETTY_FUNCTION__", RID_PRETTY_FUNCTION_NAME, 0 },
89   { "__alignof",        RID_ALIGNOF,    0 },
90   { "__alignof__",      RID_ALIGNOF,    0 },
91   { "__asm",            RID_ASM,        0 },
92   { "__asm__",          RID_ASM,        0 },
93   { "__attribute",      RID_ATTRIBUTE,  0 },
94   { "__attribute__",    RID_ATTRIBUTE,  0 },
95   { "__builtin_choose_expr", RID_CHOOSE_EXPR, 0 },
96   { "__builtin_offsetof", RID_OFFSETOF, 0 },
97   { "__builtin_types_compatible_p", RID_TYPES_COMPATIBLE_P, 0 },
98   { "__builtin_va_arg", RID_VA_ARG,     0 },
99   { "__complex",        RID_COMPLEX,    0 },
100   { "__complex__",      RID_COMPLEX,    0 },
101   { "__const",          RID_CONST,      0 },
102   { "__const__",        RID_CONST,      0 },
103   { "__extension__",    RID_EXTENSION,  0 },
104   { "__func__",         RID_C99_FUNCTION_NAME, 0 },
105   { "__imag",           RID_IMAGPART,   0 },
106   { "__imag__",         RID_IMAGPART,   0 },
107   { "__inline",         RID_INLINE,     0 },
108   { "__inline__",       RID_INLINE,     0 },
109   { "__label__",        RID_LABEL,      0 },
110   { "__real",           RID_REALPART,   0 },
111   { "__real__",         RID_REALPART,   0 },
112   { "__restrict",       RID_RESTRICT,   0 },
113   { "__restrict__",     RID_RESTRICT,   0 },
114   { "__signed",         RID_SIGNED,     0 },
115   { "__signed__",       RID_SIGNED,     0 },
116   { "__thread",         RID_THREAD,     0 },
117   { "__typeof",         RID_TYPEOF,     0 },
118   { "__typeof__",       RID_TYPEOF,     0 },
119   { "__volatile",       RID_VOLATILE,   0 },
120   { "__volatile__",     RID_VOLATILE,   0 },
121   { "asm",              RID_ASM,        D_EXT },
122   { "auto",             RID_AUTO,       0 },
123   { "break",            RID_BREAK,      0 },
124   { "case",             RID_CASE,       0 },
125   { "char",             RID_CHAR,       0 },
126   { "const",            RID_CONST,      0 },
127   { "continue",         RID_CONTINUE,   0 },
128   { "default",          RID_DEFAULT,    0 },
129   { "do",               RID_DO,         0 },
130   { "double",           RID_DOUBLE,     0 },
131   { "else",             RID_ELSE,       0 },
132   { "enum",             RID_ENUM,       0 },
133   { "extern",           RID_EXTERN,     0 },
134   { "float",            RID_FLOAT,      0 },
135   { "for",              RID_FOR,        0 },
136   { "goto",             RID_GOTO,       0 },
137   { "if",               RID_IF,         0 },
138   { "inline",           RID_INLINE,     D_EXT89 },
139   { "int",              RID_INT,        0 },
140   { "long",             RID_LONG,       0 },
141   { "register",         RID_REGISTER,   0 },
142   { "restrict",         RID_RESTRICT,   D_C89 },
143   { "return",           RID_RETURN,     0 },
144   { "short",            RID_SHORT,      0 },
145   { "signed",           RID_SIGNED,     0 },
146   { "sizeof",           RID_SIZEOF,     0 },
147   { "static",           RID_STATIC,     0 },
148   { "struct",           RID_STRUCT,     0 },
149   { "switch",           RID_SWITCH,     0 },
150   { "typedef",          RID_TYPEDEF,    0 },
151   { "typeof",           RID_TYPEOF,     D_EXT },
152   { "union",            RID_UNION,      0 },
153   { "unsigned",         RID_UNSIGNED,   0 },
154   { "void",             RID_VOID,       0 },
155   { "volatile",         RID_VOLATILE,   0 },
156   { "while",            RID_WHILE,      0 },
157   /* These Objective-C keywords are recognized only immediately after
158      an '@'.  */
159   { "class",            RID_AT_CLASS,           D_OBJC },
160   { "compatibility_alias", RID_AT_ALIAS,        D_OBJC },
161   { "defs",             RID_AT_DEFS,            D_OBJC },
162   { "encode",           RID_AT_ENCODE,          D_OBJC },
163   { "end",              RID_AT_END,             D_OBJC },
164   { "implementation",   RID_AT_IMPLEMENTATION,  D_OBJC },
165   { "interface",        RID_AT_INTERFACE,       D_OBJC },
166   { "private",          RID_AT_PRIVATE,         D_OBJC },
167   { "protected",        RID_AT_PROTECTED,       D_OBJC },
168   { "protocol",         RID_AT_PROTOCOL,        D_OBJC },
169   { "public",           RID_AT_PUBLIC,          D_OBJC },
170   { "selector",         RID_AT_SELECTOR,        D_OBJC },
171   { "throw",            RID_AT_THROW,           D_OBJC },
172   { "try",              RID_AT_TRY,             D_OBJC },
173   { "catch",            RID_AT_CATCH,           D_OBJC },
174   { "finally",          RID_AT_FINALLY,         D_OBJC },
175   { "synchronized",     RID_AT_SYNCHRONIZED,    D_OBJC },
176   /* These are recognized only in protocol-qualifier context
177      (see above) */
178   { "bycopy",           RID_BYCOPY,             D_OBJC },
179   { "byref",            RID_BYREF,              D_OBJC },
180   { "in",               RID_IN,                 D_OBJC },
181   { "inout",            RID_INOUT,              D_OBJC },
182   { "oneway",           RID_ONEWAY,             D_OBJC },
183   { "out",              RID_OUT,                D_OBJC },
184 };
185 #define N_reswords (sizeof reswords / sizeof (struct resword))
186
187 /* Initialization routine for this file.  */
188
189 void
190 c_parse_init (void)
191 {
192   /* The only initialization required is of the reserved word
193      identifiers.  */
194   unsigned int i;
195   tree id;
196   int mask = (flag_isoc99 ? 0 : D_C89)
197               | (flag_no_asm ? (flag_isoc99 ? D_EXT : D_EXT|D_EXT89) : 0);
198
199   if (!c_dialect_objc ())
200      mask |= D_OBJC;
201
202   ridpointers = GGC_CNEWVEC (tree, (int) RID_MAX);
203   for (i = 0; i < N_reswords; i++)
204     {
205       /* If a keyword is disabled, do not enter it into the table
206          and so create a canonical spelling that isn't a keyword.  */
207       if (reswords[i].disable & mask)
208         continue;
209
210       id = get_identifier (reswords[i].word);
211       C_RID_CODE (id) = reswords[i].rid;
212       C_IS_RESERVED_WORD (id) = 1;
213       ridpointers [(int) reswords[i].rid] = id;
214     }
215 }
216 \f
217 /* The C lexer intermediates between the lexer in cpplib and c-lex.c
218    and the C parser.  Unlike the C++ lexer, the parser structure
219    stores the lexer information instead of using a separate structure.
220    Identifiers are separated into ordinary identifiers, type names,
221    keywords and some other Objective-C types of identifiers, and some
222    look-ahead is maintained.
223
224    ??? It might be a good idea to lex the whole file up front (as for
225    C++).  It would then be possible to share more of the C and C++
226    lexer code, if desired.  */
227
228 /* The following local token type is used.  */
229
230 /* A keyword.  */
231 #define CPP_KEYWORD ((enum cpp_ttype) (N_TTYPES + 1))
232
233 /* More information about the type of a CPP_NAME token.  */
234 typedef enum c_id_kind {
235   /* An ordinary identifier.  */
236   C_ID_ID,
237   /* An identifier declared as a typedef name.  */
238   C_ID_TYPENAME,
239   /* An identifier declared as an Objective-C class name.  */
240   C_ID_CLASSNAME,
241   /* Not an identifier.  */
242   C_ID_NONE
243 } c_id_kind;
244
245 /* A single C token after string literal concatenation and conversion
246    of preprocessing tokens to tokens.  */
247 typedef struct c_token GTY (())
248 {
249   /* The kind of token.  */
250   ENUM_BITFIELD (cpp_ttype) type : 8;
251   /* If this token is a CPP_NAME, this value indicates whether also
252      declared as some kind of type.  Otherwise, it is C_ID_NONE.  */
253   ENUM_BITFIELD (c_id_kind) id_kind : 8;
254   /* If this token is a keyword, this value indicates which keyword.
255      Otherwise, this value is RID_MAX.  */
256   ENUM_BITFIELD (rid) keyword : 8;
257   /* If this token is a CPP_PRAGMA, this indicates the pragma that
258      was seen.  Otherwise it is PRAGMA_NONE.  */
259   ENUM_BITFIELD (pragma_kind) pragma_kind : 7;
260   /* True if this token is from a system header.  */
261   BOOL_BITFIELD in_system_header : 1;
262   /* The value associated with this token, if any.  */
263   tree value;
264   /* The location at which this token was found.  */
265   location_t location;
266 } c_token;
267
268 /* A parser structure recording information about the state and
269    context of parsing.  Includes lexer information with up to two
270    tokens of look-ahead; more are not needed for C.  */
271 typedef struct c_parser GTY(())
272 {
273   /* The look-ahead tokens.  */
274   c_token tokens[2];
275   /* How many look-ahead tokens are available (0, 1 or 2).  */
276   short tokens_avail;
277   /* True if a syntax error is being recovered from; false otherwise.
278      c_parser_error sets this flag.  It should clear this flag when
279      enough tokens have been consumed to recover from the error.  */
280   BOOL_BITFIELD error : 1;
281   /* True if we're processing a pragma, and shouldn't automatically
282      consume CPP_PRAGMA_EOL.  */
283   BOOL_BITFIELD in_pragma : 1;
284   /* True if we're parsing the outermost block of an if statement.  */
285   BOOL_BITFIELD in_if_block : 1;
286   /* True if we want to lex an untranslated string.  */
287   BOOL_BITFIELD lex_untranslated_string : 1;
288   /* Objective-C specific parser/lexer information.  */
289   BOOL_BITFIELD objc_pq_context : 1;
290   /* The following flag is needed to contextualize Objective-C lexical
291      analysis.  In some cases (e.g., 'int NSObject;'), it is
292      undesirable to bind an identifier to an Objective-C class, even
293      if a class with that name exists.  */
294   BOOL_BITFIELD objc_need_raw_identifier : 1;
295 } c_parser;
296
297
298 /* The actual parser and external interface.  ??? Does this need to be
299    garbage-collected?  */
300
301 static GTY (()) c_parser *the_parser;
302
303
304 /* Read in and lex a single token, storing it in *TOKEN.  */
305
306 static void
307 c_lex_one_token (c_parser *parser, c_token *token)
308 {
309   timevar_push (TV_LEX);
310
311   token->type = c_lex_with_flags (&token->value, &token->location, NULL,
312                                   (parser->lex_untranslated_string
313                                    ? C_LEX_STRING_NO_TRANSLATE : 0));
314   token->id_kind = C_ID_NONE;
315   token->keyword = RID_MAX;
316   token->pragma_kind = PRAGMA_NONE;
317   token->in_system_header = in_system_header;
318
319   switch (token->type)
320     {
321     case CPP_NAME:
322       {
323         tree decl;
324
325         bool objc_force_identifier = parser->objc_need_raw_identifier;
326         if (c_dialect_objc ())
327           parser->objc_need_raw_identifier = false;
328
329         if (C_IS_RESERVED_WORD (token->value))
330           {
331             enum rid rid_code = C_RID_CODE (token->value);
332
333             if (c_dialect_objc ())
334               {
335                 if (!OBJC_IS_AT_KEYWORD (rid_code)
336                     && (!OBJC_IS_PQ_KEYWORD (rid_code)
337                         || parser->objc_pq_context))
338                   {
339                     /* Return the canonical spelling for this keyword.  */
340                     token->value = ridpointers[(int) rid_code];
341                     token->type = CPP_KEYWORD;
342                     token->keyword = rid_code;
343                     break;
344                   }
345               }
346             else
347               {
348                 /* Return the canonical spelling for this keyword.  */
349                 token->value = ridpointers[(int) rid_code];
350                 token->type = CPP_KEYWORD;
351                 token->keyword = rid_code;
352                 break;
353               }
354           }
355
356         decl = lookup_name (token->value);
357         if (decl)
358           {
359             if (TREE_CODE (decl) == TYPE_DECL)
360               {
361                 token->id_kind = C_ID_TYPENAME;
362                 break;
363               }
364           }
365         else if (c_dialect_objc ())
366           {
367             tree objc_interface_decl = objc_is_class_name (token->value);
368             /* Objective-C class names are in the same namespace as
369                variables and typedefs, and hence are shadowed by local
370                declarations.  */
371             if (objc_interface_decl
372                 && (global_bindings_p ()
373                     || (!objc_force_identifier && !decl)))
374               {
375                 token->value = objc_interface_decl;
376                 token->id_kind = C_ID_CLASSNAME;
377                 break;
378               }
379           }
380         token->id_kind = C_ID_ID;
381       }
382       break;
383     case CPP_AT_NAME:
384       /* This only happens in Objective-C; it must be a keyword.  */
385       token->type = CPP_KEYWORD;
386       token->keyword = C_RID_CODE (token->value);
387       break;
388     case CPP_COLON:
389     case CPP_COMMA:
390     case CPP_CLOSE_PAREN:
391     case CPP_SEMICOLON:
392       /* These tokens may affect the interpretation of any identifiers
393          following, if doing Objective-C.  */
394       if (c_dialect_objc ())
395         parser->objc_need_raw_identifier = false;
396       break;
397     case CPP_PRAGMA:
398       /* We smuggled the cpp_token->u.pragma value in an INTEGER_CST.  */
399       token->pragma_kind = TREE_INT_CST_LOW (token->value);
400       token->value = NULL;
401       break;
402     default:
403       break;
404     }
405   timevar_pop (TV_LEX);
406 }
407
408 /* Return a pointer to the next token from PARSER, reading it in if
409    necessary.  */
410
411 static inline c_token *
412 c_parser_peek_token (c_parser *parser)
413 {
414   if (parser->tokens_avail == 0)
415     {
416       c_lex_one_token (parser, &parser->tokens[0]);
417       parser->tokens_avail = 1;
418     }
419   return &parser->tokens[0];
420 }
421
422 /* Return true if the next token from PARSER has the indicated
423    TYPE.  */
424
425 static inline bool
426 c_parser_next_token_is (c_parser *parser, enum cpp_ttype type)
427 {
428   return c_parser_peek_token (parser)->type == type;
429 }
430
431 /* Return true if the next token from PARSER does not have the
432    indicated TYPE.  */
433
434 static inline bool
435 c_parser_next_token_is_not (c_parser *parser, enum cpp_ttype type)
436 {
437   return !c_parser_next_token_is (parser, type);
438 }
439
440 /* Return true if the next token from PARSER is the indicated
441    KEYWORD.  */
442
443 static inline bool
444 c_parser_next_token_is_keyword (c_parser *parser, enum rid keyword)
445 {
446   c_token *token;
447
448   /* Peek at the next token.  */
449   token = c_parser_peek_token (parser);
450   /* Check to see if it is the indicated keyword.  */
451   return token->keyword == keyword;
452 }
453
454 /* Return true if TOKEN can start a type name,
455    false otherwise.  */
456 static bool
457 c_token_starts_typename (c_token *token)
458 {
459   switch (token->type)
460     {
461     case CPP_NAME:
462       switch (token->id_kind)
463         {
464         case C_ID_ID:
465           return false;
466         case C_ID_TYPENAME:
467           return true;
468         case C_ID_CLASSNAME:
469           gcc_assert (c_dialect_objc ());
470           return true;
471         default:
472           gcc_unreachable ();
473         }
474     case CPP_KEYWORD:
475       switch (token->keyword)
476         {
477         case RID_UNSIGNED:
478         case RID_LONG:
479         case RID_SHORT:
480         case RID_SIGNED:
481         case RID_COMPLEX:
482         case RID_INT:
483         case RID_CHAR:
484         case RID_FLOAT:
485         case RID_DOUBLE:
486         case RID_VOID:
487         case RID_DFLOAT32:
488         case RID_DFLOAT64:
489         case RID_DFLOAT128:
490         case RID_BOOL:
491         case RID_ENUM:
492         case RID_STRUCT:
493         case RID_UNION:
494         case RID_TYPEOF:
495         case RID_CONST:
496         case RID_VOLATILE:
497         case RID_RESTRICT:
498         case RID_ATTRIBUTE:
499         case RID_FRACT:
500         case RID_ACCUM:
501         case RID_SAT:
502           return true;
503         default:
504           return false;
505         }
506     case CPP_LESS:
507       if (c_dialect_objc ())
508         return true;
509       return false;
510     default:
511       return false;
512     }
513 }
514
515 /* Return true if the next token from PARSER can start a type name,
516    false otherwise.  */
517 static inline bool
518 c_parser_next_token_starts_typename (c_parser *parser)
519 {
520   c_token *token = c_parser_peek_token (parser);
521   return c_token_starts_typename (token);
522 }
523
524 /* Return true if TOKEN can start declaration specifiers, false
525    otherwise.  */
526 static bool
527 c_token_starts_declspecs (c_token *token)
528 {
529   switch (token->type)
530     {
531     case CPP_NAME:
532       switch (token->id_kind)
533         {
534         case C_ID_ID:
535           return false;
536         case C_ID_TYPENAME:
537           return true;
538         case C_ID_CLASSNAME:
539           gcc_assert (c_dialect_objc ());
540           return true;
541         default:
542           gcc_unreachable ();
543         }
544     case CPP_KEYWORD:
545       switch (token->keyword)
546         {
547         case RID_STATIC:
548         case RID_EXTERN:
549         case RID_REGISTER:
550         case RID_TYPEDEF:
551         case RID_INLINE:
552         case RID_AUTO:
553         case RID_THREAD:
554         case RID_UNSIGNED:
555         case RID_LONG:
556         case RID_SHORT:
557         case RID_SIGNED:
558         case RID_COMPLEX:
559         case RID_INT:
560         case RID_CHAR:
561         case RID_FLOAT:
562         case RID_DOUBLE:
563         case RID_VOID:
564         case RID_DFLOAT32:
565         case RID_DFLOAT64:
566         case RID_DFLOAT128:
567         case RID_BOOL:
568         case RID_ENUM:
569         case RID_STRUCT:
570         case RID_UNION:
571         case RID_TYPEOF:
572         case RID_CONST:
573         case RID_VOLATILE:
574         case RID_RESTRICT:
575         case RID_ATTRIBUTE:
576         case RID_FRACT:
577         case RID_ACCUM:
578         case RID_SAT:
579           return true;
580         default:
581           return false;
582         }
583     case CPP_LESS:
584       if (c_dialect_objc ())
585         return true;
586       return false;
587     default:
588       return false;
589     }
590 }
591
592 /* Return true if the next token from PARSER can start declaration
593    specifiers, false otherwise.  */
594 static inline bool
595 c_parser_next_token_starts_declspecs (c_parser *parser)
596 {
597   c_token *token = c_parser_peek_token (parser);
598   return c_token_starts_declspecs (token);
599 }
600
601 /* Return a pointer to the next-but-one token from PARSER, reading it
602    in if necessary.  The next token is already read in.  */
603
604 static c_token *
605 c_parser_peek_2nd_token (c_parser *parser)
606 {
607   if (parser->tokens_avail >= 2)
608     return &parser->tokens[1];
609   gcc_assert (parser->tokens_avail == 1);
610   gcc_assert (parser->tokens[0].type != CPP_EOF);
611   gcc_assert (parser->tokens[0].type != CPP_PRAGMA_EOL);
612   c_lex_one_token (parser, &parser->tokens[1]);
613   parser->tokens_avail = 2;
614   return &parser->tokens[1];
615 }
616
617 /* Consume the next token from PARSER.  */
618
619 static void
620 c_parser_consume_token (c_parser *parser)
621 {
622   gcc_assert (parser->tokens_avail >= 1);
623   gcc_assert (parser->tokens[0].type != CPP_EOF);
624   gcc_assert (!parser->in_pragma || parser->tokens[0].type != CPP_PRAGMA_EOL);
625   gcc_assert (parser->error || parser->tokens[0].type != CPP_PRAGMA);
626   if (parser->tokens_avail == 2)
627     parser->tokens[0] = parser->tokens[1];
628   parser->tokens_avail--;
629 }
630
631 /* Expect the current token to be a #pragma.  Consume it and remember
632    that we've begun parsing a pragma.  */
633
634 static void
635 c_parser_consume_pragma (c_parser *parser)
636 {
637   gcc_assert (!parser->in_pragma);
638   gcc_assert (parser->tokens_avail >= 1);
639   gcc_assert (parser->tokens[0].type == CPP_PRAGMA);
640   if (parser->tokens_avail == 2)
641     parser->tokens[0] = parser->tokens[1];
642   parser->tokens_avail--;
643   parser->in_pragma = true;
644 }
645
646 /* Update the globals input_location and in_system_header from
647    TOKEN.  */
648 static inline void
649 c_parser_set_source_position_from_token (c_token *token)
650 {
651   if (token->type != CPP_EOF)
652     {
653       input_location = token->location;
654       in_system_header = token->in_system_header;
655     }
656 }
657
658 /* Issue a diagnostic of the form
659       FILE:LINE: MESSAGE before TOKEN
660    where TOKEN is the next token in the input stream of PARSER.
661    MESSAGE (specified by the caller) is usually of the form "expected
662    OTHER-TOKEN".
663
664    Do not issue a diagnostic if still recovering from an error.
665
666    ??? This is taken from the C++ parser, but building up messages in
667    this way is not i18n-friendly and some other approach should be
668    used.  */
669
670 static void
671 c_parser_error (c_parser *parser, const char *gmsgid)
672 {
673   c_token *token = c_parser_peek_token (parser);
674   if (parser->error)
675     return;
676   parser->error = true;
677   if (!gmsgid)
678     return;
679   /* This diagnostic makes more sense if it is tagged to the line of
680      the token we just peeked at.  */
681   c_parser_set_source_position_from_token (token);
682   c_parse_error (gmsgid,
683                  /* Because c_parse_error does not understand
684                     CPP_KEYWORD, keywords are treated like
685                     identifiers.  */
686                  (token->type == CPP_KEYWORD ? CPP_NAME : token->type),
687                  token->value);
688 }
689
690 /* If the next token is of the indicated TYPE, consume it.  Otherwise,
691    issue the error MSGID.  If MSGID is NULL then a message has already
692    been produced and no message will be produced this time.  Returns
693    true if found, false otherwise.  */
694
695 static bool
696 c_parser_require (c_parser *parser,
697                   enum cpp_ttype type,
698                   const char *msgid)
699 {
700   if (c_parser_next_token_is (parser, type))
701     {
702       c_parser_consume_token (parser);
703       return true;
704     }
705   else
706     {
707       c_parser_error (parser, msgid);
708       return false;
709     }
710 }
711
712 /* If the next token is the indicated keyword, consume it.  Otherwise,
713    issue the error MSGID.  Returns true if found, false otherwise.  */
714
715 static bool
716 c_parser_require_keyword (c_parser *parser,
717                           enum rid keyword,
718                           const char *msgid)
719 {
720   if (c_parser_next_token_is_keyword (parser, keyword))
721     {
722       c_parser_consume_token (parser);
723       return true;
724     }
725   else
726     {
727       c_parser_error (parser, msgid);
728       return false;
729     }
730 }
731
732 /* Like c_parser_require, except that tokens will be skipped until the
733    desired token is found.  An error message is still produced if the
734    next token is not as expected.  If MSGID is NULL then a message has
735    already been produced and no message will be produced this
736    time.  */
737
738 static void
739 c_parser_skip_until_found (c_parser *parser,
740                            enum cpp_ttype type,
741                            const char *msgid)
742 {
743   unsigned nesting_depth = 0;
744
745   if (c_parser_require (parser, type, msgid))
746     return;
747
748   /* Skip tokens until the desired token is found.  */
749   while (true)
750     {
751       /* Peek at the next token.  */
752       c_token *token = c_parser_peek_token (parser);
753       /* If we've reached the token we want, consume it and stop.  */
754       if (token->type == type && !nesting_depth)
755         {
756           c_parser_consume_token (parser);
757           break;
758         }
759
760       /* If we've run out of tokens, stop.  */
761       if (token->type == CPP_EOF)
762         return;
763       if (token->type == CPP_PRAGMA_EOL && parser->in_pragma)
764         return;
765       if (token->type == CPP_OPEN_BRACE
766           || token->type == CPP_OPEN_PAREN
767           || token->type == CPP_OPEN_SQUARE)
768         ++nesting_depth;
769       else if (token->type == CPP_CLOSE_BRACE
770                || token->type == CPP_CLOSE_PAREN
771                || token->type == CPP_CLOSE_SQUARE)
772         {
773           if (nesting_depth-- == 0)
774             break;
775         }
776       /* Consume this token.  */
777       c_parser_consume_token (parser);
778     }
779   parser->error = false;
780 }
781
782 /* Skip tokens until the end of a parameter is found, but do not
783    consume the comma, semicolon or closing delimiter.  */
784
785 static void
786 c_parser_skip_to_end_of_parameter (c_parser *parser)
787 {
788   unsigned nesting_depth = 0;
789
790   while (true)
791     {
792       c_token *token = c_parser_peek_token (parser);
793       if ((token->type == CPP_COMMA || token->type == CPP_SEMICOLON)
794           && !nesting_depth)
795         break;
796       /* If we've run out of tokens, stop.  */
797       if (token->type == CPP_EOF)
798         return;
799       if (token->type == CPP_PRAGMA_EOL && parser->in_pragma)
800         return;
801       if (token->type == CPP_OPEN_BRACE
802           || token->type == CPP_OPEN_PAREN
803           || token->type == CPP_OPEN_SQUARE)
804         ++nesting_depth;
805       else if (token->type == CPP_CLOSE_BRACE
806                || token->type == CPP_CLOSE_PAREN
807                || token->type == CPP_CLOSE_SQUARE)
808         {
809           if (nesting_depth-- == 0)
810             break;
811         }
812       /* Consume this token.  */
813       c_parser_consume_token (parser);
814     }
815   parser->error = false;
816 }
817
818 /* Expect to be at the end of the pragma directive and consume an
819    end of line marker.  */
820
821 static void
822 c_parser_skip_to_pragma_eol (c_parser *parser)
823 {
824   gcc_assert (parser->in_pragma);
825   parser->in_pragma = false;
826
827   if (!c_parser_require (parser, CPP_PRAGMA_EOL, "expected end of line"))
828     while (true)
829       {
830         c_token *token = c_parser_peek_token (parser);
831         if (token->type == CPP_EOF)
832           break;
833         if (token->type == CPP_PRAGMA_EOL)
834           {
835             c_parser_consume_token (parser);
836             break;
837           }
838         c_parser_consume_token (parser);
839       }
840
841   parser->error = false;
842 }
843
844 /* Skip tokens until we have consumed an entire block, or until we
845    have consumed a non-nested ';'.  */
846
847 static void
848 c_parser_skip_to_end_of_block_or_statement (c_parser *parser)
849 {
850   unsigned nesting_depth = 0;
851   bool save_error = parser->error;
852
853   while (true)
854     {
855       c_token *token;
856
857       /* Peek at the next token.  */
858       token = c_parser_peek_token (parser);
859
860       switch (token->type)
861         {
862         case CPP_EOF:
863           return;
864
865         case CPP_PRAGMA_EOL:
866           if (parser->in_pragma)
867             return;
868           break;
869
870         case CPP_SEMICOLON:
871           /* If the next token is a ';', we have reached the
872              end of the statement.  */
873           if (!nesting_depth)
874             {
875               /* Consume the ';'.  */
876               c_parser_consume_token (parser);
877               goto finished;
878             }
879           break;
880
881         case CPP_CLOSE_BRACE:
882           /* If the next token is a non-nested '}', then we have
883              reached the end of the current block.  */
884           if (nesting_depth == 0 || --nesting_depth == 0)
885             {
886               c_parser_consume_token (parser);
887               goto finished;
888             }
889           break;
890
891         case CPP_OPEN_BRACE:
892           /* If it the next token is a '{', then we are entering a new
893              block.  Consume the entire block.  */
894           ++nesting_depth;
895           break;
896
897         case CPP_PRAGMA:
898           /* If we see a pragma, consume the whole thing at once.  We
899              have some safeguards against consuming pragmas willy-nilly.
900              Normally, we'd expect to be here with parser->error set,
901              which disables these safeguards.  But it's possible to get
902              here for secondary error recovery, after parser->error has
903              been cleared.  */
904           c_parser_consume_pragma (parser);
905           c_parser_skip_to_pragma_eol (parser);
906           parser->error = save_error;
907           continue;
908
909         default:
910           break;
911         }
912
913       c_parser_consume_token (parser);
914     }
915
916  finished:
917   parser->error = false;
918 }
919
920 /* Save the warning flags which are controlled by __extension__.  */
921
922 static inline int
923 disable_extension_diagnostics (void)
924 {
925   int ret = (pedantic
926              | (warn_pointer_arith << 1)
927              | (warn_traditional << 2)
928              | (flag_iso << 3));
929   pedantic = 0;
930   warn_pointer_arith = 0;
931   warn_traditional = 0;
932   flag_iso = 0;
933   return ret;
934 }
935
936 /* Restore the warning flags which are controlled by __extension__.
937    FLAGS is the return value from disable_extension_diagnostics.  */
938
939 static inline void
940 restore_extension_diagnostics (int flags)
941 {
942   pedantic = flags & 1;
943   warn_pointer_arith = (flags >> 1) & 1;
944   warn_traditional = (flags >> 2) & 1;
945   flag_iso = (flags >> 3) & 1;
946 }
947
948 /* Possibly kinds of declarator to parse.  */
949 typedef enum c_dtr_syn {
950   /* A normal declarator with an identifier.  */
951   C_DTR_NORMAL,
952   /* An abstract declarator (maybe empty).  */
953   C_DTR_ABSTRACT,
954   /* A parameter declarator: may be either, but after a type name does
955      not redeclare a typedef name as an identifier if it can
956      alternatively be interpreted as a typedef name; see DR#009,
957      applied in C90 TC1, omitted from C99 and reapplied in C99 TC2
958      following DR#249.  For example, given a typedef T, "int T" and
959      "int *T" are valid parameter declarations redeclaring T, while
960      "int (T)" and "int * (T)" and "int (T[])" and "int (T (int))" are
961      abstract declarators rather than involving redundant parentheses;
962      the same applies with attributes inside the parentheses before
963      "T".  */
964   C_DTR_PARM
965 } c_dtr_syn;
966
967 static void c_parser_external_declaration (c_parser *);
968 static void c_parser_asm_definition (c_parser *);
969 static void c_parser_declaration_or_fndef (c_parser *, bool, bool, bool, bool);
970 static void c_parser_declspecs (c_parser *, struct c_declspecs *, bool, bool,
971                                 bool);
972 static struct c_typespec c_parser_enum_specifier (c_parser *);
973 static struct c_typespec c_parser_struct_or_union_specifier (c_parser *);
974 static tree c_parser_struct_declaration (c_parser *);
975 static struct c_typespec c_parser_typeof_specifier (c_parser *);
976 static struct c_declarator *c_parser_declarator (c_parser *, bool, c_dtr_syn,
977                                                  bool *);
978 static struct c_declarator *c_parser_direct_declarator (c_parser *, bool,
979                                                         c_dtr_syn, bool *);
980 static struct c_declarator *c_parser_direct_declarator_inner (c_parser *,
981                                                               bool,
982                                                               struct c_declarator *);
983 static struct c_arg_info *c_parser_parms_declarator (c_parser *, bool, tree);
984 static struct c_arg_info *c_parser_parms_list_declarator (c_parser *, tree);
985 static struct c_parm *c_parser_parameter_declaration (c_parser *, tree);
986 static tree c_parser_simple_asm_expr (c_parser *);
987 static tree c_parser_attributes (c_parser *);
988 static struct c_type_name *c_parser_type_name (c_parser *);
989 static struct c_expr c_parser_initializer (c_parser *);
990 static struct c_expr c_parser_braced_init (c_parser *, tree, bool);
991 static void c_parser_initelt (c_parser *);
992 static void c_parser_initval (c_parser *, struct c_expr *);
993 static tree c_parser_compound_statement (c_parser *);
994 static void c_parser_compound_statement_nostart (c_parser *);
995 static void c_parser_label (c_parser *);
996 static void c_parser_statement (c_parser *);
997 static void c_parser_statement_after_labels (c_parser *);
998 static void c_parser_if_statement (c_parser *);
999 static void c_parser_switch_statement (c_parser *);
1000 static void c_parser_while_statement (c_parser *);
1001 static void c_parser_do_statement (c_parser *);
1002 static void c_parser_for_statement (c_parser *);
1003 static tree c_parser_asm_statement (c_parser *);
1004 static tree c_parser_asm_operands (c_parser *, bool);
1005 static tree c_parser_asm_clobbers (c_parser *);
1006 static struct c_expr c_parser_expr_no_commas (c_parser *, struct c_expr *);
1007 static struct c_expr c_parser_conditional_expression (c_parser *,
1008                                                       struct c_expr *);
1009 static struct c_expr c_parser_binary_expression (c_parser *, struct c_expr *);
1010 static struct c_expr c_parser_cast_expression (c_parser *, struct c_expr *);
1011 static struct c_expr c_parser_unary_expression (c_parser *);
1012 static struct c_expr c_parser_sizeof_expression (c_parser *);
1013 static struct c_expr c_parser_alignof_expression (c_parser *);
1014 static struct c_expr c_parser_postfix_expression (c_parser *);
1015 static struct c_expr c_parser_postfix_expression_after_paren_type (c_parser *,
1016                                                                    struct c_type_name *);
1017 static struct c_expr c_parser_postfix_expression_after_primary (c_parser *,
1018                                                                 struct c_expr);
1019 static struct c_expr c_parser_expression (c_parser *);
1020 static struct c_expr c_parser_expression_conv (c_parser *);
1021 static tree c_parser_expr_list (c_parser *, bool);
1022 static void c_parser_omp_construct (c_parser *);
1023 static void c_parser_omp_threadprivate (c_parser *);
1024 static void c_parser_omp_barrier (c_parser *);
1025 static void c_parser_omp_flush (c_parser *);
1026
1027 enum pragma_context { pragma_external, pragma_stmt, pragma_compound };
1028 static bool c_parser_pragma (c_parser *, enum pragma_context);
1029
1030 /* These Objective-C parser functions are only ever called when
1031    compiling Objective-C.  */
1032 static void c_parser_objc_class_definition (c_parser *);
1033 static void c_parser_objc_class_instance_variables (c_parser *);
1034 static void c_parser_objc_class_declaration (c_parser *);
1035 static void c_parser_objc_alias_declaration (c_parser *);
1036 static void c_parser_objc_protocol_definition (c_parser *);
1037 static enum tree_code c_parser_objc_method_type (c_parser *);
1038 static void c_parser_objc_method_definition (c_parser *);
1039 static void c_parser_objc_methodprotolist (c_parser *);
1040 static void c_parser_objc_methodproto (c_parser *);
1041 static tree c_parser_objc_method_decl (c_parser *);
1042 static tree c_parser_objc_type_name (c_parser *);
1043 static tree c_parser_objc_protocol_refs (c_parser *);
1044 static void c_parser_objc_try_catch_statement (c_parser *);
1045 static void c_parser_objc_synchronized_statement (c_parser *);
1046 static tree c_parser_objc_selector (c_parser *);
1047 static tree c_parser_objc_selector_arg (c_parser *);
1048 static tree c_parser_objc_receiver (c_parser *);
1049 static tree c_parser_objc_message_args (c_parser *);
1050 static tree c_parser_objc_keywordexpr (c_parser *);
1051
1052 /* Parse a translation unit (C90 6.7, C99 6.9).
1053
1054    translation-unit:
1055      external-declarations
1056
1057    external-declarations:
1058      external-declaration
1059      external-declarations external-declaration
1060
1061    GNU extensions:
1062
1063    translation-unit:
1064      empty
1065 */
1066
1067 static void
1068 c_parser_translation_unit (c_parser *parser)
1069 {
1070   if (c_parser_next_token_is (parser, CPP_EOF))
1071     {
1072       if (pedantic)
1073         pedwarn ("%HISO C forbids an empty translation unit",
1074                  &c_parser_peek_token (parser)->location);
1075     }
1076   else
1077     {
1078       void *obstack_position = obstack_alloc (&parser_obstack, 0);
1079       do
1080         {
1081           ggc_collect ();
1082           c_parser_external_declaration (parser);
1083           obstack_free (&parser_obstack, obstack_position);
1084         }
1085       while (c_parser_next_token_is_not (parser, CPP_EOF));
1086     }
1087 }
1088
1089 /* Parse an external declaration (C90 6.7, C99 6.9).
1090
1091    external-declaration:
1092      function-definition
1093      declaration
1094
1095    GNU extensions:
1096
1097    external-declaration:
1098      asm-definition
1099      ;
1100      __extension__ external-declaration
1101
1102    Objective-C:
1103
1104    external-declaration:
1105      objc-class-definition
1106      objc-class-declaration
1107      objc-alias-declaration
1108      objc-protocol-definition
1109      objc-method-definition
1110      @end
1111 */
1112
1113 static void
1114 c_parser_external_declaration (c_parser *parser)
1115 {
1116   int ext;
1117   switch (c_parser_peek_token (parser)->type)
1118     {
1119     case CPP_KEYWORD:
1120       switch (c_parser_peek_token (parser)->keyword)
1121         {
1122         case RID_EXTENSION:
1123           ext = disable_extension_diagnostics ();
1124           c_parser_consume_token (parser);
1125           c_parser_external_declaration (parser);
1126           restore_extension_diagnostics (ext);
1127           break;
1128         case RID_ASM:
1129           c_parser_asm_definition (parser);
1130           break;
1131         case RID_AT_INTERFACE:
1132         case RID_AT_IMPLEMENTATION:
1133           gcc_assert (c_dialect_objc ());
1134           c_parser_objc_class_definition (parser);
1135           break;
1136         case RID_AT_CLASS:
1137           gcc_assert (c_dialect_objc ());
1138           c_parser_objc_class_declaration (parser);
1139           break;
1140         case RID_AT_ALIAS:
1141           gcc_assert (c_dialect_objc ());
1142           c_parser_objc_alias_declaration (parser);
1143           break;
1144         case RID_AT_PROTOCOL:
1145           gcc_assert (c_dialect_objc ());
1146           c_parser_objc_protocol_definition (parser);
1147           break;
1148         case RID_AT_END:
1149           gcc_assert (c_dialect_objc ());
1150           c_parser_consume_token (parser);
1151           objc_finish_implementation ();
1152           break;
1153         default:
1154           goto decl_or_fndef;
1155         }
1156       break;
1157     case CPP_SEMICOLON:
1158       if (pedantic)
1159         pedwarn ("%HISO C does not allow extra %<;%> outside of a function",
1160                  &c_parser_peek_token (parser)->location);
1161       c_parser_consume_token (parser);
1162       break;
1163     case CPP_PRAGMA:
1164       c_parser_pragma (parser, pragma_external);
1165       break;
1166     case CPP_PLUS:
1167     case CPP_MINUS:
1168       if (c_dialect_objc ())
1169         {
1170           c_parser_objc_method_definition (parser);
1171           break;
1172         }
1173       /* Else fall through, and yield a syntax error trying to parse
1174          as a declaration or function definition.  */
1175     default:
1176     decl_or_fndef:
1177       /* A declaration or a function definition.  We can only tell
1178          which after parsing the declaration specifiers, if any, and
1179          the first declarator.  */
1180       c_parser_declaration_or_fndef (parser, true, true, false, true);
1181       break;
1182     }
1183 }
1184
1185
1186 /* Parse a declaration or function definition (C90 6.5, 6.7.1, C99
1187    6.7, 6.9.1).  If FNDEF_OK is true, a function definition is
1188    accepted; otherwise (old-style parameter declarations) only other
1189    declarations are accepted.  If NESTED is true, we are inside a
1190    function or parsing old-style parameter declarations; any functions
1191    encountered are nested functions and declaration specifiers are
1192    required; otherwise we are at top level and functions are normal
1193    functions and declaration specifiers may be optional.  If EMPTY_OK
1194    is true, empty declarations are OK (subject to all other
1195    constraints); otherwise (old-style parameter declarations) they are
1196    diagnosed.  If START_ATTR_OK is true, the declaration specifiers
1197    may start with attributes; otherwise they may not.
1198
1199    declaration:
1200      declaration-specifiers init-declarator-list[opt] ;
1201
1202    function-definition:
1203      declaration-specifiers[opt] declarator declaration-list[opt]
1204        compound-statement
1205
1206    declaration-list:
1207      declaration
1208      declaration-list declaration
1209
1210    init-declarator-list:
1211      init-declarator
1212      init-declarator-list , init-declarator
1213
1214    init-declarator:
1215      declarator simple-asm-expr[opt] attributes[opt]
1216      declarator simple-asm-expr[opt] attributes[opt] = initializer
1217
1218    GNU extensions:
1219
1220    nested-function-definition:
1221      declaration-specifiers declarator declaration-list[opt]
1222        compound-statement
1223
1224    The simple-asm-expr and attributes are GNU extensions.
1225
1226    This function does not handle __extension__; that is handled in its
1227    callers.  ??? Following the old parser, __extension__ may start
1228    external declarations, declarations in functions and declarations
1229    at the start of "for" loops, but not old-style parameter
1230    declarations.
1231
1232    C99 requires declaration specifiers in a function definition; the
1233    absence is diagnosed through the diagnosis of implicit int.  In GNU
1234    C we also allow but diagnose declarations without declaration
1235    specifiers, but only at top level (elsewhere they conflict with
1236    other syntax).
1237    
1238    OpenMP:
1239    
1240    declaration:
1241      threadprivate-directive  */
1242
1243 static void
1244 c_parser_declaration_or_fndef (c_parser *parser, bool fndef_ok, bool empty_ok,
1245                                bool nested, bool start_attr_ok)
1246 {
1247   struct c_declspecs *specs;
1248   tree prefix_attrs;
1249   tree all_prefix_attrs;
1250   bool diagnosed_no_specs = false;
1251   location_t here = c_parser_peek_token (parser)->location;
1252
1253   specs = build_null_declspecs ();
1254   c_parser_declspecs (parser, specs, true, true, start_attr_ok);
1255   if (parser->error)
1256     {
1257       c_parser_skip_to_end_of_block_or_statement (parser);
1258       return;
1259     }
1260   if (nested && !specs->declspecs_seen_p)
1261     {
1262       c_parser_error (parser, "expected declaration specifiers");
1263       c_parser_skip_to_end_of_block_or_statement (parser);
1264       return;
1265     }
1266   finish_declspecs (specs);
1267   if (c_parser_next_token_is (parser, CPP_SEMICOLON))
1268     {
1269       if (empty_ok)
1270         shadow_tag (specs);
1271       else
1272         {
1273           shadow_tag_warned (specs, 1);
1274           pedwarn ("%Hempty declaration", &here);
1275         }
1276       c_parser_consume_token (parser);
1277       return;
1278     }
1279   pending_xref_error ();
1280   prefix_attrs = specs->attrs;
1281   all_prefix_attrs = prefix_attrs;
1282   specs->attrs = NULL_TREE;
1283   while (true)
1284     {
1285       struct c_declarator *declarator;
1286       bool dummy = false;
1287       tree fnbody;
1288       /* Declaring either one or more declarators (in which case we
1289          should diagnose if there were no declaration specifiers) or a
1290          function definition (in which case the diagnostic for
1291          implicit int suffices).  */
1292       declarator = c_parser_declarator (parser, specs->type_seen_p,
1293                                         C_DTR_NORMAL, &dummy);
1294       if (declarator == NULL)
1295         {
1296           c_parser_skip_to_end_of_block_or_statement (parser);
1297           return;
1298         }
1299       if (c_parser_next_token_is (parser, CPP_EQ)
1300           || c_parser_next_token_is (parser, CPP_COMMA)
1301           || c_parser_next_token_is (parser, CPP_SEMICOLON)
1302           || c_parser_next_token_is_keyword (parser, RID_ASM)
1303           || c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
1304         {
1305           tree asm_name = NULL_TREE;
1306           tree postfix_attrs = NULL_TREE;
1307           if (!diagnosed_no_specs && !specs->declspecs_seen_p)
1308             {
1309               diagnosed_no_specs = true;
1310               pedwarn ("%Hdata definition has no type or storage class",
1311                        &here);
1312             }
1313           /* Having seen a data definition, there cannot now be a
1314              function definition.  */
1315           fndef_ok = false;
1316           if (c_parser_next_token_is_keyword (parser, RID_ASM))
1317             asm_name = c_parser_simple_asm_expr (parser);
1318           if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
1319             postfix_attrs = c_parser_attributes (parser);
1320           if (c_parser_next_token_is (parser, CPP_EQ))
1321             {
1322               tree d;
1323               struct c_expr init;
1324               c_parser_consume_token (parser);
1325               /* The declaration of the variable is in effect while
1326                  its initializer is parsed.  */
1327               d = start_decl (declarator, specs, true,
1328                               chainon (postfix_attrs, all_prefix_attrs));
1329               if (!d)
1330                 d = error_mark_node;
1331               start_init (d, asm_name, global_bindings_p ());
1332               init = c_parser_initializer (parser);
1333               finish_init ();
1334               if (d != error_mark_node)
1335                 {
1336                   maybe_warn_string_init (TREE_TYPE (d), init);
1337                   finish_decl (d, init.value, asm_name);
1338                 }
1339             }
1340           else
1341             {
1342               tree d = start_decl (declarator, specs, false,
1343                                    chainon (postfix_attrs,
1344                                             all_prefix_attrs));
1345               if (d)
1346                 finish_decl (d, NULL_TREE, asm_name);
1347             }
1348           if (c_parser_next_token_is (parser, CPP_COMMA))
1349             {
1350               c_parser_consume_token (parser);
1351               if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
1352                 all_prefix_attrs = chainon (c_parser_attributes (parser),
1353                                             prefix_attrs);
1354               else
1355                 all_prefix_attrs = prefix_attrs;
1356               continue;
1357             }
1358           else if (c_parser_next_token_is (parser, CPP_SEMICOLON))
1359             {
1360               c_parser_consume_token (parser);
1361               return;
1362             }
1363           else
1364             {
1365               c_parser_error (parser, "expected %<,%> or %<;%>");
1366               c_parser_skip_to_end_of_block_or_statement (parser);
1367               return;
1368             }
1369         }
1370       else if (!fndef_ok)
1371         {
1372           c_parser_error (parser, "expected %<=%>, %<,%>, %<;%>, "
1373                           "%<asm%> or %<__attribute__%>");
1374           c_parser_skip_to_end_of_block_or_statement (parser);
1375           return;
1376         }
1377       /* Function definition (nested or otherwise).  */
1378       if (nested)
1379         {
1380           if (pedantic)
1381             pedwarn ("%HISO C forbids nested functions", &here);
1382           push_function_context ();
1383         }
1384       if (!start_function (specs, declarator, all_prefix_attrs))
1385         {
1386           /* This can appear in many cases looking nothing like a
1387              function definition, so we don't give a more specific
1388              error suggesting there was one.  */
1389           c_parser_error (parser, "expected %<=%>, %<,%>, %<;%>, %<asm%> "
1390                           "or %<__attribute__%>");
1391           if (nested)
1392             pop_function_context ();
1393           break;
1394         }
1395       /* Parse old-style parameter declarations.  ??? Attributes are
1396          not allowed to start declaration specifiers here because of a
1397          syntax conflict between a function declaration with attribute
1398          suffix and a function definition with an attribute prefix on
1399          first old-style parameter declaration.  Following the old
1400          parser, they are not accepted on subsequent old-style
1401          parameter declarations either.  However, there is no
1402          ambiguity after the first declaration, nor indeed on the
1403          first as long as we don't allow postfix attributes after a
1404          declarator with a nonempty identifier list in a definition;
1405          and postfix attributes have never been accepted here in
1406          function definitions either.  */
1407       while (c_parser_next_token_is_not (parser, CPP_EOF)
1408              && c_parser_next_token_is_not (parser, CPP_OPEN_BRACE))
1409         c_parser_declaration_or_fndef (parser, false, false, true, false);
1410       DECL_SOURCE_LOCATION (current_function_decl)
1411         = c_parser_peek_token (parser)->location;
1412       store_parm_decls ();
1413       fnbody = c_parser_compound_statement (parser);
1414       if (nested)
1415         {
1416           tree decl = current_function_decl;
1417           add_stmt (fnbody);
1418           finish_function ();
1419           pop_function_context ();
1420           add_stmt (build_stmt (DECL_EXPR, decl));
1421         }
1422       else
1423         {
1424           add_stmt (fnbody);
1425           finish_function ();
1426         }
1427       break;
1428     }
1429 }
1430
1431 /* Parse an asm-definition (asm() outside a function body).  This is a
1432    GNU extension.
1433
1434    asm-definition:
1435      simple-asm-expr ;
1436 */
1437
1438 static void
1439 c_parser_asm_definition (c_parser *parser)
1440 {
1441   tree asm_str = c_parser_simple_asm_expr (parser);
1442   if (asm_str)
1443     cgraph_add_asm_node (asm_str);
1444   c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
1445 }
1446
1447 /* Parse some declaration specifiers (possibly none) (C90 6.5, C99
1448    6.7), adding them to SPECS (which may already include some).
1449    Storage class specifiers are accepted iff SCSPEC_OK; type
1450    specifiers are accepted iff TYPESPEC_OK; attributes are accepted at
1451    the start iff START_ATTR_OK.
1452
1453    declaration-specifiers:
1454      storage-class-specifier declaration-specifiers[opt]
1455      type-specifier declaration-specifiers[opt]
1456      type-qualifier declaration-specifiers[opt]
1457      function-specifier declaration-specifiers[opt]
1458
1459    Function specifiers (inline) are from C99, and are currently
1460    handled as storage class specifiers, as is __thread.
1461
1462    C90 6.5.1, C99 6.7.1:
1463    storage-class-specifier:
1464      typedef
1465      extern
1466      static
1467      auto
1468      register
1469
1470    C99 6.7.4:
1471    function-specifier:
1472      inline
1473
1474    C90 6.5.2, C99 6.7.2:
1475    type-specifier:
1476      void
1477      char
1478      short
1479      int
1480      long
1481      float
1482      double
1483      signed
1484      unsigned
1485      _Bool
1486      _Complex
1487      [_Imaginary removed in C99 TC2]
1488      struct-or-union-specifier
1489      enum-specifier
1490      typedef-name
1491
1492    (_Bool and _Complex are new in C99.)
1493
1494    C90 6.5.3, C99 6.7.3:
1495
1496    type-qualifier:
1497      const
1498      restrict
1499      volatile
1500
1501    (restrict is new in C99.)
1502
1503    GNU extensions:
1504
1505    declaration-specifiers:
1506      attributes declaration-specifiers[opt]
1507
1508    storage-class-specifier:
1509      __thread
1510
1511    type-specifier:
1512      typeof-specifier
1513      _Decimal32
1514      _Decimal64
1515      _Decimal128
1516      _Fract
1517      _Accum
1518      _Sat
1519
1520   (_Fract, _Accum, and _Sat are new from ISO/IEC DTR 18037:
1521    http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1169.pdf)
1522
1523    Objective-C:
1524
1525    type-specifier:
1526      class-name objc-protocol-refs[opt]
1527      typedef-name objc-protocol-refs
1528      objc-protocol-refs
1529 */
1530
1531 static void
1532 c_parser_declspecs (c_parser *parser, struct c_declspecs *specs,
1533                     bool scspec_ok, bool typespec_ok, bool start_attr_ok)
1534 {
1535   bool attrs_ok = start_attr_ok;
1536   bool seen_type = specs->type_seen_p;
1537   while (c_parser_next_token_is (parser, CPP_NAME)
1538          || c_parser_next_token_is (parser, CPP_KEYWORD)
1539          || (c_dialect_objc () && c_parser_next_token_is (parser, CPP_LESS)))
1540     {
1541       struct c_typespec t;
1542       tree attrs;
1543       if (c_parser_next_token_is (parser, CPP_NAME))
1544         {
1545           tree value = c_parser_peek_token (parser)->value;
1546           c_id_kind kind = c_parser_peek_token (parser)->id_kind;
1547           /* This finishes the specifiers unless a type name is OK, it
1548              is declared as a type name and a type name hasn't yet
1549              been seen.  */
1550           if (!typespec_ok || seen_type
1551               || (kind != C_ID_TYPENAME && kind != C_ID_CLASSNAME))
1552             break;
1553           c_parser_consume_token (parser);
1554           seen_type = true;
1555           attrs_ok = true;
1556           if (kind == C_ID_TYPENAME
1557               && (!c_dialect_objc ()
1558                   || c_parser_next_token_is_not (parser, CPP_LESS)))
1559             {
1560               t.kind = ctsk_typedef;
1561               /* For a typedef name, record the meaning, not the name.
1562                  In case of 'foo foo, bar;'.  */
1563               t.spec = lookup_name (value);
1564             }
1565           else
1566             {
1567               tree proto = NULL_TREE;
1568               gcc_assert (c_dialect_objc ());
1569               t.kind = ctsk_objc;
1570               if (c_parser_next_token_is (parser, CPP_LESS))
1571                 proto = c_parser_objc_protocol_refs (parser);
1572               t.spec = objc_get_protocol_qualified_type (value, proto);
1573             }
1574           declspecs_add_type (specs, t);
1575           continue;
1576         }
1577       if (c_parser_next_token_is (parser, CPP_LESS))
1578         {
1579           /* Make "<SomeProtocol>" equivalent to "id <SomeProtocol>" -
1580              nisse@lysator.liu.se.  */
1581           tree proto;
1582           gcc_assert (c_dialect_objc ());
1583           if (!typespec_ok || seen_type)
1584             break;
1585           proto = c_parser_objc_protocol_refs (parser);
1586           t.kind = ctsk_objc;
1587           t.spec = objc_get_protocol_qualified_type (NULL_TREE, proto);
1588           declspecs_add_type (specs, t);
1589           continue;
1590         }
1591       gcc_assert (c_parser_next_token_is (parser, CPP_KEYWORD));
1592       switch (c_parser_peek_token (parser)->keyword)
1593         {
1594         case RID_STATIC:
1595         case RID_EXTERN:
1596         case RID_REGISTER:
1597         case RID_TYPEDEF:
1598         case RID_INLINE:
1599         case RID_AUTO:
1600         case RID_THREAD:
1601           if (!scspec_ok)
1602             goto out;
1603           attrs_ok = true;
1604           /* TODO: Distinguish between function specifiers (inline)
1605              and storage class specifiers, either here or in
1606              declspecs_add_scspec.  */
1607           declspecs_add_scspec (specs, c_parser_peek_token (parser)->value);
1608           c_parser_consume_token (parser);
1609           break;
1610         case RID_UNSIGNED:
1611         case RID_LONG:
1612         case RID_SHORT:
1613         case RID_SIGNED:
1614         case RID_COMPLEX:
1615         case RID_INT:
1616         case RID_CHAR:
1617         case RID_FLOAT:
1618         case RID_DOUBLE:
1619         case RID_VOID:
1620         case RID_DFLOAT32:
1621         case RID_DFLOAT64:
1622         case RID_DFLOAT128:
1623         case RID_BOOL:
1624         case RID_FRACT:
1625         case RID_ACCUM:
1626         case RID_SAT:
1627           if (!typespec_ok)
1628             goto out;
1629           attrs_ok = true;
1630           seen_type = true;
1631           if (c_dialect_objc ())
1632             parser->objc_need_raw_identifier = true;
1633           t.kind = ctsk_resword;
1634           t.spec = c_parser_peek_token (parser)->value;
1635           declspecs_add_type (specs, t);
1636           c_parser_consume_token (parser);
1637           break;
1638         case RID_ENUM:
1639           if (!typespec_ok)
1640             goto out;
1641           attrs_ok = true;
1642           seen_type = true;
1643           t = c_parser_enum_specifier (parser);
1644           declspecs_add_type (specs, t);
1645           break;
1646         case RID_STRUCT:
1647         case RID_UNION:
1648           if (!typespec_ok)
1649             goto out;
1650           attrs_ok = true;
1651           seen_type = true;
1652           t = c_parser_struct_or_union_specifier (parser);
1653           declspecs_add_type (specs, t);
1654           break;
1655         case RID_TYPEOF:
1656           /* ??? The old parser rejected typeof after other type
1657              specifiers, but is a syntax error the best way of
1658              handling this?  */
1659           if (!typespec_ok || seen_type)
1660             goto out;
1661           attrs_ok = true;
1662           seen_type = true;
1663           t = c_parser_typeof_specifier (parser);
1664           declspecs_add_type (specs, t);
1665           break;
1666         case RID_CONST:
1667         case RID_VOLATILE:
1668         case RID_RESTRICT:
1669           attrs_ok = true;
1670           declspecs_add_qual (specs, c_parser_peek_token (parser)->value);
1671           c_parser_consume_token (parser);
1672           break;
1673         case RID_ATTRIBUTE:
1674           if (!attrs_ok)
1675             goto out;
1676           attrs = c_parser_attributes (parser);
1677           declspecs_add_attrs (specs, attrs);
1678           break;
1679         default:
1680           goto out;
1681         }
1682     }
1683  out: ;
1684 }
1685
1686 /* Parse an enum specifier (C90 6.5.2.2, C99 6.7.2.2).
1687
1688    enum-specifier:
1689      enum attributes[opt] identifier[opt] { enumerator-list } attributes[opt]
1690      enum attributes[opt] identifier[opt] { enumerator-list , } attributes[opt]
1691      enum attributes[opt] identifier
1692
1693    The form with trailing comma is new in C99.  The forms with
1694    attributes are GNU extensions.  In GNU C, we accept any expression
1695    without commas in the syntax (assignment expressions, not just
1696    conditional expressions); assignment expressions will be diagnosed
1697    as non-constant.
1698
1699    enumerator-list:
1700      enumerator
1701      enumerator-list , enumerator
1702
1703    enumerator:
1704      enumeration-constant
1705      enumeration-constant = constant-expression
1706 */
1707
1708 static struct c_typespec
1709 c_parser_enum_specifier (c_parser *parser)
1710 {
1711   struct c_typespec ret;
1712   tree attrs;
1713   tree ident = NULL_TREE;
1714   location_t ident_loc;
1715   gcc_assert (c_parser_next_token_is_keyword (parser, RID_ENUM));
1716   c_parser_consume_token (parser);
1717   attrs = c_parser_attributes (parser);
1718   /* Set the location in case we create a decl now.  */
1719   c_parser_set_source_position_from_token (c_parser_peek_token (parser));
1720   if (c_parser_next_token_is (parser, CPP_NAME))
1721     {
1722       ident = c_parser_peek_token (parser)->value;
1723       ident_loc = c_parser_peek_token (parser)->location;
1724       c_parser_consume_token (parser);
1725     }
1726   if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
1727     {
1728       /* Parse an enum definition.  */
1729       struct c_enum_contents the_enum;
1730       tree type = start_enum (&the_enum, ident);
1731       tree postfix_attrs;
1732       /* We chain the enumerators in reverse order, then put them in
1733          forward order at the end.  */
1734       tree values = NULL_TREE;
1735       c_parser_consume_token (parser);
1736       while (true)
1737         {
1738           tree enum_id;
1739           tree enum_value;
1740           tree enum_decl;
1741           bool seen_comma;
1742           c_token *token;
1743           location_t comma_loc;
1744           if (c_parser_next_token_is_not (parser, CPP_NAME))
1745             {
1746               c_parser_error (parser, "expected identifier");
1747               c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL);
1748               values = error_mark_node;
1749               break;
1750             }
1751           token = c_parser_peek_token (parser);
1752           enum_id = token->value;
1753           /* Set the location in case we create a decl now.  */
1754           c_parser_set_source_position_from_token (token);
1755           c_parser_consume_token (parser);
1756           if (c_parser_next_token_is (parser, CPP_EQ))
1757             {
1758               c_parser_consume_token (parser);
1759               enum_value = c_parser_expr_no_commas (parser, NULL).value;
1760             }
1761           else
1762             enum_value = NULL_TREE;
1763           enum_decl = build_enumerator (&the_enum, enum_id, enum_value);
1764           TREE_CHAIN (enum_decl) = values;
1765           values = enum_decl;
1766           seen_comma = false;
1767           if (c_parser_next_token_is (parser, CPP_COMMA))
1768             {
1769               comma_loc = c_parser_peek_token (parser)->location;
1770               seen_comma = true;
1771               c_parser_consume_token (parser);
1772             }
1773           if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
1774             {
1775               if (seen_comma && pedantic && !flag_isoc99)
1776                 pedwarn ("%Hcomma at end of enumerator list", &comma_loc);
1777               c_parser_consume_token (parser);
1778               break;
1779             }
1780           if (!seen_comma)
1781             {
1782               c_parser_error (parser, "expected %<,%> or %<}%>");
1783               c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL);
1784               values = error_mark_node;
1785               break;
1786             }
1787         }
1788       postfix_attrs = c_parser_attributes (parser);
1789       ret.spec = finish_enum (type, nreverse (values),
1790                               chainon (attrs, postfix_attrs));
1791       ret.kind = ctsk_tagdef;
1792       return ret;
1793     }
1794   else if (!ident)
1795     {
1796       c_parser_error (parser, "expected %<{%>");
1797       ret.spec = error_mark_node;
1798       ret.kind = ctsk_tagref;
1799       return ret;
1800     }
1801   ret = parser_xref_tag (ENUMERAL_TYPE, ident);
1802   /* In ISO C, enumerated types can be referred to only if already
1803      defined.  */
1804   if (pedantic && !COMPLETE_TYPE_P (ret.spec))
1805     {
1806       gcc_assert (ident);
1807       pedwarn ("%HISO C forbids forward references to %<enum%> types",
1808                &ident_loc);
1809     }
1810   return ret;
1811 }
1812
1813 /* Parse a struct or union specifier (C90 6.5.2.1, C99 6.7.2.1).
1814
1815    struct-or-union-specifier:
1816      struct-or-union attributes[opt] identifier[opt]
1817        { struct-contents } attributes[opt]
1818      struct-or-union attributes[opt] identifier
1819
1820    struct-contents:
1821      struct-declaration-list
1822
1823    struct-declaration-list:
1824      struct-declaration ;
1825      struct-declaration-list struct-declaration ;
1826
1827    GNU extensions:
1828
1829    struct-contents:
1830      empty
1831      struct-declaration
1832      struct-declaration-list struct-declaration
1833
1834    struct-declaration-list:
1835      struct-declaration-list ;
1836      ;
1837
1838    (Note that in the syntax here, unlike that in ISO C, the semicolons
1839    are included here rather than in struct-declaration, in order to
1840    describe the syntax with extra semicolons and missing semicolon at
1841    end.)
1842
1843    Objective-C:
1844
1845    struct-declaration-list:
1846      @defs ( class-name )
1847
1848    (Note this does not include a trailing semicolon, but can be
1849    followed by further declarations, and gets a pedwarn-if-pedantic
1850    when followed by a semicolon.)  */
1851
1852 static struct c_typespec
1853 c_parser_struct_or_union_specifier (c_parser *parser)
1854 {
1855   struct c_typespec ret;
1856   tree attrs;
1857   tree ident = NULL_TREE;
1858   enum tree_code code;
1859   switch (c_parser_peek_token (parser)->keyword)
1860     {
1861     case RID_STRUCT:
1862       code = RECORD_TYPE;
1863       break;
1864     case RID_UNION:
1865       code = UNION_TYPE;
1866       break;
1867     default:
1868       gcc_unreachable ();
1869     }
1870   c_parser_consume_token (parser);
1871   attrs = c_parser_attributes (parser);
1872   /* Set the location in case we create a decl now.  */
1873   c_parser_set_source_position_from_token (c_parser_peek_token (parser));
1874   if (c_parser_next_token_is (parser, CPP_NAME))
1875     {
1876       ident = c_parser_peek_token (parser)->value;
1877       c_parser_consume_token (parser);
1878     }
1879   if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
1880     {
1881       /* Parse a struct or union definition.  Start the scope of the
1882          tag before parsing components.  */
1883       tree type = start_struct (code, ident);
1884       tree postfix_attrs;
1885       /* We chain the components in reverse order, then put them in
1886          forward order at the end.  Each struct-declaration may
1887          declare multiple components (comma-separated), so we must use
1888          chainon to join them, although when parsing each
1889          struct-declaration we can use TREE_CHAIN directly.
1890
1891          The theory behind all this is that there will be more
1892          semicolon separated fields than comma separated fields, and
1893          so we'll be minimizing the number of node traversals required
1894          by chainon.  */
1895       tree contents = NULL_TREE;
1896       c_parser_consume_token (parser);
1897       /* Handle the Objective-C @defs construct,
1898          e.g. foo(sizeof(struct{ @defs(ClassName) }));.  */
1899       if (c_parser_next_token_is_keyword (parser, RID_AT_DEFS))
1900         {
1901           tree name;
1902           gcc_assert (c_dialect_objc ());
1903           c_parser_consume_token (parser);
1904           if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
1905             goto end_at_defs;
1906           if (c_parser_next_token_is (parser, CPP_NAME)
1907               && c_parser_peek_token (parser)->id_kind == C_ID_CLASSNAME)
1908             {
1909               name = c_parser_peek_token (parser)->value;
1910               c_parser_consume_token (parser);
1911             }
1912           else
1913             {
1914               c_parser_error (parser, "expected class name");
1915               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
1916               goto end_at_defs;
1917             }
1918           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
1919                                      "expected %<)%>");
1920           contents = nreverse (objc_get_class_ivars (name));
1921         }
1922     end_at_defs:
1923       /* Parse the struct-declarations and semicolons.  Problems with
1924          semicolons are diagnosed here; empty structures are diagnosed
1925          elsewhere.  */
1926       while (true)
1927         {
1928           tree decls;
1929           /* Parse any stray semicolon.  */
1930           if (c_parser_next_token_is (parser, CPP_SEMICOLON))
1931             {
1932               if (pedantic)
1933                 pedwarn ("%Hextra semicolon in struct or union specified",
1934                          &c_parser_peek_token (parser)->location);
1935               c_parser_consume_token (parser);
1936               continue;
1937             }
1938           /* Stop if at the end of the struct or union contents.  */
1939           if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
1940             {
1941               c_parser_consume_token (parser);
1942               break;
1943             }
1944           /* Accept #pragmas at struct scope.  */
1945           if (c_parser_next_token_is (parser, CPP_PRAGMA))
1946             {
1947               c_parser_pragma (parser, pragma_external);
1948               continue;
1949             }
1950           /* Parse some comma-separated declarations, but not the
1951              trailing semicolon if any.  */
1952           decls = c_parser_struct_declaration (parser);
1953           contents = chainon (decls, contents);
1954           /* If no semicolon follows, either we have a parse error or
1955              are at the end of the struct or union and should
1956              pedwarn.  */
1957           if (c_parser_next_token_is (parser, CPP_SEMICOLON))
1958             c_parser_consume_token (parser);
1959           else
1960             {
1961               if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
1962                 pedwarn ("%Hno semicolon at end of struct or union",
1963                          &c_parser_peek_token (parser)->location);
1964               else
1965                 {
1966                   c_parser_error (parser, "expected %<;%>");
1967                   c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL);
1968                   break;
1969                 }
1970             }
1971         }
1972       postfix_attrs = c_parser_attributes (parser);
1973       ret.spec = finish_struct (type, nreverse (contents),
1974                                 chainon (attrs, postfix_attrs));
1975       ret.kind = ctsk_tagdef;
1976       return ret;
1977     }
1978   else if (!ident)
1979     {
1980       c_parser_error (parser, "expected %<{%>");
1981       ret.spec = error_mark_node;
1982       ret.kind = ctsk_tagref;
1983       return ret;
1984     }
1985   ret = parser_xref_tag (code, ident);
1986   return ret;
1987 }
1988
1989 /* Parse a struct-declaration (C90 6.5.2.1, C99 6.7.2.1), *without*
1990    the trailing semicolon.
1991
1992    struct-declaration:
1993      specifier-qualifier-list struct-declarator-list
1994
1995    specifier-qualifier-list:
1996      type-specifier specifier-qualifier-list[opt]
1997      type-qualifier specifier-qualifier-list[opt]
1998      attributes specifier-qualifier-list[opt]
1999
2000    struct-declarator-list:
2001      struct-declarator
2002      struct-declarator-list , attributes[opt] struct-declarator
2003
2004    struct-declarator:
2005      declarator attributes[opt]
2006      declarator[opt] : constant-expression attributes[opt]
2007
2008    GNU extensions:
2009
2010    struct-declaration:
2011      __extension__ struct-declaration
2012      specifier-qualifier-list
2013
2014    Unlike the ISO C syntax, semicolons are handled elsewhere.  The use
2015    of attributes where shown is a GNU extension.  In GNU C, we accept
2016    any expression without commas in the syntax (assignment
2017    expressions, not just conditional expressions); assignment
2018    expressions will be diagnosed as non-constant.  */
2019
2020 static tree
2021 c_parser_struct_declaration (c_parser *parser)
2022 {
2023   struct c_declspecs *specs;
2024   tree prefix_attrs;
2025   tree all_prefix_attrs;
2026   tree decls;
2027   location_t decl_loc;
2028   if (c_parser_next_token_is_keyword (parser, RID_EXTENSION))
2029     {
2030       int ext;
2031       tree decl;
2032       ext = disable_extension_diagnostics ();
2033       c_parser_consume_token (parser);
2034       decl = c_parser_struct_declaration (parser);
2035       restore_extension_diagnostics (ext);
2036       return decl;
2037     }
2038   specs = build_null_declspecs ();
2039   decl_loc = c_parser_peek_token (parser)->location;
2040   c_parser_declspecs (parser, specs, false, true, true);
2041   if (parser->error)
2042     return NULL_TREE;
2043   if (!specs->declspecs_seen_p)
2044     {
2045       c_parser_error (parser, "expected specifier-qualifier-list");
2046       return NULL_TREE;
2047     }
2048   finish_declspecs (specs);
2049   if (c_parser_next_token_is (parser, CPP_SEMICOLON))
2050     {
2051       tree ret;
2052       if (!specs->type_seen_p)
2053         {
2054           if (pedantic)
2055             pedwarn ("%HISO C forbids member declarations with no members",
2056                      &decl_loc);
2057           shadow_tag_warned (specs, pedantic);
2058           ret = NULL_TREE;
2059         }
2060       else
2061         {
2062           /* Support for unnamed structs or unions as members of
2063              structs or unions (which is [a] useful and [b] supports
2064              MS P-SDK).  */
2065           tree attrs = NULL;
2066           ret = grokfield (build_id_declarator (NULL_TREE), specs,
2067                            NULL_TREE, &attrs);
2068           if (ret)
2069             decl_attributes (&ret, attrs, 0);
2070         }
2071       return ret;
2072     }
2073   pending_xref_error ();
2074   prefix_attrs = specs->attrs;
2075   all_prefix_attrs = prefix_attrs;
2076   specs->attrs = NULL_TREE;
2077   decls = NULL_TREE;
2078   while (true)
2079     {
2080       /* Declaring one or more declarators or un-named bit-fields.  */
2081       struct c_declarator *declarator;
2082       bool dummy = false;
2083       if (c_parser_next_token_is (parser, CPP_COLON))
2084         declarator = build_id_declarator (NULL_TREE);
2085       else
2086         declarator = c_parser_declarator (parser, specs->type_seen_p,
2087                                           C_DTR_NORMAL, &dummy);
2088       if (declarator == NULL)
2089         {
2090           c_parser_skip_to_end_of_block_or_statement (parser);
2091           break;
2092         }
2093       if (c_parser_next_token_is (parser, CPP_COLON)
2094           || c_parser_next_token_is (parser, CPP_COMMA)
2095           || c_parser_next_token_is (parser, CPP_SEMICOLON)
2096           || c_parser_next_token_is (parser, CPP_CLOSE_BRACE)
2097           || c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
2098         {
2099           tree postfix_attrs = NULL_TREE;
2100           tree width = NULL_TREE;
2101           tree d;
2102           if (c_parser_next_token_is (parser, CPP_COLON))
2103             {
2104               c_parser_consume_token (parser);
2105               width = c_parser_expr_no_commas (parser, NULL).value;
2106             }
2107           if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
2108             postfix_attrs = c_parser_attributes (parser);
2109           d = grokfield (declarator, specs, width, &all_prefix_attrs);
2110           decl_attributes (&d, chainon (postfix_attrs,
2111                                         all_prefix_attrs), 0);
2112           TREE_CHAIN (d) = decls;
2113           decls = d;
2114           if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
2115             all_prefix_attrs = chainon (c_parser_attributes (parser),
2116                                         prefix_attrs);
2117           else
2118             all_prefix_attrs = prefix_attrs;
2119           if (c_parser_next_token_is (parser, CPP_COMMA))
2120             c_parser_consume_token (parser);
2121           else if (c_parser_next_token_is (parser, CPP_SEMICOLON)
2122                    || c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
2123             {
2124               /* Semicolon consumed in caller.  */
2125               break;
2126             }
2127           else
2128             {
2129               c_parser_error (parser, "expected %<,%>, %<;%> or %<}%>");
2130               break;
2131             }
2132         }
2133       else
2134         {
2135           c_parser_error (parser,
2136                           "expected %<:%>, %<,%>, %<;%>, %<}%> or "
2137                           "%<__attribute__%>");
2138           break;
2139         }
2140     }
2141   return decls;
2142 }
2143
2144 /* Parse a typeof specifier (a GNU extension).
2145
2146    typeof-specifier:
2147      typeof ( expression )
2148      typeof ( type-name )
2149 */
2150
2151 static struct c_typespec
2152 c_parser_typeof_specifier (c_parser *parser)
2153 {
2154   struct c_typespec ret;
2155   ret.kind = ctsk_typeof;
2156   ret.spec = error_mark_node;
2157   gcc_assert (c_parser_next_token_is_keyword (parser, RID_TYPEOF));
2158   c_parser_consume_token (parser);
2159   skip_evaluation++;
2160   in_typeof++;
2161   if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
2162     {
2163       skip_evaluation--;
2164       in_typeof--;
2165       return ret;
2166     }
2167   if (c_parser_next_token_starts_typename (parser))
2168     {
2169       struct c_type_name *type = c_parser_type_name (parser);
2170       skip_evaluation--;
2171       in_typeof--;
2172       if (type != NULL)
2173         {
2174           ret.spec = groktypename (type);
2175           pop_maybe_used (variably_modified_type_p (ret.spec, NULL_TREE));
2176         }
2177     }
2178   else
2179     {
2180       bool was_vm;
2181       location_t here = c_parser_peek_token (parser)->location;
2182       struct c_expr expr = c_parser_expression (parser);
2183       skip_evaluation--;
2184       in_typeof--;
2185       if (TREE_CODE (expr.value) == COMPONENT_REF
2186           && DECL_C_BIT_FIELD (TREE_OPERAND (expr.value, 1)))
2187         error ("%H%<typeof%> applied to a bit-field", &here);
2188       ret.spec = TREE_TYPE (expr.value);
2189       was_vm = variably_modified_type_p (ret.spec, NULL_TREE);
2190       /* This should be returned with the type so that when the type
2191          is evaluated, this can be evaluated.  For now, we avoid
2192          evaluation when the context might.  */
2193       if (!skip_evaluation && was_vm)
2194         {
2195           tree e = expr.value;
2196
2197           /* If the expression is not of a type to which we cannot assign a line
2198              number, wrap the thing in a no-op NOP_EXPR.  */
2199           if (DECL_P (e) || CONSTANT_CLASS_P (e))
2200             e = build1 (NOP_EXPR, void_type_node, e);
2201
2202           if (CAN_HAVE_LOCATION_P (e))
2203             SET_EXPR_LOCATION (e, input_location);
2204
2205           add_stmt (e);
2206         }
2207       pop_maybe_used (was_vm);
2208     }
2209   c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
2210   return ret;
2211 }
2212
2213 /* Parse a declarator, possibly an abstract declarator (C90 6.5.4,
2214    6.5.5, C99 6.7.5, 6.7.6).  If TYPE_SEEN_P then a typedef name may
2215    be redeclared; otherwise it may not.  KIND indicates which kind of
2216    declarator is wanted.  Returns a valid declarator except in the
2217    case of a syntax error in which case NULL is returned.  *SEEN_ID is
2218    set to true if an identifier being declared is seen; this is used
2219    to diagnose bad forms of abstract array declarators and to
2220    determine whether an identifier list is syntactically permitted.
2221
2222    declarator:
2223      pointer[opt] direct-declarator
2224
2225    direct-declarator:
2226      identifier
2227      ( attributes[opt] declarator )
2228      direct-declarator array-declarator
2229      direct-declarator ( parameter-type-list )
2230      direct-declarator ( identifier-list[opt] )
2231
2232    pointer:
2233      * type-qualifier-list[opt]
2234      * type-qualifier-list[opt] pointer
2235
2236    type-qualifier-list:
2237      type-qualifier
2238      attributes
2239      type-qualifier-list type-qualifier
2240      type-qualifier-list attributes
2241
2242    parameter-type-list:
2243      parameter-list
2244      parameter-list , ...
2245
2246    parameter-list:
2247      parameter-declaration
2248      parameter-list , parameter-declaration
2249
2250    parameter-declaration:
2251      declaration-specifiers declarator attributes[opt]
2252      declaration-specifiers abstract-declarator[opt] attributes[opt]
2253
2254    identifier-list:
2255      identifier
2256      identifier-list , identifier
2257
2258    abstract-declarator:
2259      pointer
2260      pointer[opt] direct-abstract-declarator
2261
2262    direct-abstract-declarator:
2263      ( attributes[opt] abstract-declarator )
2264      direct-abstract-declarator[opt] array-declarator
2265      direct-abstract-declarator[opt] ( parameter-type-list[opt] )
2266
2267    GNU extensions:
2268
2269    direct-declarator:
2270      direct-declarator ( parameter-forward-declarations
2271                          parameter-type-list[opt] )
2272
2273    direct-abstract-declarator:
2274      direct-abstract-declarator[opt] ( parameter-forward-declarations
2275                                        parameter-type-list[opt] )
2276
2277    parameter-forward-declarations:
2278      parameter-list ;
2279      parameter-forward-declarations parameter-list ;
2280
2281    The uses of attributes shown above are GNU extensions.
2282
2283    Some forms of array declarator are not included in C99 in the
2284    syntax for abstract declarators; these are disallowed elsewhere.
2285    This may be a defect (DR#289).
2286
2287    This function also accepts an omitted abstract declarator as being
2288    an abstract declarator, although not part of the formal syntax.  */
2289
2290 static struct c_declarator *
2291 c_parser_declarator (c_parser *parser, bool type_seen_p, c_dtr_syn kind,
2292                      bool *seen_id)
2293 {
2294   /* Parse any initial pointer part.  */
2295   if (c_parser_next_token_is (parser, CPP_MULT))
2296     {
2297       struct c_declspecs *quals_attrs = build_null_declspecs ();
2298       struct c_declarator *inner;
2299       c_parser_consume_token (parser);
2300       c_parser_declspecs (parser, quals_attrs, false, false, true);
2301       inner = c_parser_declarator (parser, type_seen_p, kind, seen_id);
2302       if (inner == NULL)
2303         return NULL;
2304       else
2305         return make_pointer_declarator (quals_attrs, inner);
2306     }
2307   /* Now we have a direct declarator, direct abstract declarator or
2308      nothing (which counts as a direct abstract declarator here).  */
2309   return c_parser_direct_declarator (parser, type_seen_p, kind, seen_id);
2310 }
2311
2312 /* Parse a direct declarator or direct abstract declarator; arguments
2313    as c_parser_declarator.  */
2314
2315 static struct c_declarator *
2316 c_parser_direct_declarator (c_parser *parser, bool type_seen_p, c_dtr_syn kind,
2317                             bool *seen_id)
2318 {
2319   /* The direct declarator must start with an identifier (possibly
2320      omitted) or a parenthesized declarator (possibly abstract).  In
2321      an ordinary declarator, initial parentheses must start a
2322      parenthesized declarator.  In an abstract declarator or parameter
2323      declarator, they could start a parenthesized declarator or a
2324      parameter list.  To tell which, the open parenthesis and any
2325      following attributes must be read.  If a declaration specifier
2326      follows, then it is a parameter list; if the specifier is a
2327      typedef name, there might be an ambiguity about redeclaring it,
2328      which is resolved in the direction of treating it as a typedef
2329      name.  If a close parenthesis follows, it is also an empty
2330      parameter list, as the syntax does not permit empty abstract
2331      declarators.  Otherwise, it is a parenthesized declarator (in
2332      which case the analysis may be repeated inside it, recursively).
2333
2334      ??? There is an ambiguity in a parameter declaration "int
2335      (__attribute__((foo)) x)", where x is not a typedef name: it
2336      could be an abstract declarator for a function, or declare x with
2337      parentheses.  The proper resolution of this ambiguity needs
2338      documenting.  At present we follow an accident of the old
2339      parser's implementation, whereby the first parameter must have
2340      some declaration specifiers other than just attributes.  Thus as
2341      a parameter declaration it is treated as a parenthesized
2342      parameter named x, and as an abstract declarator it is
2343      rejected.
2344
2345      ??? Also following the old parser, attributes inside an empty
2346      parameter list are ignored, making it a list not yielding a
2347      prototype, rather than giving an error or making it have one
2348      parameter with implicit type int.
2349
2350      ??? Also following the old parser, typedef names may be
2351      redeclared in declarators, but not Objective-C class names.  */
2352
2353   if (kind != C_DTR_ABSTRACT
2354       && c_parser_next_token_is (parser, CPP_NAME)
2355       && ((type_seen_p
2356            && c_parser_peek_token (parser)->id_kind == C_ID_TYPENAME)
2357           || c_parser_peek_token (parser)->id_kind == C_ID_ID))
2358     {
2359       struct c_declarator *inner
2360         = build_id_declarator (c_parser_peek_token (parser)->value);
2361       *seen_id = true;
2362       inner->id_loc = c_parser_peek_token (parser)->location;
2363       c_parser_consume_token (parser);
2364       return c_parser_direct_declarator_inner (parser, *seen_id, inner);
2365     }
2366
2367   if (kind != C_DTR_NORMAL
2368       && c_parser_next_token_is (parser, CPP_OPEN_SQUARE))
2369     {
2370       struct c_declarator *inner = build_id_declarator (NULL_TREE);
2371       return c_parser_direct_declarator_inner (parser, *seen_id, inner);
2372     }
2373
2374   /* Either we are at the end of an abstract declarator, or we have
2375      parentheses.  */
2376
2377   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
2378     {
2379       tree attrs;
2380       struct c_declarator *inner;
2381       c_parser_consume_token (parser);
2382       attrs = c_parser_attributes (parser);
2383       if (kind != C_DTR_NORMAL
2384           && (c_parser_next_token_starts_declspecs (parser)
2385               || c_parser_next_token_is (parser, CPP_CLOSE_PAREN)))
2386         {
2387           struct c_arg_info *args
2388             = c_parser_parms_declarator (parser, kind == C_DTR_NORMAL,
2389                                          attrs);
2390           if (args == NULL)
2391             return NULL;
2392           else
2393             {
2394               inner
2395                 = build_function_declarator (args,
2396                                              build_id_declarator (NULL_TREE));
2397               return c_parser_direct_declarator_inner (parser, *seen_id,
2398                                                        inner);
2399             }
2400         }
2401       /* A parenthesized declarator.  */
2402       inner = c_parser_declarator (parser, type_seen_p, kind, seen_id);
2403       if (inner != NULL && attrs != NULL)
2404         inner = build_attrs_declarator (attrs, inner);
2405       if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2406         {
2407           c_parser_consume_token (parser);
2408           if (inner == NULL)
2409             return NULL;
2410           else
2411             return c_parser_direct_declarator_inner (parser, *seen_id, inner);
2412         }
2413       else
2414         {
2415           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2416                                      "expected %<)%>");
2417           return NULL;
2418         }
2419     }
2420   else
2421     {
2422       if (kind == C_DTR_NORMAL)
2423         {
2424           c_parser_error (parser, "expected identifier or %<(%>");
2425           return NULL;
2426         }
2427       else
2428         return build_id_declarator (NULL_TREE);
2429     }
2430 }
2431
2432 /* Parse part of a direct declarator or direct abstract declarator,
2433    given that some (in INNER) has already been parsed; ID_PRESENT is
2434    true if an identifier is present, false for an abstract
2435    declarator.  */
2436
2437 static struct c_declarator *
2438 c_parser_direct_declarator_inner (c_parser *parser, bool id_present,
2439                                   struct c_declarator *inner)
2440 {
2441   /* Parse a sequence of array declarators and parameter lists.  */
2442   if (c_parser_next_token_is (parser, CPP_OPEN_SQUARE))
2443     {
2444       struct c_declarator *declarator;
2445       struct c_declspecs *quals_attrs = build_null_declspecs ();
2446       bool static_seen;
2447       bool star_seen;
2448       tree dimen;
2449       c_parser_consume_token (parser);
2450       c_parser_declspecs (parser, quals_attrs, false, false, true);
2451       static_seen = c_parser_next_token_is_keyword (parser, RID_STATIC);
2452       if (static_seen)
2453         c_parser_consume_token (parser);
2454       if (static_seen && !quals_attrs->declspecs_seen_p)
2455         c_parser_declspecs (parser, quals_attrs, false, false, true);
2456       if (!quals_attrs->declspecs_seen_p)
2457         quals_attrs = NULL;
2458       /* If "static" is present, there must be an array dimension.
2459          Otherwise, there may be a dimension, "*", or no
2460          dimension.  */
2461       if (static_seen)
2462         {
2463           star_seen = false;
2464           dimen = c_parser_expr_no_commas (parser, NULL).value;
2465         }
2466       else
2467         {
2468           if (c_parser_next_token_is (parser, CPP_CLOSE_SQUARE))
2469             {
2470               dimen = NULL_TREE;
2471               star_seen = false;
2472             }
2473           else if (c_parser_next_token_is (parser, CPP_MULT))
2474             {
2475               if (c_parser_peek_2nd_token (parser)->type == CPP_CLOSE_SQUARE)
2476                 {
2477                   dimen = NULL_TREE;
2478                   star_seen = true;
2479                   c_parser_consume_token (parser);
2480                 }
2481               else
2482                 {
2483                   star_seen = false;
2484                   dimen = c_parser_expr_no_commas (parser, NULL).value;
2485                 }
2486             }
2487           else
2488             {
2489               star_seen = false;
2490               dimen = c_parser_expr_no_commas (parser, NULL).value;
2491             }
2492         }
2493       if (c_parser_next_token_is (parser, CPP_CLOSE_SQUARE))
2494         c_parser_consume_token (parser);
2495       else
2496         {
2497           c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
2498                                      "expected %<]%>");
2499           return NULL;
2500         }
2501       declarator = build_array_declarator (dimen, quals_attrs, static_seen,
2502                                            star_seen);
2503       if (declarator == NULL)
2504         return NULL;
2505       inner = set_array_declarator_inner (declarator, inner);
2506       return c_parser_direct_declarator_inner (parser, id_present, inner);
2507     }
2508   else if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
2509     {
2510       tree attrs;
2511       struct c_arg_info *args;
2512       c_parser_consume_token (parser);
2513       attrs = c_parser_attributes (parser);
2514       args = c_parser_parms_declarator (parser, id_present, attrs);
2515       if (args == NULL)
2516         return NULL;
2517       else
2518         {
2519           inner = build_function_declarator (args, inner);
2520           return c_parser_direct_declarator_inner (parser, id_present, inner);
2521         }
2522     }
2523   return inner;
2524 }
2525
2526 /* Parse a parameter list or identifier list, including the closing
2527    parenthesis but not the opening one.  ATTRS are the attributes at
2528    the start of the list.  ID_LIST_OK is true if an identifier list is
2529    acceptable; such a list must not have attributes at the start.  */
2530
2531 static struct c_arg_info *
2532 c_parser_parms_declarator (c_parser *parser, bool id_list_ok, tree attrs)
2533 {
2534   push_scope ();
2535   declare_parm_level ();
2536   /* If the list starts with an identifier, it is an identifier list.
2537      Otherwise, it is either a prototype list or an empty list.  */
2538   if (id_list_ok
2539       && !attrs
2540       && c_parser_next_token_is (parser, CPP_NAME)
2541       && c_parser_peek_token (parser)->id_kind == C_ID_ID)
2542     {
2543       tree list = NULL_TREE, *nextp = &list;
2544       while (c_parser_next_token_is (parser, CPP_NAME)
2545              && c_parser_peek_token (parser)->id_kind == C_ID_ID)
2546         {
2547           *nextp = build_tree_list (NULL_TREE,
2548                                     c_parser_peek_token (parser)->value);
2549           nextp = & TREE_CHAIN (*nextp);
2550           c_parser_consume_token (parser);
2551           if (c_parser_next_token_is_not (parser, CPP_COMMA))
2552             break;
2553           c_parser_consume_token (parser);
2554           if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2555             {
2556               c_parser_error (parser, "expected identifier");
2557               break;
2558             }
2559         }
2560       if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2561         {
2562           struct c_arg_info *ret = XOBNEW (&parser_obstack, struct c_arg_info);
2563           ret->parms = 0;
2564           ret->tags = 0;
2565           ret->types = list;
2566           ret->others = 0;
2567           ret->pending_sizes = 0;
2568           ret->had_vla_unspec = 0;
2569           c_parser_consume_token (parser);
2570           pop_scope ();
2571           return ret;
2572         }
2573       else
2574         {
2575           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2576                                      "expected %<)%>");
2577           pop_scope ();
2578           return NULL;
2579         }
2580     }
2581   else
2582     {
2583       struct c_arg_info *ret = c_parser_parms_list_declarator (parser, attrs);
2584       pop_scope ();
2585       return ret;
2586     }
2587 }
2588
2589 /* Parse a parameter list (possibly empty), including the closing
2590    parenthesis but not the opening one.  ATTRS are the attributes at
2591    the start of the list.  */
2592
2593 static struct c_arg_info *
2594 c_parser_parms_list_declarator (c_parser *parser, tree attrs)
2595 {
2596   bool good_parm = false;
2597   /* ??? Following the old parser, forward parameter declarations may
2598      use abstract declarators, and if no real parameter declarations
2599      follow the forward declarations then this is not diagnosed.  Also
2600      note as above that attributes are ignored as the only contents of
2601      the parentheses, or as the only contents after forward
2602      declarations.  */
2603   if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2604     {
2605       struct c_arg_info *ret = XOBNEW (&parser_obstack, struct c_arg_info);
2606       ret->parms = 0;
2607       ret->tags = 0;
2608       ret->types = 0;
2609       ret->others = 0;
2610       ret->pending_sizes = 0;
2611       ret->had_vla_unspec = 0;
2612       c_parser_consume_token (parser);
2613       return ret;
2614     }
2615   if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
2616     {
2617       struct c_arg_info *ret = XOBNEW (&parser_obstack, struct c_arg_info);
2618       ret->parms = 0;
2619       ret->tags = 0;
2620       ret->others = 0;
2621       ret->pending_sizes = 0;
2622       ret->had_vla_unspec = 0;
2623       /* Suppress -Wold-style-definition for this case.  */
2624       ret->types = error_mark_node;
2625       error ("%HISO C requires a named argument before %<...%>",
2626              &c_parser_peek_token (parser)->location);
2627       c_parser_consume_token (parser);
2628       if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2629         {
2630           c_parser_consume_token (parser);
2631           return ret;
2632         }
2633       else
2634         {
2635           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2636                                      "expected %<)%>");
2637           return NULL;
2638         }
2639     }
2640   /* Nonempty list of parameters, either terminated with semicolon
2641      (forward declarations; recurse) or with close parenthesis (normal
2642      function) or with ", ... )" (variadic function).  */
2643   while (true)
2644     {
2645       /* Parse a parameter.  */
2646       struct c_parm *parm = c_parser_parameter_declaration (parser, attrs);
2647       attrs = NULL_TREE;
2648       if (parm != NULL)
2649         {
2650           good_parm = true;
2651           push_parm_decl (parm);
2652         }
2653       if (c_parser_next_token_is (parser, CPP_SEMICOLON))
2654         {
2655           tree new_attrs;
2656           c_parser_consume_token (parser);
2657           mark_forward_parm_decls ();
2658           new_attrs = c_parser_attributes (parser);
2659           return c_parser_parms_list_declarator (parser, new_attrs);
2660         }
2661       if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2662         {
2663           c_parser_consume_token (parser);
2664           if (good_parm)
2665             return get_parm_info (false);
2666           else
2667             {
2668               struct c_arg_info *ret
2669                 = XOBNEW (&parser_obstack, struct c_arg_info);
2670               ret->parms = 0;
2671               ret->tags = 0;
2672               ret->types = 0;
2673               ret->others = 0;
2674               ret->pending_sizes = 0;
2675               ret->had_vla_unspec = 0;
2676               return ret;
2677             }
2678         }
2679       if (!c_parser_require (parser, CPP_COMMA,
2680                              "expected %<;%>, %<,%> or %<)%>"))
2681         {
2682           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
2683           return NULL;
2684         }
2685       if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
2686         {
2687           c_parser_consume_token (parser);
2688           if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2689             {
2690               c_parser_consume_token (parser);
2691               if (good_parm)
2692                 return get_parm_info (true);
2693               else
2694                 {
2695                   struct c_arg_info *ret
2696                     = XOBNEW (&parser_obstack, struct c_arg_info);
2697                   ret->parms = 0;
2698                   ret->tags = 0;
2699                   ret->types = 0;
2700                   ret->others = 0;
2701                   ret->pending_sizes = 0;
2702                   ret->had_vla_unspec = 0;
2703                   return ret;
2704                 }
2705             }
2706           else
2707             {
2708               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2709                                          "expected %<)%>");
2710               return NULL;
2711             }
2712         }
2713     }
2714 }
2715
2716 /* Parse a parameter declaration.  ATTRS are the attributes at the
2717    start of the declaration if it is the first parameter.  */
2718
2719 static struct c_parm *
2720 c_parser_parameter_declaration (c_parser *parser, tree attrs)
2721 {
2722   struct c_declspecs *specs;
2723   struct c_declarator *declarator;
2724   tree prefix_attrs;
2725   tree postfix_attrs = NULL_TREE;
2726   bool dummy = false;
2727   if (!c_parser_next_token_starts_declspecs (parser))
2728     {
2729       /* ??? In some Objective-C cases '...' isn't applicable so there
2730          should be a different message.  */
2731       c_parser_error (parser,
2732                       "expected declaration specifiers or %<...%>");
2733       c_parser_skip_to_end_of_parameter (parser);
2734       return NULL;
2735     }
2736   specs = build_null_declspecs ();
2737   if (attrs)
2738     {
2739       declspecs_add_attrs (specs, attrs);
2740       attrs = NULL_TREE;
2741     }
2742   c_parser_declspecs (parser, specs, true, true, true);
2743   finish_declspecs (specs);
2744   pending_xref_error ();
2745   prefix_attrs = specs->attrs;
2746   specs->attrs = NULL_TREE;
2747   declarator = c_parser_declarator (parser, specs->type_seen_p,
2748                                     C_DTR_PARM, &dummy);
2749   if (declarator == NULL)
2750     {
2751       c_parser_skip_until_found (parser, CPP_COMMA, NULL);
2752       return NULL;
2753     }
2754   if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
2755     postfix_attrs = c_parser_attributes (parser);
2756   return build_c_parm (specs, chainon (postfix_attrs, prefix_attrs),
2757                        declarator);
2758 }
2759
2760 /* Parse a string literal in an asm expression.  It should not be
2761    translated, and wide string literals are an error although
2762    permitted by the syntax.  This is a GNU extension.
2763
2764    asm-string-literal:
2765      string-literal
2766
2767    ??? At present, following the old parser, the caller needs to have
2768    set lex_untranslated_string to 1.  It would be better to follow the
2769    C++ parser rather than using this kludge.  */
2770
2771 static tree
2772 c_parser_asm_string_literal (c_parser *parser)
2773 {
2774   tree str;
2775   if (c_parser_next_token_is (parser, CPP_STRING))
2776     {
2777       str = c_parser_peek_token (parser)->value;
2778       c_parser_consume_token (parser);
2779     }
2780   else if (c_parser_next_token_is (parser, CPP_WSTRING))
2781     {
2782       error ("%Hwide string literal in %<asm%>",
2783              &c_parser_peek_token (parser)->location);
2784       str = build_string (1, "");
2785       c_parser_consume_token (parser);
2786     }
2787   else
2788     {
2789       c_parser_error (parser, "expected string literal");
2790       str = NULL_TREE;
2791     }
2792   return str;
2793 }
2794
2795 /* Parse a simple asm expression.  This is used in restricted
2796    contexts, where a full expression with inputs and outputs does not
2797    make sense.  This is a GNU extension.
2798
2799    simple-asm-expr:
2800      asm ( asm-string-literal )
2801 */
2802
2803 static tree
2804 c_parser_simple_asm_expr (c_parser *parser)
2805 {
2806   tree str;
2807   gcc_assert (c_parser_next_token_is_keyword (parser, RID_ASM));
2808   /* ??? Follow the C++ parser rather than using the
2809      lex_untranslated_string kludge.  */
2810   parser->lex_untranslated_string = true;
2811   c_parser_consume_token (parser);
2812   if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
2813     {
2814       parser->lex_untranslated_string = false;
2815       return NULL_TREE;
2816     }
2817   str = c_parser_asm_string_literal (parser);
2818   parser->lex_untranslated_string = false;
2819   if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
2820     {
2821       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
2822       return NULL_TREE;
2823     }
2824   return str;
2825 }
2826
2827 /* Parse (possibly empty) attributes.  This is a GNU extension.
2828
2829    attributes:
2830      empty
2831      attributes attribute
2832
2833    attribute:
2834      __attribute__ ( ( attribute-list ) )
2835
2836    attribute-list:
2837      attrib
2838      attribute_list , attrib
2839
2840    attrib:
2841      empty
2842      any-word
2843      any-word ( identifier )
2844      any-word ( identifier , nonempty-expr-list )
2845      any-word ( expr-list )
2846
2847    where the "identifier" must not be declared as a type, and
2848    "any-word" may be any identifier (including one declared as a
2849    type), a reserved word storage class specifier, type specifier or
2850    type qualifier.  ??? This still leaves out most reserved keywords
2851    (following the old parser), shouldn't we include them, and why not
2852    allow identifiers declared as types to start the arguments?  */
2853
2854 static tree
2855 c_parser_attributes (c_parser *parser)
2856 {
2857   tree attrs = NULL_TREE;
2858   while (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
2859     {
2860       /* ??? Follow the C++ parser rather than using the
2861          lex_untranslated_string kludge.  */
2862       parser->lex_untranslated_string = true;
2863       c_parser_consume_token (parser);
2864       if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
2865         {
2866           parser->lex_untranslated_string = false;
2867           return attrs;
2868         }
2869       if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
2870         {
2871           parser->lex_untranslated_string = false;
2872           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
2873           return attrs;
2874         }
2875       /* Parse the attribute list.  */
2876       while (c_parser_next_token_is (parser, CPP_COMMA)
2877              || c_parser_next_token_is (parser, CPP_NAME)
2878              || c_parser_next_token_is (parser, CPP_KEYWORD))
2879         {
2880           tree attr, attr_name, attr_args;
2881           if (c_parser_next_token_is (parser, CPP_COMMA))
2882             {
2883               c_parser_consume_token (parser);
2884               continue;
2885             }
2886           if (c_parser_next_token_is (parser, CPP_KEYWORD))
2887             {
2888               /* ??? See comment above about what keywords are
2889                  accepted here.  */
2890               bool ok;
2891               switch (c_parser_peek_token (parser)->keyword)
2892                 {
2893                 case RID_STATIC:
2894                 case RID_UNSIGNED:
2895                 case RID_LONG:
2896                 case RID_CONST:
2897                 case RID_EXTERN:
2898                 case RID_REGISTER:
2899                 case RID_TYPEDEF:
2900                 case RID_SHORT:
2901                 case RID_INLINE:
2902                 case RID_VOLATILE:
2903                 case RID_SIGNED:
2904                 case RID_AUTO:
2905                 case RID_RESTRICT:
2906                 case RID_COMPLEX:
2907                 case RID_THREAD:
2908                 case RID_INT:
2909                 case RID_CHAR:
2910                 case RID_FLOAT:
2911                 case RID_DOUBLE:
2912                 case RID_VOID:
2913                 case RID_DFLOAT32:
2914                 case RID_DFLOAT64:
2915                 case RID_DFLOAT128:
2916                 case RID_BOOL:
2917                 case RID_FRACT:
2918                 case RID_ACCUM:
2919                 case RID_SAT:
2920                   ok = true;
2921                   break;
2922                 default:
2923                   ok = false;
2924                   break;
2925                 }
2926               if (!ok)
2927                 break;
2928             }
2929           attr_name = c_parser_peek_token (parser)->value;
2930           c_parser_consume_token (parser);
2931           if (c_parser_next_token_is_not (parser, CPP_OPEN_PAREN))
2932             {
2933               attr = build_tree_list (attr_name, NULL_TREE);
2934               attrs = chainon (attrs, attr);
2935               continue;
2936             }
2937           c_parser_consume_token (parser);
2938           /* Parse the attribute contents.  If they start with an
2939              identifier which is followed by a comma or close
2940              parenthesis, then the arguments start with that
2941              identifier; otherwise they are an expression list.  */
2942           if (c_parser_next_token_is (parser, CPP_NAME)
2943               && c_parser_peek_token (parser)->id_kind == C_ID_ID
2944               && ((c_parser_peek_2nd_token (parser)->type == CPP_COMMA)
2945                   || (c_parser_peek_2nd_token (parser)->type
2946                       == CPP_CLOSE_PAREN)))
2947             {
2948               tree arg1 = c_parser_peek_token (parser)->value;
2949               c_parser_consume_token (parser);
2950               if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2951                 attr_args = build_tree_list (NULL_TREE, arg1);
2952               else
2953                 {
2954                   c_parser_consume_token (parser);
2955                   attr_args = tree_cons (NULL_TREE, arg1,
2956                                          c_parser_expr_list (parser, false));
2957                 }
2958             }
2959           else
2960             {
2961               if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2962                 attr_args = NULL_TREE;
2963               else
2964                 attr_args = c_parser_expr_list (parser, false);
2965             }
2966           attr = build_tree_list (attr_name, attr_args);
2967           if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2968             c_parser_consume_token (parser);
2969           else
2970             {
2971               parser->lex_untranslated_string = false;
2972               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2973                                          "expected %<)%>");
2974               return attrs;
2975             }
2976           attrs = chainon (attrs, attr);
2977         }
2978       if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2979         c_parser_consume_token (parser);
2980       else
2981         {
2982           parser->lex_untranslated_string = false;
2983           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2984                                      "expected %<)%>");
2985           return attrs;
2986         }
2987       if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2988         c_parser_consume_token (parser);
2989       else
2990         {
2991           parser->lex_untranslated_string = false;
2992           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2993                                      "expected %<)%>");
2994           return attrs;
2995         }
2996       parser->lex_untranslated_string = false;
2997     }
2998   return attrs;
2999 }
3000
3001 /* Parse a type name (C90 6.5.5, C99 6.7.6).
3002
3003    type-name:
3004      specifier-qualifier-list abstract-declarator[opt]
3005 */
3006
3007 static struct c_type_name *
3008 c_parser_type_name (c_parser *parser)
3009 {
3010   struct c_declspecs *specs = build_null_declspecs ();
3011   struct c_declarator *declarator;
3012   struct c_type_name *ret;
3013   bool dummy = false;
3014   c_parser_declspecs (parser, specs, false, true, true);
3015   if (!specs->declspecs_seen_p)
3016     {
3017       c_parser_error (parser, "expected specifier-qualifier-list");
3018       return NULL;
3019     }
3020   pending_xref_error ();
3021   finish_declspecs (specs);
3022   declarator = c_parser_declarator (parser, specs->type_seen_p,
3023                                     C_DTR_ABSTRACT, &dummy);
3024   if (declarator == NULL)
3025     return NULL;
3026   ret = XOBNEW (&parser_obstack, struct c_type_name);
3027   ret->specs = specs;
3028   ret->declarator = declarator;
3029   return ret;
3030 }
3031
3032 /* Parse an initializer (C90 6.5.7, C99 6.7.8).
3033
3034    initializer:
3035      assignment-expression
3036      { initializer-list }
3037      { initializer-list , }
3038
3039    initializer-list:
3040      designation[opt] initializer
3041      initializer-list , designation[opt] initializer
3042
3043    designation:
3044      designator-list =
3045
3046    designator-list:
3047      designator
3048      designator-list designator
3049
3050    designator:
3051      array-designator
3052      . identifier
3053
3054    array-designator:
3055      [ constant-expression ]
3056
3057    GNU extensions:
3058
3059    initializer:
3060      { }
3061
3062    designation:
3063      array-designator
3064      identifier :
3065
3066    array-designator:
3067      [ constant-expression ... constant-expression ]
3068
3069    Any expression without commas is accepted in the syntax for the
3070    constant-expressions, with non-constant expressions rejected later.
3071
3072    This function is only used for top-level initializers; for nested
3073    ones, see c_parser_initval.  */
3074
3075 static struct c_expr
3076 c_parser_initializer (c_parser *parser)
3077 {
3078   if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
3079     return c_parser_braced_init (parser, NULL_TREE, false);
3080   else
3081     {
3082       struct c_expr ret;
3083       ret = c_parser_expr_no_commas (parser, NULL);
3084       if (TREE_CODE (ret.value) != STRING_CST
3085           && TREE_CODE (ret.value) != COMPOUND_LITERAL_EXPR)
3086         ret = default_function_array_conversion (ret);
3087       return ret;
3088     }
3089 }
3090
3091 /* Parse a braced initializer list.  TYPE is the type specified for a
3092    compound literal, and NULL_TREE for other initializers and for
3093    nested braced lists.  NESTED_P is true for nested braced lists,
3094    false for the list of a compound literal or the list that is the
3095    top-level initializer in a declaration.  */
3096
3097 static struct c_expr
3098 c_parser_braced_init (c_parser *parser, tree type, bool nested_p)
3099 {
3100   location_t brace_loc = c_parser_peek_token (parser)->location;
3101   gcc_assert (c_parser_next_token_is (parser, CPP_OPEN_BRACE));
3102   c_parser_consume_token (parser);
3103   if (nested_p)
3104     push_init_level (0);
3105   else
3106     really_start_incremental_init (type);
3107   if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
3108     {
3109       if (pedantic)
3110         pedwarn ("%HISO C forbids empty initializer braces", &brace_loc);
3111     }
3112   else
3113     {
3114       /* Parse a non-empty initializer list, possibly with a trailing
3115          comma.  */
3116       while (true)
3117         {
3118           c_parser_initelt (parser);
3119           if (parser->error)
3120             break;
3121           if (c_parser_next_token_is (parser, CPP_COMMA))
3122             c_parser_consume_token (parser);
3123           else
3124             break;
3125           if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
3126             break;
3127         }
3128     }
3129   if (c_parser_next_token_is_not (parser, CPP_CLOSE_BRACE))
3130     {
3131       struct c_expr ret;
3132       ret.value = error_mark_node;
3133       ret.original_code = ERROR_MARK;
3134       c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, "expected %<}%>");
3135       return ret;
3136     }
3137   c_parser_consume_token (parser);
3138   return pop_init_level (0);
3139 }
3140
3141 /* Parse a nested initializer, including designators.  */
3142
3143 static void
3144 c_parser_initelt (c_parser *parser)
3145 {
3146   /* Parse any designator or designator list.  A single array
3147      designator may have the subsequent "=" omitted in GNU C, but a
3148      longer list or a structure member designator may not.  */
3149   if (c_parser_next_token_is (parser, CPP_NAME)
3150       && c_parser_peek_2nd_token (parser)->type == CPP_COLON)
3151     {
3152       /* Old-style structure member designator.  */
3153       set_init_label (c_parser_peek_token (parser)->value);
3154       if (pedantic)
3155         {
3156           /* Use the colon as the error location.  */
3157           pedwarn ("%Hobsolete use of designated initializer with %<:%>",
3158                    &c_parser_peek_2nd_token (parser)->location);
3159         }
3160       c_parser_consume_token (parser);
3161       c_parser_consume_token (parser);
3162     }
3163   else
3164     {
3165       /* des_seen is 0 if there have been no designators, 1 if there
3166          has been a single array designator and 2 otherwise.  */
3167       int des_seen = 0;
3168       /* Location of a designator.  */
3169       location_t des_loc;
3170       while (c_parser_next_token_is (parser, CPP_OPEN_SQUARE)
3171              || c_parser_next_token_is (parser, CPP_DOT))
3172         {
3173           int des_prev = des_seen;
3174           if (!des_seen)
3175             des_loc = c_parser_peek_token (parser)->location;
3176           if (des_seen < 2)
3177             des_seen++;
3178           if (c_parser_next_token_is (parser, CPP_DOT))
3179             {
3180               des_seen = 2;
3181               c_parser_consume_token (parser);
3182               if (c_parser_next_token_is (parser, CPP_NAME))
3183                 {
3184                   set_init_label (c_parser_peek_token (parser)->value);
3185                   c_parser_consume_token (parser);
3186                 }
3187               else
3188                 {
3189                   struct c_expr init;
3190                   init.value = error_mark_node;
3191                   init.original_code = ERROR_MARK;
3192                   c_parser_error (parser, "expected identifier");
3193                   c_parser_skip_until_found (parser, CPP_COMMA, NULL);
3194                   process_init_element (init);
3195                   return;
3196                 }
3197             }
3198           else
3199             {
3200               tree first, second;
3201               location_t ellipsis_loc;
3202               /* ??? Following the old parser, [ objc-receiver
3203                  objc-message-args ] is accepted as an initializer,
3204                  being distinguished from a designator by what follows
3205                  the first assignment expression inside the square
3206                  brackets, but after a first array designator a
3207                  subsequent square bracket is for Objective-C taken to
3208                  start an expression, using the obsolete form of
3209                  designated initializer without '=', rather than
3210                  possibly being a second level of designation: in LALR
3211                  terms, the '[' is shifted rather than reducing
3212                  designator to designator-list.  */
3213               if (des_prev == 1 && c_dialect_objc ())
3214                 {
3215                   des_seen = des_prev;
3216                   break;
3217                 }
3218               if (des_prev == 0 && c_dialect_objc ())
3219                 {
3220                   /* This might be an array designator or an
3221                      Objective-C message expression.  If the former,
3222                      continue parsing here; if the latter, parse the
3223                      remainder of the initializer given the starting
3224                      primary-expression.  ??? It might make sense to
3225                      distinguish when des_prev == 1 as well; see
3226                      previous comment.  */
3227                   tree rec, args;
3228                   struct c_expr mexpr;
3229                   c_parser_consume_token (parser);
3230                   if (c_parser_peek_token (parser)->type == CPP_NAME
3231                       && ((c_parser_peek_token (parser)->id_kind
3232                            == C_ID_TYPENAME)
3233                           || (c_parser_peek_token (parser)->id_kind
3234                               == C_ID_CLASSNAME)))
3235                     {
3236                       /* Type name receiver.  */
3237                       tree id = c_parser_peek_token (parser)->value;
3238                       c_parser_consume_token (parser);
3239                       rec = objc_get_class_reference (id);
3240                       goto parse_message_args;
3241                     }
3242                   first = c_parser_expr_no_commas (parser, NULL).value;
3243                   if (c_parser_next_token_is (parser, CPP_ELLIPSIS)
3244                       || c_parser_next_token_is (parser, CPP_CLOSE_SQUARE))
3245                     goto array_desig_after_first;
3246                   /* Expression receiver.  So far only one part
3247                      without commas has been parsed; there might be
3248                      more of the expression.  */
3249                   rec = first;
3250                   while (c_parser_next_token_is (parser, CPP_COMMA))
3251                     {
3252                       struct c_expr next;
3253                       c_parser_consume_token (parser);
3254                       next = c_parser_expr_no_commas (parser, NULL);
3255                       next = default_function_array_conversion (next);
3256                       rec = build_compound_expr (rec, next.value);
3257                     }
3258                 parse_message_args:
3259                   /* Now parse the objc-message-args.  */
3260                   args = c_parser_objc_message_args (parser);
3261                   c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
3262                                              "expected %<]%>");
3263                   mexpr.value
3264                     = objc_build_message_expr (build_tree_list (rec, args));
3265                   mexpr.original_code = ERROR_MARK;
3266                   /* Now parse and process the remainder of the
3267                      initializer, starting with this message
3268                      expression as a primary-expression.  */
3269                   c_parser_initval (parser, &mexpr);
3270                   return;
3271                 }
3272               c_parser_consume_token (parser);
3273               first = c_parser_expr_no_commas (parser, NULL).value;
3274             array_desig_after_first:
3275               if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
3276                 {
3277                   ellipsis_loc = c_parser_peek_token (parser)->location;
3278                   c_parser_consume_token (parser);
3279                   second = c_parser_expr_no_commas (parser, NULL).value;
3280                 }
3281               else
3282                 second = NULL_TREE;
3283               if (c_parser_next_token_is (parser, CPP_CLOSE_SQUARE))
3284                 {
3285                   c_parser_consume_token (parser);
3286                   set_init_index (first, second);
3287                   if (pedantic && second)
3288                     pedwarn ("%HISO C forbids specifying range of "
3289                              "elements to initialize", &ellipsis_loc);
3290                 }
3291               else
3292                 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
3293                                            "expected %<]%>");
3294             }
3295         }
3296       if (des_seen >= 1)
3297         {
3298           if (c_parser_next_token_is (parser, CPP_EQ))
3299             {
3300               if (pedantic && !flag_isoc99)
3301                 pedwarn ("%HISO C90 forbids specifying subobject "
3302                          "to initialize", &des_loc);
3303               c_parser_consume_token (parser);
3304             }
3305           else
3306             {
3307               if (des_seen == 1)
3308                 {
3309                   if (pedantic)
3310                     pedwarn ("%Hobsolete use of designated initializer "
3311                              "without %<=%>",
3312                              &c_parser_peek_token (parser)->location);
3313                 }
3314               else
3315                 {
3316                   struct c_expr init;
3317                   init.value = error_mark_node;
3318                   init.original_code = ERROR_MARK;
3319                   c_parser_error (parser, "expected %<=%>");
3320                   c_parser_skip_until_found (parser, CPP_COMMA, NULL);
3321                   process_init_element (init);
3322                   return;
3323                 }
3324             }
3325         }
3326     }
3327   c_parser_initval (parser, NULL);
3328 }
3329
3330 /* Parse a nested initializer; as c_parser_initializer but parses
3331    initializers within braced lists, after any designators have been
3332    applied.  If AFTER is not NULL then it is an Objective-C message
3333    expression which is the primary-expression starting the
3334    initializer.  */
3335
3336 static void
3337 c_parser_initval (c_parser *parser, struct c_expr *after)
3338 {
3339   struct c_expr init;
3340   gcc_assert (!after || c_dialect_objc ());
3341   if (c_parser_next_token_is (parser, CPP_OPEN_BRACE) && !after)
3342     init = c_parser_braced_init (parser, NULL_TREE, true);
3343   else
3344     {
3345       init = c_parser_expr_no_commas (parser, after);
3346       if (init.value != NULL_TREE
3347           && TREE_CODE (init.value) != STRING_CST
3348           && TREE_CODE (init.value) != COMPOUND_LITERAL_EXPR)
3349         init = default_function_array_conversion (init);
3350     }
3351   process_init_element (init);
3352 }
3353
3354 /* Parse a compound statement (possibly a function body) (C90 6.6.2,
3355    C99 6.8.2).
3356
3357    compound-statement:
3358      { block-item-list[opt] }
3359      { label-declarations block-item-list }
3360
3361    block-item-list:
3362      block-item
3363      block-item-list block-item
3364
3365    block-item:
3366      nested-declaration
3367      statement
3368
3369    nested-declaration:
3370      declaration
3371
3372    GNU extensions:
3373
3374    compound-statement:
3375      { label-declarations block-item-list }
3376
3377    nested-declaration:
3378      __extension__ nested-declaration
3379      nested-function-definition
3380
3381    label-declarations:
3382      label-declaration
3383      label-declarations label-declaration
3384
3385    label-declaration:
3386      __label__ identifier-list ;
3387
3388    Allowing the mixing of declarations and code is new in C99.  The
3389    GNU syntax also permits (not shown above) labels at the end of
3390    compound statements, which yield an error.  We don't allow labels
3391    on declarations; this might seem like a natural extension, but
3392    there would be a conflict between attributes on the label and
3393    prefix attributes on the declaration.  ??? The syntax follows the
3394    old parser in requiring something after label declarations.
3395    Although they are erroneous if the labels declared aren't defined,
3396    is it useful for the syntax to be this way?
3397    
3398    OpenMP:
3399    
3400    block-item:
3401      openmp-directive
3402
3403    openmp-directive:
3404      barrier-directive
3405      flush-directive  */
3406
3407 static tree
3408 c_parser_compound_statement (c_parser *parser)
3409 {
3410   tree stmt;
3411   if (!c_parser_require (parser, CPP_OPEN_BRACE, "expected %<{%>"))
3412     return error_mark_node;
3413   stmt = c_begin_compound_stmt (true);
3414   c_parser_compound_statement_nostart (parser);
3415   return c_end_compound_stmt (stmt, true);
3416 }
3417
3418 /* Parse a compound statement except for the opening brace.  This is
3419    used for parsing both compound statements and statement expressions
3420    (which follow different paths to handling the opening).  */
3421
3422 static void
3423 c_parser_compound_statement_nostart (c_parser *parser)
3424 {
3425   bool last_stmt = false;
3426   bool last_label = false;
3427   location_t label_loc;
3428   if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
3429     {
3430       c_parser_consume_token (parser);
3431       return;
3432     }
3433   if (c_parser_next_token_is_keyword (parser, RID_LABEL))
3434     {
3435       location_t err_loc = c_parser_peek_token (parser)->location;
3436       /* Read zero or more forward-declarations for labels that nested
3437          functions can jump to.  */
3438       while (c_parser_next_token_is_keyword (parser, RID_LABEL))
3439         {
3440           c_parser_consume_token (parser);
3441           /* Any identifiers, including those declared as type names,
3442              are OK here.  */
3443           while (true)
3444             {
3445               tree label;
3446               if (c_parser_next_token_is_not (parser, CPP_NAME))
3447                 {
3448                   c_parser_error (parser, "expected identifier");
3449                   break;
3450                 }
3451               label
3452                 = declare_label (c_parser_peek_token (parser)->value);
3453               C_DECLARED_LABEL_FLAG (label) = 1;
3454               add_stmt (build_stmt (DECL_EXPR, label));
3455               c_parser_consume_token (parser);
3456               if (c_parser_next_token_is (parser, CPP_COMMA))
3457                 c_parser_consume_token (parser);
3458               else
3459                 break;
3460             }
3461           c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
3462         }
3463       if (pedantic)
3464         pedwarn ("%HISO C forbids label declarations", &err_loc);
3465     }
3466   /* We must now have at least one statement, label or declaration.  */
3467   if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
3468     {
3469       c_parser_error (parser, "expected declaration or statement");
3470       c_parser_consume_token (parser);
3471       return;
3472     }
3473   while (c_parser_next_token_is_not (parser, CPP_CLOSE_BRACE))
3474     {
3475       location_t loc = c_parser_peek_token (parser)->location;
3476       if (c_parser_next_token_is_keyword (parser, RID_CASE)
3477           || c_parser_next_token_is_keyword (parser, RID_DEFAULT)
3478           || (c_parser_next_token_is (parser, CPP_NAME)
3479               && c_parser_peek_2nd_token (parser)->type == CPP_COLON))
3480         {
3481           if (c_parser_next_token_is_keyword (parser, RID_CASE))
3482             label_loc = c_parser_peek_2nd_token (parser)->location;
3483           else
3484             label_loc = c_parser_peek_token (parser)->location;
3485           last_label = true;
3486           last_stmt = false;
3487           c_parser_label (parser);
3488         }
3489       else if (!last_label
3490                && c_parser_next_token_starts_declspecs (parser))
3491         {
3492           last_label = false;
3493           c_parser_declaration_or_fndef (parser, true, true, true, true);
3494           if (last_stmt
3495               && ((pedantic && !flag_isoc99)
3496                   || warn_declaration_after_statement))
3497             pedwarn_c90 ("%HISO C90 forbids mixed declarations and code",
3498                          &loc);
3499           last_stmt = false;
3500         }
3501       else if (!last_label
3502                && c_parser_next_token_is_keyword (parser, RID_EXTENSION))
3503         {
3504           /* __extension__ can start a declaration, but is also an
3505              unary operator that can start an expression.  Consume all
3506              but the last of a possible series of __extension__ to
3507              determine which.  */
3508           while (c_parser_peek_2nd_token (parser)->type == CPP_KEYWORD
3509                  && (c_parser_peek_2nd_token (parser)->keyword
3510                      == RID_EXTENSION))
3511             c_parser_consume_token (parser);
3512           if (c_token_starts_declspecs (c_parser_peek_2nd_token (parser)))
3513             {
3514               int ext;
3515               ext = disable_extension_diagnostics ();
3516               c_parser_consume_token (parser);
3517               last_label = false;
3518               c_parser_declaration_or_fndef (parser, true, true, true, true);
3519               /* Following the old parser, __extension__ does not
3520                  disable this diagnostic.  */
3521               restore_extension_diagnostics (ext);
3522               if (last_stmt
3523                   && ((pedantic && !flag_isoc99)
3524                       || warn_declaration_after_statement))
3525                 pedwarn_c90 ("%HISO C90 forbids mixed declarations and code",
3526                              &loc);
3527               last_stmt = false;
3528             }
3529           else
3530             goto statement;
3531         }
3532       else if (c_parser_next_token_is (parser, CPP_PRAGMA))
3533         {
3534           /* External pragmas, and some omp pragmas, are not associated
3535              with regular c code, and so are not to be considered statements
3536              syntactically.  This ensures that the user doesn't put them
3537              places that would turn into syntax errors if the directive
3538              were ignored.  */
3539           if (c_parser_pragma (parser, pragma_compound))
3540             last_label = false, last_stmt = true;
3541         }
3542       else if (c_parser_next_token_is (parser, CPP_EOF))
3543         {
3544           c_parser_error (parser, "expected declaration or statement");
3545           return;
3546         }
3547       else if (c_parser_next_token_is_keyword (parser, RID_ELSE))
3548         {
3549           if (parser->in_if_block) 
3550             {
3551               error ("%H""expected %<}%> before %<else%>", &loc);
3552               return;
3553             }
3554           else 
3555             {
3556               error ("%H%<else%> without a previous %<if%>", &loc);
3557               c_parser_consume_token (parser);
3558               continue;
3559             }
3560         }
3561       else
3562         {
3563         statement:
3564           last_label = false;
3565           last_stmt = true;
3566           c_parser_statement_after_labels (parser);
3567         }
3568
3569       parser->error = false;
3570     }
3571   if (last_label)
3572     error ("%Hlabel at end of compound statement", &label_loc);
3573   c_parser_consume_token (parser);
3574 }
3575
3576 /* Parse a label (C90 6.6.1, C99 6.8.1).
3577
3578    label:
3579      identifier : attributes[opt]
3580      case constant-expression :
3581      default :
3582
3583    GNU extensions:
3584
3585    label:
3586      case constant-expression ... constant-expression :
3587
3588    The use of attributes on labels is a GNU extension.  The syntax in
3589    GNU C accepts any expressions without commas, non-constant
3590    expressions being rejected later.  */
3591
3592 static void
3593 c_parser_label (c_parser *parser)
3594 {
3595   location_t loc1 = c_parser_peek_token (parser)->location;
3596   tree label = NULL_TREE;
3597   if (c_parser_next_token_is_keyword (parser, RID_CASE))
3598     {
3599       tree exp1, exp2;
3600       c_parser_consume_token (parser);
3601       exp1 = c_parser_expr_no_commas (parser, NULL).value;
3602       if (c_parser_next_token_is (parser, CPP_COLON))
3603         {
3604           c_parser_consume_token (parser);
3605           label = do_case (exp1, NULL_TREE);
3606         }
3607       else if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
3608         {
3609           c_parser_consume_token (parser);
3610           exp2 = c_parser_expr_no_commas (parser, NULL).value;
3611           if (c_parser_require (parser, CPP_COLON, "expected %<:%>"))
3612             label = do_case (exp1, exp2);
3613         }
3614       else
3615         c_parser_error (parser, "expected %<:%> or %<...%>");
3616     }
3617   else if (c_parser_next_token_is_keyword (parser, RID_DEFAULT))
3618     {
3619       c_parser_consume_token (parser);
3620       if (c_parser_require (parser, CPP_COLON, "expected %<:%>"))
3621         label = do_case (NULL_TREE, NULL_TREE);
3622     }
3623   else
3624     {
3625       tree name = c_parser_peek_token (parser)->value;
3626       tree tlab;
3627       tree attrs;
3628       location_t loc2 = c_parser_peek_token (parser)->location;
3629       gcc_assert (c_parser_next_token_is (parser, CPP_NAME));
3630       c_parser_consume_token (parser);
3631       gcc_assert (c_parser_next_token_is (parser, CPP_COLON));
3632       c_parser_consume_token (parser);
3633       attrs = c_parser_attributes (parser);
3634       tlab = define_label (loc2, name);
3635       if (tlab)
3636         {
3637           decl_attributes (&tlab, attrs, 0);
3638           label = add_stmt (build_stmt (LABEL_EXPR, tlab));
3639         }
3640     }
3641   if (label)
3642     {
3643       SET_EXPR_LOCATION (label, loc1);
3644       if (c_parser_next_token_starts_declspecs (parser)
3645           && !(c_parser_next_token_is (parser, CPP_NAME)
3646                && c_parser_peek_2nd_token (parser)->type == CPP_COLON))
3647         {
3648           error ("%Ha label can only be part of a statement and "
3649                  "a declaration is not a statement",
3650                  &c_parser_peek_token (parser)->location);
3651           c_parser_declaration_or_fndef (parser, /*fndef_ok*/ false, 
3652                                          /*nested*/ true, /*empty_ok*/ false,
3653                                          /*start_attr_ok*/ true);
3654         }
3655     }
3656 }
3657
3658 /* Parse a statement (C90 6.6, C99 6.8).
3659
3660    statement:
3661      labeled-statement
3662      compound-statement
3663      expression-statement
3664      selection-statement
3665      iteration-statement
3666      jump-statement
3667
3668    labeled-statement:
3669      label statement
3670
3671    expression-statement:
3672      expression[opt] ;
3673
3674    selection-statement:
3675      if-statement
3676      switch-statement
3677
3678    iteration-statement:
3679      while-statement
3680      do-statement
3681      for-statement
3682
3683    jump-statement:
3684      goto identifier ;
3685      continue ;
3686      break ;
3687      return expression[opt] ;
3688
3689    GNU extensions:
3690
3691    statement:
3692      asm-statement
3693
3694    jump-statement:
3695      goto * expression ;
3696
3697    Objective-C:
3698
3699    statement:
3700      objc-throw-statement
3701      objc-try-catch-statement
3702      objc-synchronized-statement
3703
3704    objc-throw-statement:
3705      @throw expression ;
3706      @throw ;
3707
3708    OpenMP:
3709
3710    statement:
3711      openmp-construct
3712
3713    openmp-construct:
3714      parallel-construct
3715      for-construct
3716      sections-construct
3717      single-construct
3718      parallel-for-construct
3719      parallel-sections-construct
3720      master-construct
3721      critical-construct
3722      atomic-construct
3723      ordered-construct
3724
3725    parallel-construct:
3726      parallel-directive structured-block
3727
3728    for-construct:
3729      for-directive iteration-statement
3730
3731    sections-construct:
3732      sections-directive section-scope
3733
3734    single-construct:
3735      single-directive structured-block
3736
3737    parallel-for-construct:
3738      parallel-for-directive iteration-statement
3739
3740    parallel-sections-construct:
3741      parallel-sections-directive section-scope
3742
3743    master-construct:
3744      master-directive structured-block
3745
3746    critical-construct:
3747      critical-directive structured-block
3748
3749    atomic-construct:
3750      atomic-directive expression-statement
3751
3752    ordered-construct:
3753      ordered-directive structured-block  */
3754
3755 static void
3756 c_parser_statement (c_parser *parser)
3757 {
3758   while (c_parser_next_token_is_keyword (parser, RID_CASE)
3759          || c_parser_next_token_is_keyword (parser, RID_DEFAULT)
3760          || (c_parser_next_token_is (parser, CPP_NAME)
3761              && c_parser_peek_2nd_token (parser)->type == CPP_COLON))
3762     c_parser_label (parser);
3763   c_parser_statement_after_labels (parser);
3764 }
3765
3766 /* Parse a statement, other than a labeled statement.  */
3767
3768 static void
3769 c_parser_statement_after_labels (c_parser *parser)
3770 {
3771   location_t loc = c_parser_peek_token (parser)->location;
3772   tree stmt = NULL_TREE;
3773   bool in_if_block = parser->in_if_block;
3774   parser->in_if_block = false;
3775   switch (c_parser_peek_token (parser)->type)
3776     {
3777     case CPP_OPEN_BRACE:
3778       add_stmt (c_parser_compound_statement (parser));
3779       break;
3780     case CPP_KEYWORD:
3781       switch (c_parser_peek_token (parser)->keyword)
3782         {
3783         case RID_IF:
3784           c_parser_if_statement (parser);
3785           break;
3786         case RID_SWITCH:
3787           c_parser_switch_statement (parser);
3788           break;
3789         case RID_WHILE:
3790           c_parser_while_statement (parser);
3791           break;
3792         case RID_DO:
3793           c_parser_do_statement (parser);
3794           break;
3795         case RID_FOR:
3796           c_parser_for_statement (parser);
3797           break;
3798         case RID_GOTO:
3799           c_parser_consume_token (parser);
3800           if (c_parser_next_token_is (parser, CPP_NAME))
3801             {
3802               stmt = c_finish_goto_label (c_parser_peek_token (parser)->value);
3803               c_parser_consume_token (parser);
3804             }
3805           else if (c_parser_next_token_is (parser, CPP_MULT))
3806             {
3807               c_parser_consume_token (parser);
3808               stmt = c_finish_goto_ptr (c_parser_expression (parser).value);
3809             }
3810           else
3811             c_parser_error (parser, "expected identifier or %<*%>");
3812           goto expect_semicolon;
3813         case RID_CONTINUE:
3814           c_parser_consume_token (parser);
3815           stmt = c_finish_bc_stmt (&c_cont_label, false);
3816           goto expect_semicolon;
3817         case RID_BREAK:
3818           c_parser_consume_token (parser);
3819           stmt = c_finish_bc_stmt (&c_break_label, true);
3820           goto expect_semicolon;
3821         case RID_RETURN:
3822           c_parser_consume_token (parser);
3823           if (c_parser_next_token_is (parser, CPP_SEMICOLON))
3824             {
3825               stmt = c_finish_return (NULL_TREE);
3826               c_parser_consume_token (parser);
3827             }
3828           else
3829             {
3830               stmt = c_finish_return (c_parser_expression_conv (parser).value);
3831               goto expect_semicolon;
3832             }
3833           break;
3834         case RID_ASM:
3835           stmt = c_parser_asm_statement (parser);
3836           break;
3837         case RID_AT_THROW:
3838           gcc_assert (c_dialect_objc ());
3839           c_parser_consume_token (parser);
3840           if (c_parser_next_token_is (parser, CPP_SEMICOLON))
3841             {
3842               stmt = objc_build_throw_stmt (NULL_TREE);
3843               c_parser_consume_token (parser);
3844             }
3845           else
3846             {
3847               stmt
3848                 = objc_build_throw_stmt (c_parser_expression (parser).value);
3849               goto expect_semicolon;
3850             }
3851           break;
3852         case RID_AT_TRY:
3853           gcc_assert (c_dialect_objc ());
3854           c_parser_objc_try_catch_statement (parser);
3855           break;
3856         case RID_AT_SYNCHRONIZED:
3857           gcc_assert (c_dialect_objc ());
3858           c_parser_objc_synchronized_statement (parser);
3859           break;
3860         default:
3861           goto expr_stmt;
3862         }
3863       break;
3864     case CPP_SEMICOLON:
3865       c_parser_consume_token (parser);
3866       break;
3867     case CPP_CLOSE_PAREN:
3868     case CPP_CLOSE_SQUARE:
3869       /* Avoid infinite loop in error recovery:
3870          c_parser_skip_until_found stops at a closing nesting
3871          delimiter without consuming it, but here we need to consume
3872          it to proceed further.  */
3873       c_parser_error (parser, "expected statement");
3874       c_parser_consume_token (parser);
3875       break;
3876     case CPP_PRAGMA:
3877       c_parser_pragma (parser, pragma_stmt);
3878       break;
3879     default:
3880     expr_stmt:
3881       stmt = c_finish_expr_stmt (c_parser_expression_conv (parser).value);
3882     expect_semicolon:
3883       c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
3884       break;
3885     }
3886   /* Two cases cannot and do not have line numbers associated: If stmt
3887      is degenerate, such as "2;", then stmt is an INTEGER_CST, which
3888      cannot hold line numbers.  But that's OK because the statement
3889      will either be changed to a MODIFY_EXPR during gimplification of
3890      the statement expr, or discarded.  If stmt was compound, but
3891      without new variables, we will have skipped the creation of a
3892      BIND and will have a bare STATEMENT_LIST.  But that's OK because
3893      (recursively) all of the component statements should already have
3894      line numbers assigned.  ??? Can we discard no-op statements
3895      earlier?  */
3896   if (stmt && CAN_HAVE_LOCATION_P (stmt))
3897     SET_EXPR_LOCATION (stmt, loc);
3898
3899   parser->in_if_block = in_if_block;
3900 }
3901
3902 /* Parse a parenthesized condition from an if, do or while statement.
3903
3904    condition:
3905      ( expression )
3906 */
3907 static tree
3908 c_parser_paren_condition (c_parser *parser)
3909 {
3910   location_t loc;
3911   tree cond;
3912   if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
3913     return error_mark_node;
3914   loc = c_parser_peek_token (parser)->location;
3915   cond = c_objc_common_truthvalue_conversion
3916     (c_parser_expression_conv (parser).value);
3917   if (CAN_HAVE_LOCATION_P (cond))
3918     SET_EXPR_LOCATION (cond, loc);
3919   c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
3920   return cond;
3921 }
3922
3923 /* Parse a statement which is a block in C99.  */
3924
3925 static tree
3926 c_parser_c99_block_statement (c_parser *parser)
3927 {
3928   tree block = c_begin_compound_stmt (flag_isoc99);
3929   c_parser_statement (parser);
3930   return c_end_compound_stmt (block, flag_isoc99);
3931 }
3932
3933 /* Parse the body of an if statement.  This is just parsing a
3934    statement but (a) it is a block in C99, (b) we track whether the
3935    body is an if statement for the sake of -Wparentheses warnings, (c)
3936    we handle an empty body specially for the sake of -Wempty-body
3937    warnings, and (d) we call parser_compound_statement directly
3938    because c_parser_statement_after_labels resets
3939    parser->in_if_block.  */
3940
3941 static tree
3942 c_parser_if_body (c_parser *parser, bool *if_p)
3943 {
3944   tree block = c_begin_compound_stmt (flag_isoc99);
3945   while (c_parser_next_token_is_keyword (parser, RID_CASE)
3946          || c_parser_next_token_is_keyword (parser, RID_DEFAULT)
3947          || (c_parser_next_token_is (parser, CPP_NAME)
3948              && c_parser_peek_2nd_token (parser)->type == CPP_COLON))
3949     c_parser_label (parser);
3950   *if_p = c_parser_next_token_is_keyword (parser, RID_IF);
3951   if (c_parser_next_token_is (parser, CPP_SEMICOLON))
3952     {
3953       add_stmt (build_empty_stmt ());
3954       c_parser_consume_token (parser);
3955     }
3956   else if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
3957     add_stmt (c_parser_compound_statement (parser));
3958   else
3959     c_parser_statement_after_labels (parser);
3960   return c_end_compound_stmt (block, flag_isoc99);
3961 }
3962
3963 /* Parse the else body of an if statement.  This is just parsing a
3964    statement but (a) it is a block in C99, (b) we handle an empty body
3965    specially for the sake of -Wempty-body warnings.  */
3966
3967 static tree
3968 c_parser_else_body (c_parser *parser)
3969 {
3970   tree block = c_begin_compound_stmt (flag_isoc99);
3971   while (c_parser_next_token_is_keyword (parser, RID_CASE)
3972          || c_parser_next_token_is_keyword (parser, RID_DEFAULT)
3973          || (c_parser_next_token_is (parser, CPP_NAME)
3974              && c_parser_peek_2nd_token (parser)->type == CPP_COLON))
3975     c_parser_label (parser);
3976   if (c_parser_next_token_is (parser, CPP_SEMICOLON))
3977     {
3978       add_stmt (build_empty_stmt ());
3979       c_parser_consume_token (parser);
3980     }
3981   else 
3982     c_parser_statement_after_labels (parser);
3983   return c_end_compound_stmt (block, flag_isoc99);
3984 }
3985
3986 /* Parse an if statement (C90 6.6.4, C99 6.8.4).
3987
3988    if-statement:
3989      if ( expression ) statement
3990      if ( expression ) statement else statement
3991 */
3992
3993 static void
3994 c_parser_if_statement (c_parser *parser)
3995 {
3996   tree block;
3997   location_t loc;
3998   tree cond;
3999   bool first_if = false;
4000   tree first_body, second_body;
4001   bool in_if_block;
4002
4003   gcc_assert (c_parser_next_token_is_keyword (parser, RID_IF));
4004   c_parser_consume_token (parser);
4005   block = c_begin_compound_stmt (flag_isoc99);
4006   loc = c_parser_peek_token (parser)->location;
4007   cond = c_parser_paren_condition (parser);
4008   in_if_block = parser->in_if_block;
4009   parser->in_if_block = true;
4010   first_body = c_parser_if_body (parser, &first_if);
4011   parser->in_if_block = in_if_block;
4012   if (c_parser_next_token_is_keyword (parser, RID_ELSE))
4013     {
4014       c_parser_consume_token (parser);
4015       second_body = c_parser_else_body (parser);
4016     }
4017   else
4018     second_body = NULL_TREE;
4019   c_finish_if_stmt (loc, cond, first_body, second_body, first_if);
4020   add_stmt (c_end_compound_stmt (block, flag_isoc99));
4021 }
4022
4023 /* Parse a switch statement (C90 6.6.4, C99 6.8.4).
4024
4025    switch-statement:
4026      switch (expression) statement
4027 */
4028
4029 static void
4030 c_parser_switch_statement (c_parser *parser)
4031 {
4032   tree block, expr, body, save_break;
4033   gcc_assert (c_parser_next_token_is_keyword (parser, RID_SWITCH));
4034   c_parser_consume_token (parser);
4035   block = c_begin_compound_stmt (flag_isoc99);
4036   if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
4037     {
4038       expr = c_parser_expression (parser).value;
4039       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
4040     }
4041   else
4042     expr = error_mark_node;
4043   c_start_case (expr);
4044   save_break = c_break_label;
4045   c_break_label = NULL_TREE;
4046   body = c_parser_c99_block_statement (parser);
4047   c_finish_case (body);
4048   if (c_break_label)
4049     add_stmt (build1 (LABEL_EXPR, void_type_node, c_break_label));
4050   c_break_label = save_break;
4051   add_stmt (c_end_compound_stmt (block, flag_isoc99));
4052 }
4053
4054 /* Parse a while statement (C90 6.6.5, C99 6.8.5).
4055
4056    while-statement:
4057       while (expression) statement
4058 */
4059
4060 static void
4061 c_parser_while_statement (c_parser *parser)
4062 {
4063   tree block, cond, body, save_break, save_cont;
4064   location_t loc;
4065   gcc_assert (c_parser_next_token_is_keyword (parser, RID_WHILE));
4066   c_parser_consume_token (parser);
4067   block = c_begin_compound_stmt (flag_isoc99);
4068   loc = c_parser_peek_token (parser)->location;
4069   cond = c_parser_paren_condition (parser);
4070   save_break = c_break_label;
4071   c_break_label = NULL_TREE;
4072   save_cont = c_cont_label;
4073   c_cont_label = NULL_TREE;
4074   body = c_parser_c99_block_statement (parser);
4075   c_finish_loop (loc, cond, NULL, body, c_break_label, c_cont_label, true);
4076   add_stmt (c_end_compound_stmt (block, flag_isoc99));
4077   c_break_label = save_break;
4078   c_cont_label = save_cont;
4079 }
4080
4081 /* Parse a do statement (C90 6.6.5, C99 6.8.5).
4082
4083    do-statement:
4084      do statement while ( expression ) ;
4085 */
4086
4087 static void
4088 c_parser_do_statement (c_parser *parser)
4089 {
4090   tree block, cond, body, save_break, save_cont, new_break, new_cont;
4091   location_t loc;
4092   gcc_assert (c_parser_next_token_is_keyword (parser, RID_DO));
4093   c_parser_consume_token (parser);
4094   if (c_parser_next_token_is (parser, CPP_SEMICOLON))
4095     warning (OPT_Wempty_body,
4096              "%Hsuggest braces around empty body in %<do%> statement",
4097              &c_parser_peek_token (parser)->location);
4098   block = c_begin_compound_stmt (flag_isoc99);
4099   loc = c_parser_peek_token (parser)->location;
4100   save_break = c_break_label;
4101   c_break_label = NULL_TREE;
4102   save_cont = c_cont_label;
4103   c_cont_label = NULL_TREE;
4104   body = c_parser_c99_block_statement (parser);
4105   c_parser_require_keyword (parser, RID_WHILE, "expected %<while%>");
4106   new_break = c_break_label;
4107   c_break_label = save_break;
4108   new_cont = c_cont_label;
4109   c_cont_label = save_cont;
4110   cond = c_parser_paren_condition (parser);
4111   if (!c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>"))
4112     c_parser_skip_to_end_of_block_or_statement (parser);
4113   c_finish_loop (loc, cond, NULL, body, new_break, new_cont, false);
4114   add_stmt (c_end_compound_stmt (block, flag_isoc99));
4115 }
4116
4117 /* Parse a for statement (C90 6.6.5, C99 6.8.5).
4118
4119    for-statement:
4120      for ( expression[opt] ; expression[opt] ; expression[opt] ) statement
4121      for ( nested-declaration expression[opt] ; expression[opt] ) statement
4122
4123    The form with a declaration is new in C99.
4124
4125    ??? In accordance with the old parser, the declaration may be a
4126    nested function, which is then rejected in check_for_loop_decls,
4127    but does it make any sense for this to be included in the grammar?
4128    Note in particular that the nested function does not include a
4129    trailing ';', whereas the "declaration" production includes one.
4130    Also, can we reject bad declarations earlier and cheaper than
4131    check_for_loop_decls?  */
4132
4133 static void
4134 c_parser_for_statement (c_parser *parser)
4135 {
4136   tree block, cond, incr, save_break, save_cont, body;
4137   location_t loc;
4138   gcc_assert (c_parser_next_token_is_keyword (parser, RID_FOR));
4139   loc = c_parser_peek_token (parser)->location;
4140   c_parser_consume_token (parser);
4141   block = c_begin_compound_stmt (flag_isoc99);
4142   if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
4143     {
4144       /* Parse the initialization declaration or expression.  */
4145       if (c_parser_next_token_is (parser, CPP_SEMICOLON))
4146         {
4147           c_parser_consume_token (parser);
4148           c_finish_expr_stmt (NULL_TREE);
4149         }
4150       else if (c_parser_next_token_starts_declspecs (parser))
4151         {
4152           c_parser_declaration_or_fndef (parser, true, true, true, true);
4153           check_for_loop_decls ();
4154         }
4155       else if (c_parser_next_token_is_keyword (parser, RID_EXTENSION))
4156         {
4157           /* __extension__ can start a declaration, but is also an
4158              unary operator that can start an expression.  Consume all
4159              but the last of a possible series of __extension__ to
4160              determine which.  */
4161           while (c_parser_peek_2nd_token (parser)->type == CPP_KEYWORD
4162                  && (c_parser_peek_2nd_token (parser)->keyword
4163                      == RID_EXTENSION))
4164             c_parser_consume_token (parser);
4165           if (c_token_starts_declspecs (c_parser_peek_2nd_token (parser)))
4166             {
4167               int ext;
4168               ext = disable_extension_diagnostics ();
4169               c_parser_consume_token (parser);
4170               c_parser_declaration_or_fndef (parser, true, true, true, true);
4171               restore_extension_diagnostics (ext);
4172               check_for_loop_decls ();
4173             }
4174           else
4175             goto init_expr;
4176         }
4177       else
4178         {
4179         init_expr:
4180           c_finish_expr_stmt (c_parser_expression (parser).value);
4181           c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
4182         }
4183       /* Parse the loop condition.  */
4184       loc = c_parser_peek_token (parser)->location;
4185       if (c_parser_next_token_is (parser, CPP_SEMICOLON))
4186         {
4187           c_parser_consume_token (parser);
4188           cond = NULL_TREE;
4189         }
4190       else
4191         {
4192           tree ocond = c_parser_expression_conv (parser).value;
4193           cond = c_objc_common_truthvalue_conversion (ocond);
4194           if (CAN_HAVE_LOCATION_P (cond))
4195             SET_EXPR_LOCATION (cond, loc);
4196           c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
4197         }
4198       /* Parse the increment expression.  */
4199       if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
4200         incr = c_process_expr_stmt (NULL_TREE);
4201       else
4202         incr = c_process_expr_stmt (c_parser_expression (parser).value);
4203       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
4204     }
4205   else
4206     {
4207       cond = error_mark_node;
4208       incr = error_mark_node;
4209     }
4210   save_break = c_break_label;
4211   c_break_label = NULL_TREE;
4212   save_cont = c_cont_label;
4213   c_cont_label = NULL_TREE;
4214   body = c_parser_c99_block_statement (parser);
4215   c_finish_loop (loc, cond, incr, body, c_break_label, c_cont_label, true);
4216   add_stmt (c_end_compound_stmt (block, flag_isoc99));
4217   c_break_label = save_break;
4218   c_cont_label = save_cont;
4219 }
4220
4221 /* Parse an asm statement, a GNU extension.  This is a full-blown asm
4222    statement with inputs, outputs, clobbers, and volatile tag
4223    allowed.
4224
4225    asm-statement:
4226      asm type-qualifier[opt] ( asm-argument ) ;
4227
4228    asm-argument:
4229      asm-string-literal
4230      asm-string-literal : asm-operands[opt]
4231      asm-string-literal : asm-operands[opt] : asm-operands[opt]
4232      asm-string-literal : asm-operands[opt] : asm-operands[opt] : asm-clobbers
4233
4234    Qualifiers other than volatile are accepted in the syntax but
4235    warned for.  */
4236
4237 static tree
4238 c_parser_asm_statement (c_parser *parser)
4239 {
4240   tree quals, str, outputs, inputs, clobbers, ret;
4241   bool simple;
4242   gcc_assert (c_parser_next_token_is_keyword (parser, RID_ASM));
4243   c_parser_consume_token (parser);
4244   if (c_parser_next_token_is_keyword (parser, RID_VOLATILE))
4245     {
4246       quals = c_parser_peek_token (parser)->value;
4247       c_parser_consume_token (parser);
4248     }
4249   else if (c_parser_next_token_is_keyword (parser, RID_CONST)
4250            || c_parser_next_token_is_keyword (parser, RID_RESTRICT))
4251     {
4252       warning (0, "%H%E qualifier ignored on asm",
4253                &c_parser_peek_token (parser)->location,
4254                c_parser_peek_token (parser)->value);
4255       quals = NULL_TREE;
4256       c_parser_consume_token (parser);
4257     }
4258   else
4259     quals = NULL_TREE;
4260   /* ??? Follow the C++ parser rather than using the
4261      lex_untranslated_string kludge.  */
4262   parser->lex_untranslated_string = true;
4263   if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
4264     {
4265       parser->lex_untranslated_string = false;
4266       return NULL_TREE;
4267     }
4268   str = c_parser_asm_string_literal (parser);
4269   if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
4270     {
4271       simple = true;
4272       outputs = NULL_TREE;
4273       inputs = NULL_TREE;
4274       clobbers = NULL_TREE;
4275       goto done_asm;
4276     }
4277   if (!c_parser_require (parser, CPP_COLON, "expected %<:%> or %<)%>"))
4278     {
4279       parser->lex_untranslated_string = false;
4280       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
4281       return NULL_TREE;
4282     }
4283   simple = false;
4284   /* Parse outputs.  */
4285   if (c_parser_next_token_is (parser, CPP_COLON)
4286       || c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
4287     outputs = NULL_TREE;
4288   else
4289     outputs = c_parser_asm_operands (parser, false);
4290   if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
4291     {
4292       inputs = NULL_TREE;
4293       clobbers = NULL_TREE;
4294       goto done_asm;
4295     }
4296   if (!c_parser_require (parser, CPP_COLON, "expected %<:%> or %<)%>"))
4297     {
4298       parser->lex_untranslated_string = false;
4299       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
4300       return NULL_TREE;
4301     }
4302   /* Parse inputs.  */
4303   if (c_parser_next_token_is (parser, CPP_COLON)
4304       || c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
4305     inputs = NULL_TREE;
4306   else
4307     inputs = c_parser_asm_operands (parser, true);
4308   if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
4309     {
4310       clobbers = NULL_TREE;
4311       goto done_asm;
4312     }
4313   if (!c_parser_require (parser, CPP_COLON, "expected %<:%> or %<)%>"))
4314     {
4315       parser->lex_untranslated_string = false;
4316       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
4317       return NULL_TREE;
4318     }
4319   /* Parse clobbers.  */
4320   clobbers = c_parser_asm_clobbers (parser);
4321  done_asm:
4322   parser->lex_untranslated_string = false;
4323   if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
4324     {
4325       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
4326       return NULL_TREE;
4327     }
4328   if (!c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>"))
4329     c_parser_skip_to_end_of_block_or_statement (parser);
4330   ret = build_asm_stmt (quals, build_asm_expr (str, outputs, inputs,
4331                                                clobbers, simple));
4332   return ret;
4333 }
4334
4335 /* Parse asm operands, a GNU extension.  If CONVERT_P (for inputs but
4336    not outputs), apply the default conversion of functions and arrays
4337    to pointers.
4338
4339    asm-operands:
4340      asm-operand
4341      asm-operands , asm-operand
4342
4343    asm-operand:
4344      asm-string-literal ( expression )
4345      [ identifier ] asm-string-literal ( expression )
4346 */
4347
4348 static tree
4349 c_parser_asm_operands (c_parser *parser, bool convert_p)
4350 {
4351   tree list = NULL_TREE;
4352   while (true)
4353     {
4354       tree name, str;
4355       struct c_expr expr;
4356       if (c_parser_next_token_is (parser, CPP_OPEN_SQUARE))
4357         {
4358           c_parser_consume_token (parser);
4359           if (c_parser_next_token_is (parser, CPP_NAME))
4360             {
4361               tree id = c_parser_peek_token (parser)->value;
4362               c_parser_consume_token (parser);
4363               name = build_string (IDENTIFIER_LENGTH (id),
4364                                    IDENTIFIER_POINTER (id));
4365             }
4366           else
4367             {
4368               c_parser_error (parser, "expected identifier");
4369               c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, NULL);
4370               return NULL_TREE;
4371             }
4372           c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
4373                                      "expected %<]%>");
4374         }
4375       else
4376         name = NULL_TREE;
4377       str = c_parser_asm_string_literal (parser);
4378       if (str == NULL_TREE)
4379         return NULL_TREE;
4380       parser->lex_untranslated_string = false;
4381       if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
4382         {
4383           parser->lex_untranslated_string = true;
4384           return NULL_TREE;
4385         }
4386       expr = c_parser_expression (parser);
4387       if (convert_p)
4388         expr = default_function_array_conversion (expr);
4389       parser->lex_untranslated_string = true;
4390       if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
4391         {
4392           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
4393           return NULL_TREE;
4394         }
4395       list = chainon (list, build_tree_list (build_tree_list (name, str),
4396                                              expr.value));
4397       if (c_parser_next_token_is (parser, CPP_COMMA))
4398         c_parser_consume_token (parser);
4399       else
4400         break;
4401     }
4402   return list;
4403 }
4404
4405 /* Parse asm clobbers, a GNU extension.
4406
4407    asm-clobbers:
4408      asm-string-literal
4409      asm-clobbers , asm-string-literal
4410 */
4411
4412 static tree
4413 c_parser_asm_clobbers (c_parser *parser)
4414 {
4415   tree list = NULL_TREE;
4416   while (true)
4417     {
4418       tree str = c_parser_asm_string_literal (parser);
4419       if (str)
4420         list = tree_cons (NULL_TREE, str, list);
4421       else
4422         return NULL_TREE;
4423       if (c_parser_next_token_is (parser, CPP_COMMA))
4424         c_parser_consume_token (parser);
4425       else
4426         break;
4427     }
4428   return list;
4429 }
4430
4431 /* Parse an expression other than a compound expression; that is, an
4432    assignment expression (C90 6.3.16, C99 6.5.16).  If AFTER is not
4433    NULL then it is an Objective-C message expression which is the
4434    primary-expression starting the expression as an initializer.
4435
4436    assignment-expression:
4437      conditional-expression
4438      unary-expression assignment-operator assignment-expression
4439
4440    assignment-operator: one of
4441      = *= /= %= += -= <<= >>= &= ^= |=
4442
4443    In GNU C we accept any conditional expression on the LHS and
4444    diagnose the invalid lvalue rather than producing a syntax
4445    error.  */
4446
4447 static struct c_expr
4448 c_parser_expr_no_commas (c_parser *parser, struct c_expr *after)
4449 {
4450   struct c_expr lhs, rhs, ret;
4451   enum tree_code code;
4452   gcc_assert (!after || c_dialect_objc ());
4453   lhs = c_parser_conditional_expression (parser, after);
4454   switch (c_parser_peek_token (parser)->type)
4455     {
4456     case CPP_EQ:
4457       code = NOP_EXPR;
4458       break;
4459     case CPP_MULT_EQ:
4460       code = MULT_EXPR;
4461       break;
4462     case CPP_DIV_EQ:
4463       code = TRUNC_DIV_EXPR;
4464       break;
4465     case CPP_MOD_EQ:
4466       code = TRUNC_MOD_EXPR;
4467       break;
4468     case CPP_PLUS_EQ:
4469       code = PLUS_EXPR;
4470       break;
4471     case CPP_MINUS_EQ:
4472       code = MINUS_EXPR;
4473       break;
4474     case CPP_LSHIFT_EQ:
4475       code = LSHIFT_EXPR;
4476       break;
4477     case CPP_RSHIFT_EQ:
4478       code = RSHIFT_EXPR;
4479       break;
4480     case CPP_AND_EQ:
4481       code = BIT_AND_EXPR;
4482       break;
4483     case CPP_XOR_EQ:
4484       code = BIT_XOR_EXPR;
4485       break;
4486     case CPP_OR_EQ:
4487       code = BIT_IOR_EXPR;
4488       break;
4489     default:
4490       return lhs;
4491     }
4492   c_parser_consume_token (parser);
4493   rhs = c_parser_expr_no_commas (parser, NULL);
4494   rhs = default_function_array_conversion (rhs);
4495   ret.value = build_modify_expr (lhs.value, code, rhs.value);
4496   if (code == NOP_EXPR)
4497     ret.original_code = MODIFY_EXPR;
4498   else
4499     {
4500       TREE_NO_WARNING (ret.value) = 1;
4501       ret.original_code = ERROR_MARK;
4502     }
4503   return ret;
4504 }
4505
4506 /* Parse a conditional expression (C90 6.3.15, C99 6.5.15).  If AFTER
4507    is not NULL then it is an Objective-C message expression which is
4508    the primary-expression starting the expression as an initializer.
4509
4510    conditional-expression:
4511      logical-OR-expression
4512      logical-OR-expression ? expression : conditional-expression
4513
4514    GNU extensions:
4515
4516    conditional-expression:
4517      logical-OR-expression ? : conditional-expression
4518 */
4519
4520 static struct c_expr
4521 c_parser_conditional_expression (c_parser *parser, struct c_expr *after)
4522 {
4523   struct c_expr cond, exp1, exp2, ret;
4524   gcc_assert (!after || c_dialect_objc ());
4525   cond = c_parser_binary_expression (parser, after);
4526   if (c_parser_next_token_is_not (parser, CPP_QUERY))
4527     return cond;
4528   cond = default_function_array_conversion (cond);
4529   c_parser_consume_token (parser);
4530   if (c_parser_next_token_is (parser, CPP_COLON))
4531     {
4532       if (pedantic)
4533         pedwarn ("%HISO C forbids omitting the middle term of a ?: expression",
4534                  &c_parser_peek_token (parser)->location);
4535       /* Make sure first operand is calculated only once.  */
4536       exp1.value = save_expr (default_conversion (cond.value));
4537       cond.value = c_objc_common_truthvalue_conversion (exp1.value);
4538       skip_evaluation += cond.value == truthvalue_true_node;
4539     }
4540   else
4541     {
4542       cond.value
4543         = c_objc_common_truthvalue_conversion
4544         (default_conversion (cond.value));
4545       skip_evaluation += cond.value == truthvalue_false_node;
4546       exp1 = c_parser_expression_conv (parser);
4547       skip_evaluation += ((cond.value == truthvalue_true_node)
4548                           - (cond.value == truthvalue_false_node));
4549     }
4550   if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
4551     {
4552       skip_evaluation -= cond.value == truthvalue_true_node;
4553       ret.value = error_mark_node;
4554       ret.original_code = ERROR_MARK;
4555       return ret;
4556     }
4557   exp2 = c_parser_conditional_expression (parser, NULL);
4558   exp2 = default_function_array_conversion (exp2);
4559   skip_evaluation -= cond.value == truthvalue_true_node;
4560   ret.value = build_conditional_expr (cond.value, exp1.value, exp2.value);
4561   ret.original_code = ERROR_MARK;
4562   return ret;
4563 }
4564
4565 /* Parse a binary expression; that is, a logical-OR-expression (C90
4566    6.3.5-6.3.14, C99 6.5.5-6.5.14).  If AFTER is not NULL then it is
4567    an Objective-C message expression which is the primary-expression
4568    starting the expression as an initializer.
4569
4570    multiplicative-expression:
4571      cast-expression
4572      multiplicative-expression * cast-expression
4573      multiplicative-expression / cast-expression
4574      multiplicative-expression % cast-expression
4575
4576    additive-expression:
4577      multiplicative-expression
4578      additive-expression + multiplicative-expression
4579      additive-expression - multiplicative-expression
4580
4581    shift-expression:
4582      additive-expression
4583      shift-expression << additive-expression
4584      shift-expression >> additive-expression
4585
4586    relational-expression:
4587      shift-expression
4588      relational-expression < shift-expression
4589      relational-expression > shift-expression
4590      relational-expression <= shift-expression
4591      relational-expression >= shift-expression
4592
4593    equality-expression:
4594      relational-expression
4595      equality-expression == relational-expression
4596      equality-expression != relational-expression
4597
4598    AND-expression:
4599      equality-expression
4600      AND-expression & equality-expression
4601
4602    exclusive-OR-expression:
4603      AND-expression
4604      exclusive-OR-expression ^ AND-expression
4605
4606    inclusive-OR-expression:
4607      exclusive-OR-expression
4608      inclusive-OR-expression | exclusive-OR-expression
4609
4610    logical-AND-expression:
4611      inclusive-OR-expression
4612      logical-AND-expression && inclusive-OR-expression
4613
4614    logical-OR-expression:
4615      logical-AND-expression
4616      logical-OR-expression || logical-AND-expression
4617 */
4618
4619 static struct c_expr
4620 c_parser_binary_expression (c_parser *parser, struct c_expr *after)
4621 {
4622   /* A binary expression is parsed using operator-precedence parsing,
4623      with the operands being cast expressions.  All the binary
4624      operators are left-associative.  Thus a binary expression is of
4625      form:
4626
4627      E0 op1 E1 op2 E2 ...
4628
4629      which we represent on a stack.  On the stack, the precedence
4630      levels are strictly increasing.  When a new operator is
4631      encountered of higher precedence than that at the top of the
4632      stack, it is pushed; its LHS is the top expression, and its RHS
4633      is everything parsed until it is popped.  When a new operator is
4634      encountered with precedence less than or equal to that at the top
4635      of the stack, triples E[i-1] op[i] E[i] are popped and replaced
4636      by the result of the operation until the operator at the top of
4637      the stack has lower precedence than the new operator or there is
4638      only one element on the stack; then the top expression is the LHS
4639      of the new operator.  In the case of logical AND and OR
4640      expressions, we also need to adjust skip_evaluation as
4641      appropriate when the operators are pushed and popped.  */
4642
4643   /* The precedence levels, where 0 is a dummy lowest level used for
4644      the bottom of the stack.  */
4645   enum prec {
4646     PREC_NONE,
4647     PREC_LOGOR,
4648     PREC_LOGAND,
4649     PREC_BITOR,
4650     PREC_BITXOR,
4651     PREC_BITAND,
4652     PREC_EQ,
4653     PREC_REL,
4654     PREC_SHIFT,
4655     PREC_ADD,
4656     PREC_MULT,
4657     NUM_PRECS
4658   };
4659   struct {
4660     /* The expression at this stack level.  */
4661     struct c_expr expr;
4662     /* The precedence of the operator on its left, PREC_NONE at the
4663        bottom of the stack.  */
4664     enum prec prec;
4665     /* The operation on its left.  */
4666     enum tree_code op;
4667   } stack[NUM_PRECS];
4668   int sp;
4669 #define POP                                                                   \
4670   do {                                                                        \
4671     switch (stack[sp].op)                                                     \
4672       {                                                                       \
4673       case TRUTH_ANDIF_EXPR:                                                  \
4674         skip_evaluation -= stack[sp - 1].expr.value == truthvalue_false_node; \
4675         break;                                                                \
4676       case TRUTH_ORIF_EXPR:                                                   \
4677         skip_evaluation -= stack[sp - 1].expr.value == truthvalue_true_node;  \
4678         break;                                                                \
4679       default:                                                                \
4680         break;                                                                \
4681       }                                                                       \
4682     stack[sp - 1].expr                                                        \
4683       = default_function_array_conversion (stack[sp - 1].expr);               \
4684     stack[sp].expr                                                            \
4685       = default_function_array_conversion (stack[sp].expr);                   \
4686     stack[sp - 1].expr = parser_build_binary_op (stack[sp].op,                \
4687                                                  stack[sp - 1].expr,          \
4688                                                  stack[sp].expr);             \
4689     sp--;                                                                     \
4690   } while (0)
4691   gcc_assert (!after || c_dialect_objc ());
4692   stack[0].expr = c_parser_cast_expression (parser, after);
4693   stack[0].prec = PREC_NONE;
4694   sp = 0;
4695   while (true)
4696     {
4697       enum prec oprec;
4698       enum tree_code ocode;
4699       if (parser->error)
4700         goto out;
4701       switch (c_parser_peek_token (parser)->type)
4702         {
4703         case CPP_MULT:
4704           oprec = PREC_MULT;
4705           ocode = MULT_EXPR;
4706           break;
4707         case CPP_DIV:
4708           oprec = PREC_MULT;
4709           ocode = TRUNC_DIV_EXPR;
4710           break;
4711         case CPP_MOD:
4712           oprec = PREC_MULT;
4713           ocode = TRUNC_MOD_EXPR;
4714           break;
4715         case CPP_PLUS:
4716           oprec = PREC_ADD;
4717           ocode = PLUS_EXPR;
4718           break;
4719         case CPP_MINUS:
4720           oprec = PREC_ADD;
4721           ocode = MINUS_EXPR;
4722           break;
4723         case CPP_LSHIFT:
4724           oprec = PREC_SHIFT;
4725           ocode = LSHIFT_EXPR;
4726           break;
4727         case CPP_RSHIFT:
4728           oprec = PREC_SHIFT;
4729           ocode = RSHIFT_EXPR;
4730           break;
4731         case CPP_LESS:
4732           oprec = PREC_REL;
4733           ocode = LT_EXPR;
4734           break;
4735         case CPP_GREATER:
4736           oprec = PREC_REL;
4737           ocode = GT_EXPR;
4738           break;
4739         case CPP_LESS_EQ:
4740           oprec = PREC_REL;
4741           ocode = LE_EXPR;
4742           break;
4743         case CPP_GREATER_EQ:
4744           oprec = PREC_REL;
4745           ocode = GE_EXPR;
4746           break;
4747         case CPP_EQ_EQ:
4748           oprec = PREC_EQ;
4749           ocode = EQ_EXPR;
4750           break;
4751         case CPP_NOT_EQ:
4752           oprec = PREC_EQ;
4753           ocode = NE_EXPR;
4754           break;
4755         case CPP_AND:
4756           oprec = PREC_BITAND;
4757           ocode = BIT_AND_EXPR;
4758           break;
4759         case CPP_XOR:
4760           oprec = PREC_BITXOR;
4761           ocode = BIT_XOR_EXPR;
4762           break;
4763         case CPP_OR:
4764           oprec = PREC_BITOR;
4765           ocode = BIT_IOR_EXPR;
4766           break;
4767         case CPP_AND_AND:
4768           oprec = PREC_LOGAND;
4769           ocode = TRUTH_ANDIF_EXPR;
4770           break;
4771         case CPP_OR_OR:
4772           oprec = PREC_LOGOR;
4773           ocode = TRUTH_ORIF_EXPR;
4774           break;
4775         default:
4776           /* Not a binary operator, so end of the binary
4777              expression.  */
4778           goto out;
4779         }
4780       c_parser_consume_token (parser);
4781       while (oprec <= stack[sp].prec)
4782         POP;
4783       switch (ocode)
4784         {
4785         case TRUTH_ANDIF_EXPR:
4786           stack[sp].expr
4787             = default_function_array_conversion (stack[sp].expr);
4788           stack[sp].expr.value = c_objc_common_truthvalue_conversion
4789             (default_conversion (stack[sp].expr.value));
4790           skip_evaluation += stack[sp].expr.value == truthvalue_false_node;
4791           break;
4792         case TRUTH_ORIF_EXPR:
4793           stack[sp].expr
4794             = default_function_array_conversion (stack[sp].expr);
4795           stack[sp].expr.value = c_objc_common_truthvalue_conversion
4796             (default_conversion (stack[sp].expr.value));
4797           skip_evaluation += stack[sp].expr.value == truthvalue_true_node;
4798           break;
4799         default:
4800           break;
4801         }
4802       sp++;
4803       stack[sp].expr = c_parser_cast_expression (parser, NULL);
4804       stack[sp].prec = oprec;
4805       stack[sp].op = ocode;
4806     }
4807  out:
4808   while (sp > 0)
4809     POP;
4810   return stack[0].expr;
4811 #undef POP
4812 }
4813
4814 /* Parse a cast expression (C90 6.3.4, C99 6.5.4).  If AFTER is not
4815    NULL then it is an Objective-C message expression which is the
4816    primary-expression starting the expression as an initializer.
4817
4818    cast-expression:
4819      unary-expression
4820      ( type-name ) unary-expression
4821 */
4822
4823 static struct c_expr
4824 c_parser_cast_expression (c_parser *parser, struct c_expr *after)
4825 {
4826   gcc_assert (!after || c_dialect_objc ());
4827   if (after)
4828     return c_parser_postfix_expression_after_primary (parser, *after);
4829   /* If the expression begins with a parenthesized type name, it may
4830      be either a cast or a compound literal; we need to see whether
4831      the next character is '{' to tell the difference.  If not, it is
4832      an unary expression.  */
4833   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)
4834       && c_token_starts_typename (c_parser_peek_2nd_token (parser)))
4835     {
4836       struct c_type_name *type_name;
4837       struct c_expr ret;
4838       struct c_expr expr;
4839       c_parser_consume_token (parser);
4840       type_name = c_parser_type_name (parser);
4841       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
4842       if (type_name == NULL)
4843         {
4844           ret.value = error_mark_node;
4845           ret.original_code = ERROR_MARK;
4846           return ret;
4847         }
4848
4849       /* Save casted types in the function's used types hash table.  */
4850       used_types_insert (type_name->specs->type);
4851
4852       if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
4853         return c_parser_postfix_expression_after_paren_type (parser,
4854                                                              type_name);
4855       expr = c_parser_cast_expression (parser, NULL);
4856       expr = default_function_array_conversion (expr);
4857       ret.value = c_cast_expr (type_name, expr.value);
4858       ret.original_code = ERROR_MARK;
4859       return ret;
4860     }
4861   else
4862     return c_parser_unary_expression (parser);
4863 }
4864
4865 /* Parse an unary expression (C90 6.3.3, C99 6.5.3).
4866
4867    unary-expression:
4868      postfix-expression
4869      ++ unary-expression
4870      -- unary-expression
4871      unary-operator cast-expression
4872      sizeof unary-expression
4873      sizeof ( type-name )
4874
4875    unary-operator: one of
4876      & * + - ~ !
4877
4878    GNU extensions:
4879
4880    unary-expression:
4881      __alignof__ unary-expression
4882      __alignof__ ( type-name )
4883      && identifier
4884
4885    unary-operator: one of
4886      __extension__ __real__ __imag__
4887
4888    In addition, the GNU syntax treats ++ and -- as unary operators, so
4889    they may be applied to cast expressions with errors for non-lvalues
4890    given later.  */
4891
4892 static struct c_expr
4893 c_parser_unary_expression (c_parser *parser)
4894 {
4895   int ext;
4896   struct c_expr ret, op;
4897   switch (c_parser_peek_token (parser)->type)
4898     {
4899     case CPP_PLUS_PLUS:
4900       c_parser_consume_token (parser);
4901       op = c_parser_cast_expression (parser, NULL);
4902       op = default_function_array_conversion (op);
4903       return parser_build_unary_op (PREINCREMENT_EXPR, op);
4904     case CPP_MINUS_MINUS:
4905       c_parser_consume_token (parser);
4906       op = c_parser_cast_expression (parser, NULL);
4907       op = default_function_array_conversion (op);
4908       return parser_build_unary_op (PREDECREMENT_EXPR, op);
4909     case CPP_AND:
4910       c_parser_consume_token (parser);
4911       return parser_build_unary_op (ADDR_EXPR,
4912                                     c_parser_cast_expression (parser, NULL));
4913     case CPP_MULT:
4914       c_parser_consume_token (parser);
4915       op = c_parser_cast_expression (parser, NULL);
4916       op = default_function_array_conversion (op);
4917       ret.value = build_indirect_ref (op.value, "unary *");
4918       ret.original_code = ERROR_MARK;
4919       return ret;
4920     case CPP_PLUS:
4921       if (!c_dialect_objc () && !in_system_header)
4922         warning (OPT_Wtraditional,
4923                  "%Htraditional C rejects the unary plus operator",
4924                  &c_parser_peek_token (parser)->location);
4925       c_parser_consume_token (parser);
4926       op = c_parser_cast_expression (parser, NULL);
4927       op = default_function_array_conversion (op);
4928       return parser_build_unary_op (CONVERT_EXPR, op);
4929     case CPP_MINUS:
4930       c_parser_consume_token (parser);
4931       op = c_parser_cast_expression (parser, NULL);
4932       op = default_function_array_conversion (op);
4933       return parser_build_unary_op (NEGATE_EXPR, op);
4934     case CPP_COMPL:
4935       c_parser_consume_token (parser);
4936       op = c_parser_cast_expression (parser, NULL);
4937       op = default_function_array_conversion (op);
4938       return parser_build_unary_op (BIT_NOT_EXPR, op);
4939     case CPP_NOT:
4940       c_parser_consume_token (parser);
4941       op = c_parser_cast_expression (parser, NULL);
4942       op = default_function_array_conversion (op);
4943       return parser_build_unary_op (TRUTH_NOT_EXPR, op);
4944     case CPP_AND_AND:
4945       /* Refer to the address of a label as a pointer.  */
4946       c_parser_consume_token (parser);
4947       if (c_parser_next_token_is (parser, CPP_NAME))
4948         {
4949           ret.value = finish_label_address_expr
4950             (c_parser_peek_token (parser)->value);
4951           c_parser_consume_token (parser);
4952         }
4953       else
4954         {
4955           c_parser_error (parser, "expected identifier");
4956           ret.value = error_mark_node;
4957         }
4958         ret.original_code = ERROR_MARK;
4959         return ret;
4960     case CPP_KEYWORD:
4961       switch (c_parser_peek_token (parser)->keyword)
4962         {
4963         case RID_SIZEOF:
4964           return c_parser_sizeof_expression (parser);
4965         case RID_ALIGNOF:
4966           return c_parser_alignof_expression (parser);
4967         case RID_EXTENSION:
4968           c_parser_consume_token (parser);
4969           ext = disable_extension_diagnostics ();
4970           ret = c_parser_cast_expression (parser, NULL);
4971           restore_extension_diagnostics (ext);
4972           return ret;
4973         case RID_REALPART:
4974           c_parser_consume_token (parser);
4975           op = c_parser_cast_expression (parser, NULL);
4976           op = default_function_array_conversion (op);
4977           return parser_build_unary_op (REALPART_EXPR, op);
4978         case RID_IMAGPART:
4979           c_parser_consume_token (parser);
4980           op = c_parser_cast_expression (parser, NULL);
4981           op = default_function_array_conversion (op);
4982           return parser_build_unary_op (IMAGPART_EXPR, op);
4983         default:
4984           return c_parser_postfix_expression (parser);
4985         }
4986     default:
4987       return c_parser_postfix_expression (parser);
4988     }
4989 }
4990
4991 /* Parse a sizeof expression.  */
4992
4993 static struct c_expr
4994 c_parser_sizeof_expression (c_parser *parser)
4995 {
4996   struct c_expr expr;
4997   location_t expr_loc;
4998   gcc_assert (c_parser_next_token_is_keyword (parser, RID_SIZEOF));
4999   c_parser_consume_token (parser);
5000   skip_evaluation++;
5001   in_sizeof++;
5002   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)
5003       && c_token_starts_typename (c_parser_peek_2nd_token (parser)))
5004     {
5005       /* Either sizeof ( type-name ) or sizeof unary-expression
5006          starting with a compound literal.  */
5007       struct c_type_name *type_name;
5008       c_parser_consume_token (parser);
5009       expr_loc = c_parser_peek_token (parser)->location;
5010       type_name = c_parser_type_name (parser);
5011       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
5012       if (type_name == NULL)
5013         {
5014           struct c_expr ret;
5015           skip_evaluation--;
5016           in_sizeof--;
5017           ret.value = error_mark_node;
5018           ret.original_code = ERROR_MARK;
5019           return ret;
5020         }
5021       if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
5022         {
5023           expr = c_parser_postfix_expression_after_paren_type (parser,
5024                                                                type_name);
5025           goto sizeof_expr;
5026         }
5027       /* sizeof ( type-name ).  */
5028       skip_evaluation--;
5029       in_sizeof--;
5030       if (type_name->declarator->kind == cdk_array
5031           && type_name->declarator->u.array.vla_unspec_p)
5032         {
5033           /* C99 6.7.5.2p4 */
5034           error ("%H%<[*]%> not allowed in other than a declaration",
5035                  &expr_loc);
5036         }
5037       return c_expr_sizeof_type (type_name);
5038     }
5039   else
5040     {
5041       expr_loc = c_parser_peek_token (parser)->location;
5042       expr = c_parser_unary_expression (parser);
5043     sizeof_expr:
5044       skip_evaluation--;
5045       in_sizeof--;
5046       if (TREE_CODE (expr.value) == COMPONENT_REF
5047           && DECL_C_BIT_FIELD (TREE_OPERAND (expr.value, 1)))
5048         error ("%H%<sizeof%> applied to a bit-field", &expr_loc);
5049       return c_expr_sizeof_expr (expr);
5050     }
5051 }
5052
5053 /* Parse an alignof expression.  */
5054
5055 static struct c_expr
5056 c_parser_alignof_expression (c_parser *parser)
5057 {
5058   struct c_expr expr;
5059   gcc_assert (c_parser_next_token_is_keyword (parser, RID_ALIGNOF));
5060   c_parser_consume_token (parser);
5061   skip_evaluation++;
5062   in_alignof++;
5063   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)
5064       && c_token_starts_typename (c_parser_peek_2nd_token (parser)))
5065     {
5066       /* Either __alignof__ ( type-name ) or __alignof__
5067          unary-expression starting with a compound literal.  */
5068       struct c_type_name *type_name;
5069       struct c_expr ret;
5070       c_parser_consume_token (parser);
5071       type_name = c_parser_type_name (parser);
5072       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
5073       if (type_name == NULL)
5074         {
5075           struct c_expr ret;
5076           skip_evaluation--;
5077           in_alignof--;
5078           ret.value = error_mark_node;
5079           ret.original_code = ERROR_MARK;
5080           return ret;
5081         }
5082       if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
5083         {
5084           expr = c_parser_postfix_expression_after_paren_type (parser,
5085                                                                type_name);
5086           goto alignof_expr;
5087         }
5088       /* alignof ( type-name ).  */
5089       skip_evaluation--;
5090       in_alignof--;
5091       ret.value = c_alignof (groktypename (type_name));
5092       ret.original_code = ERROR_MARK;
5093       return ret;
5094     }
5095   else
5096     {
5097       struct c_expr ret;
5098       expr = c_parser_unary_expression (parser);
5099     alignof_expr:
5100       skip_evaluation--;
5101       in_alignof--;
5102       ret.value = c_alignof_expr (expr.value);
5103       ret.original_code = ERROR_MARK;
5104       return ret;
5105     }
5106 }
5107
5108 /* Parse a postfix expression (C90 6.3.1-6.3.2, C99 6.5.1-6.5.2).
5109
5110    postfix-expression:
5111      primary-expression
5112      postfix-expression [ expression ]
5113      postfix-expression ( argument-expression-list[opt] )
5114      postfix-expression . identifier
5115      postfix-expression -> identifier
5116      postfix-expression ++
5117      postfix-expression --
5118      ( type-name ) { initializer-list }
5119      ( type-name ) { initializer-list , }
5120
5121    argument-expression-list:
5122      argument-expression
5123      argument-expression-list , argument-expression
5124
5125    primary-expression:
5126      identifier
5127      constant
5128      string-literal
5129      ( expression )
5130
5131    GNU extensions:
5132
5133    primary-expression:
5134      __func__
5135        (treated as a keyword in GNU C)
5136      __FUNCTION__
5137      __PRETTY_FUNCTION__
5138      ( compound-statement )
5139      __builtin_va_arg ( assignment-expression , type-name )
5140      __builtin_offsetof ( type-name , offsetof-member-designator )
5141      __builtin_choose_expr ( assignment-expression ,
5142                              assignment-expression ,
5143                              assignment-expression )
5144      __builtin_types_compatible_p ( type-name , type-name )
5145
5146    offsetof-member-designator:
5147      identifier
5148      offsetof-member-designator . identifier
5149      offsetof-member-designator [ expression ]
5150
5151    Objective-C:
5152
5153    primary-expression:
5154      [ objc-receiver objc-message-args ]
5155      @selector ( objc-selector-arg )
5156      @protocol ( identifier )
5157      @encode ( type-name )
5158      objc-string-literal
5159 */
5160
5161 static struct c_expr
5162 c_parser_postfix_expression (c_parser *parser)
5163 {
5164   struct c_expr expr, e1, e2, e3;
5165   struct c_type_name *t1, *t2;
5166   location_t loc;
5167   switch (c_parser_peek_token (parser)->type)
5168     {
5169     case CPP_NUMBER:
5170     case CPP_CHAR:
5171     case CPP_WCHAR:
5172       expr.value = c_parser_peek_token (parser)->value;
5173       expr.original_code = ERROR_MARK;
5174       c_parser_consume_token (parser);
5175       break;
5176     case CPP_STRING:
5177     case CPP_WSTRING:
5178       expr.value = c_parser_peek_token (parser)->value;
5179       expr.original_code = STRING_CST;
5180       c_parser_consume_token (parser);
5181       break;
5182     case CPP_OBJC_STRING:
5183       gcc_assert (c_dialect_objc ());
5184       expr.value
5185         = objc_build_string_object (c_parser_peek_token (parser)->value);
5186       expr.original_code = ERROR_MARK;
5187       c_parser_consume_token (parser);
5188       break;
5189     case CPP_NAME:
5190       if (c_parser_peek_token (parser)->id_kind != C_ID_ID)
5191         {
5192           c_parser_error (parser, "expected expression");
5193           expr.value = error_mark_node;
5194           expr.original_code = ERROR_MARK;
5195           break;
5196         }
5197       {
5198         tree id = c_parser_peek_token (parser)->value;
5199         location_t loc = c_parser_peek_token (parser)->location;
5200         c_parser_consume_token (parser);
5201         expr.value = build_external_ref (id,
5202                                          (c_parser_peek_token (parser)->type
5203                                           == CPP_OPEN_PAREN), loc);
5204         expr.original_code = ERROR_MARK;
5205       }
5206       break;
5207     case CPP_OPEN_PAREN:
5208       /* A parenthesized expression, statement expression or compound
5209          literal.  */
5210       if (c_parser_peek_2nd_token (parser)->type == CPP_OPEN_BRACE)
5211         {
5212           /* A statement expression.  */
5213           tree stmt;
5214           location_t here = c_parser_peek_token (parser)->location;
5215           c_parser_consume_token (parser);
5216           c_parser_consume_token (parser);
5217           if (cur_stmt_list == NULL)
5218             {
5219               error ("%Hbraced-group within expression allowed "
5220                      "only inside a function", &here);
5221               parser->error = true;
5222               c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL);
5223               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5224               expr.value = error_mark_node;
5225               expr.original_code = ERROR_MARK;
5226               break;
5227             }
5228           stmt = c_begin_stmt_expr ();
5229           c_parser_compound_statement_nostart (parser);
5230           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5231                                      "expected %<)%>");
5232           if (pedantic)
5233             pedwarn ("%HISO C forbids braced-groups within expressions",
5234                      &here);
5235           expr.value = c_finish_stmt_expr (stmt);
5236           expr.original_code = ERROR_MARK;
5237         }
5238       else if (c_token_starts_typename (c_parser_peek_2nd_token (parser)))
5239         {
5240           /* A compound literal.  ??? Can we actually get here rather
5241              than going directly to
5242              c_parser_postfix_expression_after_paren_type from
5243              elsewhere?  */
5244           struct c_type_name *type_name;
5245           c_parser_consume_token (parser);
5246           type_name = c_parser_type_name (parser);
5247           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5248                                      "expected %<)%>");
5249           if (type_name == NULL)
5250             {
5251               expr.value = error_mark_node;
5252               expr.original_code = ERROR_MARK;
5253             }
5254           else
5255             expr = c_parser_postfix_expression_after_paren_type (parser,
5256                                                                  type_name);
5257         }
5258       else
5259         {
5260           /* A parenthesized expression.  */
5261           c_parser_consume_token (parser);
5262           expr = c_parser_expression (parser);
5263           if (TREE_CODE (expr.value) == MODIFY_EXPR)
5264             TREE_NO_WARNING (expr.value) = 1;
5265           expr.original_code = ERROR_MARK;
5266           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5267                                      "expected %<)%>");
5268         }
5269       break;
5270     case CPP_KEYWORD:
5271       switch (c_parser_peek_token (parser)->keyword)
5272         {
5273         case RID_FUNCTION_NAME:
5274         case RID_PRETTY_FUNCTION_NAME:
5275         case RID_C99_FUNCTION_NAME:
5276           expr.value = fname_decl (c_parser_peek_token (parser)->keyword,
5277                                    c_parser_peek_token (parser)->value);
5278           expr.original_code = ERROR_MARK;
5279           c_parser_consume_token (parser);
5280           break;
5281         case RID_VA_ARG:
5282           c_parser_consume_token (parser);
5283           if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5284             {
5285               expr.value = error_mark_node;
5286               expr.original_code = ERROR_MARK;
5287               break;
5288             }
5289           e1 = c_parser_expr_no_commas (parser, NULL);
5290           if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
5291             {
5292               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5293               expr.value = error_mark_node;
5294               expr.original_code = ERROR_MARK;
5295               break;
5296             }
5297           t1 = c_parser_type_name (parser);
5298           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5299                                      "expected %<)%>");
5300           if (t1 == NULL)
5301             {
5302               expr.value = error_mark_node;
5303               expr.original_code = ERROR_MARK;
5304             }
5305           else
5306             {
5307               expr.value = build_va_arg (e1.value, groktypename (t1));
5308               expr.original_code = ERROR_MARK;
5309             }
5310           break;
5311         case RID_OFFSETOF:
5312           c_parser_consume_token (parser);
5313           if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5314             {
5315               expr.value = error_mark_node;
5316               expr.original_code = ERROR_MARK;
5317               break;
5318             }
5319           t1 = c_parser_type_name (parser);
5320           if (t1 == NULL)
5321             {
5322               expr.value = error_mark_node;
5323               expr.original_code = ERROR_MARK;
5324               break;
5325             }
5326           if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
5327             {
5328               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5329               expr.value = error_mark_node;
5330               expr.original_code = ERROR_MARK;
5331               break;
5332             }
5333           {
5334             tree type = groktypename (t1);
5335             tree offsetof_ref;
5336             if (type == error_mark_node)
5337               offsetof_ref = error_mark_node;
5338             else
5339               offsetof_ref = build1 (INDIRECT_REF, type, null_pointer_node);
5340             /* Parse the second argument to __builtin_offsetof.  We
5341                must have one identifier, and beyond that we want to
5342                accept sub structure and sub array references.  */
5343             if (c_parser_next_token_is (parser, CPP_NAME))
5344               {
5345                 offsetof_ref = build_component_ref
5346                   (offsetof_ref, c_parser_peek_token (parser)->value);
5347                 c_parser_consume_token (parser);
5348                 while (c_parser_next_token_is (parser, CPP_DOT)
5349                        || c_parser_next_token_is (parser,
5350                                                   CPP_OPEN_SQUARE))
5351                   {
5352                     if (c_parser_next_token_is (parser, CPP_DOT))
5353                       {
5354                         c_parser_consume_token (parser);
5355                         if (c_parser_next_token_is_not (parser,
5356                                                         CPP_NAME))
5357                           {
5358                             c_parser_error (parser, "expected identifier");
5359                             break;
5360                           }
5361                         offsetof_ref = build_component_ref
5362                           (offsetof_ref,
5363                            c_parser_peek_token (parser)->value);
5364                         c_parser_consume_token (parser);
5365                       }
5366                     else
5367                       {
5368                         tree idx;
5369                         c_parser_consume_token (parser);
5370                         idx = c_parser_expression (parser).value;
5371                         c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
5372                                                    "expected %<]%>");
5373                         offsetof_ref = build_array_ref (offsetof_ref, idx);
5374                       }
5375                   }
5376               }
5377             else
5378               c_parser_error (parser, "expected identifier");
5379             c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5380                                        "expected %<)%>");
5381             expr.value = fold_offsetof (offsetof_ref, NULL_TREE);
5382             expr.original_code = ERROR_MARK;
5383           }
5384           break;
5385         case RID_CHOOSE_EXPR:
5386           c_parser_consume_token (parser);
5387           if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5388             {
5389               expr.value = error_mark_node;
5390               expr.original_code = ERROR_MARK;
5391               break;
5392             }
5393           loc = c_parser_peek_token (parser)->location;
5394           e1 = c_parser_expr_no_commas (parser, NULL);
5395           if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
5396             {
5397               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5398               expr.value = error_mark_node;
5399               expr.original_code = ERROR_MARK;
5400               break;
5401             }
5402           e2 = c_parser_expr_no_commas (parser, NULL);
5403           if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
5404             {
5405               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5406               expr.value = error_mark_node;
5407               expr.original_code = ERROR_MARK;
5408               break;
5409             }
5410           e3 = c_parser_expr_no_commas (parser, NULL);
5411           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5412                                      "expected %<)%>");
5413           {
5414             tree c;
5415
5416             c = fold (e1.value);
5417             if (TREE_CODE (c) != INTEGER_CST)
5418               error ("%Hfirst argument to %<__builtin_choose_expr%> not"
5419                      " a constant", &loc);
5420             expr = integer_zerop (c) ? e3 : e2;
5421           }
5422           break;
5423         case RID_TYPES_COMPATIBLE_P:
5424           c_parser_consume_token (parser);
5425           if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5426             {
5427               expr.value = error_mark_node;
5428               expr.original_code = ERROR_MARK;
5429               break;
5430             }
5431           t1 = c_parser_type_name (parser);
5432           if (t1 == NULL)
5433             {
5434               expr.value = error_mark_node;
5435               expr.original_code = ERROR_MARK;
5436               break;
5437             }
5438           if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
5439             {
5440               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5441               expr.value = error_mark_node;
5442               expr.original_code = ERROR_MARK;
5443               break;
5444             }
5445           t2 = c_parser_type_name (parser);
5446           if (t2 == NULL)
5447             {
5448               expr.value = error_mark_node;
5449               expr.original_code = ERROR_MARK;
5450               break;
5451             }
5452           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5453                                      "expected %<)%>");
5454           {
5455             tree e1, e2;
5456
5457             e1 = TYPE_MAIN_VARIANT (groktypename (t1));
5458             e2 = TYPE_MAIN_VARIANT (groktypename (t2));
5459
5460             expr.value = comptypes (e1, e2)
5461               ? build_int_cst (NULL_TREE, 1)
5462               : build_int_cst (NULL_TREE, 0);
5463             expr.original_code = ERROR_MARK;
5464           }
5465           break;
5466         case RID_AT_SELECTOR:
5467           gcc_assert (c_dialect_objc ());
5468           c_parser_consume_token (parser);
5469           if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5470             {
5471               expr.value = error_mark_node;
5472               expr.original_code = ERROR_MARK;
5473               break;
5474             }
5475           {
5476             tree sel = c_parser_objc_selector_arg (parser);
5477             c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5478                                        "expected %<)%>");
5479             expr.value = objc_build_selector_expr (sel);
5480             expr.original_code = ERROR_MARK;
5481           }
5482           break;
5483         case RID_AT_PROTOCOL:
5484           gcc_assert (c_dialect_objc ());
5485           c_parser_consume_token (parser);
5486           if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5487             {
5488               expr.value = error_mark_node;
5489               expr.original_code = ERROR_MARK;
5490               break;
5491             }
5492           if (c_parser_next_token_is_not (parser, CPP_NAME))
5493             {
5494               c_parser_error (parser, "expected identifier");
5495               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5496               expr.value = error_mark_node;
5497               expr.original_code = ERROR_MARK;
5498               break;
5499             }
5500           {
5501             tree id = c_parser_peek_token (parser)->value;
5502             c_parser_consume_token (parser);
5503             c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5504                                        "expected %<)%>");
5505             expr.value = objc_build_protocol_expr (id);
5506             expr.original_code = ERROR_MARK;
5507           }
5508           break;
5509         case RID_AT_ENCODE:
5510           /* Extension to support C-structures in the archiver.  */
5511           gcc_assert (c_dialect_objc ());
5512           c_parser_consume_token (parser);
5513           if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5514             {
5515               expr.value = error_mark_node;
5516               expr.original_code = ERROR_MARK;
5517               break;
5518             }
5519           t1 = c_parser_type_name (parser);
5520           if (t1 == NULL)
5521             {
5522               expr.value = error_mark_node;
5523               expr.original_code = ERROR_MARK;
5524               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5525               break;
5526             }
5527           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5528                                      "expected %<)%>");
5529           {
5530             tree type = groktypename (t1);
5531             expr.value = objc_build_encode_expr (type);
5532             expr.original_code = ERROR_MARK;
5533           }
5534           break;
5535         default:
5536           c_parser_error (parser, "expected expression");
5537           expr.value = error_mark_node;
5538           expr.original_code = ERROR_MARK;
5539           break;
5540         }
5541       break;
5542     case CPP_OPEN_SQUARE:
5543       if (c_dialect_objc ())
5544         {
5545           tree receiver, args;
5546           c_parser_consume_token (parser);
5547           receiver = c_parser_objc_receiver (parser);
5548           args = c_parser_objc_message_args (parser);
5549           c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
5550                                      "expected %<]%>");
5551           expr.value = objc_build_message_expr (build_tree_list (receiver,
5552                                                                  args));
5553           expr.original_code = ERROR_MARK;
5554           break;
5555         }
5556       /* Else fall through to report error.  */
5557     default:
5558       c_parser_error (parser, "expected expression");
5559       expr.value = error_mark_node;
5560       expr.original_code = ERROR_MARK;
5561       break;
5562     }
5563   return c_parser_postfix_expression_after_primary (parser, expr);
5564 }
5565
5566 /* Parse a postfix expression after a parenthesized type name: the
5567    brace-enclosed initializer of a compound literal, possibly followed
5568    by some postfix operators.  This is separate because it is not
5569    possible to tell until after the type name whether a cast
5570    expression has a cast or a compound literal, or whether the operand
5571    of sizeof is a parenthesized type name or starts with a compound
5572    literal.  */
5573
5574 static struct c_expr
5575 c_parser_postfix_expression_after_paren_type (c_parser *parser,
5576                                               struct c_type_name *type_name)
5577 {
5578   tree type;
5579   struct c_expr init;
5580   struct c_expr expr;
5581   location_t start_loc;
5582   start_init (NULL_TREE, NULL, 0);
5583   type = groktypename (type_name);
5584   start_loc = c_parser_peek_token (parser)->location;
5585   if (type != error_mark_node && C_TYPE_VARIABLE_SIZE (type))
5586     {
5587       error ("%Hcompound literal has variable size", &start_loc);
5588       type = error_mark_node;
5589     }
5590   init = c_parser_braced_init (parser, type, false);
5591   finish_init ();
5592   maybe_warn_string_init (type, init);
5593
5594   if (pedantic && !flag_isoc99)
5595     pedwarn ("%HISO C90 forbids compound literals", &start_loc);
5596   expr.value = build_compound_literal (type, init.value);
5597   expr.original_code = ERROR_MARK;
5598   return c_parser_postfix_expression_after_primary (parser, expr);
5599 }
5600
5601 /* Parse a postfix expression after the initial primary or compound
5602    literal; that is, parse a series of postfix operators.  */
5603
5604 static struct c_expr
5605 c_parser_postfix_expression_after_primary (c_parser *parser,
5606                                            struct c_expr expr)
5607 {
5608   tree ident, idx, exprlist;
5609   while (true)
5610     {
5611       switch (c_parser_peek_token (parser)->type)
5612         {
5613         case CPP_OPEN_SQUARE:
5614           /* Array reference.  */
5615           c_parser_consume_token (parser);
5616           idx = c_parser_expression (parser).value;
5617           c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
5618                                      "expected %<]%>");
5619           expr.value = build_array_ref (expr.value, idx);
5620           expr.original_code = ERROR_MARK;
5621           break;
5622         case CPP_OPEN_PAREN:
5623           /* Function call.  */
5624           c_parser_consume_token (parser);
5625           if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
5626             exprlist = NULL_TREE;
5627           else
5628             exprlist = c_parser_expr_list (parser, true);
5629           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5630                                      "expected %<)%>");
5631           expr.value = build_function_call (expr.value, exprlist);
5632           expr.original_code = ERROR_MARK;
5633           break;
5634         case CPP_DOT:
5635           /* Structure element reference.  */
5636           c_parser_consume_token (parser);
5637           expr = default_function_array_conversion (expr);
5638           if (c_parser_next_token_is (parser, CPP_NAME))
5639             ident = c_parser_peek_token (parser)->value;
5640           else
5641             {
5642               c_parser_error (parser, "expected identifier");
5643               expr.value = error_mark_node;
5644               expr.original_code = ERROR_MARK;
5645               return expr;
5646             }
5647           c_parser_consume_token (parser);
5648           expr.value = build_component_ref (expr.value, ident);
5649           expr.original_code = ERROR_MARK;
5650           break;
5651         case CPP_DEREF:
5652           /* Structure element reference.  */
5653           c_parser_consume_token (parser);
5654           expr = default_function_array_conversion (expr);
5655           if (c_parser_next_token_is (parser, CPP_NAME))
5656             ident = c_parser_peek_token (parser)->value;
5657           else
5658             {
5659               c_parser_error (parser, "expected identifier");
5660               expr.value = error_mark_node;
5661               expr.original_code = ERROR_MARK;
5662               return expr;
5663             }
5664           c_parser_consume_token (parser);
5665           expr.value = build_component_ref (build_indirect_ref (expr.value,
5666                                                                 "->"), ident);
5667           expr.original_code = ERROR_MARK;
5668           break;
5669         case CPP_PLUS_PLUS:
5670           /* Postincrement.  */
5671           c_parser_consume_token (parser);
5672           expr = default_function_array_conversion (expr);
5673           expr.value = build_unary_op (POSTINCREMENT_EXPR, expr.value, 0);
5674           expr.original_code = ERROR_MARK;
5675           break;
5676         case CPP_MINUS_MINUS:
5677           /* Postdecrement.  */
5678           c_parser_consume_token (parser);
5679           expr = default_function_array_conversion (expr);
5680           expr.value = build_unary_op (POSTDECREMENT_EXPR, expr.value, 0);
5681           expr.original_code = ERROR_MARK;
5682           break;
5683         default:
5684           return expr;
5685         }
5686     }
5687 }
5688
5689 /* Parse an expression (C90 6.3.17, C99 6.5.17).
5690
5691    expression:
5692      assignment-expression
5693      expression , assignment-expression
5694 */
5695
5696 static struct c_expr
5697 c_parser_expression (c_parser *parser)
5698 {
5699   struct c_expr expr;
5700   expr = c_parser_expr_no_commas (parser, NULL);
5701   while (c_parser_next_token_is (parser, CPP_COMMA))
5702     {
5703       struct c_expr next;
5704       c_parser_consume_token (parser);
5705       next = c_parser_expr_no_commas (parser, NULL);
5706       next = default_function_array_conversion (next);
5707       expr.value = build_compound_expr (expr.value, next.value);
5708       expr.original_code = COMPOUND_EXPR;
5709     }
5710   return expr;
5711 }
5712
5713 /* Parse an expression and convert functions or arrays to
5714    pointers.  */
5715
5716 static struct c_expr
5717 c_parser_expression_conv (c_parser *parser)
5718 {
5719   struct c_expr expr;
5720   expr = c_parser_expression (parser);
5721   expr = default_function_array_conversion (expr);
5722   return expr;
5723 }
5724
5725 /* Parse a non-empty list of expressions.  If CONVERT_P, convert
5726    functions and arrays to pointers.
5727
5728    nonempty-expr-list:
5729      assignment-expression
5730      nonempty-expr-list , assignment-expression
5731 */
5732
5733 static tree
5734 c_parser_expr_list (c_parser *parser, bool convert_p)
5735 {
5736   struct c_expr expr;
5737   tree ret, cur;
5738   expr = c_parser_expr_no_commas (parser, NULL);
5739   if (convert_p)
5740     expr = default_function_array_conversion (expr);
5741   ret = cur = build_tree_list (NULL_TREE, expr.value);
5742   while (c_parser_next_token_is (parser, CPP_COMMA))
5743     {
5744       c_parser_consume_token (parser);
5745       expr = c_parser_expr_no_commas (parser, NULL);
5746       if (convert_p)
5747         expr = default_function_array_conversion (expr);
5748       cur = TREE_CHAIN (cur) = build_tree_list (NULL_TREE, expr.value);
5749     }
5750   return ret;
5751 }
5752
5753 \f
5754 /* Parse Objective-C-specific constructs.  */
5755
5756 /* Parse an objc-class-definition.
5757
5758    objc-class-definition:
5759      @interface identifier objc-superclass[opt] objc-protocol-refs[opt]
5760        objc-class-instance-variables[opt] objc-methodprotolist @end
5761      @implementation identifier objc-superclass[opt]
5762        objc-class-instance-variables[opt]
5763      @interface identifier ( identifier ) objc-protocol-refs[opt]
5764        objc-methodprotolist @end
5765      @implementation identifier ( identifier )
5766
5767    objc-superclass:
5768      : identifier
5769
5770    "@interface identifier (" must start "@interface identifier (
5771    identifier ) ...": objc-methodprotolist in the first production may
5772    not start with a parenthesized identifier as a declarator of a data
5773    definition with no declaration specifiers if the objc-superclass,
5774    objc-protocol-refs and objc-class-instance-variables are omitted.  */
5775
5776 static void
5777 c_parser_objc_class_definition (c_parser *parser)
5778 {
5779   bool iface_p;
5780   tree id1;
5781   tree superclass;
5782   if (c_parser_next_token_is_keyword (parser, RID_AT_INTERFACE))
5783     iface_p = true;
5784   else if (c_parser_next_token_is_keyword (parser, RID_AT_IMPLEMENTATION))
5785     iface_p = false;
5786   else
5787     gcc_unreachable ();
5788   c_parser_consume_token (parser);
5789   if (c_parser_next_token_is_not (parser, CPP_NAME))
5790     {
5791       c_parser_error (parser, "expected identifier");
5792       return;
5793     }
5794   id1 = c_parser_peek_token (parser)->value;
5795   c_parser_consume_token (parser);
5796   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
5797     {
5798       tree id2;
5799       tree proto = NULL_TREE;
5800       c_parser_consume_token (parser);
5801       if (c_parser_next_token_is_not (parser, CPP_NAME))
5802         {
5803           c_parser_error (parser, "expected identifier");
5804           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5805           return;
5806         }
5807       id2 = c_parser_peek_token (parser)->value;
5808       c_parser_consume_token (parser);
5809       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
5810       if (!iface_p)
5811         {
5812           objc_start_category_implementation (id1, id2);
5813           return;
5814         }
5815       if (c_parser_next_token_is (parser, CPP_LESS))
5816         proto = c_parser_objc_protocol_refs (parser);
5817       objc_start_category_interface (id1, id2, proto);
5818       c_parser_objc_methodprotolist (parser);
5819       c_parser_require_keyword (parser, RID_AT_END, "expected %<@end%>");
5820       objc_finish_interface ();
5821       return;
5822     }
5823   if (c_parser_next_token_is (parser, CPP_COLON))
5824     {
5825       c_parser_consume_token (parser);
5826       if (c_parser_next_token_is_not (parser, CPP_NAME))
5827         {
5828           c_parser_error (parser, "expected identifier");
5829           return;
5830         }
5831       superclass = c_parser_peek_token (parser)->value;
5832       c_parser_consume_token (parser);
5833     }
5834   else
5835     superclass = NULL_TREE;
5836   if (iface_p)
5837     {
5838       tree proto = NULL_TREE;
5839       if (c_parser_next_token_is (parser, CPP_LESS))
5840         proto = c_parser_objc_protocol_refs (parser);
5841       objc_start_class_interface (id1, superclass, proto);
5842     }
5843   else
5844     objc_start_class_implementation (id1, superclass);
5845   if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
5846     c_parser_objc_class_instance_variables (parser);
5847   if (iface_p)
5848     {
5849       objc_continue_interface ();
5850       c_parser_objc_methodprotolist (parser);
5851       c_parser_require_keyword (parser, RID_AT_END, "expected %<@end%>");
5852       objc_finish_interface ();
5853     }
5854   else
5855     {
5856       objc_continue_implementation ();
5857       return;
5858     }
5859 }
5860
5861 /* Parse objc-class-instance-variables.
5862
5863    objc-class-instance-variables:
5864      { objc-instance-variable-decl-list[opt] }
5865
5866    objc-instance-variable-decl-list:
5867      objc-visibility-spec
5868      objc-instance-variable-decl ;
5869      ;
5870      objc-instance-variable-decl-list objc-visibility-spec
5871      objc-instance-variable-decl-list objc-instance-variable-decl ;
5872      objc-instance-variable-decl-list ;
5873
5874    objc-visibility-spec:
5875      @private
5876      @protected
5877      @public
5878
5879    objc-instance-variable-decl:
5880      struct-declaration
5881 */
5882
5883 static void
5884 c_parser_objc_class_instance_variables (c_parser *parser)
5885 {
5886   gcc_assert (c_parser_next_token_is (parser, CPP_OPEN_BRACE));
5887   c_parser_consume_token (parser);
5888   while (c_parser_next_token_is_not (parser, CPP_EOF))
5889     {
5890       tree decls;
5891       /* Parse any stray semicolon.  */
5892       if (c_parser_next_token_is (parser, CPP_SEMICOLON))
5893         {
5894           if (pedantic)
5895             pedwarn ("%Hextra semicolon in struct or union specified",
5896                      &c_parser_peek_token (parser)->location);
5897           c_parser_consume_token (parser);
5898           continue;
5899         }
5900       /* Stop if at the end of the instance variables.  */
5901       if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
5902         {
5903           c_parser_consume_token (parser);
5904           break;
5905         }
5906       /* Parse any objc-visibility-spec.  */
5907       if (c_parser_next_token_is_keyword (parser, RID_AT_PRIVATE))
5908         {
5909           c_parser_consume_token (parser);
5910           objc_set_visibility (2);
5911           continue;
5912         }
5913       else if (c_parser_next_token_is_keyword (parser, RID_AT_PROTECTED))
5914         {
5915           c_parser_consume_token (parser);
5916           objc_set_visibility (0);
5917           continue;
5918         }
5919       else if (c_parser_next_token_is_keyword (parser, RID_AT_PUBLIC))
5920         {
5921           c_parser_consume_token (parser);
5922           objc_set_visibility (1);
5923           continue;
5924         }
5925       else if (c_parser_next_token_is (parser, CPP_PRAGMA))
5926         {
5927           c_parser_pragma (parser, pragma_external);
5928           continue;
5929         }
5930
5931       /* Parse some comma-separated declarations.  */
5932       decls = c_parser_struct_declaration (parser);
5933       {
5934         /* Comma-separated instance variables are chained together in
5935            reverse order; add them one by one.  */
5936         tree ivar = nreverse (decls);
5937         for (; ivar; ivar = TREE_CHAIN (ivar))
5938           objc_add_instance_variable (copy_node (ivar));
5939       }
5940       c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
5941     }
5942 }
5943
5944 /* Parse an objc-class-declaration.
5945
5946    objc-class-declaration:
5947      @class identifier-list ;
5948 */
5949
5950 static void
5951 c_parser_objc_class_declaration (c_parser *parser)
5952 {
5953   tree list = NULL_TREE;
5954   gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_CLASS));
5955   c_parser_consume_token (parser);
5956   /* Any identifiers, including those declared as type names, are OK
5957      here.  */
5958   while (true)
5959     {
5960       tree id;
5961       if (c_parser_next_token_is_not (parser, CPP_NAME))
5962         {
5963           c_parser_error (parser, "expected identifier");
5964           break;
5965         }
5966       id = c_parser_peek_token (parser)->value;
5967       list = chainon (list, build_tree_list (NULL_TREE, id));
5968       c_parser_consume_token (parser);
5969       if (c_parser_next_token_is (parser, CPP_COMMA))
5970         c_parser_consume_token (parser);
5971       else
5972         break;
5973     }
5974   c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
5975   objc_declare_class (list);
5976 }
5977
5978 /* Parse an objc-alias-declaration.
5979
5980    objc-alias-declaration:
5981      @compatibility_alias identifier identifier ;
5982 */
5983
5984 static void
5985 c_parser_objc_alias_declaration (c_parser *parser)
5986 {
5987   tree id1, id2;
5988   gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_ALIAS));
5989   c_parser_consume_token (parser);
5990   if (c_parser_next_token_is_not (parser, CPP_NAME))
5991     {
5992       c_parser_error (parser, "expected identifier");
5993       c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
5994       return;
5995     }
5996   id1 = c_parser_peek_token (parser)->value;
5997   c_parser_consume_token (parser);
5998   if (c_parser_next_token_is_not (parser, CPP_NAME))
5999     {
6000       c_parser_error (parser, "expected identifier");
6001       c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
6002       return;
6003     }
6004   id2 = c_parser_peek_token (parser)->value;
6005   c_parser_consume_token (parser);
6006   c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
6007   objc_declare_alias (id1, id2);
6008 }
6009
6010 /* Parse an objc-protocol-definition.
6011
6012    objc-protocol-definition:
6013      @protocol identifier objc-protocol-refs[opt] objc-methodprotolist @end
6014      @protocol identifier-list ;
6015
6016    "@protocol identifier ;" should be resolved as "@protocol
6017    identifier-list ;": objc-methodprotolist may not start with a
6018    semicolon in the first alternative if objc-protocol-refs are
6019    omitted.  */
6020
6021 static void
6022 c_parser_objc_protocol_definition (c_parser *parser)
6023 {
6024   gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_PROTOCOL));
6025   c_parser_consume_token (parser);
6026   if (c_parser_next_token_is_not (parser, CPP_NAME))
6027     {
6028       c_parser_error (parser, "expected identifier");
6029       return;
6030     }
6031   if (c_parser_peek_2nd_token (parser)->type == CPP_COMMA
6032       || c_parser_peek_2nd_token (parser)->type == CPP_SEMICOLON)
6033     {
6034       tree list = NULL_TREE;
6035       /* Any identifiers, including those declared as type names, are
6036          OK here.  */
6037       while (true)
6038         {
6039           tree id;
6040           if (c_parser_next_token_is_not (parser, CPP_NAME))
6041             {
6042               c_parser_error (parser, "expected identifier");
6043               break;
6044             }
6045           id = c_parser_peek_token (parser)->value;
6046           list = chainon (list, build_tree_list (NULL_TREE, id));
6047           c_parser_consume_token (parser);
6048           if (c_parser_next_token_is (parser, CPP_COMMA))
6049             c_parser_consume_token (parser);
6050           else
6051             break;
6052         }
6053       c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
6054       objc_declare_protocols (list);
6055     }
6056   else
6057     {
6058       tree id = c_parser_peek_token (parser)->value;
6059       tree proto = NULL_TREE;
6060       c_parser_consume_token (parser);
6061       if (c_parser_next_token_is (parser, CPP_LESS))
6062         proto = c_parser_objc_protocol_refs (parser);
6063       parser->objc_pq_context = true;
6064       objc_start_protocol (id, proto);
6065       c_parser_objc_methodprotolist (parser);
6066       c_parser_require_keyword (parser, RID_AT_END, "expected %<@end%>");
6067       parser->objc_pq_context = false;
6068       objc_finish_interface ();
6069     }
6070 }
6071
6072 /* Parse an objc-method-type.
6073
6074    objc-method-type:
6075      +
6076      -
6077 */
6078
6079 static enum tree_code
6080 c_parser_objc_method_type (c_parser *parser)
6081 {
6082   switch (c_parser_peek_token (parser)->type)
6083     {
6084     case CPP_PLUS:
6085       c_parser_consume_token (parser);
6086       return PLUS_EXPR;
6087     case CPP_MINUS:
6088       c_parser_consume_token (parser);
6089       return MINUS_EXPR;
6090     default:
6091       gcc_unreachable ();
6092     }
6093 }
6094
6095 /* Parse an objc-method-definition.
6096
6097    objc-method-definition:
6098      objc-method-type objc-method-decl ;[opt] compound-statement
6099 */
6100
6101 static void
6102 c_parser_objc_method_definition (c_parser *parser)
6103 {
6104   enum tree_code type = c_parser_objc_method_type (parser);
6105   tree decl;
6106   objc_set_method_type (type);
6107   parser->objc_pq_context = true;
6108   decl = c_parser_objc_method_decl (parser);
6109   if (c_parser_next_token_is (parser, CPP_SEMICOLON))
6110     {
6111       c_parser_consume_token (parser);
6112       if (pedantic)
6113         pedwarn ("%Hextra semicolon in method definition specified",
6114                  &c_parser_peek_token (parser)->location);
6115     }
6116   if (!c_parser_next_token_is (parser, CPP_OPEN_BRACE))
6117     {
6118       c_parser_error (parser, "expected %<{%>");
6119       return;
6120     }
6121   parser->objc_pq_context = false;
6122   objc_start_method_definition (decl);
6123   add_stmt (c_parser_compound_statement (parser));
6124   objc_finish_method_definition (current_function_decl);
6125 }
6126
6127 /* Parse an objc-methodprotolist.
6128
6129    objc-methodprotolist:
6130      empty
6131      objc-methodprotolist objc-methodproto
6132      objc-methodprotolist declaration
6133      objc-methodprotolist ;
6134
6135    The declaration is a data definition, which may be missing
6136    declaration specifiers under the same rules and diagnostics as
6137    other data definitions outside functions, and the stray semicolon
6138    is diagnosed the same way as a stray semicolon outside a
6139    function.  */
6140
6141 static void
6142 c_parser_objc_methodprotolist (c_parser *parser)
6143 {
6144   while (true)
6145     {
6146       /* The list is terminated by @end.  */
6147       switch (c_parser_peek_token (parser)->type)
6148         {
6149         case CPP_SEMICOLON:
6150           if (pedantic)
6151             pedwarn ("%HISO C does not allow extra %<;%> "
6152                      "outside of a function",
6153                      &c_parser_peek_token (parser)->location);
6154           c_parser_consume_token (parser);
6155           break;
6156         case CPP_PLUS:
6157         case CPP_MINUS:
6158           c_parser_objc_methodproto (parser);
6159           break;
6160         case CPP_PRAGMA:
6161           c_parser_pragma (parser, pragma_external);
6162           break;
6163         case CPP_EOF:
6164           return;
6165         default:
6166           if (c_parser_next_token_is_keyword (parser, RID_AT_END))
6167             return;
6168           c_parser_declaration_or_fndef (parser, false, true, false, true);
6169           break;
6170         }
6171     }
6172 }
6173
6174 /* Parse an objc-methodproto.
6175
6176    objc-methodproto:
6177      objc-method-type objc-method-decl ;
6178 */
6179
6180 static void
6181 c_parser_objc_methodproto (c_parser *parser)
6182 {
6183   enum tree_code type = c_parser_objc_method_type (parser);
6184   tree decl;
6185   objc_set_method_type (type);
6186   /* Remember protocol qualifiers in prototypes.  */
6187   parser->objc_pq_context = true;
6188   decl = c_parser_objc_method_decl (parser);
6189   /* Forget protocol qualifiers here.  */
6190   parser->objc_pq_context = false;
6191   objc_add_method_declaration (decl);
6192   c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
6193 }
6194
6195 /* Parse an objc-method-decl.
6196
6197    objc-method-decl:
6198      ( objc-type-name ) objc-selector
6199      objc-selector
6200      ( objc-type-name ) objc-keyword-selector objc-optparmlist
6201      objc-keyword-selector objc-optparmlist
6202
6203    objc-keyword-selector:
6204      objc-keyword-decl
6205      objc-keyword-selector objc-keyword-decl
6206
6207    objc-keyword-decl:
6208      objc-selector : ( objc-type-name ) identifier
6209      objc-selector : identifier
6210      : ( objc-type-name ) identifier
6211      : identifier
6212
6213    objc-optparmlist:
6214      objc-optparms objc-optellipsis
6215
6216    objc-optparms:
6217      empty
6218      objc-opt-parms , parameter-declaration
6219
6220    objc-optellipsis:
6221      empty
6222      , ...
6223 */
6224
6225 static tree
6226 c_parser_objc_method_decl (c_parser *parser)
6227 {
6228   tree type = NULL_TREE;
6229   tree sel;
6230   tree parms = NULL_TREE;
6231   bool ellipsis = false;
6232
6233   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
6234     {
6235       c_parser_consume_token (parser);
6236       type = c_parser_objc_type_name (parser);
6237       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
6238     }
6239   sel = c_parser_objc_selector (parser);
6240   /* If there is no selector, or a colon follows, we have an
6241      objc-keyword-selector.  If there is a selector, and a colon does
6242      not follow, that selector ends the objc-method-decl.  */
6243   if (!sel || c_parser_next_token_is (parser, CPP_COLON))
6244     {
6245       tree tsel = sel;
6246       tree list = NULL_TREE;
6247       while (true)
6248         {
6249           tree atype = NULL_TREE, id, keyworddecl;
6250           if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
6251             break;
6252           if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
6253             {
6254               c_parser_consume_token (parser);
6255               atype = c_parser_objc_type_name (parser);
6256               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
6257                                          "expected %<)%>");
6258             }
6259           if (c_parser_next_token_is_not (parser, CPP_NAME))
6260             {
6261               c_parser_error (parser, "expected identifier");
6262               return error_mark_node;
6263             }
6264           id = c_parser_peek_token (parser)->value;
6265           c_parser_consume_token (parser);
6266           keyworddecl = objc_build_keyword_decl (tsel, atype, id);
6267           list = chainon (list, keyworddecl);
6268           tsel = c_parser_objc_selector (parser);
6269           if (!tsel && c_parser_next_token_is_not (parser, CPP_COLON))
6270             break;
6271         }
6272       /* Parse the optional parameter list.  Optional Objective-C
6273          method parameters follow the C syntax, and may include '...'
6274          to denote a variable number of arguments.  */
6275       parms = make_node (TREE_LIST);
6276       while (c_parser_next_token_is (parser, CPP_COMMA))
6277         {
6278           struct c_parm *parm;
6279           c_parser_consume_token (parser);
6280           if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
6281             {
6282               ellipsis = true;
6283               c_parser_consume_token (parser);
6284               break;
6285             }
6286           parm = c_parser_parameter_declaration (parser, NULL_TREE);
6287           if (parm == NULL)
6288             break;
6289           parms = chainon (parms,
6290                            build_tree_list (NULL_TREE, grokparm (parm)));
6291         }
6292       sel = list;
6293     }
6294   return objc_build_method_signature (type, sel, parms, ellipsis);
6295 }
6296
6297 /* Parse an objc-type-name.
6298
6299    objc-type-name:
6300      objc-type-qualifiers[opt] type-name
6301      objc-type-qualifiers[opt]
6302
6303    objc-type-qualifiers:
6304      objc-type-qualifier
6305      objc-type-qualifiers objc-type-qualifier
6306
6307    objc-type-qualifier: one of
6308      in out inout bycopy byref oneway
6309 */
6310
6311 static tree
6312 c_parser_objc_type_name (c_parser *parser)
6313 {
6314   tree quals = NULL_TREE;
6315   struct c_type_name *typename = NULL;
6316   tree type = NULL_TREE;
6317   while (true)
6318     {
6319       c_token *token = c_parser_peek_token (parser);
6320       if (token->type == CPP_KEYWORD
6321           && (token->keyword == RID_IN
6322               || token->keyword == RID_OUT
6323               || token->keyword == RID_INOUT
6324               || token->keyword == RID_BYCOPY
6325               || token->keyword == RID_BYREF
6326               || token->keyword == RID_ONEWAY))
6327         {
6328           quals = chainon (quals, build_tree_list (NULL_TREE, token->value));
6329           c_parser_consume_token (parser);
6330         }
6331       else
6332         break;
6333     }
6334   if (c_parser_next_token_starts_typename (parser))
6335     typename = c_parser_type_name (parser);
6336   if (typename)
6337     type = groktypename (typename);
6338   return build_tree_list (quals, type);
6339 }
6340
6341 /* Parse objc-protocol-refs.
6342
6343    objc-protocol-refs:
6344      < identifier-list >
6345 */
6346
6347 static tree
6348 c_parser_objc_protocol_refs (c_parser *parser)
6349 {
6350   tree list = NULL_TREE;
6351   gcc_assert (c_parser_next_token_is (parser, CPP_LESS));
6352   c_parser_consume_token (parser);
6353   /* Any identifiers, including those declared as type names, are OK
6354      here.  */
6355   while (true)
6356     {
6357       tree id;
6358       if (c_parser_next_token_is_not (parser, CPP_NAME))
6359         {
6360           c_parser_error (parser, "expected identifier");
6361           break;
6362         }
6363       id = c_parser_peek_token (parser)->value;
6364       list = chainon (list, build_tree_list (NULL_TREE, id));
6365       c_parser_consume_token (parser);
6366       if (c_parser_next_token_is (parser, CPP_COMMA))
6367         c_parser_consume_token (parser);
6368       else
6369         break;
6370     }
6371   c_parser_require (parser, CPP_GREATER, "expected %<>%>");
6372   return list;
6373 }
6374
6375 /* Parse an objc-try-catch-statement.
6376
6377    objc-try-catch-statement:
6378      @try compound-statement objc-catch-list[opt]
6379      @try compound-statement objc-catch-list[opt] @finally compound-statement
6380
6381    objc-catch-list:
6382      @catch ( parameter-declaration ) compound-statement
6383      objc-catch-list @catch ( parameter-declaration ) compound-statement
6384 */
6385
6386 static void
6387 c_parser_objc_try_catch_statement (c_parser *parser)
6388 {
6389   location_t loc;
6390   tree stmt;
6391   gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_TRY));
6392   c_parser_consume_token (parser);
6393   loc = c_parser_peek_token (parser)->location;
6394   stmt = c_parser_compound_statement (parser);
6395   objc_begin_try_stmt (loc, stmt);
6396   while (c_parser_next_token_is_keyword (parser, RID_AT_CATCH))
6397     {
6398       struct c_parm *parm;
6399       c_parser_consume_token (parser);
6400       if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
6401         break;
6402       parm = c_parser_parameter_declaration (parser, NULL_TREE);
6403       if (parm == NULL)
6404         {
6405           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
6406           break;
6407         }
6408       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
6409       objc_begin_catch_clause (grokparm (parm));
6410       if (c_parser_require (parser, CPP_OPEN_BRACE, "expected %<{%>"))
6411         c_parser_compound_statement_nostart (parser);
6412       objc_finish_catch_clause ();
6413     }
6414   if (c_parser_next_token_is_keyword (parser, RID_AT_FINALLY))
6415     {
6416       location_t finloc;
6417       tree finstmt;
6418       c_parser_consume_token (parser);
6419       finloc = c_parser_peek_token (parser)->location;
6420       finstmt = c_parser_compound_statement (parser);
6421       objc_build_finally_clause (finloc, finstmt);
6422     }
6423   objc_finish_try_stmt ();
6424 }
6425
6426 /* Parse an objc-synchronized-statement.
6427
6428    objc-synchronized-statement:
6429      @synchronized ( expression ) compound-statement
6430 */
6431
6432 static void
6433 c_parser_objc_synchronized_statement (c_parser *parser)
6434 {
6435   location_t loc;
6436   tree expr, stmt;
6437   gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_SYNCHRONIZED));
6438   c_parser_consume_token (parser);
6439   loc = c_parser_peek_token (parser)->location;
6440   if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
6441     {
6442       expr = c_parser_expression (parser).value;
6443       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
6444     }
6445   else
6446     expr = error_mark_node;
6447   stmt = c_parser_compound_statement (parser);
6448   objc_build_synchronized (loc, expr, stmt);
6449 }
6450
6451 /* Parse an objc-selector; return NULL_TREE without an error if the
6452    next token is not an objc-selector.
6453
6454    objc-selector:
6455      identifier
6456      one of
6457        enum struct union if else while do for switch case default
6458        break continue return goto asm sizeof typeof __alignof
6459        unsigned long const short volatile signed restrict _Complex
6460        in out inout bycopy byref oneway int char float double void _Bool
6461
6462    ??? Why this selection of keywords but not, for example, storage
6463    class specifiers?  */
6464
6465 static tree
6466 c_parser_objc_selector (c_parser *parser)
6467 {
6468   c_token *token = c_parser_peek_token (parser);
6469   tree value = token->value;
6470   if (token->type == CPP_NAME)
6471     {
6472       c_parser_consume_token (parser);
6473       return value;
6474     }
6475   if (token->type != CPP_KEYWORD)
6476     return NULL_TREE;
6477   switch (token->keyword)
6478     {
6479     case RID_ENUM:
6480     case RID_STRUCT:
6481     case RID_UNION:
6482     case RID_IF:
6483     case RID_ELSE:
6484     case RID_WHILE:
6485     case RID_DO:
6486     case RID_FOR:
6487     case RID_SWITCH:
6488     case RID_CASE:
6489     case RID_DEFAULT:
6490     case RID_BREAK:
6491     case RID_CONTINUE:
6492     case RID_RETURN:
6493     case RID_GOTO:
6494     case RID_ASM:
6495     case RID_SIZEOF:
6496     case RID_TYPEOF:
6497     case RID_ALIGNOF:
6498     case RID_UNSIGNED:
6499     case RID_LONG:
6500     case RID_CONST:
6501     case RID_SHORT:
6502     case RID_VOLATILE:
6503     case RID_SIGNED:
6504     case RID_RESTRICT:
6505     case RID_COMPLEX:
6506     case RID_IN:
6507     case RID_OUT:
6508     case RID_INOUT:
6509     case RID_BYCOPY:
6510     case RID_BYREF:
6511     case RID_ONEWAY:
6512     case RID_INT:
6513     case RID_CHAR:
6514     case RID_FLOAT:
6515     case RID_DOUBLE:
6516     case RID_VOID:
6517     case RID_BOOL:
6518       c_parser_consume_token (parser);
6519       return value;
6520     default:
6521       return NULL_TREE;
6522     }
6523 }
6524
6525 /* Parse an objc-selector-arg.
6526
6527    objc-selector-arg:
6528      objc-selector
6529      objc-keywordname-list
6530
6531    objc-keywordname-list:
6532      objc-keywordname
6533      objc-keywordname-list objc-keywordname
6534
6535    objc-keywordname:
6536      objc-selector :
6537      :
6538 */
6539
6540 static tree
6541 c_parser_objc_selector_arg (c_parser *parser)
6542 {
6543   tree sel = c_parser_objc_selector (parser);
6544   tree list = NULL_TREE;
6545   if (sel && c_parser_next_token_is_not (parser, CPP_COLON))
6546     return sel;
6547   while (true)
6548     {
6549       if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
6550         return list;
6551       list = chainon (list, build_tree_list (sel, NULL_TREE));
6552       sel = c_parser_objc_selector (parser);
6553       if (!sel && c_parser_next_token_is_not (parser, CPP_COLON))
6554         break;
6555     }
6556   return list;
6557 }
6558
6559 /* Parse an objc-receiver.
6560
6561    objc-receiver:
6562      expression
6563      class-name
6564      type-name
6565 */
6566
6567 static tree
6568 c_parser_objc_receiver (c_parser *parser)
6569 {
6570   if (c_parser_peek_token (parser)->type == CPP_NAME
6571       && (c_parser_peek_token (parser)->id_kind == C_ID_TYPENAME
6572           || c_parser_peek_token (parser)->id_kind == C_ID_CLASSNAME))
6573     {
6574       tree id = c_parser_peek_token (parser)->value;
6575       c_parser_consume_token (parser);
6576       return objc_get_class_reference (id);
6577     }
6578   return c_parser_expression (parser).value;
6579 }
6580
6581 /* Parse objc-message-args.
6582
6583    objc-message-args:
6584      objc-selector
6585      objc-keywordarg-list
6586
6587    objc-keywordarg-list:
6588      objc-keywordarg
6589      objc-keywordarg-list objc-keywordarg
6590
6591    objc-keywordarg:
6592      objc-selector : objc-keywordexpr
6593      : objc-keywordexpr
6594 */
6595
6596 static tree
6597 c_parser_objc_message_args (c_parser *parser)
6598 {
6599   tree sel = c_parser_objc_selector (parser);
6600   tree list = NULL_TREE;
6601   if (sel && c_parser_next_token_is_not (parser, CPP_COLON))
6602     return sel;
6603   while (true)
6604     {
6605       tree keywordexpr;
6606       if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
6607         return list;
6608       keywordexpr = c_parser_objc_keywordexpr (parser);
6609       list = chainon (list, build_tree_list (sel, keywordexpr));
6610       sel = c_parser_objc_selector (parser);
6611       if (!sel && c_parser_next_token_is_not (parser, CPP_COLON))
6612         break;
6613     }
6614   return list;
6615 }
6616
6617 /* Parse an objc-keywordexpr.
6618
6619    objc-keywordexpr:
6620      nonempty-expr-list
6621 */
6622
6623 static tree
6624 c_parser_objc_keywordexpr (c_parser *parser)
6625 {
6626   tree list = c_parser_expr_list (parser, true);
6627   if (TREE_CHAIN (list) == NULL_TREE)
6628     {
6629       /* Just return the expression, remove a level of
6630          indirection.  */
6631       return TREE_VALUE (list);
6632     }
6633   else
6634     {
6635       /* We have a comma expression, we will collapse later.  */
6636       return list;
6637     }
6638 }
6639
6640 \f
6641 /* Handle pragmas.  Some OpenMP pragmas are associated with, and therefore
6642    should be considered, statements.  ALLOW_STMT is true if we're within
6643    the context of a function and such pragmas are to be allowed.  Returns
6644    true if we actually parsed such a pragma.  */
6645
6646 static bool
6647 c_parser_pragma (c_parser *parser, enum pragma_context context)
6648 {
6649   unsigned int id;
6650
6651   id = c_parser_peek_token (parser)->pragma_kind;
6652   gcc_assert (id != PRAGMA_NONE);
6653
6654   switch (id)
6655     {
6656     case PRAGMA_OMP_BARRIER:
6657       if (context != pragma_compound)
6658         {
6659           if (context == pragma_stmt)
6660             c_parser_error (parser, "%<#pragma omp barrier%> may only be "
6661                             "used in compound statements");
6662           goto bad_stmt;
6663         }
6664       c_parser_omp_barrier (parser);
6665       return false;
6666
6667     case PRAGMA_OMP_FLUSH:
6668       if (context != pragma_compound)
6669         {
6670           if (context == pragma_stmt)
6671             c_parser_error (parser, "%<#pragma omp flush%> may only be "
6672                             "used in compound statements");
6673           goto bad_stmt;
6674         }
6675       c_parser_omp_flush (parser);
6676       return false;
6677
6678     case PRAGMA_OMP_THREADPRIVATE:
6679       c_parser_omp_threadprivate (parser);
6680       return false;
6681
6682     case PRAGMA_OMP_SECTION:
6683       error ("%H%<#pragma omp section%> may only be used in "
6684              "%<#pragma omp sections%> construct",
6685              &c_parser_peek_token (parser)->location);
6686       c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL);
6687       return false;
6688
6689     case PRAGMA_GCC_PCH_PREPROCESS:
6690       c_parser_error (parser, "%<#pragma GCC pch_preprocess%> must be first");
6691       c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL);
6692       return false;
6693
6694     default:
6695       if (id < PRAGMA_FIRST_EXTERNAL)
6696         {
6697           if (context == pragma_external)
6698             {
6699             bad_stmt:
6700               c_parser_error (parser, "expected declaration specifiers");
6701               c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL);
6702               return false;
6703             }
6704           c_parser_omp_construct (parser);
6705           return true;
6706         }
6707       break;
6708     }
6709
6710   c_parser_consume_pragma (parser);
6711   c_invoke_pragma_handler (id);
6712
6713   /* Skip to EOL, but suppress any error message.  Those will have been 
6714      generated by the handler routine through calling error, as opposed
6715      to calling c_parser_error.  */
6716   parser->error = true;
6717   c_parser_skip_to_pragma_eol (parser);
6718
6719   return false;
6720 }
6721
6722 /* The interface the pragma parsers have to the lexer.  */
6723
6724 enum cpp_ttype
6725 pragma_lex (tree *value)
6726 {
6727   c_token *tok = c_parser_peek_token (the_parser);
6728   enum cpp_ttype ret = tok->type;
6729
6730   *value = tok->value;
6731   if (ret == CPP_PRAGMA_EOL || ret == CPP_EOF)
6732     ret = CPP_EOF;
6733   else
6734     {
6735       if (ret == CPP_KEYWORD)
6736         ret = CPP_NAME;
6737       c_parser_consume_token (the_parser);
6738     }
6739
6740   return ret;
6741 }
6742
6743 static void
6744 c_parser_pragma_pch_preprocess (c_parser *parser)
6745 {
6746   tree name = NULL;
6747
6748   c_parser_consume_pragma (parser);
6749   if (c_parser_next_token_is (parser, CPP_STRING))
6750     {
6751       name = c_parser_peek_token (parser)->value;
6752       c_parser_consume_token (parser);
6753     }
6754   else
6755     c_parser_error (parser, "expected string literal");
6756   c_parser_skip_to_pragma_eol (parser);
6757
6758   if (name)
6759     c_common_pch_pragma (parse_in, TREE_STRING_POINTER (name));
6760 }
6761 \f
6762 /* OpenMP 2.5 parsing routines.  */
6763
6764 /* Returns name of the next clause.
6765    If the clause is not recognized PRAGMA_OMP_CLAUSE_NONE is returned and
6766    the token is not consumed.  Otherwise appropriate pragma_omp_clause is
6767    returned and the token is consumed.  */
6768
6769 static pragma_omp_clause
6770 c_parser_omp_clause_name (c_parser *parser)
6771 {
6772   pragma_omp_clause result = PRAGMA_OMP_CLAUSE_NONE;
6773
6774   if (c_parser_next_token_is_keyword (parser, RID_IF))
6775     result = PRAGMA_OMP_CLAUSE_IF;
6776   else if (c_parser_next_token_is_keyword (parser, RID_DEFAULT))
6777     result = PRAGMA_OMP_CLAUSE_DEFAULT;
6778   else if (c_parser_next_token_is (parser, CPP_NAME))
6779     {
6780       const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
6781
6782       switch (p[0])
6783         {
6784         case 'c':
6785           if (!strcmp ("copyin", p))
6786             result = PRAGMA_OMP_CLAUSE_COPYIN;
6787           else if (!strcmp ("copyprivate", p))
6788             result = PRAGMA_OMP_CLAUSE_COPYPRIVATE;
6789           break;
6790         case 'f':
6791           if (!strcmp ("firstprivate", p))
6792             result = PRAGMA_OMP_CLAUSE_FIRSTPRIVATE;
6793           break;
6794         case 'l':
6795           if (!strcmp ("lastprivate", p))
6796             result = PRAGMA_OMP_CLAUSE_LASTPRIVATE;
6797           break;
6798         case 'n':
6799           if (!strcmp ("nowait", p))
6800             result = PRAGMA_OMP_CLAUSE_NOWAIT;
6801           else if (!strcmp ("num_threads", p))
6802             result = PRAGMA_OMP_CLAUSE_NUM_THREADS;
6803           break;
6804         case 'o':
6805           if (!strcmp ("ordered", p))
6806             result = PRAGMA_OMP_CLAUSE_ORDERED;
6807           break;
6808         case 'p':
6809           if (!strcmp ("private", p))
6810             result = PRAGMA_OMP_CLAUSE_PRIVATE;
6811           break;
6812         case 'r':
6813           if (!strcmp ("reduction", p))
6814             result = PRAGMA_OMP_CLAUSE_REDUCTION;
6815           break;
6816         case 's':
6817           if (!strcmp ("schedule", p))
6818             result = PRAGMA_OMP_CLAUSE_SCHEDULE;
6819           else if (!strcmp ("shared", p))
6820             result = PRAGMA_OMP_CLAUSE_SHARED;
6821           break;
6822         }
6823     }
6824
6825   if (result != PRAGMA_OMP_CLAUSE_NONE)
6826     c_parser_consume_token (parser);
6827
6828   return result;
6829 }
6830
6831 /* Validate that a clause of the given type does not already exist.  */
6832
6833 static void
6834 check_no_duplicate_clause (tree clauses, enum tree_code code, const char *name)
6835 {
6836   tree c;
6837
6838   for (c = clauses; c ; c = OMP_CLAUSE_CHAIN (c))
6839     if (OMP_CLAUSE_CODE (c) == code)
6840       {
6841         error ("too many %qs clauses", name);
6842         break;
6843       }
6844 }
6845
6846 /* OpenMP 2.5:
6847    variable-list:
6848      identifier
6849      variable-list , identifier
6850
6851    If KIND is nonzero, create the appropriate node and install the decl
6852    in OMP_CLAUSE_DECL and add the node to the head of the list.
6853
6854    If KIND is zero, create a TREE_LIST with the decl in TREE_PURPOSE;
6855    return the list created.  */
6856
6857 static tree
6858 c_parser_omp_variable_list (c_parser *parser, enum omp_clause_code kind,
6859                             tree list)
6860 {
6861   if (c_parser_next_token_is_not (parser, CPP_NAME)
6862       || c_parser_peek_token (parser)->id_kind != C_ID_ID)
6863     c_parser_error (parser, "expected identifier");
6864
6865   while (c_parser_next_token_is (parser, CPP_NAME)
6866          && c_parser_peek_token (parser)->id_kind == C_ID_ID)
6867     {
6868       tree t = lookup_name (c_parser_peek_token (parser)->value);
6869
6870       if (t == NULL_TREE)
6871         undeclared_variable (c_parser_peek_token (parser)->value,
6872                              c_parser_peek_token (parser)->location);
6873       else if (t == error_mark_node)
6874         ;
6875       else if (kind != 0)
6876         {
6877           tree u = build_omp_clause (kind);
6878           OMP_CLAUSE_DECL (u) = t;
6879           OMP_CLAUSE_CHAIN (u) = list;
6880           list = u;
6881         }
6882       else
6883         list = tree_cons (t, NULL_TREE, list);
6884
6885       c_parser_consume_token (parser);
6886
6887       if (c_parser_next_token_is_not (parser, CPP_COMMA))
6888         break;
6889
6890       c_parser_consume_token (parser);
6891     }
6892
6893   return list;
6894 }
6895
6896 /* Similarly, but expect leading and trailing parenthesis.  This is a very
6897    common case for omp clauses.  */
6898
6899 static tree
6900 c_parser_omp_var_list_parens (c_parser *parser, enum tree_code kind, tree list)
6901 {
6902   if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
6903     {
6904       list = c_parser_omp_variable_list (parser, kind, list);
6905       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
6906     }
6907   return list;
6908 }
6909
6910 /* OpenMP 2.5:
6911    copyin ( variable-list ) */
6912
6913 static tree
6914 c_parser_omp_clause_copyin (c_parser *parser, tree list)
6915 {
6916   return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_COPYIN, list);
6917 }
6918
6919 /* OpenMP 2.5:
6920    copyprivate ( variable-list ) */
6921
6922 static tree
6923 c_parser_omp_clause_copyprivate (c_parser *parser, tree list)
6924 {
6925   return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_COPYPRIVATE, list);
6926 }
6927
6928 /* OpenMP 2.5:
6929    default ( shared | none ) */
6930
6931 static tree
6932 c_parser_omp_clause_default (c_parser *parser, tree list)
6933 {
6934   enum omp_clause_default_kind kind = OMP_CLAUSE_DEFAULT_UNSPECIFIED;
6935   tree c;
6936
6937   if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
6938     return list;
6939   if (c_parser_next_token_is (parser, CPP_NAME))
6940     {
6941       const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
6942
6943       switch (p[0])
6944         {
6945         case 'n':
6946           if (strcmp ("none", p) != 0)
6947             goto invalid_kind;
6948           kind = OMP_CLAUSE_DEFAULT_NONE;
6949           break;
6950
6951         case 's':
6952           if (strcmp ("shared", p) != 0)
6953             goto invalid_kind;
6954           kind = OMP_CLAUSE_DEFAULT_SHARED;
6955           break;
6956
6957         default:
6958           goto invalid_kind;
6959         }
6960
6961       c_parser_consume_token (parser);
6962     }
6963   else
6964     {
6965     invalid_kind:
6966       c_parser_error (parser, "expected %<none%> or %<shared%>");
6967     }
6968   c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
6969
6970   if (kind == OMP_CLAUSE_DEFAULT_UNSPECIFIED)
6971     return list;
6972
6973   check_no_duplicate_clause (list, OMP_CLAUSE_DEFAULT, "default");
6974   c = build_omp_clause (OMP_CLAUSE_DEFAULT);
6975   OMP_CLAUSE_CHAIN (c) = list;
6976   OMP_CLAUSE_DEFAULT_KIND (c) = kind;
6977
6978   return c;
6979 }
6980
6981 /* OpenMP 2.5:
6982    firstprivate ( variable-list ) */
6983
6984 static tree
6985 c_parser_omp_clause_firstprivate (c_parser *parser, tree list)
6986 {
6987   return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_FIRSTPRIVATE, list);
6988 }
6989
6990 /* OpenMP 2.5:
6991    if ( expression ) */
6992
6993 static tree
6994 c_parser_omp_clause_if (c_parser *parser, tree list)
6995 {
6996   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
6997     {
6998       tree t = c_parser_paren_condition (parser);
6999       tree c;
7000
7001       check_no_duplicate_clause (list, OMP_CLAUSE_IF, "if");
7002
7003       c = build_omp_clause (OMP_CLAUSE_IF);
7004       OMP_CLAUSE_IF_EXPR (c) = t;
7005       OMP_CLAUSE_CHAIN (c) = list;
7006       list = c;
7007     }
7008   else
7009     c_parser_error (parser, "expected %<(%>");
7010
7011   return list;
7012 }
7013
7014 /* OpenMP 2.5:
7015    lastprivate ( variable-list ) */
7016
7017 static tree
7018 c_parser_omp_clause_lastprivate (c_parser *parser, tree list)
7019 {
7020   return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_LASTPRIVATE, list);
7021 }
7022
7023 /* OpenMP 2.5:
7024    nowait */
7025
7026 static tree
7027 c_parser_omp_clause_nowait (c_parser *parser ATTRIBUTE_UNUSED, tree list)
7028 {
7029   tree c;
7030
7031   check_no_duplicate_clause (list, OMP_CLAUSE_NOWAIT, "nowait");
7032
7033   c = build_omp_clause (OMP_CLAUSE_NOWAIT);
7034   OMP_CLAUSE_CHAIN (c) = list;
7035   return c;
7036 }
7037
7038 /* OpenMP 2.5:
7039    num_threads ( expression ) */
7040
7041 static tree
7042 c_parser_omp_clause_num_threads (c_parser *parser, tree list)
7043 {
7044   if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
7045     {
7046       location_t expr_loc = c_parser_peek_token (parser)->location;
7047       tree c, t = c_parser_expression (parser).value;
7048
7049       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
7050
7051       if (!INTEGRAL_TYPE_P (TREE_TYPE (t)))
7052         {
7053           c_parser_error (parser, "expected integer expression");
7054           return list;
7055         }
7056
7057       /* Attempt to statically determine when the number isn't positive.  */
7058       c = fold_build2 (LE_EXPR, boolean_type_node, t,
7059                        build_int_cst (TREE_TYPE (t), 0));
7060       if (c == boolean_true_node)
7061         {
7062           warning (0, "%H%<num_threads%> value must be positive", &expr_loc);
7063           t = integer_one_node;
7064         }
7065
7066       check_no_duplicate_clause (list, OMP_CLAUSE_NUM_THREADS, "num_threads");
7067
7068       c = build_omp_clause (OMP_CLAUSE_NUM_THREADS);
7069       OMP_CLAUSE_NUM_THREADS_EXPR (c) = t;
7070       OMP_CLAUSE_CHAIN (c) = list;
7071       list = c;
7072     }
7073
7074   return list;
7075 }
7076
7077 /* OpenMP 2.5:
7078    ordered */
7079
7080 static tree
7081 c_parser_omp_clause_ordered (c_parser *parser ATTRIBUTE_UNUSED, tree list)
7082 {
7083   tree c;
7084
7085   check_no_duplicate_clause (list, OMP_CLAUSE_ORDERED, "ordered");
7086
7087   c = build_omp_clause (OMP_CLAUSE_ORDERED);
7088   OMP_CLAUSE_CHAIN (c) = list;
7089   return c;
7090 }
7091
7092 /* OpenMP 2.5:
7093    private ( variable-list ) */
7094
7095 static tree
7096 c_parser_omp_clause_private (c_parser *parser, tree list)
7097 {
7098   return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_PRIVATE, list);
7099 }
7100
7101 /* OpenMP 2.5:
7102    reduction ( reduction-operator : variable-list )
7103
7104    reduction-operator:
7105      One of: + * - & ^ | && || */
7106
7107 static tree
7108 c_parser_omp_clause_reduction (c_parser *parser, tree list)
7109 {
7110   if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
7111     {
7112       enum tree_code code;
7113
7114       switch (c_parser_peek_token (parser)->type)
7115         {
7116         case CPP_PLUS:
7117           code = PLUS_EXPR;
7118           break;
7119         case CPP_MULT:
7120           code = MULT_EXPR;
7121           break;
7122         case CPP_MINUS:
7123           code = MINUS_EXPR;
7124           break;
7125         case CPP_AND:
7126           code = BIT_AND_EXPR;
7127           break;
7128         case CPP_XOR:
7129           code = BIT_XOR_EXPR;
7130           break;
7131         case CPP_OR:
7132           code = BIT_IOR_EXPR;
7133           break;
7134         case CPP_AND_AND:
7135           code = TRUTH_ANDIF_EXPR;
7136           break;
7137         case CPP_OR_OR:
7138           code = TRUTH_ORIF_EXPR;
7139           break;
7140         default:
7141           c_parser_error (parser,
7142                           "expected %<+%>, %<*%>, %<-%>, %<&%>, "
7143                           "%<^%>, %<|%>, %<&&%>, or %<||%>");
7144           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 0);
7145           return list;
7146         }
7147       c_parser_consume_token (parser);
7148       if (c_parser_require (parser, CPP_COLON, "expected %<:%>"))
7149         {
7150           tree nl, c;
7151
7152           nl = c_parser_omp_variable_list (parser, OMP_CLAUSE_REDUCTION, list);
7153           for (c = nl; c != list; c = OMP_CLAUSE_CHAIN (c))
7154             OMP_CLAUSE_REDUCTION_CODE (c) = code;
7155
7156           list = nl;
7157         }
7158       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
7159     }
7160   return list;
7161 }
7162
7163 /* OpenMP 2.5:
7164    schedule ( schedule-kind )
7165    schedule ( schedule-kind , expression )
7166
7167    schedule-kind:
7168      static | dynamic | guided | runtime
7169 */
7170
7171 static tree
7172 c_parser_omp_clause_schedule (c_parser *parser, tree list)
7173 {
7174   tree c, t;
7175
7176   if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
7177     return list;
7178
7179   c = build_omp_clause (OMP_CLAUSE_SCHEDULE);
7180
7181   if (c_parser_next_token_is (parser, CPP_NAME))
7182     {
7183       tree kind = c_parser_peek_token (parser)->value;
7184       const char *p = IDENTIFIER_POINTER (kind);
7185
7186       switch (p[0])
7187         {
7188         case 'd':
7189           if (strcmp ("dynamic", p) != 0)
7190             goto invalid_kind;
7191           OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_DYNAMIC;
7192           break;
7193
7194         case 'g':
7195           if (strcmp ("guided", p) != 0)
7196             goto invalid_kind;
7197           OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_GUIDED;
7198           break;
7199
7200         case 'r':
7201           if (strcmp ("runtime", p) != 0)
7202             goto invalid_kind;
7203           OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_RUNTIME;
7204           break;
7205
7206         default:
7207           goto invalid_kind;
7208         }
7209     }
7210   else if (c_parser_next_token_is_keyword (parser, RID_STATIC))
7211     OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_STATIC;
7212   else
7213     goto invalid_kind;
7214
7215   c_parser_consume_token (parser);
7216   if (c_parser_next_token_is (parser, CPP_COMMA))
7217     {
7218       location_t here;
7219       c_parser_consume_token (parser);
7220
7221       here = c_parser_peek_token (parser)->location;
7222       t = c_parser_expr_no_commas (parser, NULL).value;
7223
7224       if (OMP_CLAUSE_SCHEDULE_KIND (c) == OMP_CLAUSE_SCHEDULE_RUNTIME)
7225         error ("%Hschedule %<runtime%> does not take "
7226                "a %<chunk_size%> parameter", &here);
7227       else if (TREE_CODE (TREE_TYPE (t)) == INTEGER_TYPE)
7228         OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (c) = t;
7229       else
7230         c_parser_error (parser, "expected integer expression");
7231
7232       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
7233     }
7234   else
7235     c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
7236                                "expected %<,%> or %<)%>");
7237
7238   check_no_duplicate_clause (list, OMP_CLAUSE_SCHEDULE, "schedule");
7239   OMP_CLAUSE_CHAIN (c) = list;
7240   return c;
7241
7242  invalid_kind:
7243   c_parser_error (parser, "invalid schedule kind");
7244   c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 0);
7245   return list;
7246 }
7247
7248 /* OpenMP 2.5:
7249    shared ( variable-list ) */
7250
7251 static tree
7252 c_parser_omp_clause_shared (c_parser *parser, tree list)
7253 {
7254   return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_SHARED, list);
7255 }
7256
7257 /* Parse all OpenMP clauses.  The set clauses allowed by the directive
7258    is a bitmask in MASK.  Return the list of clauses found; the result
7259    of clause default goes in *pdefault.  */
7260
7261 static tree
7262 c_parser_omp_all_clauses (c_parser *parser, unsigned int mask,
7263                           const char *where)
7264 {
7265   tree clauses = NULL;
7266   bool first = true;
7267
7268   while (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL))
7269     {
7270       location_t here;
7271       pragma_omp_clause c_kind;
7272       const char *c_name;
7273       tree prev = clauses;
7274
7275       if (!first && c_parser_next_token_is (parser, CPP_COMMA))
7276         c_parser_consume_token (parser);
7277
7278       first = false;
7279       here = c_parser_peek_token (parser)->location;
7280       c_kind = c_parser_omp_clause_name (parser);
7281
7282       switch (c_kind)
7283         {
7284         case PRAGMA_OMP_CLAUSE_COPYIN:
7285           clauses = c_parser_omp_clause_copyin (parser, clauses);
7286           c_name = "copyin";
7287           break;
7288         case PRAGMA_OMP_CLAUSE_COPYPRIVATE:
7289           clauses = c_parser_omp_clause_copyprivate (parser, clauses);
7290           c_name = "copyprivate";
7291           break;
7292         case PRAGMA_OMP_CLAUSE_DEFAULT:
7293           clauses = c_parser_omp_clause_default (parser, clauses);
7294           c_name = "default";
7295           break;
7296         case PRAGMA_OMP_CLAUSE_FIRSTPRIVATE:
7297           clauses = c_parser_omp_clause_firstprivate (parser, clauses);
7298           c_name = "firstprivate";
7299           break;
7300         case PRAGMA_OMP_CLAUSE_IF:
7301           clauses = c_parser_omp_clause_if (parser, clauses);
7302           c_name = "if";
7303           break;
7304         case PRAGMA_OMP_CLAUSE_LASTPRIVATE:
7305           clauses = c_parser_omp_clause_lastprivate (parser, clauses);
7306           c_name = "lastprivate";
7307           break;
7308         case PRAGMA_OMP_CLAUSE_NOWAIT:
7309           clauses = c_parser_omp_clause_nowait (parser, clauses);
7310           c_name = "nowait";
7311           break;
7312         case PRAGMA_OMP_CLAUSE_NUM_THREADS:
7313           clauses = c_parser_omp_clause_num_threads (parser, clauses);
7314           c_name = "num_threads";
7315           break;
7316         case PRAGMA_OMP_CLAUSE_ORDERED:
7317           clauses = c_parser_omp_clause_ordered (parser, clauses);
7318           c_name = "ordered";
7319           break;
7320         case PRAGMA_OMP_CLAUSE_PRIVATE:
7321           clauses = c_parser_omp_clause_private (parser, clauses);
7322           c_name = "private";
7323           break;
7324         case PRAGMA_OMP_CLAUSE_REDUCTION:
7325           clauses = c_parser_omp_clause_reduction (parser, clauses);
7326           c_name = "reduction";
7327           break;
7328         case PRAGMA_OMP_CLAUSE_SCHEDULE:
7329           clauses = c_parser_omp_clause_schedule (parser, clauses);
7330           c_name = "schedule";
7331           break;
7332         case PRAGMA_OMP_CLAUSE_SHARED:
7333           clauses = c_parser_omp_clause_shared (parser, clauses);
7334           c_name = "shared";
7335           break;
7336         default:
7337           c_parser_error (parser, "expected %<#pragma omp%> clause");
7338           goto saw_error;
7339         }
7340
7341       if (((mask >> c_kind) & 1) == 0 && !parser->error)
7342         {
7343           /* Remove the invalid clause(s) from the list to avoid
7344              confusing the rest of the compiler.  */
7345           clauses = prev;
7346           error ("%H%qs is not valid for %qs", &here, c_name, where);
7347         }
7348     }
7349
7350  saw_error:
7351   c_parser_skip_to_pragma_eol (parser);
7352
7353   return c_finish_omp_clauses (clauses);
7354 }
7355
7356 /* OpenMP 2.5:
7357    structured-block:
7358      statement
7359
7360    In practice, we're also interested in adding the statement to an
7361    outer node.  So it is convenient if we work around the fact that
7362    c_parser_statement calls add_stmt.  */
7363
7364 static tree
7365 c_parser_omp_structured_block (c_parser *parser)
7366 {
7367   tree stmt = push_stmt_list ();
7368   c_parser_statement (parser);
7369   return pop_stmt_list (stmt);
7370 }
7371
7372 /* OpenMP 2.5:
7373    # pragma omp atomic new-line
7374      expression-stmt
7375
7376    expression-stmt:
7377      x binop= expr | x++ | ++x | x-- | --x
7378    binop:
7379      +, *, -, /, &, ^, |, <<, >>
7380
7381   where x is an lvalue expression with scalar type.  */
7382
7383 static void
7384 c_parser_omp_atomic (c_parser *parser)
7385 {
7386   tree lhs, rhs;
7387   tree stmt;
7388   enum tree_code code;
7389
7390   c_parser_skip_to_pragma_eol (parser);
7391
7392   lhs = c_parser_unary_expression (parser).value;
7393   switch (TREE_CODE (lhs))
7394     {
7395     case ERROR_MARK:
7396     saw_error:
7397       c_parser_skip_to_end_of_block_or_statement (parser);
7398       return;
7399
7400     case PREINCREMENT_EXPR:
7401     case POSTINCREMENT_EXPR:
7402       lhs = TREE_OPERAND (lhs, 0);
7403       code = PLUS_EXPR;
7404       rhs = integer_one_node;
7405       break;
7406
7407     case PREDECREMENT_EXPR:
7408     case POSTDECREMENT_EXPR:
7409       lhs = TREE_OPERAND (lhs, 0);
7410       code = MINUS_EXPR;
7411       rhs = integer_one_node;
7412       break;
7413
7414     default:
7415       switch (c_parser_peek_token (parser)->type)
7416         {
7417         case CPP_MULT_EQ:
7418           code = MULT_EXPR;
7419           break;
7420         case CPP_DIV_EQ:
7421           code = TRUNC_DIV_EXPR;
7422           break;
7423         case CPP_PLUS_EQ:
7424           code = PLUS_EXPR;
7425           break;
7426         case CPP_MINUS_EQ:
7427           code = MINUS_EXPR;
7428           break;
7429         case CPP_LSHIFT_EQ:
7430           code = LSHIFT_EXPR;
7431           break;
7432         case CPP_RSHIFT_EQ:
7433           code = RSHIFT_EXPR;
7434           break;
7435         case CPP_AND_EQ:
7436           code = BIT_AND_EXPR;
7437           break;
7438         case CPP_OR_EQ:
7439           code = BIT_IOR_EXPR;
7440           break;
7441         case CPP_XOR_EQ:
7442           code = BIT_XOR_EXPR;
7443           break;
7444         default:
7445           c_parser_error (parser,
7446                           "invalid operator for %<#pragma omp atomic%>");
7447           goto saw_error;
7448         }
7449
7450       c_parser_consume_token (parser);
7451       rhs = c_parser_expression (parser).value;
7452       break;
7453     }
7454   stmt = c_finish_omp_atomic (code, lhs, rhs);
7455   if (stmt != error_mark_node)
7456     add_stmt (stmt);
7457   c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
7458 }
7459
7460
7461 /* OpenMP 2.5:
7462    # pragma omp barrier new-line
7463 */
7464
7465 static void
7466 c_parser_omp_barrier (c_parser *parser)
7467 {
7468   c_parser_consume_pragma (parser);
7469   c_parser_skip_to_pragma_eol (parser);
7470
7471   c_finish_omp_barrier ();
7472 }
7473
7474 /* OpenMP 2.5:
7475    # pragma omp critical [(name)] new-line
7476      structured-block
7477 */
7478
7479 static tree
7480 c_parser_omp_critical (c_parser *parser)
7481 {
7482   tree stmt, name = NULL;
7483
7484   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
7485     {
7486       c_parser_consume_token (parser);
7487       if (c_parser_next_token_is (parser, CPP_NAME))
7488         {
7489           name = c_parser_peek_token (parser)->value;
7490           c_parser_consume_token (parser);
7491           c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>");
7492         }
7493       else
7494         c_parser_error (parser, "expected identifier");
7495     }
7496   else if (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL))
7497     c_parser_error (parser, "expected %<(%> or end of line");
7498   c_parser_skip_to_pragma_eol (parser);
7499
7500   stmt = c_parser_omp_structured_block (parser);
7501   return c_finish_omp_critical (stmt, name);
7502 }
7503
7504 /* OpenMP 2.5:
7505    # pragma omp flush flush-vars[opt] new-line
7506
7507    flush-vars:
7508      ( variable-list ) */
7509
7510 static void
7511 c_parser_omp_flush (c_parser *parser)
7512 {
7513   c_parser_consume_pragma (parser);
7514   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
7515     c_parser_omp_var_list_parens (parser, 0, NULL);
7516   else if (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL))
7517     c_parser_error (parser, "expected %<(%> or end of line");
7518   c_parser_skip_to_pragma_eol (parser);
7519
7520   c_finish_omp_flush ();
7521 }
7522
7523 /* Parse the restricted form of the for statment allowed by OpenMP.
7524    The real trick here is to determine the loop control variable early
7525    so that we can push a new decl if necessary to make it private.  */
7526
7527 static tree
7528 c_parser_omp_for_loop (c_parser *parser)
7529 {
7530   tree decl, cond, incr, save_break, save_cont, body, init;
7531   location_t loc;
7532
7533   if (!c_parser_next_token_is_keyword (parser, RID_FOR))
7534     {
7535       c_parser_error (parser, "for statement expected");
7536       return NULL;
7537     }
7538   loc = c_parser_peek_token (parser)->location;
7539   c_parser_consume_token (parser);
7540
7541   if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
7542     return NULL;
7543
7544   /* Parse the initialization declaration or expression.  */
7545   if (c_parser_next_token_starts_declspecs (parser))
7546     {
7547       c_parser_declaration_or_fndef (parser, true, true, true, true);
7548       decl = check_for_loop_decls ();
7549       if (decl == NULL)
7550         goto error_init;
7551       if (DECL_INITIAL (decl) == error_mark_node)
7552         decl = error_mark_node;
7553       init = decl;
7554     }
7555   else if (c_parser_next_token_is (parser, CPP_NAME)
7556            && c_parser_peek_2nd_token (parser)->type == CPP_EQ)
7557     {
7558       decl = c_parser_postfix_expression (parser).value;
7559
7560       c_parser_require (parser, CPP_EQ, "expected %<=%>");
7561
7562       init = c_parser_expr_no_commas (parser, NULL).value;
7563       init = build_modify_expr (decl, NOP_EXPR, init);
7564       init = c_process_expr_stmt (init);
7565
7566       c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
7567     }
7568   else
7569     goto error_init;
7570
7571   /* Parse the loop condition.  */
7572   cond = NULL_TREE;
7573   if (c_parser_next_token_is_not (parser, CPP_SEMICOLON))
7574     {
7575       cond = c_parser_expression_conv (parser).value;
7576       cond = c_objc_common_truthvalue_conversion (cond);
7577       if (CAN_HAVE_LOCATION_P (cond))
7578         SET_EXPR_LOCATION (cond, input_location);
7579     }
7580   c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
7581
7582   /* Parse the increment expression.  */
7583   incr = NULL_TREE;
7584   if (c_parser_next_token_is_not (parser, CPP_CLOSE_PAREN))
7585     incr = c_process_expr_stmt (c_parser_expression (parser).value);
7586   c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
7587
7588  parse_body:
7589   save_break = c_break_label;
7590   c_break_label = size_one_node;
7591   save_cont = c_cont_label;
7592   c_cont_label = NULL_TREE;
7593   body = push_stmt_list ();
7594
7595   add_stmt (c_parser_c99_block_statement (parser));
7596   if (c_cont_label)
7597     add_stmt (build1 (LABEL_EXPR, void_type_node, c_cont_label));
7598
7599   body = pop_stmt_list (body);
7600   c_break_label = save_break;
7601   c_cont_label = save_cont;
7602
7603   /* Only bother calling c_finish_omp_for if we haven't already generated
7604      an error from the initialization parsing.  */
7605   if (decl != NULL && decl != error_mark_node && init != error_mark_node)
7606     return c_finish_omp_for (loc, decl, init, cond, incr, body, NULL);
7607   return NULL;
7608
7609  error_init:
7610   c_parser_error (parser, "expected iteration declaration or initialization");
7611   c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
7612   decl = init = cond = incr = NULL_TREE;
7613   goto parse_body;
7614 }
7615
7616 /* OpenMP 2.5:
7617    #pragma omp for for-clause[optseq] new-line
7618      for-loop
7619 */
7620
7621 #define OMP_FOR_CLAUSE_MASK                             \
7622         ( (1u << PRAGMA_OMP_CLAUSE_PRIVATE)             \
7623         | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)        \
7624         | (1u << PRAGMA_OMP_CLAUSE_LASTPRIVATE)         \
7625         | (1u << PRAGMA_OMP_CLAUSE_REDUCTION)           \
7626         | (1u << PRAGMA_OMP_CLAUSE_ORDERED)             \
7627         | (1u << PRAGMA_OMP_CLAUSE_SCHEDULE)            \
7628         | (1u << PRAGMA_OMP_CLAUSE_NOWAIT))
7629
7630 static tree
7631 c_parser_omp_for (c_parser *parser)
7632 {
7633   tree block, clauses, ret;
7634
7635   clauses = c_parser_omp_all_clauses (parser, OMP_FOR_CLAUSE_MASK,
7636                                       "#pragma omp for");
7637
7638   block = c_begin_compound_stmt (true);
7639   ret = c_parser_omp_for_loop (parser);
7640   if (ret)
7641     OMP_FOR_CLAUSES (ret) = clauses;
7642   block = c_end_compound_stmt (block, true);
7643   add_stmt (block);
7644
7645   return ret;
7646 }
7647
7648 /* OpenMP 2.5:
7649    # pragma omp master new-line
7650      structured-block
7651 */
7652
7653 static tree
7654 c_parser_omp_master (c_parser *parser)
7655 {
7656   c_parser_skip_to_pragma_eol (parser);
7657   return c_finish_omp_master (c_parser_omp_structured_block (parser));
7658 }
7659
7660 /* OpenMP 2.5:
7661    # pragma omp ordered new-line
7662      structured-block
7663 */
7664
7665 static tree
7666 c_parser_omp_ordered (c_parser *parser)
7667 {
7668   c_parser_skip_to_pragma_eol (parser);
7669   return c_finish_omp_ordered (c_parser_omp_structured_block (parser));
7670 }
7671
7672 /* OpenMP 2.5:
7673
7674    section-scope:
7675      { section-sequence }
7676
7677    section-sequence:
7678      section-directive[opt] structured-block
7679      section-sequence section-directive structured-block  */
7680
7681 static tree
7682 c_parser_omp_sections_scope (c_parser *parser)
7683 {
7684   tree stmt, substmt;
7685   bool error_suppress = false;
7686   location_t loc;
7687
7688   if (!c_parser_require (parser, CPP_OPEN_BRACE, "expected %<{%>"))
7689     {
7690       /* Avoid skipping until the end of the block.  */
7691       parser->error = false;
7692       return NULL_TREE;
7693     }
7694
7695   stmt = push_stmt_list ();
7696
7697   loc = c_parser_peek_token (parser)->location;
7698   if (c_parser_peek_token (parser)->pragma_kind != PRAGMA_OMP_SECTION)
7699     {
7700       substmt = push_stmt_list ();
7701
7702       while (1)
7703         {
7704           c_parser_statement (parser);
7705
7706           if (c_parser_peek_token (parser)->pragma_kind == PRAGMA_OMP_SECTION)
7707             break;
7708           if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
7709             break;
7710           if (c_parser_next_token_is (parser, CPP_EOF))
7711             break;
7712         }
7713
7714       substmt = pop_stmt_list (substmt);
7715       substmt = build1 (OMP_SECTION, void_type_node, substmt);
7716       SET_EXPR_LOCATION (substmt, loc);
7717       add_stmt (substmt);
7718     }
7719
7720   while (1)
7721     {
7722       if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
7723         break;
7724       if (c_parser_next_token_is (parser, CPP_EOF))
7725         break;
7726
7727       loc = c_parser_peek_token (parser)->location;
7728       if (c_parser_peek_token (parser)->pragma_kind == PRAGMA_OMP_SECTION)
7729         {
7730           c_parser_consume_pragma (parser);
7731           c_parser_skip_to_pragma_eol (parser);
7732           error_suppress = false;
7733         }
7734       else if (!error_suppress)
7735         {
7736           error ("%Hexpected %<#pragma omp section%> or %<}%>",
7737                  &loc);
7738           error_suppress = true;
7739         }
7740
7741       substmt = c_parser_omp_structured_block (parser);
7742       substmt = build1 (OMP_SECTION, void_type_node, substmt);
7743       SET_EXPR_LOCATION (substmt, loc);
7744       add_stmt (substmt);
7745     }
7746   c_parser_skip_until_found (parser, CPP_CLOSE_BRACE,
7747                              "expected %<#pragma omp section%> or %<}%>");
7748
7749   substmt = pop_stmt_list (stmt);
7750
7751   stmt = make_node (OMP_SECTIONS);
7752   TREE_TYPE (stmt) = void_type_node;
7753   OMP_SECTIONS_BODY (stmt) = substmt;
7754
7755   return add_stmt (stmt);
7756 }
7757
7758 /* OpenMP 2.5:
7759    # pragma omp sections sections-clause[optseq] newline
7760      sections-scope
7761 */
7762
7763 #define OMP_SECTIONS_CLAUSE_MASK                        \
7764         ( (1u << PRAGMA_OMP_CLAUSE_PRIVATE)             \
7765         | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)        \
7766         | (1u << PRAGMA_OMP_CLAUSE_LASTPRIVATE)         \
7767         | (1u << PRAGMA_OMP_CLAUSE_REDUCTION)           \
7768         | (1u << PRAGMA_OMP_CLAUSE_NOWAIT))
7769
7770 static tree
7771 c_parser_omp_sections (c_parser *parser)
7772 {
7773   tree block, clauses, ret;
7774
7775   clauses = c_parser_omp_all_clauses (parser, OMP_SECTIONS_CLAUSE_MASK,
7776                                       "#pragma omp sections");
7777
7778   block = c_begin_compound_stmt (true);
7779   ret = c_parser_omp_sections_scope (parser);
7780   if (ret)
7781     OMP_SECTIONS_CLAUSES (ret) = clauses;
7782   block = c_end_compound_stmt (block, true);
7783   add_stmt (block);
7784
7785   return ret;
7786 }
7787
7788 /* OpenMP 2.5:
7789    # pragma parallel parallel-clause new-line
7790    # pragma parallel for parallel-for-clause new-line
7791    # pragma parallel sections parallel-sections-clause new-line
7792 */
7793
7794 #define OMP_PARALLEL_CLAUSE_MASK                        \
7795         ( (1u << PRAGMA_OMP_CLAUSE_IF)                  \
7796         | (1u << PRAGMA_OMP_CLAUSE_PRIVATE)             \
7797         | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)        \
7798         | (1u << PRAGMA_OMP_CLAUSE_DEFAULT)             \
7799         | (1u << PRAGMA_OMP_CLAUSE_SHARED)              \
7800         | (1u << PRAGMA_OMP_CLAUSE_COPYIN)              \
7801         | (1u << PRAGMA_OMP_CLAUSE_REDUCTION)           \
7802         | (1u << PRAGMA_OMP_CLAUSE_NUM_THREADS))
7803
7804 static tree
7805 c_parser_omp_parallel (c_parser *parser)
7806 {
7807   enum pragma_kind p_kind = PRAGMA_OMP_PARALLEL;
7808   const char *p_name = "#pragma omp parallel";
7809   tree stmt, clauses, par_clause, ws_clause, block;
7810   unsigned int mask = OMP_PARALLEL_CLAUSE_MASK;
7811
7812   if (c_parser_next_token_is_keyword (parser, RID_FOR))
7813     {
7814       c_parser_consume_token (parser);
7815       p_kind = PRAGMA_OMP_PARALLEL_FOR;
7816       p_name = "#pragma omp parallel for";
7817       mask |= OMP_FOR_CLAUSE_MASK;
7818       mask &= ~(1u << PRAGMA_OMP_CLAUSE_NOWAIT);
7819     }
7820   else if (c_parser_next_token_is (parser, CPP_NAME))
7821     {
7822       const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
7823       if (strcmp (p, "sections") == 0)
7824         {
7825           c_parser_consume_token (parser);
7826           p_kind = PRAGMA_OMP_PARALLEL_SECTIONS;
7827           p_name = "#pragma omp parallel sections";
7828           mask |= OMP_SECTIONS_CLAUSE_MASK;
7829           mask &= ~(1u << PRAGMA_OMP_CLAUSE_NOWAIT);
7830         }
7831     }
7832
7833   clauses = c_parser_omp_all_clauses (parser, mask, p_name);
7834
7835   switch (p_kind)
7836     {
7837     case PRAGMA_OMP_PARALLEL:
7838       block = c_begin_omp_parallel ();
7839       c_parser_statement (parser);
7840       stmt = c_finish_omp_parallel (clauses, block);
7841       break;
7842
7843     case PRAGMA_OMP_PARALLEL_FOR:
7844       block = c_begin_omp_parallel ();
7845       c_split_parallel_clauses (clauses, &par_clause, &ws_clause);
7846       stmt = c_parser_omp_for_loop (parser);
7847       if (stmt)
7848         OMP_FOR_CLAUSES (stmt) = ws_clause;
7849       stmt = c_finish_omp_parallel (par_clause, block);
7850       OMP_PARALLEL_COMBINED (stmt) = 1;
7851       break;
7852
7853     case PRAGMA_OMP_PARALLEL_SECTIONS:
7854       block = c_begin_omp_parallel ();
7855       c_split_parallel_clauses (clauses, &par_clause, &ws_clause);
7856       stmt = c_parser_omp_sections_scope (parser);
7857       if (stmt)
7858         OMP_SECTIONS_CLAUSES (stmt) = ws_clause;
7859       stmt = c_finish_omp_parallel (par_clause, block);
7860       OMP_PARALLEL_COMBINED (stmt) = 1;
7861       break;
7862
7863     default:
7864       gcc_unreachable ();
7865     }
7866
7867   return stmt;
7868 }
7869
7870 /* OpenMP 2.5:
7871    # pragma omp single single-clause[optseq] new-line
7872      structured-block
7873 */
7874
7875 #define OMP_SINGLE_CLAUSE_MASK                          \
7876         ( (1u << PRAGMA_OMP_CLAUSE_PRIVATE)             \
7877         | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)        \
7878         | (1u << PRAGMA_OMP_CLAUSE_COPYPRIVATE)         \
7879         | (1u << PRAGMA_OMP_CLAUSE_NOWAIT))
7880
7881 static tree
7882 c_parser_omp_single (c_parser *parser)
7883 {
7884   tree stmt = make_node (OMP_SINGLE);
7885   TREE_TYPE (stmt) = void_type_node;
7886
7887   OMP_SINGLE_CLAUSES (stmt)
7888     = c_parser_omp_all_clauses (parser, OMP_SINGLE_CLAUSE_MASK,
7889                                 "#pragma omp single");
7890   OMP_SINGLE_BODY (stmt) = c_parser_omp_structured_block (parser);
7891
7892   return add_stmt (stmt);
7893 }
7894
7895
7896 /* Main entry point to parsing most OpenMP pragmas.  */
7897
7898 static void
7899 c_parser_omp_construct (c_parser *parser)
7900 {
7901   enum pragma_kind p_kind;
7902   location_t loc;
7903   tree stmt;
7904
7905   loc = c_parser_peek_token (parser)->location;
7906   p_kind = c_parser_peek_token (parser)->pragma_kind;
7907   c_parser_consume_pragma (parser);
7908
7909   /* For all constructs below except #pragma omp atomic
7910      MUST_NOT_THROW catch handlers are needed when exceptions
7911      are enabled.  */
7912   if (p_kind != PRAGMA_OMP_ATOMIC)
7913     c_maybe_initialize_eh ();
7914
7915   switch (p_kind)
7916     {
7917     case PRAGMA_OMP_ATOMIC:
7918       c_parser_omp_atomic (parser);
7919       return;
7920     case PRAGMA_OMP_CRITICAL:
7921       stmt = c_parser_omp_critical (parser);
7922       break;
7923     case PRAGMA_OMP_FOR:
7924       stmt = c_parser_omp_for (parser);
7925       break;
7926     case PRAGMA_OMP_MASTER:
7927       stmt = c_parser_omp_master (parser);
7928       break;
7929     case PRAGMA_OMP_ORDERED:
7930       stmt = c_parser_omp_ordered (parser);
7931       break;
7932     case PRAGMA_OMP_PARALLEL:
7933       stmt = c_parser_omp_parallel (parser);
7934       break;
7935     case PRAGMA_OMP_SECTIONS:
7936       stmt = c_parser_omp_sections (parser);
7937       break;
7938     case PRAGMA_OMP_SINGLE:
7939       stmt = c_parser_omp_single (parser);
7940       break;
7941     default:
7942       gcc_unreachable ();
7943     }
7944
7945   if (stmt)
7946     SET_EXPR_LOCATION (stmt, loc);
7947 }
7948
7949
7950 /* OpenMP 2.5:
7951    # pragma omp threadprivate (variable-list) */
7952
7953 static void
7954 c_parser_omp_threadprivate (c_parser *parser)
7955 {
7956   tree vars, t;
7957
7958   c_parser_consume_pragma (parser);
7959   vars = c_parser_omp_var_list_parens (parser, 0, NULL);
7960
7961   /* Mark every variable in VARS to be assigned thread local storage.  */
7962   for (t = vars; t; t = TREE_CHAIN (t))
7963     {
7964       tree v = TREE_PURPOSE (t);
7965
7966       /* If V had already been marked threadprivate, it doesn't matter
7967          whether it had been used prior to this point.  */
7968       if (TREE_CODE (v) != VAR_DECL)
7969         error ("%qD is not a variable", v);
7970       else if (TREE_USED (v) && !C_DECL_THREADPRIVATE_P (v))
7971         error ("%qE declared %<threadprivate%> after first use", v);
7972       else if (! TREE_STATIC (v) && ! DECL_EXTERNAL (v))
7973         error ("automatic variable %qE cannot be %<threadprivate%>", v);
7974       else if (TREE_TYPE (v) == error_mark_node)
7975         ;
7976       else if (! COMPLETE_TYPE_P (TREE_TYPE (v)))
7977         error ("%<threadprivate%> %qE has incomplete type", v);
7978       else
7979         {
7980           if (! DECL_THREAD_LOCAL_P (v))
7981             {
7982               DECL_TLS_MODEL (v) = decl_default_tls_model (v);
7983               /* If rtl has been already set for this var, call
7984                  make_decl_rtl once again, so that encode_section_info
7985                  has a chance to look at the new decl flags.  */
7986               if (DECL_RTL_SET_P (v))
7987                 make_decl_rtl (v);
7988             }
7989           C_DECL_THREADPRIVATE_P (v) = 1;
7990         }
7991     }
7992
7993   c_parser_skip_to_pragma_eol (parser);
7994 }
7995
7996 \f
7997 /* Parse a single source file.  */
7998
7999 void
8000 c_parse_file (void)
8001 {
8002   /* Use local storage to begin.  If the first token is a pragma, parse it.
8003      If it is #pragma GCC pch_preprocess, then this will load a PCH file
8004      which will cause garbage collection.  */
8005   c_parser tparser;
8006
8007   memset (&tparser, 0, sizeof tparser);
8008   the_parser = &tparser;
8009
8010   if (c_parser_peek_token (&tparser)->pragma_kind == PRAGMA_GCC_PCH_PREPROCESS)
8011     c_parser_pragma_pch_preprocess (&tparser);
8012
8013   the_parser = GGC_NEW (c_parser);
8014   *the_parser = tparser;
8015
8016   c_parser_translation_unit (the_parser);
8017   the_parser = NULL;
8018 }
8019
8020 #include "gt-c-parser.h"