OSDN Git Service

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