OSDN Git Service

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