OSDN Git Service

PR 33870
[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       if (c_parser_next_token_starts_declspecs (parser)) 
3815         {
3816           error ("a label can only be part of a statement and a declaration is not a statement");
3817           c_parser_declaration_or_fndef (parser, /*fndef_ok*/ false, 
3818                                          /*nested*/ true, /*empty_ok*/ false,
3819                                          /*start_attr_ok*/ true);
3820           return;
3821         }
3822       stmt = c_finish_expr_stmt (c_parser_expression_conv (parser).value);
3823     expect_semicolon:
3824       c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
3825       break;
3826     }
3827   /* Two cases cannot and do not have line numbers associated: If stmt
3828      is degenerate, such as "2;", then stmt is an INTEGER_CST, which
3829      cannot hold line numbers.  But that's OK because the statement
3830      will either be changed to a MODIFY_EXPR during gimplification of
3831      the statement expr, or discarded.  If stmt was compound, but
3832      without new variables, we will have skipped the creation of a
3833      BIND and will have a bare STATEMENT_LIST.  But that's OK because
3834      (recursively) all of the component statements should already have
3835      line numbers assigned.  ??? Can we discard no-op statements
3836      earlier?  */
3837   if (stmt && CAN_HAVE_LOCATION_P (stmt))
3838     SET_EXPR_LOCATION (stmt, loc);
3839 }
3840
3841 /* Parse a parenthesized condition from an if, do or while statement.
3842
3843    condition:
3844      ( expression )
3845 */
3846 static tree
3847 c_parser_paren_condition (c_parser *parser)
3848 {
3849   location_t loc;
3850   tree cond;
3851   if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
3852     return error_mark_node;
3853   loc = c_parser_peek_token (parser)->location;
3854   cond = c_objc_common_truthvalue_conversion
3855     (c_parser_expression_conv (parser).value);
3856   if (CAN_HAVE_LOCATION_P (cond))
3857     SET_EXPR_LOCATION (cond, loc);
3858   c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
3859   return cond;
3860 }
3861
3862 /* Parse a statement which is a block in C99.  */
3863
3864 static tree
3865 c_parser_c99_block_statement (c_parser *parser)
3866 {
3867   tree block = c_begin_compound_stmt (flag_isoc99);
3868   c_parser_statement (parser);
3869   return c_end_compound_stmt (block, flag_isoc99);
3870 }
3871
3872 /* Parse the body of an if statement or the else half thereof.  This
3873    is just parsing a statement but (a) it is a block in C99, (b) we
3874    track whether the body is an if statement for the sake of
3875    -Wparentheses warnings, (c) we handle an empty body specially for
3876    the sake of -Wempty-body warnings.  */
3877
3878 static tree
3879 c_parser_if_body (c_parser *parser, bool *if_p)
3880 {
3881   tree block = c_begin_compound_stmt (flag_isoc99);
3882   while (c_parser_next_token_is_keyword (parser, RID_CASE)
3883          || c_parser_next_token_is_keyword (parser, RID_DEFAULT)
3884          || (c_parser_next_token_is (parser, CPP_NAME)
3885              && c_parser_peek_2nd_token (parser)->type == CPP_COLON))
3886     c_parser_label (parser);
3887   *if_p = c_parser_next_token_is_keyword (parser, RID_IF);
3888   if (c_parser_next_token_is (parser, CPP_SEMICOLON))
3889     add_stmt (build_empty_stmt ());
3890   c_parser_statement_after_labels (parser);
3891   return c_end_compound_stmt (block, flag_isoc99);
3892 }
3893
3894 /* Parse an if statement (C90 6.6.4, C99 6.8.4).
3895
3896    if-statement:
3897      if ( expression ) statement
3898      if ( expression ) statement else statement
3899 */
3900
3901 static void
3902 c_parser_if_statement (c_parser *parser)
3903 {
3904   tree block;
3905   location_t loc;
3906   tree cond;
3907   bool first_if = false, second_if = false;
3908   tree first_body, second_body;
3909   gcc_assert (c_parser_next_token_is_keyword (parser, RID_IF));
3910   c_parser_consume_token (parser);
3911   block = c_begin_compound_stmt (flag_isoc99);
3912   loc = c_parser_peek_token (parser)->location;
3913   cond = c_parser_paren_condition (parser);
3914   first_body = c_parser_if_body (parser, &first_if);
3915   if (c_parser_next_token_is_keyword (parser, RID_ELSE))
3916     {
3917       c_parser_consume_token (parser);
3918       second_body = c_parser_if_body (parser, &second_if);
3919     }
3920   else
3921     second_body = NULL_TREE;
3922   c_finish_if_stmt (loc, cond, first_body, second_body, first_if);
3923   add_stmt (c_end_compound_stmt (block, flag_isoc99));
3924 }
3925
3926 /* Parse a switch statement (C90 6.6.4, C99 6.8.4).
3927
3928    switch-statement:
3929      switch (expression) statement
3930 */
3931
3932 static void
3933 c_parser_switch_statement (c_parser *parser)
3934 {
3935   tree block, expr, body, save_break;
3936   gcc_assert (c_parser_next_token_is_keyword (parser, RID_SWITCH));
3937   c_parser_consume_token (parser);
3938   block = c_begin_compound_stmt (flag_isoc99);
3939   if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
3940     {
3941       expr = c_parser_expression (parser).value;
3942       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
3943     }
3944   else
3945     expr = error_mark_node;
3946   c_start_case (expr);
3947   save_break = c_break_label;
3948   c_break_label = NULL_TREE;
3949   body = c_parser_c99_block_statement (parser);
3950   c_finish_case (body);
3951   if (c_break_label)
3952     add_stmt (build1 (LABEL_EXPR, void_type_node, c_break_label));
3953   c_break_label = save_break;
3954   add_stmt (c_end_compound_stmt (block, flag_isoc99));
3955 }
3956
3957 /* Parse a while statement (C90 6.6.5, C99 6.8.5).
3958
3959    while-statement:
3960       while (expression) statement
3961 */
3962
3963 static void
3964 c_parser_while_statement (c_parser *parser)
3965 {
3966   tree block, cond, body, save_break, save_cont;
3967   location_t loc;
3968   gcc_assert (c_parser_next_token_is_keyword (parser, RID_WHILE));
3969   c_parser_consume_token (parser);
3970   block = c_begin_compound_stmt (flag_isoc99);
3971   loc = c_parser_peek_token (parser)->location;
3972   cond = c_parser_paren_condition (parser);
3973   save_break = c_break_label;
3974   c_break_label = NULL_TREE;
3975   save_cont = c_cont_label;
3976   c_cont_label = NULL_TREE;
3977   body = c_parser_c99_block_statement (parser);
3978   c_finish_loop (loc, cond, NULL, body, c_break_label, c_cont_label, true);
3979   add_stmt (c_end_compound_stmt (block, flag_isoc99));
3980   c_break_label = save_break;
3981   c_cont_label = save_cont;
3982 }
3983
3984 /* Parse a do statement (C90 6.6.5, C99 6.8.5).
3985
3986    do-statement:
3987      do statement while ( expression ) ;
3988 */
3989
3990 static void
3991 c_parser_do_statement (c_parser *parser)
3992 {
3993   tree block, cond, body, save_break, save_cont, new_break, new_cont;
3994   location_t loc;
3995   gcc_assert (c_parser_next_token_is_keyword (parser, RID_DO));
3996   c_parser_consume_token (parser);
3997   if (c_parser_next_token_is (parser, CPP_SEMICOLON))
3998     warning (OPT_Wempty_body,
3999              "suggest braces around empty body in %<do%> statement");
4000   block = c_begin_compound_stmt (flag_isoc99);
4001   loc = c_parser_peek_token (parser)->location;
4002   save_break = c_break_label;
4003   c_break_label = NULL_TREE;
4004   save_cont = c_cont_label;
4005   c_cont_label = NULL_TREE;
4006   body = c_parser_c99_block_statement (parser);
4007   c_parser_require_keyword (parser, RID_WHILE, "expected %<while%>");
4008   new_break = c_break_label;
4009   c_break_label = save_break;
4010   new_cont = c_cont_label;
4011   c_cont_label = save_cont;
4012   cond = c_parser_paren_condition (parser);
4013   if (!c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>"))
4014     c_parser_skip_to_end_of_block_or_statement (parser);
4015   c_finish_loop (loc, cond, NULL, body, new_break, new_cont, false);
4016   add_stmt (c_end_compound_stmt (block, flag_isoc99));
4017 }
4018
4019 /* Parse a for statement (C90 6.6.5, C99 6.8.5).
4020
4021    for-statement:
4022      for ( expression[opt] ; expression[opt] ; expression[opt] ) statement
4023      for ( nested-declaration expression[opt] ; expression[opt] ) statement
4024
4025    The form with a declaration is new in C99.
4026
4027    ??? In accordance with the old parser, the declaration may be a
4028    nested function, which is then rejected in check_for_loop_decls,
4029    but does it make any sense for this to be included in the grammar?
4030    Note in particular that the nested function does not include a
4031    trailing ';', whereas the "declaration" production includes one.
4032    Also, can we reject bad declarations earlier and cheaper than
4033    check_for_loop_decls?  */
4034
4035 static void
4036 c_parser_for_statement (c_parser *parser)
4037 {
4038   tree block, cond, incr, save_break, save_cont, body;
4039   location_t loc;
4040   gcc_assert (c_parser_next_token_is_keyword (parser, RID_FOR));
4041   loc = c_parser_peek_token (parser)->location;
4042   c_parser_consume_token (parser);
4043   block = c_begin_compound_stmt (flag_isoc99);
4044   if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
4045     {
4046       /* Parse the initialization declaration or expression.  */
4047       if (c_parser_next_token_is (parser, CPP_SEMICOLON))
4048         {
4049           c_parser_consume_token (parser);
4050           c_finish_expr_stmt (NULL_TREE);
4051         }
4052       else if (c_parser_next_token_starts_declspecs (parser))
4053         {
4054           c_parser_declaration_or_fndef (parser, true, true, true, true);
4055           check_for_loop_decls ();
4056         }
4057       else if (c_parser_next_token_is_keyword (parser, RID_EXTENSION))
4058         {
4059           /* __extension__ can start a declaration, but is also an
4060              unary operator that can start an expression.  Consume all
4061              but the last of a possible series of __extension__ to
4062              determine which.  */
4063           while (c_parser_peek_2nd_token (parser)->type == CPP_KEYWORD
4064                  && (c_parser_peek_2nd_token (parser)->keyword
4065                      == RID_EXTENSION))
4066             c_parser_consume_token (parser);
4067           if (c_token_starts_declspecs (c_parser_peek_2nd_token (parser)))
4068             {
4069               int ext;
4070               ext = disable_extension_diagnostics ();
4071               c_parser_consume_token (parser);
4072               c_parser_declaration_or_fndef (parser, true, true, true, true);
4073               restore_extension_diagnostics (ext);
4074               check_for_loop_decls ();
4075             }
4076           else
4077             goto init_expr;
4078         }
4079       else
4080         {
4081         init_expr:
4082           c_finish_expr_stmt (c_parser_expression (parser).value);
4083           c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
4084         }
4085       /* Parse the loop condition.  */
4086       loc = c_parser_peek_token (parser)->location;
4087       if (c_parser_next_token_is (parser, CPP_SEMICOLON))
4088         {
4089           c_parser_consume_token (parser);
4090           cond = NULL_TREE;
4091         }
4092       else
4093         {
4094           tree ocond = c_parser_expression_conv (parser).value;
4095           cond = c_objc_common_truthvalue_conversion (ocond);
4096           if (CAN_HAVE_LOCATION_P (cond))
4097             SET_EXPR_LOCATION (cond, loc);
4098           c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
4099         }
4100       /* Parse the increment expression.  */
4101       if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
4102         incr = c_process_expr_stmt (NULL_TREE);
4103       else
4104         incr = c_process_expr_stmt (c_parser_expression (parser).value);
4105       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
4106     }
4107   else
4108     {
4109       cond = error_mark_node;
4110       incr = error_mark_node;
4111     }
4112   save_break = c_break_label;
4113   c_break_label = NULL_TREE;
4114   save_cont = c_cont_label;
4115   c_cont_label = NULL_TREE;
4116   body = c_parser_c99_block_statement (parser);
4117   c_finish_loop (loc, cond, incr, body, c_break_label, c_cont_label, true);
4118   add_stmt (c_end_compound_stmt (block, flag_isoc99));
4119   c_break_label = save_break;
4120   c_cont_label = save_cont;
4121 }
4122
4123 /* Parse an asm statement, a GNU extension.  This is a full-blown asm
4124    statement with inputs, outputs, clobbers, and volatile tag
4125    allowed.
4126
4127    asm-statement:
4128      asm type-qualifier[opt] ( asm-argument ) ;
4129
4130    asm-argument:
4131      asm-string-literal
4132      asm-string-literal : asm-operands[opt]
4133      asm-string-literal : asm-operands[opt] : asm-operands[opt]
4134      asm-string-literal : asm-operands[opt] : asm-operands[opt] : asm-clobbers
4135
4136    Qualifiers other than volatile are accepted in the syntax but
4137    warned for.  */
4138
4139 static tree
4140 c_parser_asm_statement (c_parser *parser)
4141 {
4142   tree quals, str, outputs, inputs, clobbers, ret;
4143   bool simple;
4144   gcc_assert (c_parser_next_token_is_keyword (parser, RID_ASM));
4145   c_parser_consume_token (parser);
4146   if (c_parser_next_token_is_keyword (parser, RID_VOLATILE))
4147     {
4148       quals = c_parser_peek_token (parser)->value;
4149       c_parser_consume_token (parser);
4150     }
4151   else if (c_parser_next_token_is_keyword (parser, RID_CONST)
4152            || c_parser_next_token_is_keyword (parser, RID_RESTRICT))
4153     {
4154       warning (0, "%E qualifier ignored on asm",
4155                c_parser_peek_token (parser)->value);
4156       quals = NULL_TREE;
4157       c_parser_consume_token (parser);
4158     }
4159   else
4160     quals = NULL_TREE;
4161   /* ??? Follow the C++ parser rather than using the
4162      lex_untranslated_string kludge.  */
4163   parser->lex_untranslated_string = true;
4164   if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
4165     {
4166       parser->lex_untranslated_string = false;
4167       return NULL_TREE;
4168     }
4169   str = c_parser_asm_string_literal (parser);
4170   if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
4171     {
4172       simple = true;
4173       outputs = NULL_TREE;
4174       inputs = NULL_TREE;
4175       clobbers = NULL_TREE;
4176       goto done_asm;
4177     }
4178   if (!c_parser_require (parser, CPP_COLON, "expected %<:%> or %<)%>"))
4179     {
4180       parser->lex_untranslated_string = false;
4181       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
4182       return NULL_TREE;
4183     }
4184   simple = false;
4185   /* Parse outputs.  */
4186   if (c_parser_next_token_is (parser, CPP_COLON)
4187       || c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
4188     outputs = NULL_TREE;
4189   else
4190     outputs = c_parser_asm_operands (parser, false);
4191   if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
4192     {
4193       inputs = NULL_TREE;
4194       clobbers = NULL_TREE;
4195       goto done_asm;
4196     }
4197   if (!c_parser_require (parser, CPP_COLON, "expected %<:%> or %<)%>"))
4198     {
4199       parser->lex_untranslated_string = false;
4200       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
4201       return NULL_TREE;
4202     }
4203   /* Parse inputs.  */
4204   if (c_parser_next_token_is (parser, CPP_COLON)
4205       || c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
4206     inputs = NULL_TREE;
4207   else
4208     inputs = c_parser_asm_operands (parser, true);
4209   if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
4210     {
4211       clobbers = NULL_TREE;
4212       goto done_asm;
4213     }
4214   if (!c_parser_require (parser, CPP_COLON, "expected %<:%> or %<)%>"))
4215     {
4216       parser->lex_untranslated_string = false;
4217       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
4218       return NULL_TREE;
4219     }
4220   /* Parse clobbers.  */
4221   clobbers = c_parser_asm_clobbers (parser);
4222  done_asm:
4223   parser->lex_untranslated_string = false;
4224   if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
4225     {
4226       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
4227       return NULL_TREE;
4228     }
4229   if (!c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>"))
4230     c_parser_skip_to_end_of_block_or_statement (parser);
4231   ret = build_asm_stmt (quals, build_asm_expr (str, outputs, inputs,
4232                                                clobbers, simple));
4233   return ret;
4234 }
4235
4236 /* Parse asm operands, a GNU extension.  If CONVERT_P (for inputs but
4237    not outputs), apply the default conversion of functions and arrays
4238    to pointers.
4239
4240    asm-operands:
4241      asm-operand
4242      asm-operands , asm-operand
4243
4244    asm-operand:
4245      asm-string-literal ( expression )
4246      [ identifier ] asm-string-literal ( expression )
4247 */
4248
4249 static tree
4250 c_parser_asm_operands (c_parser *parser, bool convert_p)
4251 {
4252   tree list = NULL_TREE;
4253   while (true)
4254     {
4255       tree name, str;
4256       struct c_expr expr;
4257       if (c_parser_next_token_is (parser, CPP_OPEN_SQUARE))
4258         {
4259           c_parser_consume_token (parser);
4260           if (c_parser_next_token_is (parser, CPP_NAME))
4261             {
4262               tree id = c_parser_peek_token (parser)->value;
4263               c_parser_consume_token (parser);
4264               name = build_string (IDENTIFIER_LENGTH (id),
4265                                    IDENTIFIER_POINTER (id));
4266             }
4267           else
4268             {
4269               c_parser_error (parser, "expected identifier");
4270               c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, NULL);
4271               return NULL_TREE;
4272             }
4273           c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
4274                                      "expected %<]%>");
4275         }
4276       else
4277         name = NULL_TREE;
4278       str = c_parser_asm_string_literal (parser);
4279       if (str == NULL_TREE)
4280         return NULL_TREE;
4281       parser->lex_untranslated_string = false;
4282       if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
4283         {
4284           parser->lex_untranslated_string = true;
4285           return NULL_TREE;
4286         }
4287       expr = c_parser_expression (parser);
4288       if (convert_p)
4289         expr = default_function_array_conversion (expr);
4290       parser->lex_untranslated_string = true;
4291       if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
4292         {
4293           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
4294           return NULL_TREE;
4295         }
4296       list = chainon (list, build_tree_list (build_tree_list (name, str),
4297                                              expr.value));
4298       if (c_parser_next_token_is (parser, CPP_COMMA))
4299         c_parser_consume_token (parser);
4300       else
4301         break;
4302     }
4303   return list;
4304 }
4305
4306 /* Parse asm clobbers, a GNU extension.
4307
4308    asm-clobbers:
4309      asm-string-literal
4310      asm-clobbers , asm-string-literal
4311 */
4312
4313 static tree
4314 c_parser_asm_clobbers (c_parser *parser)
4315 {
4316   tree list = NULL_TREE;
4317   while (true)
4318     {
4319       tree str = c_parser_asm_string_literal (parser);
4320       if (str)
4321         list = tree_cons (NULL_TREE, str, list);
4322       else
4323         return NULL_TREE;
4324       if (c_parser_next_token_is (parser, CPP_COMMA))
4325         c_parser_consume_token (parser);
4326       else
4327         break;
4328     }
4329   return list;
4330 }
4331
4332 /* Parse an expression other than a compound expression; that is, an
4333    assignment expression (C90 6.3.16, C99 6.5.16).  If AFTER is not
4334    NULL then it is an Objective-C message expression which is the
4335    primary-expression starting the expression as an initializer.
4336
4337    assignment-expression:
4338      conditional-expression
4339      unary-expression assignment-operator assignment-expression
4340
4341    assignment-operator: one of
4342      = *= /= %= += -= <<= >>= &= ^= |=
4343
4344    In GNU C we accept any conditional expression on the LHS and
4345    diagnose the invalid lvalue rather than producing a syntax
4346    error.  */
4347
4348 static struct c_expr
4349 c_parser_expr_no_commas (c_parser *parser, struct c_expr *after)
4350 {
4351   struct c_expr lhs, rhs, ret;
4352   enum tree_code code;
4353   gcc_assert (!after || c_dialect_objc ());
4354   lhs = c_parser_conditional_expression (parser, after);
4355   switch (c_parser_peek_token (parser)->type)
4356     {
4357     case CPP_EQ:
4358       code = NOP_EXPR;
4359       break;
4360     case CPP_MULT_EQ:
4361       code = MULT_EXPR;
4362       break;
4363     case CPP_DIV_EQ:
4364       code = TRUNC_DIV_EXPR;
4365       break;
4366     case CPP_MOD_EQ:
4367       code = TRUNC_MOD_EXPR;
4368       break;
4369     case CPP_PLUS_EQ:
4370       code = PLUS_EXPR;
4371       break;
4372     case CPP_MINUS_EQ:
4373       code = MINUS_EXPR;
4374       break;
4375     case CPP_LSHIFT_EQ:
4376       code = LSHIFT_EXPR;
4377       break;
4378     case CPP_RSHIFT_EQ:
4379       code = RSHIFT_EXPR;
4380       break;
4381     case CPP_AND_EQ:
4382       code = BIT_AND_EXPR;
4383       break;
4384     case CPP_XOR_EQ:
4385       code = BIT_XOR_EXPR;
4386       break;
4387     case CPP_OR_EQ:
4388       code = BIT_IOR_EXPR;
4389       break;
4390     default:
4391       return lhs;
4392     }
4393   c_parser_consume_token (parser);
4394   rhs = c_parser_expr_no_commas (parser, NULL);
4395   rhs = default_function_array_conversion (rhs);
4396   ret.value = build_modify_expr (lhs.value, code, rhs.value);
4397   if (code == NOP_EXPR)
4398     ret.original_code = MODIFY_EXPR;
4399   else
4400     {
4401       TREE_NO_WARNING (ret.value) = 1;
4402       ret.original_code = ERROR_MARK;
4403     }
4404   return ret;
4405 }
4406
4407 /* Parse a conditional expression (C90 6.3.15, C99 6.5.15).  If AFTER
4408    is not NULL then it is an Objective-C message expression which is
4409    the primary-expression starting the expression as an initializer.
4410
4411    conditional-expression:
4412      logical-OR-expression
4413      logical-OR-expression ? expression : conditional-expression
4414
4415    GNU extensions:
4416
4417    conditional-expression:
4418      logical-OR-expression ? : conditional-expression
4419 */
4420
4421 static struct c_expr
4422 c_parser_conditional_expression (c_parser *parser, struct c_expr *after)
4423 {
4424   struct c_expr cond, exp1, exp2, ret;
4425   gcc_assert (!after || c_dialect_objc ());
4426   cond = c_parser_binary_expression (parser, after);
4427   if (c_parser_next_token_is_not (parser, CPP_QUERY))
4428     return cond;
4429   cond = default_function_array_conversion (cond);
4430   c_parser_consume_token (parser);
4431   if (c_parser_next_token_is (parser, CPP_COLON))
4432     {
4433       if (pedantic)
4434         pedwarn ("ISO C forbids omitting the middle term of a ?: expression");
4435       /* Make sure first operand is calculated only once.  */
4436       exp1.value = save_expr (default_conversion (cond.value));
4437       cond.value = c_objc_common_truthvalue_conversion (exp1.value);
4438       skip_evaluation += cond.value == truthvalue_true_node;
4439     }
4440   else
4441     {
4442       cond.value
4443         = c_objc_common_truthvalue_conversion
4444         (default_conversion (cond.value));
4445       skip_evaluation += cond.value == truthvalue_false_node;
4446       exp1 = c_parser_expression_conv (parser);
4447       skip_evaluation += ((cond.value == truthvalue_true_node)
4448                           - (cond.value == truthvalue_false_node));
4449     }
4450   if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
4451     {
4452       skip_evaluation -= cond.value == truthvalue_true_node;
4453       ret.value = error_mark_node;
4454       ret.original_code = ERROR_MARK;
4455       return ret;
4456     }
4457   exp2 = c_parser_conditional_expression (parser, NULL);
4458   exp2 = default_function_array_conversion (exp2);
4459   skip_evaluation -= cond.value == truthvalue_true_node;
4460   ret.value = build_conditional_expr (cond.value, exp1.value, exp2.value);
4461   ret.original_code = ERROR_MARK;
4462   return ret;
4463 }
4464
4465 /* Parse a binary expression; that is, a logical-OR-expression (C90
4466    6.3.5-6.3.14, C99 6.5.5-6.5.14).  If AFTER is not NULL then it is
4467    an Objective-C message expression which is the primary-expression
4468    starting the expression as an initializer.
4469
4470    multiplicative-expression:
4471      cast-expression
4472      multiplicative-expression * cast-expression
4473      multiplicative-expression / cast-expression
4474      multiplicative-expression % cast-expression
4475
4476    additive-expression:
4477      multiplicative-expression
4478      additive-expression + multiplicative-expression
4479      additive-expression - multiplicative-expression
4480
4481    shift-expression:
4482      additive-expression
4483      shift-expression << additive-expression
4484      shift-expression >> additive-expression
4485
4486    relational-expression:
4487      shift-expression
4488      relational-expression < shift-expression
4489      relational-expression > shift-expression
4490      relational-expression <= shift-expression
4491      relational-expression >= shift-expression
4492
4493    equality-expression:
4494      relational-expression
4495      equality-expression == relational-expression
4496      equality-expression != relational-expression
4497
4498    AND-expression:
4499      equality-expression
4500      AND-expression & equality-expression
4501
4502    exclusive-OR-expression:
4503      AND-expression
4504      exclusive-OR-expression ^ AND-expression
4505
4506    inclusive-OR-expression:
4507      exclusive-OR-expression
4508      inclusive-OR-expression | exclusive-OR-expression
4509
4510    logical-AND-expression:
4511      inclusive-OR-expression
4512      logical-AND-expression && inclusive-OR-expression
4513
4514    logical-OR-expression:
4515      logical-AND-expression
4516      logical-OR-expression || logical-AND-expression
4517 */
4518
4519 static struct c_expr
4520 c_parser_binary_expression (c_parser *parser, struct c_expr *after)
4521 {
4522   /* A binary expression is parsed using operator-precedence parsing,
4523      with the operands being cast expressions.  All the binary
4524      operators are left-associative.  Thus a binary expression is of
4525      form:
4526
4527      E0 op1 E1 op2 E2 ...
4528
4529      which we represent on a stack.  On the stack, the precedence
4530      levels are strictly increasing.  When a new operator is
4531      encountered of higher precedence than that at the top of the
4532      stack, it is pushed; its LHS is the top expression, and its RHS
4533      is everything parsed until it is popped.  When a new operator is
4534      encountered with precedence less than or equal to that at the top
4535      of the stack, triples E[i-1] op[i] E[i] are popped and replaced
4536      by the result of the operation until the operator at the top of
4537      the stack has lower precedence than the new operator or there is
4538      only one element on the stack; then the top expression is the LHS
4539      of the new operator.  In the case of logical AND and OR
4540      expressions, we also need to adjust skip_evaluation as
4541      appropriate when the operators are pushed and popped.  */
4542
4543   /* The precedence levels, where 0 is a dummy lowest level used for
4544      the bottom of the stack.  */
4545   enum prec {
4546     PREC_NONE,
4547     PREC_LOGOR,
4548     PREC_LOGAND,
4549     PREC_BITOR,
4550     PREC_BITXOR,
4551     PREC_BITAND,
4552     PREC_EQ,
4553     PREC_REL,
4554     PREC_SHIFT,
4555     PREC_ADD,
4556     PREC_MULT,
4557     NUM_PRECS
4558   };
4559   struct {
4560     /* The expression at this stack level.  */
4561     struct c_expr expr;
4562     /* The precedence of the operator on its left, PREC_NONE at the
4563        bottom of the stack.  */
4564     enum prec prec;
4565     /* The operation on its left.  */
4566     enum tree_code op;
4567   } stack[NUM_PRECS];
4568   int sp;
4569 #define POP                                                                   \
4570   do {                                                                        \
4571     switch (stack[sp].op)                                                     \
4572       {                                                                       \
4573       case TRUTH_ANDIF_EXPR:                                                  \
4574         skip_evaluation -= stack[sp - 1].expr.value == truthvalue_false_node; \
4575         break;                                                                \
4576       case TRUTH_ORIF_EXPR:                                                   \
4577         skip_evaluation -= stack[sp - 1].expr.value == truthvalue_true_node;  \
4578         break;                                                                \
4579       default:                                                                \
4580         break;                                                                \
4581       }                                                                       \
4582     stack[sp - 1].expr                                                        \
4583       = default_function_array_conversion (stack[sp - 1].expr);               \
4584     stack[sp].expr                                                            \
4585       = default_function_array_conversion (stack[sp].expr);                   \
4586     stack[sp - 1].expr = parser_build_binary_op (stack[sp].op,                \
4587                                                  stack[sp - 1].expr,          \
4588                                                  stack[sp].expr);             \
4589     sp--;                                                                     \
4590   } while (0)
4591   gcc_assert (!after || c_dialect_objc ());
4592   stack[0].expr = c_parser_cast_expression (parser, after);
4593   stack[0].prec = PREC_NONE;
4594   sp = 0;
4595   while (true)
4596     {
4597       enum prec oprec;
4598       enum tree_code ocode;
4599       if (parser->error)
4600         goto out;
4601       switch (c_parser_peek_token (parser)->type)
4602         {
4603         case CPP_MULT:
4604           oprec = PREC_MULT;
4605           ocode = MULT_EXPR;
4606           break;
4607         case CPP_DIV:
4608           oprec = PREC_MULT;
4609           ocode = TRUNC_DIV_EXPR;
4610           break;
4611         case CPP_MOD:
4612           oprec = PREC_MULT;
4613           ocode = TRUNC_MOD_EXPR;
4614           break;
4615         case CPP_PLUS:
4616           oprec = PREC_ADD;
4617           ocode = PLUS_EXPR;
4618           break;
4619         case CPP_MINUS:
4620           oprec = PREC_ADD;
4621           ocode = MINUS_EXPR;
4622           break;
4623         case CPP_LSHIFT:
4624           oprec = PREC_SHIFT;
4625           ocode = LSHIFT_EXPR;
4626           break;
4627         case CPP_RSHIFT:
4628           oprec = PREC_SHIFT;
4629           ocode = RSHIFT_EXPR;
4630           break;
4631         case CPP_LESS:
4632           oprec = PREC_REL;
4633           ocode = LT_EXPR;
4634           break;
4635         case CPP_GREATER:
4636           oprec = PREC_REL;
4637           ocode = GT_EXPR;
4638           break;
4639         case CPP_LESS_EQ:
4640           oprec = PREC_REL;
4641           ocode = LE_EXPR;
4642           break;
4643         case CPP_GREATER_EQ:
4644           oprec = PREC_REL;
4645           ocode = GE_EXPR;
4646           break;
4647         case CPP_EQ_EQ:
4648           oprec = PREC_EQ;
4649           ocode = EQ_EXPR;
4650           break;
4651         case CPP_NOT_EQ:
4652           oprec = PREC_EQ;
4653           ocode = NE_EXPR;
4654           break;
4655         case CPP_AND:
4656           oprec = PREC_BITAND;
4657           ocode = BIT_AND_EXPR;
4658           break;
4659         case CPP_XOR:
4660           oprec = PREC_BITXOR;
4661           ocode = BIT_XOR_EXPR;
4662           break;
4663         case CPP_OR:
4664           oprec = PREC_BITOR;
4665           ocode = BIT_IOR_EXPR;
4666           break;
4667         case CPP_AND_AND:
4668           oprec = PREC_LOGAND;
4669           ocode = TRUTH_ANDIF_EXPR;
4670           break;
4671         case CPP_OR_OR:
4672           oprec = PREC_LOGOR;
4673           ocode = TRUTH_ORIF_EXPR;
4674           break;
4675         default:
4676           /* Not a binary operator, so end of the binary
4677              expression.  */
4678           goto out;
4679         }
4680       c_parser_consume_token (parser);
4681       while (oprec <= stack[sp].prec)
4682         POP;
4683       switch (ocode)
4684         {
4685         case TRUTH_ANDIF_EXPR:
4686           stack[sp].expr
4687             = default_function_array_conversion (stack[sp].expr);
4688           stack[sp].expr.value = c_objc_common_truthvalue_conversion
4689             (default_conversion (stack[sp].expr.value));
4690           skip_evaluation += stack[sp].expr.value == truthvalue_false_node;
4691           break;
4692         case TRUTH_ORIF_EXPR:
4693           stack[sp].expr
4694             = default_function_array_conversion (stack[sp].expr);
4695           stack[sp].expr.value = c_objc_common_truthvalue_conversion
4696             (default_conversion (stack[sp].expr.value));
4697           skip_evaluation += stack[sp].expr.value == truthvalue_true_node;
4698           break;
4699         default:
4700           break;
4701         }
4702       sp++;
4703       stack[sp].expr = c_parser_cast_expression (parser, NULL);
4704       stack[sp].prec = oprec;
4705       stack[sp].op = ocode;
4706     }
4707  out:
4708   while (sp > 0)
4709     POP;
4710   return stack[0].expr;
4711 #undef POP
4712 }
4713
4714 /* Parse a cast expression (C90 6.3.4, C99 6.5.4).  If AFTER is not
4715    NULL then it is an Objective-C message expression which is the
4716    primary-expression starting the expression as an initializer.
4717
4718    cast-expression:
4719      unary-expression
4720      ( type-name ) unary-expression
4721 */
4722
4723 static struct c_expr
4724 c_parser_cast_expression (c_parser *parser, struct c_expr *after)
4725 {
4726   gcc_assert (!after || c_dialect_objc ());
4727   if (after)
4728     return c_parser_postfix_expression_after_primary (parser, *after);
4729   /* If the expression begins with a parenthesized type name, it may
4730      be either a cast or a compound literal; we need to see whether
4731      the next character is '{' to tell the difference.  If not, it is
4732      an unary expression.  */
4733   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)
4734       && c_token_starts_typename (c_parser_peek_2nd_token (parser)))
4735     {
4736       struct c_type_name *type_name;
4737       struct c_expr ret;
4738       struct c_expr expr;
4739       c_parser_consume_token (parser);
4740       type_name = c_parser_type_name (parser);
4741       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
4742       if (type_name == NULL)
4743         {
4744           ret.value = error_mark_node;
4745           ret.original_code = ERROR_MARK;
4746           return ret;
4747         }
4748
4749       /* Save casted types in the function's used types hash table.  */
4750       used_types_insert (type_name->specs->type);
4751
4752       if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
4753         return c_parser_postfix_expression_after_paren_type (parser,
4754                                                              type_name);
4755       expr = c_parser_cast_expression (parser, NULL);
4756       expr = default_function_array_conversion (expr);
4757       ret.value = c_cast_expr (type_name, expr.value);
4758       ret.original_code = ERROR_MARK;
4759       return ret;
4760     }
4761   else
4762     return c_parser_unary_expression (parser);
4763 }
4764
4765 /* Parse an unary expression (C90 6.3.3, C99 6.5.3).
4766
4767    unary-expression:
4768      postfix-expression
4769      ++ unary-expression
4770      -- unary-expression
4771      unary-operator cast-expression
4772      sizeof unary-expression
4773      sizeof ( type-name )
4774
4775    unary-operator: one of
4776      & * + - ~ !
4777
4778    GNU extensions:
4779
4780    unary-expression:
4781      __alignof__ unary-expression
4782      __alignof__ ( type-name )
4783      && identifier
4784
4785    unary-operator: one of
4786      __extension__ __real__ __imag__
4787
4788    In addition, the GNU syntax treats ++ and -- as unary operators, so
4789    they may be applied to cast expressions with errors for non-lvalues
4790    given later.  */
4791
4792 static struct c_expr
4793 c_parser_unary_expression (c_parser *parser)
4794 {
4795   int ext;
4796   struct c_expr ret, op;
4797   switch (c_parser_peek_token (parser)->type)
4798     {
4799     case CPP_PLUS_PLUS:
4800       c_parser_consume_token (parser);
4801       op = c_parser_cast_expression (parser, NULL);
4802       op = default_function_array_conversion (op);
4803       return parser_build_unary_op (PREINCREMENT_EXPR, op);
4804     case CPP_MINUS_MINUS:
4805       c_parser_consume_token (parser);
4806       op = c_parser_cast_expression (parser, NULL);
4807       op = default_function_array_conversion (op);
4808       return parser_build_unary_op (PREDECREMENT_EXPR, op);
4809     case CPP_AND:
4810       c_parser_consume_token (parser);
4811       return parser_build_unary_op (ADDR_EXPR,
4812                                     c_parser_cast_expression (parser, NULL));
4813     case CPP_MULT:
4814       c_parser_consume_token (parser);
4815       op = c_parser_cast_expression (parser, NULL);
4816       op = default_function_array_conversion (op);
4817       ret.value = build_indirect_ref (op.value, "unary *");
4818       ret.original_code = ERROR_MARK;
4819       return ret;
4820     case CPP_PLUS:
4821       c_parser_consume_token (parser);
4822       if (!c_dialect_objc () && !in_system_header)
4823         warning (OPT_Wtraditional,
4824                  "traditional C rejects the unary plus operator");
4825       op = c_parser_cast_expression (parser, NULL);
4826       op = default_function_array_conversion (op);
4827       return parser_build_unary_op (CONVERT_EXPR, op);
4828     case CPP_MINUS:
4829       c_parser_consume_token (parser);
4830       op = c_parser_cast_expression (parser, NULL);
4831       op = default_function_array_conversion (op);
4832       return parser_build_unary_op (NEGATE_EXPR, op);
4833     case CPP_COMPL:
4834       c_parser_consume_token (parser);
4835       op = c_parser_cast_expression (parser, NULL);
4836       op = default_function_array_conversion (op);
4837       return parser_build_unary_op (BIT_NOT_EXPR, op);
4838     case CPP_NOT:
4839       c_parser_consume_token (parser);
4840       op = c_parser_cast_expression (parser, NULL);
4841       op = default_function_array_conversion (op);
4842       return parser_build_unary_op (TRUTH_NOT_EXPR, op);
4843     case CPP_AND_AND:
4844       /* Refer to the address of a label as a pointer.  */
4845       c_parser_consume_token (parser);
4846       if (c_parser_next_token_is (parser, CPP_NAME))
4847         {
4848           ret.value = finish_label_address_expr
4849             (c_parser_peek_token (parser)->value);
4850           c_parser_consume_token (parser);
4851         }
4852       else
4853         {
4854           c_parser_error (parser, "expected identifier");
4855           ret.value = error_mark_node;
4856         }
4857         ret.original_code = ERROR_MARK;
4858         return ret;
4859     case CPP_KEYWORD:
4860       switch (c_parser_peek_token (parser)->keyword)
4861         {
4862         case RID_SIZEOF:
4863           return c_parser_sizeof_expression (parser);
4864         case RID_ALIGNOF:
4865           return c_parser_alignof_expression (parser);
4866         case RID_EXTENSION:
4867           c_parser_consume_token (parser);
4868           ext = disable_extension_diagnostics ();
4869           ret = c_parser_cast_expression (parser, NULL);
4870           restore_extension_diagnostics (ext);
4871           return ret;
4872         case RID_REALPART:
4873           c_parser_consume_token (parser);
4874           op = c_parser_cast_expression (parser, NULL);
4875           op = default_function_array_conversion (op);
4876           return parser_build_unary_op (REALPART_EXPR, op);
4877         case RID_IMAGPART:
4878           c_parser_consume_token (parser);
4879           op = c_parser_cast_expression (parser, NULL);
4880           op = default_function_array_conversion (op);
4881           return parser_build_unary_op (IMAGPART_EXPR, op);
4882         default:
4883           return c_parser_postfix_expression (parser);
4884         }
4885     default:
4886       return c_parser_postfix_expression (parser);
4887     }
4888 }
4889
4890 /* Parse a sizeof expression.  */
4891
4892 static struct c_expr
4893 c_parser_sizeof_expression (c_parser *parser)
4894 {
4895   struct c_expr expr;
4896   gcc_assert (c_parser_next_token_is_keyword (parser, RID_SIZEOF));
4897   c_parser_consume_token (parser);
4898   skip_evaluation++;
4899   in_sizeof++;
4900   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)
4901       && c_token_starts_typename (c_parser_peek_2nd_token (parser)))
4902     {
4903       /* Either sizeof ( type-name ) or sizeof unary-expression
4904          starting with a compound literal.  */
4905       struct c_type_name *type_name;
4906       c_parser_consume_token (parser);
4907       type_name = c_parser_type_name (parser);
4908       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
4909       if (type_name == NULL)
4910         {
4911           struct c_expr ret;
4912           skip_evaluation--;
4913           in_sizeof--;
4914           ret.value = error_mark_node;
4915           ret.original_code = ERROR_MARK;
4916           return ret;
4917         }
4918       if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
4919         {
4920           expr = c_parser_postfix_expression_after_paren_type (parser,
4921                                                                type_name);
4922           goto sizeof_expr;
4923         }
4924       /* sizeof ( type-name ).  */
4925       skip_evaluation--;
4926       in_sizeof--;
4927       if (type_name->declarator->kind == cdk_array
4928           && type_name->declarator->u.array.vla_unspec_p)
4929         {
4930           /* C99 6.7.5.2p4 */
4931           error ("%<[*]%> not allowed in other than a declaration");
4932         }
4933       return c_expr_sizeof_type (type_name);
4934     }
4935   else
4936     {
4937       expr = c_parser_unary_expression (parser);
4938     sizeof_expr:
4939       skip_evaluation--;
4940       in_sizeof--;
4941       if (TREE_CODE (expr.value) == COMPONENT_REF
4942           && DECL_C_BIT_FIELD (TREE_OPERAND (expr.value, 1)))
4943         error ("%<sizeof%> applied to a bit-field");
4944       return c_expr_sizeof_expr (expr);
4945     }
4946 }
4947
4948 /* Parse an alignof expression.  */
4949
4950 static struct c_expr
4951 c_parser_alignof_expression (c_parser *parser)
4952 {
4953   struct c_expr expr;
4954   gcc_assert (c_parser_next_token_is_keyword (parser, RID_ALIGNOF));
4955   c_parser_consume_token (parser);
4956   skip_evaluation++;
4957   in_alignof++;
4958   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)
4959       && c_token_starts_typename (c_parser_peek_2nd_token (parser)))
4960     {
4961       /* Either __alignof__ ( type-name ) or __alignof__
4962          unary-expression starting with a compound literal.  */
4963       struct c_type_name *type_name;
4964       struct c_expr ret;
4965       c_parser_consume_token (parser);
4966       type_name = c_parser_type_name (parser);
4967       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
4968       if (type_name == NULL)
4969         {
4970           struct c_expr ret;
4971           skip_evaluation--;
4972           in_alignof--;
4973           ret.value = error_mark_node;
4974           ret.original_code = ERROR_MARK;
4975           return ret;
4976         }
4977       if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
4978         {
4979           expr = c_parser_postfix_expression_after_paren_type (parser,
4980                                                                type_name);
4981           goto alignof_expr;
4982         }
4983       /* alignof ( type-name ).  */
4984       skip_evaluation--;
4985       in_alignof--;
4986       ret.value = c_alignof (groktypename (type_name));
4987       ret.original_code = ERROR_MARK;
4988       return ret;
4989     }
4990   else
4991     {
4992       struct c_expr ret;
4993       expr = c_parser_unary_expression (parser);
4994     alignof_expr:
4995       skip_evaluation--;
4996       in_alignof--;
4997       ret.value = c_alignof_expr (expr.value);
4998       ret.original_code = ERROR_MARK;
4999       return ret;
5000     }
5001 }
5002
5003 /* Parse a postfix expression (C90 6.3.1-6.3.2, C99 6.5.1-6.5.2).
5004
5005    postfix-expression:
5006      primary-expression
5007      postfix-expression [ expression ]
5008      postfix-expression ( argument-expression-list[opt] )
5009      postfix-expression . identifier
5010      postfix-expression -> identifier
5011      postfix-expression ++
5012      postfix-expression --
5013      ( type-name ) { initializer-list }
5014      ( type-name ) { initializer-list , }
5015
5016    argument-expression-list:
5017      argument-expression
5018      argument-expression-list , argument-expression
5019
5020    primary-expression:
5021      identifier
5022      constant
5023      string-literal
5024      ( expression )
5025
5026    GNU extensions:
5027
5028    primary-expression:
5029      __func__
5030        (treated as a keyword in GNU C)
5031      __FUNCTION__
5032      __PRETTY_FUNCTION__
5033      ( compound-statement )
5034      __builtin_va_arg ( assignment-expression , type-name )
5035      __builtin_offsetof ( type-name , offsetof-member-designator )
5036      __builtin_choose_expr ( assignment-expression ,
5037                              assignment-expression ,
5038                              assignment-expression )
5039      __builtin_types_compatible_p ( type-name , type-name )
5040
5041    offsetof-member-designator:
5042      identifier
5043      offsetof-member-designator . identifier
5044      offsetof-member-designator [ expression ]
5045
5046    Objective-C:
5047
5048    primary-expression:
5049      [ objc-receiver objc-message-args ]
5050      @selector ( objc-selector-arg )
5051      @protocol ( identifier )
5052      @encode ( type-name )
5053      objc-string-literal
5054 */
5055
5056 static struct c_expr
5057 c_parser_postfix_expression (c_parser *parser)
5058 {
5059   struct c_expr expr, e1, e2, e3;
5060   struct c_type_name *t1, *t2;
5061   switch (c_parser_peek_token (parser)->type)
5062     {
5063     case CPP_NUMBER:
5064     case CPP_CHAR:
5065     case CPP_WCHAR:
5066       expr.value = c_parser_peek_token (parser)->value;
5067       expr.original_code = ERROR_MARK;
5068       c_parser_consume_token (parser);
5069       break;
5070     case CPP_STRING:
5071     case CPP_WSTRING:
5072       expr.value = c_parser_peek_token (parser)->value;
5073       expr.original_code = STRING_CST;
5074       c_parser_consume_token (parser);
5075       break;
5076     case CPP_OBJC_STRING:
5077       gcc_assert (c_dialect_objc ());
5078       expr.value
5079         = objc_build_string_object (c_parser_peek_token (parser)->value);
5080       expr.original_code = ERROR_MARK;
5081       c_parser_consume_token (parser);
5082       break;
5083     case CPP_NAME:
5084       if (c_parser_peek_token (parser)->id_kind != C_ID_ID)
5085         {
5086           c_parser_error (parser, "expected expression");
5087           expr.value = error_mark_node;
5088           expr.original_code = ERROR_MARK;
5089           break;
5090         }
5091       {
5092         tree id = c_parser_peek_token (parser)->value;
5093         location_t loc = c_parser_peek_token (parser)->location;
5094         c_parser_consume_token (parser);
5095         expr.value = build_external_ref (id,
5096                                          (c_parser_peek_token (parser)->type
5097                                           == CPP_OPEN_PAREN), loc);
5098         expr.original_code = ERROR_MARK;
5099       }
5100       break;
5101     case CPP_OPEN_PAREN:
5102       /* A parenthesized expression, statement expression or compound
5103          literal.  */
5104       if (c_parser_peek_2nd_token (parser)->type == CPP_OPEN_BRACE)
5105         {
5106           /* A statement expression.  */
5107           tree stmt;
5108           c_parser_consume_token (parser);
5109           c_parser_consume_token (parser);
5110           if (cur_stmt_list == NULL)
5111             {
5112               error ("braced-group within expression allowed "
5113                      "only inside a function");
5114               parser->error = true;
5115               c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL);
5116               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5117               expr.value = error_mark_node;
5118               expr.original_code = ERROR_MARK;
5119               break;
5120             }
5121           stmt = c_begin_stmt_expr ();
5122           c_parser_compound_statement_nostart (parser);
5123           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5124                                      "expected %<)%>");
5125           if (pedantic)
5126             pedwarn ("ISO C forbids braced-groups within expressions");
5127           expr.value = c_finish_stmt_expr (stmt);
5128           expr.original_code = ERROR_MARK;
5129         }
5130       else if (c_token_starts_typename (c_parser_peek_2nd_token (parser)))
5131         {
5132           /* A compound literal.  ??? Can we actually get here rather
5133              than going directly to
5134              c_parser_postfix_expression_after_paren_type from
5135              elsewhere?  */
5136           struct c_type_name *type_name;
5137           c_parser_consume_token (parser);
5138           type_name = c_parser_type_name (parser);
5139           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5140                                      "expected %<)%>");
5141           if (type_name == NULL)
5142             {
5143               expr.value = error_mark_node;
5144               expr.original_code = ERROR_MARK;
5145             }
5146           else
5147             expr = c_parser_postfix_expression_after_paren_type (parser,
5148                                                                  type_name);
5149         }
5150       else
5151         {
5152           /* A parenthesized expression.  */
5153           c_parser_consume_token (parser);
5154           expr = c_parser_expression (parser);
5155           if (TREE_CODE (expr.value) == MODIFY_EXPR)
5156             TREE_NO_WARNING (expr.value) = 1;
5157           expr.original_code = ERROR_MARK;
5158           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5159                                      "expected %<)%>");
5160         }
5161       break;
5162     case CPP_KEYWORD:
5163       switch (c_parser_peek_token (parser)->keyword)
5164         {
5165         case RID_FUNCTION_NAME:
5166         case RID_PRETTY_FUNCTION_NAME:
5167         case RID_C99_FUNCTION_NAME:
5168           expr.value = fname_decl (c_parser_peek_token (parser)->keyword,
5169                                    c_parser_peek_token (parser)->value);
5170           expr.original_code = ERROR_MARK;
5171           c_parser_consume_token (parser);
5172           break;
5173         case RID_VA_ARG:
5174           c_parser_consume_token (parser);
5175           if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5176             {
5177               expr.value = error_mark_node;
5178               expr.original_code = ERROR_MARK;
5179               break;
5180             }
5181           e1 = c_parser_expr_no_commas (parser, NULL);
5182           if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
5183             {
5184               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5185               expr.value = error_mark_node;
5186               expr.original_code = ERROR_MARK;
5187               break;
5188             }
5189           t1 = c_parser_type_name (parser);
5190           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5191                                      "expected %<)%>");
5192           if (t1 == NULL)
5193             {
5194               expr.value = error_mark_node;
5195               expr.original_code = ERROR_MARK;
5196             }
5197           else
5198             {
5199               expr.value = build_va_arg (e1.value, groktypename (t1));
5200               expr.original_code = ERROR_MARK;
5201             }
5202           break;
5203         case RID_OFFSETOF:
5204           c_parser_consume_token (parser);
5205           if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5206             {
5207               expr.value = error_mark_node;
5208               expr.original_code = ERROR_MARK;
5209               break;
5210             }
5211           t1 = c_parser_type_name (parser);
5212           if (t1 == NULL)
5213             {
5214               expr.value = error_mark_node;
5215               expr.original_code = ERROR_MARK;
5216               break;
5217             }
5218           if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
5219             {
5220               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5221               expr.value = error_mark_node;
5222               expr.original_code = ERROR_MARK;
5223               break;
5224             }
5225           {
5226             tree type = groktypename (t1);
5227             tree offsetof_ref;
5228             if (type == error_mark_node)
5229               offsetof_ref = error_mark_node;
5230             else
5231               offsetof_ref = build1 (INDIRECT_REF, type, null_pointer_node);
5232             /* Parse the second argument to __builtin_offsetof.  We
5233                must have one identifier, and beyond that we want to
5234                accept sub structure and sub array references.  */
5235             if (c_parser_next_token_is (parser, CPP_NAME))
5236               {
5237                 offsetof_ref = build_component_ref
5238                   (offsetof_ref, c_parser_peek_token (parser)->value);
5239                 c_parser_consume_token (parser);
5240                 while (c_parser_next_token_is (parser, CPP_DOT)
5241                        || c_parser_next_token_is (parser,
5242                                                   CPP_OPEN_SQUARE))
5243                   {
5244                     if (c_parser_next_token_is (parser, CPP_DOT))
5245                       {
5246                         c_parser_consume_token (parser);
5247                         if (c_parser_next_token_is_not (parser,
5248                                                         CPP_NAME))
5249                           {
5250                             c_parser_error (parser, "expected identifier");
5251                             break;
5252                           }
5253                         offsetof_ref = build_component_ref
5254                           (offsetof_ref,
5255                            c_parser_peek_token (parser)->value);
5256                         c_parser_consume_token (parser);
5257                       }
5258                     else
5259                       {
5260                         tree idx;
5261                         c_parser_consume_token (parser);
5262                         idx = c_parser_expression (parser).value;
5263                         c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
5264                                                    "expected %<]%>");
5265                         offsetof_ref = build_array_ref (offsetof_ref, idx);
5266                       }
5267                   }
5268               }
5269             else
5270               c_parser_error (parser, "expected identifier");
5271             c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5272                                        "expected %<)%>");
5273             expr.value = fold_offsetof (offsetof_ref, NULL_TREE);
5274             expr.original_code = ERROR_MARK;
5275           }
5276           break;
5277         case RID_CHOOSE_EXPR:
5278           c_parser_consume_token (parser);
5279           if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5280             {
5281               expr.value = error_mark_node;
5282               expr.original_code = ERROR_MARK;
5283               break;
5284             }
5285           e1 = 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           e2 = c_parser_expr_no_commas (parser, NULL);
5294           if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
5295             {
5296               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5297               expr.value = error_mark_node;
5298               expr.original_code = ERROR_MARK;
5299               break;
5300             }
5301           e3 = c_parser_expr_no_commas (parser, NULL);
5302           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5303                                      "expected %<)%>");
5304           {
5305             tree c;
5306
5307             c = fold (e1.value);
5308             if (TREE_CODE (c) != INTEGER_CST)
5309               error ("first argument to %<__builtin_choose_expr%> not"
5310                      " a constant");
5311             expr = integer_zerop (c) ? e3 : e2;
5312           }
5313           break;
5314         case RID_TYPES_COMPATIBLE_P:
5315           c_parser_consume_token (parser);
5316           if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5317             {
5318               expr.value = error_mark_node;
5319               expr.original_code = ERROR_MARK;
5320               break;
5321             }
5322           t1 = c_parser_type_name (parser);
5323           if (t1 == NULL)
5324             {
5325               expr.value = error_mark_node;
5326               expr.original_code = ERROR_MARK;
5327               break;
5328             }
5329           if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
5330             {
5331               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5332               expr.value = error_mark_node;
5333               expr.original_code = ERROR_MARK;
5334               break;
5335             }
5336           t2 = c_parser_type_name (parser);
5337           if (t2 == NULL)
5338             {
5339               expr.value = error_mark_node;
5340               expr.original_code = ERROR_MARK;
5341               break;
5342             }
5343           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5344                                      "expected %<)%>");
5345           {
5346             tree e1, e2;
5347
5348             e1 = TYPE_MAIN_VARIANT (groktypename (t1));
5349             e2 = TYPE_MAIN_VARIANT (groktypename (t2));
5350
5351             expr.value = comptypes (e1, e2)
5352               ? build_int_cst (NULL_TREE, 1)
5353               : build_int_cst (NULL_TREE, 0);
5354             expr.original_code = ERROR_MARK;
5355           }
5356           break;
5357         case RID_AT_SELECTOR:
5358           gcc_assert (c_dialect_objc ());
5359           c_parser_consume_token (parser);
5360           if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5361             {
5362               expr.value = error_mark_node;
5363               expr.original_code = ERROR_MARK;
5364               break;
5365             }
5366           {
5367             tree sel = c_parser_objc_selector_arg (parser);
5368             c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5369                                        "expected %<)%>");
5370             expr.value = objc_build_selector_expr (sel);
5371             expr.original_code = ERROR_MARK;
5372           }
5373           break;
5374         case RID_AT_PROTOCOL:
5375           gcc_assert (c_dialect_objc ());
5376           c_parser_consume_token (parser);
5377           if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5378             {
5379               expr.value = error_mark_node;
5380               expr.original_code = ERROR_MARK;
5381               break;
5382             }
5383           if (c_parser_next_token_is_not (parser, CPP_NAME))
5384             {
5385               c_parser_error (parser, "expected identifier");
5386               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5387               expr.value = error_mark_node;
5388               expr.original_code = ERROR_MARK;
5389               break;
5390             }
5391           {
5392             tree id = c_parser_peek_token (parser)->value;
5393             c_parser_consume_token (parser);
5394             c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5395                                        "expected %<)%>");
5396             expr.value = objc_build_protocol_expr (id);
5397             expr.original_code = ERROR_MARK;
5398           }
5399           break;
5400         case RID_AT_ENCODE:
5401           /* Extension to support C-structures in the archiver.  */
5402           gcc_assert (c_dialect_objc ());
5403           c_parser_consume_token (parser);
5404           if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5405             {
5406               expr.value = error_mark_node;
5407               expr.original_code = ERROR_MARK;
5408               break;
5409             }
5410           t1 = c_parser_type_name (parser);
5411           if (t1 == NULL)
5412             {
5413               expr.value = error_mark_node;
5414               expr.original_code = ERROR_MARK;
5415               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5416               break;
5417             }
5418           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5419                                      "expected %<)%>");
5420           {
5421             tree type = groktypename (t1);
5422             expr.value = objc_build_encode_expr (type);
5423             expr.original_code = ERROR_MARK;
5424           }
5425           break;
5426         default:
5427           c_parser_error (parser, "expected expression");
5428           expr.value = error_mark_node;
5429           expr.original_code = ERROR_MARK;
5430           break;
5431         }
5432       break;
5433     case CPP_OPEN_SQUARE:
5434       if (c_dialect_objc ())
5435         {
5436           tree receiver, args;
5437           c_parser_consume_token (parser);
5438           receiver = c_parser_objc_receiver (parser);
5439           args = c_parser_objc_message_args (parser);
5440           c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
5441                                      "expected %<]%>");
5442           expr.value = objc_build_message_expr (build_tree_list (receiver,
5443                                                                  args));
5444           expr.original_code = ERROR_MARK;
5445           break;
5446         }
5447       /* Else fall through to report error.  */
5448     default:
5449       c_parser_error (parser, "expected expression");
5450       expr.value = error_mark_node;
5451       expr.original_code = ERROR_MARK;
5452       break;
5453     }
5454   return c_parser_postfix_expression_after_primary (parser, expr);
5455 }
5456
5457 /* Parse a postfix expression after a parenthesized type name: the
5458    brace-enclosed initializer of a compound literal, possibly followed
5459    by some postfix operators.  This is separate because it is not
5460    possible to tell until after the type name whether a cast
5461    expression has a cast or a compound literal, or whether the operand
5462    of sizeof is a parenthesized type name or starts with a compound
5463    literal.  */
5464
5465 static struct c_expr
5466 c_parser_postfix_expression_after_paren_type (c_parser *parser,
5467                                               struct c_type_name *type_name)
5468 {
5469   tree type;
5470   struct c_expr init;
5471   struct c_expr expr;
5472   start_init (NULL_TREE, NULL, 0);
5473   type = groktypename (type_name);
5474   if (type != error_mark_node && C_TYPE_VARIABLE_SIZE (type))
5475     {
5476       error ("compound literal has variable size");
5477       type = error_mark_node;
5478     }
5479   init = c_parser_braced_init (parser, type, false);
5480   finish_init ();
5481   maybe_warn_string_init (type, init);
5482
5483   if (pedantic && !flag_isoc99)
5484     pedwarn ("ISO C90 forbids compound literals");
5485   expr.value = build_compound_literal (type, init.value);
5486   expr.original_code = ERROR_MARK;
5487   return c_parser_postfix_expression_after_primary (parser, expr);
5488 }
5489
5490 /* Parse a postfix expression after the initial primary or compound
5491    literal; that is, parse a series of postfix operators.  */
5492
5493 static struct c_expr
5494 c_parser_postfix_expression_after_primary (c_parser *parser,
5495                                            struct c_expr expr)
5496 {
5497   tree ident, idx, exprlist;
5498   while (true)
5499     {
5500       switch (c_parser_peek_token (parser)->type)
5501         {
5502         case CPP_OPEN_SQUARE:
5503           /* Array reference.  */
5504           c_parser_consume_token (parser);
5505           idx = c_parser_expression (parser).value;
5506           c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
5507                                      "expected %<]%>");
5508           expr.value = build_array_ref (expr.value, idx);
5509           expr.original_code = ERROR_MARK;
5510           break;
5511         case CPP_OPEN_PAREN:
5512           /* Function call.  */
5513           c_parser_consume_token (parser);
5514           if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
5515             exprlist = NULL_TREE;
5516           else
5517             exprlist = c_parser_expr_list (parser, true);
5518           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5519                                      "expected %<)%>");
5520           expr.value = build_function_call (expr.value, exprlist);
5521           expr.original_code = ERROR_MARK;
5522           break;
5523         case CPP_DOT:
5524           /* Structure element reference.  */
5525           c_parser_consume_token (parser);
5526           expr = default_function_array_conversion (expr);
5527           if (c_parser_next_token_is (parser, CPP_NAME))
5528             ident = c_parser_peek_token (parser)->value;
5529           else
5530             {
5531               c_parser_error (parser, "expected identifier");
5532               expr.value = error_mark_node;
5533               expr.original_code = ERROR_MARK;
5534               return expr;
5535             }
5536           c_parser_consume_token (parser);
5537           expr.value = build_component_ref (expr.value, ident);
5538           expr.original_code = ERROR_MARK;
5539           break;
5540         case CPP_DEREF:
5541           /* Structure element reference.  */
5542           c_parser_consume_token (parser);
5543           expr = default_function_array_conversion (expr);
5544           if (c_parser_next_token_is (parser, CPP_NAME))
5545             ident = c_parser_peek_token (parser)->value;
5546           else
5547             {
5548               c_parser_error (parser, "expected identifier");
5549               expr.value = error_mark_node;
5550               expr.original_code = ERROR_MARK;
5551               return expr;
5552             }
5553           c_parser_consume_token (parser);
5554           expr.value = build_component_ref (build_indirect_ref (expr.value,
5555                                                                 "->"), ident);
5556           expr.original_code = ERROR_MARK;
5557           break;
5558         case CPP_PLUS_PLUS:
5559           /* Postincrement.  */
5560           c_parser_consume_token (parser);
5561           expr = default_function_array_conversion (expr);
5562           expr.value = build_unary_op (POSTINCREMENT_EXPR, expr.value, 0);
5563           expr.original_code = ERROR_MARK;
5564           break;
5565         case CPP_MINUS_MINUS:
5566           /* Postdecrement.  */
5567           c_parser_consume_token (parser);
5568           expr = default_function_array_conversion (expr);
5569           expr.value = build_unary_op (POSTDECREMENT_EXPR, expr.value, 0);
5570           expr.original_code = ERROR_MARK;
5571           break;
5572         default:
5573           return expr;
5574         }
5575     }
5576 }
5577
5578 /* Parse an expression (C90 6.3.17, C99 6.5.17).
5579
5580    expression:
5581      assignment-expression
5582      expression , assignment-expression
5583 */
5584
5585 static struct c_expr
5586 c_parser_expression (c_parser *parser)
5587 {
5588   struct c_expr expr;
5589   expr = c_parser_expr_no_commas (parser, NULL);
5590   while (c_parser_next_token_is (parser, CPP_COMMA))
5591     {
5592       struct c_expr next;
5593       c_parser_consume_token (parser);
5594       next = c_parser_expr_no_commas (parser, NULL);
5595       next = default_function_array_conversion (next);
5596       expr.value = build_compound_expr (expr.value, next.value);
5597       expr.original_code = COMPOUND_EXPR;
5598     }
5599   return expr;
5600 }
5601
5602 /* Parse an expression and convert functions or arrays to
5603    pointers.  */
5604
5605 static struct c_expr
5606 c_parser_expression_conv (c_parser *parser)
5607 {
5608   struct c_expr expr;
5609   expr = c_parser_expression (parser);
5610   expr = default_function_array_conversion (expr);
5611   return expr;
5612 }
5613
5614 /* Parse a non-empty list of expressions.  If CONVERT_P, convert
5615    functions and arrays to pointers.
5616
5617    nonempty-expr-list:
5618      assignment-expression
5619      nonempty-expr-list , assignment-expression
5620 */
5621
5622 static tree
5623 c_parser_expr_list (c_parser *parser, bool convert_p)
5624 {
5625   struct c_expr expr;
5626   tree ret, cur;
5627   expr = c_parser_expr_no_commas (parser, NULL);
5628   if (convert_p)
5629     expr = default_function_array_conversion (expr);
5630   ret = cur = build_tree_list (NULL_TREE, expr.value);
5631   while (c_parser_next_token_is (parser, CPP_COMMA))
5632     {
5633       c_parser_consume_token (parser);
5634       expr = c_parser_expr_no_commas (parser, NULL);
5635       if (convert_p)
5636         expr = default_function_array_conversion (expr);
5637       cur = TREE_CHAIN (cur) = build_tree_list (NULL_TREE, expr.value);
5638     }
5639   return ret;
5640 }
5641
5642 \f
5643 /* Parse Objective-C-specific constructs.  */
5644
5645 /* Parse an objc-class-definition.
5646
5647    objc-class-definition:
5648      @interface identifier objc-superclass[opt] objc-protocol-refs[opt]
5649        objc-class-instance-variables[opt] objc-methodprotolist @end
5650      @implementation identifier objc-superclass[opt]
5651        objc-class-instance-variables[opt]
5652      @interface identifier ( identifier ) objc-protocol-refs[opt]
5653        objc-methodprotolist @end
5654      @implementation identifier ( identifier )
5655
5656    objc-superclass:
5657      : identifier
5658
5659    "@interface identifier (" must start "@interface identifier (
5660    identifier ) ...": objc-methodprotolist in the first production may
5661    not start with a parenthesized identifier as a declarator of a data
5662    definition with no declaration specifiers if the objc-superclass,
5663    objc-protocol-refs and objc-class-instance-variables are omitted.  */
5664
5665 static void
5666 c_parser_objc_class_definition (c_parser *parser)
5667 {
5668   bool iface_p;
5669   tree id1;
5670   tree superclass;
5671   if (c_parser_next_token_is_keyword (parser, RID_AT_INTERFACE))
5672     iface_p = true;
5673   else if (c_parser_next_token_is_keyword (parser, RID_AT_IMPLEMENTATION))
5674     iface_p = false;
5675   else
5676     gcc_unreachable ();
5677   c_parser_consume_token (parser);
5678   if (c_parser_next_token_is_not (parser, CPP_NAME))
5679     {
5680       c_parser_error (parser, "expected identifier");
5681       return;
5682     }
5683   id1 = c_parser_peek_token (parser)->value;
5684   c_parser_consume_token (parser);
5685   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
5686     {
5687       tree id2;
5688       tree proto = NULL_TREE;
5689       c_parser_consume_token (parser);
5690       if (c_parser_next_token_is_not (parser, CPP_NAME))
5691         {
5692           c_parser_error (parser, "expected identifier");
5693           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5694           return;
5695         }
5696       id2 = c_parser_peek_token (parser)->value;
5697       c_parser_consume_token (parser);
5698       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
5699       if (!iface_p)
5700         {
5701           objc_start_category_implementation (id1, id2);
5702           return;
5703         }
5704       if (c_parser_next_token_is (parser, CPP_LESS))
5705         proto = c_parser_objc_protocol_refs (parser);
5706       objc_start_category_interface (id1, id2, proto);
5707       c_parser_objc_methodprotolist (parser);
5708       c_parser_require_keyword (parser, RID_AT_END, "expected %<@end%>");
5709       objc_finish_interface ();
5710       return;
5711     }
5712   if (c_parser_next_token_is (parser, CPP_COLON))
5713     {
5714       c_parser_consume_token (parser);
5715       if (c_parser_next_token_is_not (parser, CPP_NAME))
5716         {
5717           c_parser_error (parser, "expected identifier");
5718           return;
5719         }
5720       superclass = c_parser_peek_token (parser)->value;
5721       c_parser_consume_token (parser);
5722     }
5723   else
5724     superclass = NULL_TREE;
5725   if (iface_p)
5726     {
5727       tree proto = NULL_TREE;
5728       if (c_parser_next_token_is (parser, CPP_LESS))
5729         proto = c_parser_objc_protocol_refs (parser);
5730       objc_start_class_interface (id1, superclass, proto);
5731     }
5732   else
5733     objc_start_class_implementation (id1, superclass);
5734   if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
5735     c_parser_objc_class_instance_variables (parser);
5736   if (iface_p)
5737     {
5738       objc_continue_interface ();
5739       c_parser_objc_methodprotolist (parser);
5740       c_parser_require_keyword (parser, RID_AT_END, "expected %<@end%>");
5741       objc_finish_interface ();
5742     }
5743   else
5744     {
5745       objc_continue_implementation ();
5746       return;
5747     }
5748 }
5749
5750 /* Parse objc-class-instance-variables.
5751
5752    objc-class-instance-variables:
5753      { objc-instance-variable-decl-list[opt] }
5754
5755    objc-instance-variable-decl-list:
5756      objc-visibility-spec
5757      objc-instance-variable-decl ;
5758      ;
5759      objc-instance-variable-decl-list objc-visibility-spec
5760      objc-instance-variable-decl-list objc-instance-variable-decl ;
5761      objc-instance-variable-decl-list ;
5762
5763    objc-visibility-spec:
5764      @private
5765      @protected
5766      @public
5767
5768    objc-instance-variable-decl:
5769      struct-declaration
5770 */
5771
5772 static void
5773 c_parser_objc_class_instance_variables (c_parser *parser)
5774 {
5775   gcc_assert (c_parser_next_token_is (parser, CPP_OPEN_BRACE));
5776   c_parser_consume_token (parser);
5777   while (c_parser_next_token_is_not (parser, CPP_EOF))
5778     {
5779       tree decls;
5780       /* Parse any stray semicolon.  */
5781       if (c_parser_next_token_is (parser, CPP_SEMICOLON))
5782         {
5783           if (pedantic)
5784             pedwarn ("extra semicolon in struct or union specified");
5785           c_parser_consume_token (parser);
5786           continue;
5787         }
5788       /* Stop if at the end of the instance variables.  */
5789       if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
5790         {
5791           c_parser_consume_token (parser);
5792           break;
5793         }
5794       /* Parse any objc-visibility-spec.  */
5795       if (c_parser_next_token_is_keyword (parser, RID_AT_PRIVATE))
5796         {
5797           c_parser_consume_token (parser);
5798           objc_set_visibility (2);
5799           continue;
5800         }
5801       else if (c_parser_next_token_is_keyword (parser, RID_AT_PROTECTED))
5802         {
5803           c_parser_consume_token (parser);
5804           objc_set_visibility (0);
5805           continue;
5806         }
5807       else if (c_parser_next_token_is_keyword (parser, RID_AT_PUBLIC))
5808         {
5809           c_parser_consume_token (parser);
5810           objc_set_visibility (1);
5811           continue;
5812         }
5813       else if (c_parser_next_token_is (parser, CPP_PRAGMA))
5814         {
5815           c_parser_pragma (parser, pragma_external);
5816           continue;
5817         }
5818
5819       /* Parse some comma-separated declarations.  */
5820       decls = c_parser_struct_declaration (parser);
5821       {
5822         /* Comma-separated instance variables are chained together in
5823            reverse order; add them one by one.  */
5824         tree ivar = nreverse (decls);
5825         for (; ivar; ivar = TREE_CHAIN (ivar))
5826           objc_add_instance_variable (copy_node (ivar));
5827       }
5828       c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
5829     }
5830 }
5831
5832 /* Parse an objc-class-declaration.
5833
5834    objc-class-declaration:
5835      @class identifier-list ;
5836 */
5837
5838 static void
5839 c_parser_objc_class_declaration (c_parser *parser)
5840 {
5841   tree list = NULL_TREE;
5842   gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_CLASS));
5843   c_parser_consume_token (parser);
5844   /* Any identifiers, including those declared as type names, are OK
5845      here.  */
5846   while (true)
5847     {
5848       tree id;
5849       if (c_parser_next_token_is_not (parser, CPP_NAME))
5850         {
5851           c_parser_error (parser, "expected identifier");
5852           break;
5853         }
5854       id = c_parser_peek_token (parser)->value;
5855       list = chainon (list, build_tree_list (NULL_TREE, id));
5856       c_parser_consume_token (parser);
5857       if (c_parser_next_token_is (parser, CPP_COMMA))
5858         c_parser_consume_token (parser);
5859       else
5860         break;
5861     }
5862   c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
5863   objc_declare_class (list);
5864 }
5865
5866 /* Parse an objc-alias-declaration.
5867
5868    objc-alias-declaration:
5869      @compatibility_alias identifier identifier ;
5870 */
5871
5872 static void
5873 c_parser_objc_alias_declaration (c_parser *parser)
5874 {
5875   tree id1, id2;
5876   gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_ALIAS));
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   id1 = c_parser_peek_token (parser)->value;
5885   c_parser_consume_token (parser);
5886   if (c_parser_next_token_is_not (parser, CPP_NAME))
5887     {
5888       c_parser_error (parser, "expected identifier");
5889       c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
5890       return;
5891     }
5892   id2 = c_parser_peek_token (parser)->value;
5893   c_parser_consume_token (parser);
5894   c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
5895   objc_declare_alias (id1, id2);
5896 }
5897
5898 /* Parse an objc-protocol-definition.
5899
5900    objc-protocol-definition:
5901      @protocol identifier objc-protocol-refs[opt] objc-methodprotolist @end
5902      @protocol identifier-list ;
5903
5904    "@protocol identifier ;" should be resolved as "@protocol
5905    identifier-list ;": objc-methodprotolist may not start with a
5906    semicolon in the first alternative if objc-protocol-refs are
5907    omitted.  */
5908
5909 static void
5910 c_parser_objc_protocol_definition (c_parser *parser)
5911 {
5912   gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_PROTOCOL));
5913   c_parser_consume_token (parser);
5914   if (c_parser_next_token_is_not (parser, CPP_NAME))
5915     {
5916       c_parser_error (parser, "expected identifier");
5917       return;
5918     }
5919   if (c_parser_peek_2nd_token (parser)->type == CPP_COMMA
5920       || c_parser_peek_2nd_token (parser)->type == CPP_SEMICOLON)
5921     {
5922       tree list = NULL_TREE;
5923       /* Any identifiers, including those declared as type names, are
5924          OK here.  */
5925       while (true)
5926         {
5927           tree id;
5928           if (c_parser_next_token_is_not (parser, CPP_NAME))
5929             {
5930               c_parser_error (parser, "expected identifier");
5931               break;
5932             }
5933           id = c_parser_peek_token (parser)->value;
5934           list = chainon (list, build_tree_list (NULL_TREE, id));
5935           c_parser_consume_token (parser);
5936           if (c_parser_next_token_is (parser, CPP_COMMA))
5937             c_parser_consume_token (parser);
5938           else
5939             break;
5940         }
5941       c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
5942       objc_declare_protocols (list);
5943     }
5944   else
5945     {
5946       tree id = c_parser_peek_token (parser)->value;
5947       tree proto = NULL_TREE;
5948       c_parser_consume_token (parser);
5949       if (c_parser_next_token_is (parser, CPP_LESS))
5950         proto = c_parser_objc_protocol_refs (parser);
5951       parser->objc_pq_context = true;
5952       objc_start_protocol (id, proto);
5953       c_parser_objc_methodprotolist (parser);
5954       c_parser_require_keyword (parser, RID_AT_END, "expected %<@end%>");
5955       parser->objc_pq_context = false;
5956       objc_finish_interface ();
5957     }
5958 }
5959
5960 /* Parse an objc-method-type.
5961
5962    objc-method-type:
5963      +
5964      -
5965 */
5966
5967 static enum tree_code
5968 c_parser_objc_method_type (c_parser *parser)
5969 {
5970   switch (c_parser_peek_token (parser)->type)
5971     {
5972     case CPP_PLUS:
5973       c_parser_consume_token (parser);
5974       return PLUS_EXPR;
5975     case CPP_MINUS:
5976       c_parser_consume_token (parser);
5977       return MINUS_EXPR;
5978     default:
5979       gcc_unreachable ();
5980     }
5981 }
5982
5983 /* Parse an objc-method-definition.
5984
5985    objc-method-definition:
5986      objc-method-type objc-method-decl ;[opt] compound-statement
5987 */
5988
5989 static void
5990 c_parser_objc_method_definition (c_parser *parser)
5991 {
5992   enum tree_code type = c_parser_objc_method_type (parser);
5993   tree decl;
5994   objc_set_method_type (type);
5995   parser->objc_pq_context = true;
5996   decl = c_parser_objc_method_decl (parser);
5997   if (c_parser_next_token_is (parser, CPP_SEMICOLON))
5998     {
5999       c_parser_consume_token (parser);
6000       if (pedantic)
6001         pedwarn ("extra semicolon in method definition specified");
6002     }
6003   if (!c_parser_next_token_is (parser, CPP_OPEN_BRACE))
6004     {
6005       c_parser_error (parser, "expected %<{%>");
6006       return;
6007     }
6008   parser->objc_pq_context = false;
6009   objc_start_method_definition (decl);
6010   add_stmt (c_parser_compound_statement (parser));
6011   objc_finish_method_definition (current_function_decl);
6012 }
6013
6014 /* Parse an objc-methodprotolist.
6015
6016    objc-methodprotolist:
6017      empty
6018      objc-methodprotolist objc-methodproto
6019      objc-methodprotolist declaration
6020      objc-methodprotolist ;
6021
6022    The declaration is a data definition, which may be missing
6023    declaration specifiers under the same rules and diagnostics as
6024    other data definitions outside functions, and the stray semicolon
6025    is diagnosed the same way as a stray semicolon outside a
6026    function.  */
6027
6028 static void
6029 c_parser_objc_methodprotolist (c_parser *parser)
6030 {
6031   while (true)
6032     {
6033       /* The list is terminated by @end.  */
6034       switch (c_parser_peek_token (parser)->type)
6035         {
6036         case CPP_SEMICOLON:
6037           if (pedantic)
6038             pedwarn ("ISO C does not allow extra %<;%> outside of a function");
6039           c_parser_consume_token (parser);
6040           break;
6041         case CPP_PLUS:
6042         case CPP_MINUS:
6043           c_parser_objc_methodproto (parser);
6044           break;
6045         case CPP_PRAGMA:
6046           c_parser_pragma (parser, pragma_external);
6047           break;
6048         case CPP_EOF:
6049           return;
6050         default:
6051           if (c_parser_next_token_is_keyword (parser, RID_AT_END))
6052             return;
6053           c_parser_declaration_or_fndef (parser, false, true, false, true);
6054           break;
6055         }
6056     }
6057 }
6058
6059 /* Parse an objc-methodproto.
6060
6061    objc-methodproto:
6062      objc-method-type objc-method-decl ;
6063 */
6064
6065 static void
6066 c_parser_objc_methodproto (c_parser *parser)
6067 {
6068   enum tree_code type = c_parser_objc_method_type (parser);
6069   tree decl;
6070   objc_set_method_type (type);
6071   /* Remember protocol qualifiers in prototypes.  */
6072   parser->objc_pq_context = true;
6073   decl = c_parser_objc_method_decl (parser);
6074   /* Forget protocol qualifiers here.  */
6075   parser->objc_pq_context = false;
6076   objc_add_method_declaration (decl);
6077   c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
6078 }
6079
6080 /* Parse an objc-method-decl.
6081
6082    objc-method-decl:
6083      ( objc-type-name ) objc-selector
6084      objc-selector
6085      ( objc-type-name ) objc-keyword-selector objc-optparmlist
6086      objc-keyword-selector objc-optparmlist
6087
6088    objc-keyword-selector:
6089      objc-keyword-decl
6090      objc-keyword-selector objc-keyword-decl
6091
6092    objc-keyword-decl:
6093      objc-selector : ( objc-type-name ) identifier
6094      objc-selector : identifier
6095      : ( objc-type-name ) identifier
6096      : identifier
6097
6098    objc-optparmlist:
6099      objc-optparms objc-optellipsis
6100
6101    objc-optparms:
6102      empty
6103      objc-opt-parms , parameter-declaration
6104
6105    objc-optellipsis:
6106      empty
6107      , ...
6108 */
6109
6110 static tree
6111 c_parser_objc_method_decl (c_parser *parser)
6112 {
6113   tree type = NULL_TREE;
6114   tree sel;
6115   tree parms = NULL_TREE;
6116   bool ellipsis = false;
6117
6118   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
6119     {
6120       c_parser_consume_token (parser);
6121       type = c_parser_objc_type_name (parser);
6122       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
6123     }
6124   sel = c_parser_objc_selector (parser);
6125   /* If there is no selector, or a colon follows, we have an
6126      objc-keyword-selector.  If there is a selector, and a colon does
6127      not follow, that selector ends the objc-method-decl.  */
6128   if (!sel || c_parser_next_token_is (parser, CPP_COLON))
6129     {
6130       tree tsel = sel;
6131       tree list = NULL_TREE;
6132       while (true)
6133         {
6134           tree atype = NULL_TREE, id, keyworddecl;
6135           if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
6136             break;
6137           if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
6138             {
6139               c_parser_consume_token (parser);
6140               atype = c_parser_objc_type_name (parser);
6141               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
6142                                          "expected %<)%>");
6143             }
6144           if (c_parser_next_token_is_not (parser, CPP_NAME))
6145             {
6146               c_parser_error (parser, "expected identifier");
6147               return error_mark_node;
6148             }
6149           id = c_parser_peek_token (parser)->value;
6150           c_parser_consume_token (parser);
6151           keyworddecl = objc_build_keyword_decl (tsel, atype, id);
6152           list = chainon (list, keyworddecl);
6153           tsel = c_parser_objc_selector (parser);
6154           if (!tsel && c_parser_next_token_is_not (parser, CPP_COLON))
6155             break;
6156         }
6157       /* Parse the optional parameter list.  Optional Objective-C
6158          method parameters follow the C syntax, and may include '...'
6159          to denote a variable number of arguments.  */
6160       parms = make_node (TREE_LIST);
6161       while (c_parser_next_token_is (parser, CPP_COMMA))
6162         {
6163           struct c_parm *parm;
6164           c_parser_consume_token (parser);
6165           if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
6166             {
6167               ellipsis = true;
6168               c_parser_consume_token (parser);
6169               break;
6170             }
6171           parm = c_parser_parameter_declaration (parser, NULL_TREE);
6172           if (parm == NULL)
6173             break;
6174           parms = chainon (parms,
6175                            build_tree_list (NULL_TREE, grokparm (parm)));
6176         }
6177       sel = list;
6178     }
6179   return objc_build_method_signature (type, sel, parms, ellipsis);
6180 }
6181
6182 /* Parse an objc-type-name.
6183
6184    objc-type-name:
6185      objc-type-qualifiers[opt] type-name
6186      objc-type-qualifiers[opt]
6187
6188    objc-type-qualifiers:
6189      objc-type-qualifier
6190      objc-type-qualifiers objc-type-qualifier
6191
6192    objc-type-qualifier: one of
6193      in out inout bycopy byref oneway
6194 */
6195
6196 static tree
6197 c_parser_objc_type_name (c_parser *parser)
6198 {
6199   tree quals = NULL_TREE;
6200   struct c_type_name *typename = NULL;
6201   tree type = NULL_TREE;
6202   while (true)
6203     {
6204       c_token *token = c_parser_peek_token (parser);
6205       if (token->type == CPP_KEYWORD
6206           && (token->keyword == RID_IN
6207               || token->keyword == RID_OUT
6208               || token->keyword == RID_INOUT
6209               || token->keyword == RID_BYCOPY
6210               || token->keyword == RID_BYREF
6211               || token->keyword == RID_ONEWAY))
6212         {
6213           quals = chainon (quals, build_tree_list (NULL_TREE, token->value));
6214           c_parser_consume_token (parser);
6215         }
6216       else
6217         break;
6218     }
6219   if (c_parser_next_token_starts_typename (parser))
6220     typename = c_parser_type_name (parser);
6221   if (typename)
6222     type = groktypename (typename);
6223   return build_tree_list (quals, type);
6224 }
6225
6226 /* Parse objc-protocol-refs.
6227
6228    objc-protocol-refs:
6229      < identifier-list >
6230 */
6231
6232 static tree
6233 c_parser_objc_protocol_refs (c_parser *parser)
6234 {
6235   tree list = NULL_TREE;
6236   gcc_assert (c_parser_next_token_is (parser, CPP_LESS));
6237   c_parser_consume_token (parser);
6238   /* Any identifiers, including those declared as type names, are OK
6239      here.  */
6240   while (true)
6241     {
6242       tree id;
6243       if (c_parser_next_token_is_not (parser, CPP_NAME))
6244         {
6245           c_parser_error (parser, "expected identifier");
6246           break;
6247         }
6248       id = c_parser_peek_token (parser)->value;
6249       list = chainon (list, build_tree_list (NULL_TREE, id));
6250       c_parser_consume_token (parser);
6251       if (c_parser_next_token_is (parser, CPP_COMMA))
6252         c_parser_consume_token (parser);
6253       else
6254         break;
6255     }
6256   c_parser_require (parser, CPP_GREATER, "expected %<>%>");
6257   return list;
6258 }
6259
6260 /* Parse an objc-try-catch-statement.
6261
6262    objc-try-catch-statement:
6263      @try compound-statement objc-catch-list[opt]
6264      @try compound-statement objc-catch-list[opt] @finally compound-statement
6265
6266    objc-catch-list:
6267      @catch ( parameter-declaration ) compound-statement
6268      objc-catch-list @catch ( parameter-declaration ) compound-statement
6269 */
6270
6271 static void
6272 c_parser_objc_try_catch_statement (c_parser *parser)
6273 {
6274   location_t loc;
6275   tree stmt;
6276   gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_TRY));
6277   c_parser_consume_token (parser);
6278   loc = c_parser_peek_token (parser)->location;
6279   stmt = c_parser_compound_statement (parser);
6280   objc_begin_try_stmt (loc, stmt);
6281   while (c_parser_next_token_is_keyword (parser, RID_AT_CATCH))
6282     {
6283       struct c_parm *parm;
6284       c_parser_consume_token (parser);
6285       if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
6286         break;
6287       parm = c_parser_parameter_declaration (parser, NULL_TREE);
6288       if (parm == NULL)
6289         {
6290           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
6291           break;
6292         }
6293       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
6294       objc_begin_catch_clause (grokparm (parm));
6295       if (c_parser_require (parser, CPP_OPEN_BRACE, "expected %<{%>"))
6296         c_parser_compound_statement_nostart (parser);
6297       objc_finish_catch_clause ();
6298     }
6299   if (c_parser_next_token_is_keyword (parser, RID_AT_FINALLY))
6300     {
6301       location_t finloc;
6302       tree finstmt;
6303       c_parser_consume_token (parser);
6304       finloc = c_parser_peek_token (parser)->location;
6305       finstmt = c_parser_compound_statement (parser);
6306       objc_build_finally_clause (finloc, finstmt);
6307     }
6308   objc_finish_try_stmt ();
6309 }
6310
6311 /* Parse an objc-synchronized-statement.
6312
6313    objc-synchronized-statement:
6314      @synchronized ( expression ) compound-statement
6315 */
6316
6317 static void
6318 c_parser_objc_synchronized_statement (c_parser *parser)
6319 {
6320   location_t loc;
6321   tree expr, stmt;
6322   gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_SYNCHRONIZED));
6323   c_parser_consume_token (parser);
6324   loc = c_parser_peek_token (parser)->location;
6325   if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
6326     {
6327       expr = c_parser_expression (parser).value;
6328       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
6329     }
6330   else
6331     expr = error_mark_node;
6332   stmt = c_parser_compound_statement (parser);
6333   objc_build_synchronized (loc, expr, stmt);
6334 }
6335
6336 /* Parse an objc-selector; return NULL_TREE without an error if the
6337    next token is not an objc-selector.
6338
6339    objc-selector:
6340      identifier
6341      one of
6342        enum struct union if else while do for switch case default
6343        break continue return goto asm sizeof typeof __alignof
6344        unsigned long const short volatile signed restrict _Complex
6345        in out inout bycopy byref oneway int char float double void _Bool
6346
6347    ??? Why this selection of keywords but not, for example, storage
6348    class specifiers?  */
6349
6350 static tree
6351 c_parser_objc_selector (c_parser *parser)
6352 {
6353   c_token *token = c_parser_peek_token (parser);
6354   tree value = token->value;
6355   if (token->type == CPP_NAME)
6356     {
6357       c_parser_consume_token (parser);
6358       return value;
6359     }
6360   if (token->type != CPP_KEYWORD)
6361     return NULL_TREE;
6362   switch (token->keyword)
6363     {
6364     case RID_ENUM:
6365     case RID_STRUCT:
6366     case RID_UNION:
6367     case RID_IF:
6368     case RID_ELSE:
6369     case RID_WHILE:
6370     case RID_DO:
6371     case RID_FOR:
6372     case RID_SWITCH:
6373     case RID_CASE:
6374     case RID_DEFAULT:
6375     case RID_BREAK:
6376     case RID_CONTINUE:
6377     case RID_RETURN:
6378     case RID_GOTO:
6379     case RID_ASM:
6380     case RID_SIZEOF:
6381     case RID_TYPEOF:
6382     case RID_ALIGNOF:
6383     case RID_UNSIGNED:
6384     case RID_LONG:
6385     case RID_CONST:
6386     case RID_SHORT:
6387     case RID_VOLATILE:
6388     case RID_SIGNED:
6389     case RID_RESTRICT:
6390     case RID_COMPLEX:
6391     case RID_IN:
6392     case RID_OUT:
6393     case RID_INOUT:
6394     case RID_BYCOPY:
6395     case RID_BYREF:
6396     case RID_ONEWAY:
6397     case RID_INT:
6398     case RID_CHAR:
6399     case RID_FLOAT:
6400     case RID_DOUBLE:
6401     case RID_VOID:
6402     case RID_BOOL:
6403       c_parser_consume_token (parser);
6404       return value;
6405     default:
6406       return NULL_TREE;
6407     }
6408 }
6409
6410 /* Parse an objc-selector-arg.
6411
6412    objc-selector-arg:
6413      objc-selector
6414      objc-keywordname-list
6415
6416    objc-keywordname-list:
6417      objc-keywordname
6418      objc-keywordname-list objc-keywordname
6419
6420    objc-keywordname:
6421      objc-selector :
6422      :
6423 */
6424
6425 static tree
6426 c_parser_objc_selector_arg (c_parser *parser)
6427 {
6428   tree sel = c_parser_objc_selector (parser);
6429   tree list = NULL_TREE;
6430   if (sel && c_parser_next_token_is_not (parser, CPP_COLON))
6431     return sel;
6432   while (true)
6433     {
6434       if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
6435         return list;
6436       list = chainon (list, build_tree_list (sel, NULL_TREE));
6437       sel = c_parser_objc_selector (parser);
6438       if (!sel && c_parser_next_token_is_not (parser, CPP_COLON))
6439         break;
6440     }
6441   return list;
6442 }
6443
6444 /* Parse an objc-receiver.
6445
6446    objc-receiver:
6447      expression
6448      class-name
6449      type-name
6450 */
6451
6452 static tree
6453 c_parser_objc_receiver (c_parser *parser)
6454 {
6455   if (c_parser_peek_token (parser)->type == CPP_NAME
6456       && (c_parser_peek_token (parser)->id_kind == C_ID_TYPENAME
6457           || c_parser_peek_token (parser)->id_kind == C_ID_CLASSNAME))
6458     {
6459       tree id = c_parser_peek_token (parser)->value;
6460       c_parser_consume_token (parser);
6461       return objc_get_class_reference (id);
6462     }
6463   return c_parser_expression (parser).value;
6464 }
6465
6466 /* Parse objc-message-args.
6467
6468    objc-message-args:
6469      objc-selector
6470      objc-keywordarg-list
6471
6472    objc-keywordarg-list:
6473      objc-keywordarg
6474      objc-keywordarg-list objc-keywordarg
6475
6476    objc-keywordarg:
6477      objc-selector : objc-keywordexpr
6478      : objc-keywordexpr
6479 */
6480
6481 static tree
6482 c_parser_objc_message_args (c_parser *parser)
6483 {
6484   tree sel = c_parser_objc_selector (parser);
6485   tree list = NULL_TREE;
6486   if (sel && c_parser_next_token_is_not (parser, CPP_COLON))
6487     return sel;
6488   while (true)
6489     {
6490       tree keywordexpr;
6491       if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
6492         return list;
6493       keywordexpr = c_parser_objc_keywordexpr (parser);
6494       list = chainon (list, build_tree_list (sel, keywordexpr));
6495       sel = c_parser_objc_selector (parser);
6496       if (!sel && c_parser_next_token_is_not (parser, CPP_COLON))
6497         break;
6498     }
6499   return list;
6500 }
6501
6502 /* Parse an objc-keywordexpr.
6503
6504    objc-keywordexpr:
6505      nonempty-expr-list
6506 */
6507
6508 static tree
6509 c_parser_objc_keywordexpr (c_parser *parser)
6510 {
6511   tree list = c_parser_expr_list (parser, true);
6512   if (TREE_CHAIN (list) == NULL_TREE)
6513     {
6514       /* Just return the expression, remove a level of
6515          indirection.  */
6516       return TREE_VALUE (list);
6517     }
6518   else
6519     {
6520       /* We have a comma expression, we will collapse later.  */
6521       return list;
6522     }
6523 }
6524
6525 \f
6526 /* Handle pragmas.  Some OpenMP pragmas are associated with, and therefore
6527    should be considered, statements.  ALLOW_STMT is true if we're within
6528    the context of a function and such pragmas are to be allowed.  Returns
6529    true if we actually parsed such a pragma.  */
6530
6531 static bool
6532 c_parser_pragma (c_parser *parser, enum pragma_context context)
6533 {
6534   unsigned int id;
6535
6536   id = c_parser_peek_token (parser)->pragma_kind;
6537   gcc_assert (id != PRAGMA_NONE);
6538
6539   switch (id)
6540     {
6541     case PRAGMA_OMP_BARRIER:
6542       if (context != pragma_compound)
6543         {
6544           if (context == pragma_stmt)
6545             c_parser_error (parser, "%<#pragma omp barrier%> may only be "
6546                             "used in compound statements");
6547           goto bad_stmt;
6548         }
6549       c_parser_omp_barrier (parser);
6550       return false;
6551
6552     case PRAGMA_OMP_FLUSH:
6553       if (context != pragma_compound)
6554         {
6555           if (context == pragma_stmt)
6556             c_parser_error (parser, "%<#pragma omp flush%> may only be "
6557                             "used in compound statements");
6558           goto bad_stmt;
6559         }
6560       c_parser_omp_flush (parser);
6561       return false;
6562
6563     case PRAGMA_OMP_THREADPRIVATE:
6564       c_parser_omp_threadprivate (parser);
6565       return false;
6566
6567     case PRAGMA_OMP_SECTION:
6568       error ("%<#pragma omp section%> may only be used in "
6569              "%<#pragma omp sections%> construct");
6570       c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL);
6571       return false;
6572
6573     case PRAGMA_GCC_PCH_PREPROCESS:
6574       c_parser_error (parser, "%<#pragma GCC pch_preprocess%> must be first");
6575       c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL);
6576       return false;
6577
6578     default:
6579       if (id < PRAGMA_FIRST_EXTERNAL)
6580         {
6581           if (context == pragma_external)
6582             {
6583             bad_stmt:
6584               c_parser_error (parser, "expected declaration specifiers");
6585               c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL);
6586               return false;
6587             }
6588           c_parser_omp_construct (parser);
6589           return true;
6590         }
6591       break;
6592     }
6593
6594   c_parser_consume_pragma (parser);
6595   c_invoke_pragma_handler (id);
6596
6597   /* Skip to EOL, but suppress any error message.  Those will have been 
6598      generated by the handler routine through calling error, as opposed
6599      to calling c_parser_error.  */
6600   parser->error = true;
6601   c_parser_skip_to_pragma_eol (parser);
6602
6603   return false;
6604 }
6605
6606 /* The interface the pragma parsers have to the lexer.  */
6607
6608 enum cpp_ttype
6609 pragma_lex (tree *value)
6610 {
6611   c_token *tok = c_parser_peek_token (the_parser);
6612   enum cpp_ttype ret = tok->type;
6613
6614   *value = tok->value;
6615   if (ret == CPP_PRAGMA_EOL || ret == CPP_EOF)
6616     ret = CPP_EOF;
6617   else
6618     {
6619       if (ret == CPP_KEYWORD)
6620         ret = CPP_NAME;
6621       c_parser_consume_token (the_parser);
6622     }
6623
6624   return ret;
6625 }
6626
6627 static void
6628 c_parser_pragma_pch_preprocess (c_parser *parser)
6629 {
6630   tree name = NULL;
6631
6632   c_parser_consume_pragma (parser);
6633   if (c_parser_next_token_is (parser, CPP_STRING))
6634     {
6635       name = c_parser_peek_token (parser)->value;
6636       c_parser_consume_token (parser);
6637     }
6638   else
6639     c_parser_error (parser, "expected string literal");
6640   c_parser_skip_to_pragma_eol (parser);
6641
6642   if (name)
6643     c_common_pch_pragma (parse_in, TREE_STRING_POINTER (name));
6644 }
6645 \f
6646 /* OpenMP 2.5 parsing routines.  */
6647
6648 /* Returns name of the next clause.
6649    If the clause is not recognized PRAGMA_OMP_CLAUSE_NONE is returned and
6650    the token is not consumed.  Otherwise appropriate pragma_omp_clause is
6651    returned and the token is consumed.  */
6652
6653 static pragma_omp_clause
6654 c_parser_omp_clause_name (c_parser *parser)
6655 {
6656   pragma_omp_clause result = PRAGMA_OMP_CLAUSE_NONE;
6657
6658   if (c_parser_next_token_is_keyword (parser, RID_IF))
6659     result = PRAGMA_OMP_CLAUSE_IF;
6660   else if (c_parser_next_token_is_keyword (parser, RID_DEFAULT))
6661     result = PRAGMA_OMP_CLAUSE_DEFAULT;
6662   else if (c_parser_next_token_is (parser, CPP_NAME))
6663     {
6664       const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
6665
6666       switch (p[0])
6667         {
6668         case 'c':
6669           if (!strcmp ("copyin", p))
6670             result = PRAGMA_OMP_CLAUSE_COPYIN;
6671           else if (!strcmp ("copyprivate", p))
6672             result = PRAGMA_OMP_CLAUSE_COPYPRIVATE;
6673           break;
6674         case 'f':
6675           if (!strcmp ("firstprivate", p))
6676             result = PRAGMA_OMP_CLAUSE_FIRSTPRIVATE;
6677           break;
6678         case 'l':
6679           if (!strcmp ("lastprivate", p))
6680             result = PRAGMA_OMP_CLAUSE_LASTPRIVATE;
6681           break;
6682         case 'n':
6683           if (!strcmp ("nowait", p))
6684             result = PRAGMA_OMP_CLAUSE_NOWAIT;
6685           else if (!strcmp ("num_threads", p))
6686             result = PRAGMA_OMP_CLAUSE_NUM_THREADS;
6687           break;
6688         case 'o':
6689           if (!strcmp ("ordered", p))
6690             result = PRAGMA_OMP_CLAUSE_ORDERED;
6691           break;
6692         case 'p':
6693           if (!strcmp ("private", p))
6694             result = PRAGMA_OMP_CLAUSE_PRIVATE;
6695           break;
6696         case 'r':
6697           if (!strcmp ("reduction", p))
6698             result = PRAGMA_OMP_CLAUSE_REDUCTION;
6699           break;
6700         case 's':
6701           if (!strcmp ("schedule", p))
6702             result = PRAGMA_OMP_CLAUSE_SCHEDULE;
6703           else if (!strcmp ("shared", p))
6704             result = PRAGMA_OMP_CLAUSE_SHARED;
6705           break;
6706         }
6707     }
6708
6709   if (result != PRAGMA_OMP_CLAUSE_NONE)
6710     c_parser_consume_token (parser);
6711
6712   return result;
6713 }
6714
6715 /* Validate that a clause of the given type does not already exist.  */
6716
6717 static void
6718 check_no_duplicate_clause (tree clauses, enum tree_code code, const char *name)
6719 {
6720   tree c;
6721
6722   for (c = clauses; c ; c = OMP_CLAUSE_CHAIN (c))
6723     if (OMP_CLAUSE_CODE (c) == code)
6724       {
6725         error ("too many %qs clauses", name);
6726         break;
6727       }
6728 }
6729
6730 /* OpenMP 2.5:
6731    variable-list:
6732      identifier
6733      variable-list , identifier
6734
6735    If KIND is nonzero, create the appropriate node and install the decl
6736    in OMP_CLAUSE_DECL and add the node to the head of the list.
6737
6738    If KIND is zero, create a TREE_LIST with the decl in TREE_PURPOSE;
6739    return the list created.  */
6740
6741 static tree
6742 c_parser_omp_variable_list (c_parser *parser, enum omp_clause_code kind,
6743                             tree list)
6744 {
6745   if (c_parser_next_token_is_not (parser, CPP_NAME)
6746       || c_parser_peek_token (parser)->id_kind != C_ID_ID)
6747     c_parser_error (parser, "expected identifier");
6748
6749   while (c_parser_next_token_is (parser, CPP_NAME)
6750          && c_parser_peek_token (parser)->id_kind == C_ID_ID)
6751     {
6752       tree t = lookup_name (c_parser_peek_token (parser)->value);
6753
6754       if (t == NULL_TREE)
6755         undeclared_variable (c_parser_peek_token (parser)->value,
6756                              c_parser_peek_token (parser)->location);
6757       else if (t == error_mark_node)
6758         ;
6759       else if (kind != 0)
6760         {
6761           tree u = build_omp_clause (kind);
6762           OMP_CLAUSE_DECL (u) = t;
6763           OMP_CLAUSE_CHAIN (u) = list;
6764           list = u;
6765         }
6766       else
6767         list = tree_cons (t, NULL_TREE, list);
6768
6769       c_parser_consume_token (parser);
6770
6771       if (c_parser_next_token_is_not (parser, CPP_COMMA))
6772         break;
6773
6774       c_parser_consume_token (parser);
6775     }
6776
6777   return list;
6778 }
6779
6780 /* Similarly, but expect leading and trailing parenthesis.  This is a very
6781    common case for omp clauses.  */
6782
6783 static tree
6784 c_parser_omp_var_list_parens (c_parser *parser, enum tree_code kind, tree list)
6785 {
6786   if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
6787     {
6788       list = c_parser_omp_variable_list (parser, kind, list);
6789       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
6790     }
6791   return list;
6792 }
6793
6794 /* OpenMP 2.5:
6795    copyin ( variable-list ) */
6796
6797 static tree
6798 c_parser_omp_clause_copyin (c_parser *parser, tree list)
6799 {
6800   return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_COPYIN, list);
6801 }
6802
6803 /* OpenMP 2.5:
6804    copyprivate ( variable-list ) */
6805
6806 static tree
6807 c_parser_omp_clause_copyprivate (c_parser *parser, tree list)
6808 {
6809   return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_COPYPRIVATE, list);
6810 }
6811
6812 /* OpenMP 2.5:
6813    default ( shared | none ) */
6814
6815 static tree
6816 c_parser_omp_clause_default (c_parser *parser, tree list)
6817 {
6818   enum omp_clause_default_kind kind = OMP_CLAUSE_DEFAULT_UNSPECIFIED;
6819   tree c;
6820
6821   if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
6822     return list;
6823   if (c_parser_next_token_is (parser, CPP_NAME))
6824     {
6825       const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
6826
6827       switch (p[0])
6828         {
6829         case 'n':
6830           if (strcmp ("none", p) != 0)
6831             goto invalid_kind;
6832           kind = OMP_CLAUSE_DEFAULT_NONE;
6833           break;
6834
6835         case 's':
6836           if (strcmp ("shared", p) != 0)
6837             goto invalid_kind;
6838           kind = OMP_CLAUSE_DEFAULT_SHARED;
6839           break;
6840
6841         default:
6842           goto invalid_kind;
6843         }
6844
6845       c_parser_consume_token (parser);
6846     }
6847   else
6848     {
6849     invalid_kind:
6850       c_parser_error (parser, "expected %<none%> or %<shared%>");
6851     }
6852   c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
6853
6854   if (kind == OMP_CLAUSE_DEFAULT_UNSPECIFIED)
6855     return list;
6856
6857   check_no_duplicate_clause (list, OMP_CLAUSE_DEFAULT, "default");
6858   c = build_omp_clause (OMP_CLAUSE_DEFAULT);
6859   OMP_CLAUSE_CHAIN (c) = list;
6860   OMP_CLAUSE_DEFAULT_KIND (c) = kind;
6861
6862   return c;
6863 }
6864
6865 /* OpenMP 2.5:
6866    firstprivate ( variable-list ) */
6867
6868 static tree
6869 c_parser_omp_clause_firstprivate (c_parser *parser, tree list)
6870 {
6871   return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_FIRSTPRIVATE, list);
6872 }
6873
6874 /* OpenMP 2.5:
6875    if ( expression ) */
6876
6877 static tree
6878 c_parser_omp_clause_if (c_parser *parser, tree list)
6879 {
6880   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
6881     {
6882       tree t = c_parser_paren_condition (parser);
6883       tree c;
6884
6885       check_no_duplicate_clause (list, OMP_CLAUSE_IF, "if");
6886
6887       c = build_omp_clause (OMP_CLAUSE_IF);
6888       OMP_CLAUSE_IF_EXPR (c) = t;
6889       OMP_CLAUSE_CHAIN (c) = list;
6890       list = c;
6891     }
6892   else
6893     c_parser_error (parser, "expected %<(%>");
6894
6895   return list;
6896 }
6897
6898 /* OpenMP 2.5:
6899    lastprivate ( variable-list ) */
6900
6901 static tree
6902 c_parser_omp_clause_lastprivate (c_parser *parser, tree list)
6903 {
6904   return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_LASTPRIVATE, list);
6905 }
6906
6907 /* OpenMP 2.5:
6908    nowait */
6909
6910 static tree
6911 c_parser_omp_clause_nowait (c_parser *parser ATTRIBUTE_UNUSED, tree list)
6912 {
6913   tree c;
6914
6915   check_no_duplicate_clause (list, OMP_CLAUSE_NOWAIT, "nowait");
6916
6917   c = build_omp_clause (OMP_CLAUSE_NOWAIT);
6918   OMP_CLAUSE_CHAIN (c) = list;
6919   return c;
6920 }
6921
6922 /* OpenMP 2.5:
6923    num_threads ( expression ) */
6924
6925 static tree
6926 c_parser_omp_clause_num_threads (c_parser *parser, tree list)
6927 {
6928   if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
6929     {
6930       tree c, t = c_parser_expression (parser).value;
6931
6932       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
6933
6934       if (!INTEGRAL_TYPE_P (TREE_TYPE (t)))
6935         {
6936           c_parser_error (parser, "expected integer expression");
6937           return list;
6938         }
6939
6940       /* Attempt to statically determine when the number isn't positive.  */
6941       c = fold_build2 (LE_EXPR, boolean_type_node, t,
6942                        build_int_cst (TREE_TYPE (t), 0));
6943       if (c == boolean_true_node)
6944         {
6945           warning (0, "%<num_threads%> value must be positive");
6946           t = integer_one_node;
6947         }
6948
6949       check_no_duplicate_clause (list, OMP_CLAUSE_NUM_THREADS, "num_threads");
6950
6951       c = build_omp_clause (OMP_CLAUSE_NUM_THREADS);
6952       OMP_CLAUSE_NUM_THREADS_EXPR (c) = t;
6953       OMP_CLAUSE_CHAIN (c) = list;
6954       list = c;
6955     }
6956
6957   return list;
6958 }
6959
6960 /* OpenMP 2.5:
6961    ordered */
6962
6963 static tree
6964 c_parser_omp_clause_ordered (c_parser *parser ATTRIBUTE_UNUSED, tree list)
6965 {
6966   tree c;
6967
6968   check_no_duplicate_clause (list, OMP_CLAUSE_ORDERED, "ordered");
6969
6970   c = build_omp_clause (OMP_CLAUSE_ORDERED);
6971   OMP_CLAUSE_CHAIN (c) = list;
6972   return c;
6973 }
6974
6975 /* OpenMP 2.5:
6976    private ( variable-list ) */
6977
6978 static tree
6979 c_parser_omp_clause_private (c_parser *parser, tree list)
6980 {
6981   return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_PRIVATE, list);
6982 }
6983
6984 /* OpenMP 2.5:
6985    reduction ( reduction-operator : variable-list )
6986
6987    reduction-operator:
6988      One of: + * - & ^ | && || */
6989
6990 static tree
6991 c_parser_omp_clause_reduction (c_parser *parser, tree list)
6992 {
6993   if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
6994     {
6995       enum tree_code code;
6996
6997       switch (c_parser_peek_token (parser)->type)
6998         {
6999         case CPP_PLUS:
7000           code = PLUS_EXPR;
7001           break;
7002         case CPP_MULT:
7003           code = MULT_EXPR;
7004           break;
7005         case CPP_MINUS:
7006           code = MINUS_EXPR;
7007           break;
7008         case CPP_AND:
7009           code = BIT_AND_EXPR;
7010           break;
7011         case CPP_XOR:
7012           code = BIT_XOR_EXPR;
7013           break;
7014         case CPP_OR:
7015           code = BIT_IOR_EXPR;
7016           break;
7017         case CPP_AND_AND:
7018           code = TRUTH_ANDIF_EXPR;
7019           break;
7020         case CPP_OR_OR:
7021           code = TRUTH_ORIF_EXPR;
7022           break;
7023         default:
7024           c_parser_error (parser,
7025                           "expected %<+%>, %<*%>, %<-%>, %<&%>, "
7026                           "%<^%>, %<|%>, %<&&%>, or %<||%>");
7027           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 0);
7028           return list;
7029         }
7030       c_parser_consume_token (parser);
7031       if (c_parser_require (parser, CPP_COLON, "expected %<:%>"))
7032         {
7033           tree nl, c;
7034
7035           nl = c_parser_omp_variable_list (parser, OMP_CLAUSE_REDUCTION, list);
7036           for (c = nl; c != list; c = OMP_CLAUSE_CHAIN (c))
7037             OMP_CLAUSE_REDUCTION_CODE (c) = code;
7038
7039           list = nl;
7040         }
7041       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
7042     }
7043   return list;
7044 }
7045
7046 /* OpenMP 2.5:
7047    schedule ( schedule-kind )
7048    schedule ( schedule-kind , expression )
7049
7050    schedule-kind:
7051      static | dynamic | guided | runtime
7052 */
7053
7054 static tree
7055 c_parser_omp_clause_schedule (c_parser *parser, tree list)
7056 {
7057   tree c, t;
7058
7059   if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
7060     return list;
7061
7062   c = build_omp_clause (OMP_CLAUSE_SCHEDULE);
7063
7064   if (c_parser_next_token_is (parser, CPP_NAME))
7065     {
7066       tree kind = c_parser_peek_token (parser)->value;
7067       const char *p = IDENTIFIER_POINTER (kind);
7068
7069       switch (p[0])
7070         {
7071         case 'd':
7072           if (strcmp ("dynamic", p) != 0)
7073             goto invalid_kind;
7074           OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_DYNAMIC;
7075           break;
7076
7077         case 'g':
7078           if (strcmp ("guided", p) != 0)
7079             goto invalid_kind;
7080           OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_GUIDED;
7081           break;
7082
7083         case 'r':
7084           if (strcmp ("runtime", p) != 0)
7085             goto invalid_kind;
7086           OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_RUNTIME;
7087           break;
7088
7089         default:
7090           goto invalid_kind;
7091         }
7092     }
7093   else if (c_parser_next_token_is_keyword (parser, RID_STATIC))
7094     OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_STATIC;
7095   else
7096     goto invalid_kind;
7097
7098   c_parser_consume_token (parser);
7099   if (c_parser_next_token_is (parser, CPP_COMMA))
7100     {
7101       c_parser_consume_token (parser);
7102
7103       t = c_parser_expr_no_commas (parser, NULL).value;
7104
7105       if (OMP_CLAUSE_SCHEDULE_KIND (c) == OMP_CLAUSE_SCHEDULE_RUNTIME)
7106         error ("schedule %<runtime%> does not take "
7107                "a %<chunk_size%> parameter");
7108       else if (TREE_CODE (TREE_TYPE (t)) == INTEGER_TYPE)
7109         OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (c) = t;
7110       else
7111         c_parser_error (parser, "expected integer expression");
7112
7113       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
7114     }
7115   else
7116     c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
7117                                "expected %<,%> or %<)%>");
7118
7119   check_no_duplicate_clause (list, OMP_CLAUSE_SCHEDULE, "schedule");
7120   OMP_CLAUSE_CHAIN (c) = list;
7121   return c;
7122
7123  invalid_kind:
7124   c_parser_error (parser, "invalid schedule kind");
7125   c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 0);
7126   return list;
7127 }
7128
7129 /* OpenMP 2.5:
7130    shared ( variable-list ) */
7131
7132 static tree
7133 c_parser_omp_clause_shared (c_parser *parser, tree list)
7134 {
7135   return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_SHARED, list);
7136 }
7137
7138 /* Parse all OpenMP clauses.  The set clauses allowed by the directive
7139    is a bitmask in MASK.  Return the list of clauses found; the result
7140    of clause default goes in *pdefault.  */
7141
7142 static tree
7143 c_parser_omp_all_clauses (c_parser *parser, unsigned int mask,
7144                           const char *where)
7145 {
7146   tree clauses = NULL;
7147
7148   while (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL))
7149     {
7150       const pragma_omp_clause c_kind = c_parser_omp_clause_name (parser);
7151       const char *c_name;
7152       tree prev = clauses;
7153
7154       switch (c_kind)
7155         {
7156         case PRAGMA_OMP_CLAUSE_COPYIN:
7157           clauses = c_parser_omp_clause_copyin (parser, clauses);
7158           c_name = "copyin";
7159           break;
7160         case PRAGMA_OMP_CLAUSE_COPYPRIVATE:
7161           clauses = c_parser_omp_clause_copyprivate (parser, clauses);
7162           c_name = "copyprivate";
7163           break;
7164         case PRAGMA_OMP_CLAUSE_DEFAULT:
7165           clauses = c_parser_omp_clause_default (parser, clauses);
7166           c_name = "default";
7167           break;
7168         case PRAGMA_OMP_CLAUSE_FIRSTPRIVATE:
7169           clauses = c_parser_omp_clause_firstprivate (parser, clauses);
7170           c_name = "firstprivate";
7171           break;
7172         case PRAGMA_OMP_CLAUSE_IF:
7173           clauses = c_parser_omp_clause_if (parser, clauses);
7174           c_name = "if";
7175           break;
7176         case PRAGMA_OMP_CLAUSE_LASTPRIVATE:
7177           clauses = c_parser_omp_clause_lastprivate (parser, clauses);
7178           c_name = "lastprivate";
7179           break;
7180         case PRAGMA_OMP_CLAUSE_NOWAIT:
7181           clauses = c_parser_omp_clause_nowait (parser, clauses);
7182           c_name = "nowait";
7183           break;
7184         case PRAGMA_OMP_CLAUSE_NUM_THREADS:
7185           clauses = c_parser_omp_clause_num_threads (parser, clauses);
7186           c_name = "num_threads";
7187           break;
7188         case PRAGMA_OMP_CLAUSE_ORDERED:
7189           clauses = c_parser_omp_clause_ordered (parser, clauses);
7190           c_name = "ordered";
7191           break;
7192         case PRAGMA_OMP_CLAUSE_PRIVATE:
7193           clauses = c_parser_omp_clause_private (parser, clauses);
7194           c_name = "private";
7195           break;
7196         case PRAGMA_OMP_CLAUSE_REDUCTION:
7197           clauses = c_parser_omp_clause_reduction (parser, clauses);
7198           c_name = "reduction";
7199           break;
7200         case PRAGMA_OMP_CLAUSE_SCHEDULE:
7201           clauses = c_parser_omp_clause_schedule (parser, clauses);
7202           c_name = "schedule";
7203           break;
7204         case PRAGMA_OMP_CLAUSE_SHARED:
7205           clauses = c_parser_omp_clause_shared (parser, clauses);
7206           c_name = "shared";
7207           break;
7208         default:
7209           c_parser_error (parser, "expected %<#pragma omp%> clause");
7210           goto saw_error;
7211         }
7212
7213       if (((mask >> c_kind) & 1) == 0 && !parser->error)
7214         {
7215           /* Remove the invalid clause(s) from the list to avoid
7216              confusing the rest of the compiler.  */
7217           clauses = prev;
7218           error ("%qs is not valid for %qs", c_name, where);
7219         }
7220     }
7221
7222  saw_error:
7223   c_parser_skip_to_pragma_eol (parser);
7224
7225   return c_finish_omp_clauses (clauses);
7226 }
7227
7228 /* OpenMP 2.5:
7229    structured-block:
7230      statement
7231
7232    In practice, we're also interested in adding the statement to an
7233    outer node.  So it is convenient if we work around the fact that
7234    c_parser_statement calls add_stmt.  */
7235
7236 static tree
7237 c_parser_omp_structured_block (c_parser *parser)
7238 {
7239   tree stmt = push_stmt_list ();
7240   c_parser_statement (parser);
7241   return pop_stmt_list (stmt);
7242 }
7243
7244 /* OpenMP 2.5:
7245    # pragma omp atomic new-line
7246      expression-stmt
7247
7248    expression-stmt:
7249      x binop= expr | x++ | ++x | x-- | --x
7250    binop:
7251      +, *, -, /, &, ^, |, <<, >>
7252
7253   where x is an lvalue expression with scalar type.  */
7254
7255 static void
7256 c_parser_omp_atomic (c_parser *parser)
7257 {
7258   tree lhs, rhs;
7259   tree stmt;
7260   enum tree_code code;
7261
7262   c_parser_skip_to_pragma_eol (parser);
7263
7264   lhs = c_parser_unary_expression (parser).value;
7265   switch (TREE_CODE (lhs))
7266     {
7267     case ERROR_MARK:
7268     saw_error:
7269       c_parser_skip_to_end_of_block_or_statement (parser);
7270       return;
7271
7272     case PREINCREMENT_EXPR:
7273     case POSTINCREMENT_EXPR:
7274       lhs = TREE_OPERAND (lhs, 0);
7275       code = PLUS_EXPR;
7276       rhs = integer_one_node;
7277       break;
7278
7279     case PREDECREMENT_EXPR:
7280     case POSTDECREMENT_EXPR:
7281       lhs = TREE_OPERAND (lhs, 0);
7282       code = MINUS_EXPR;
7283       rhs = integer_one_node;
7284       break;
7285
7286     default:
7287       switch (c_parser_peek_token (parser)->type)
7288         {
7289         case CPP_MULT_EQ:
7290           code = MULT_EXPR;
7291           break;
7292         case CPP_DIV_EQ:
7293           code = TRUNC_DIV_EXPR;
7294           break;
7295         case CPP_PLUS_EQ:
7296           code = PLUS_EXPR;
7297           break;
7298         case CPP_MINUS_EQ:
7299           code = MINUS_EXPR;
7300           break;
7301         case CPP_LSHIFT_EQ:
7302           code = LSHIFT_EXPR;
7303           break;
7304         case CPP_RSHIFT_EQ:
7305           code = RSHIFT_EXPR;
7306           break;
7307         case CPP_AND_EQ:
7308           code = BIT_AND_EXPR;
7309           break;
7310         case CPP_OR_EQ:
7311           code = BIT_IOR_EXPR;
7312           break;
7313         case CPP_XOR_EQ:
7314           code = BIT_XOR_EXPR;
7315           break;
7316         default:
7317           c_parser_error (parser,
7318                           "invalid operator for %<#pragma omp atomic%>");
7319           goto saw_error;
7320         }
7321
7322       c_parser_consume_token (parser);
7323       rhs = c_parser_expression (parser).value;
7324       break;
7325     }
7326   stmt = c_finish_omp_atomic (code, lhs, rhs);
7327   if (stmt != error_mark_node)
7328     add_stmt (stmt);
7329   c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
7330 }
7331
7332
7333 /* OpenMP 2.5:
7334    # pragma omp barrier new-line
7335 */
7336
7337 static void
7338 c_parser_omp_barrier (c_parser *parser)
7339 {
7340   c_parser_consume_pragma (parser);
7341   c_parser_skip_to_pragma_eol (parser);
7342
7343   c_finish_omp_barrier ();
7344 }
7345
7346 /* OpenMP 2.5:
7347    # pragma omp critical [(name)] new-line
7348      structured-block
7349 */
7350
7351 static tree
7352 c_parser_omp_critical (c_parser *parser)
7353 {
7354   tree stmt, name = NULL;
7355
7356   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
7357     {
7358       c_parser_consume_token (parser);
7359       if (c_parser_next_token_is (parser, CPP_NAME))
7360         {
7361           name = c_parser_peek_token (parser)->value;
7362           c_parser_consume_token (parser);
7363           c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>");
7364         }
7365       else
7366         c_parser_error (parser, "expected identifier");
7367     }
7368   else if (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL))
7369     c_parser_error (parser, "expected %<(%> or end of line");
7370   c_parser_skip_to_pragma_eol (parser);
7371
7372   stmt = c_parser_omp_structured_block (parser);
7373   return c_finish_omp_critical (stmt, name);
7374 }
7375
7376 /* OpenMP 2.5:
7377    # pragma omp flush flush-vars[opt] new-line
7378
7379    flush-vars:
7380      ( variable-list ) */
7381
7382 static void
7383 c_parser_omp_flush (c_parser *parser)
7384 {
7385   c_parser_consume_pragma (parser);
7386   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
7387     c_parser_omp_var_list_parens (parser, 0, NULL);
7388   else if (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL))
7389     c_parser_error (parser, "expected %<(%> or end of line");
7390   c_parser_skip_to_pragma_eol (parser);
7391
7392   c_finish_omp_flush ();
7393 }
7394
7395 /* Parse the restricted form of the for statment allowed by OpenMP.
7396    The real trick here is to determine the loop control variable early
7397    so that we can push a new decl if necessary to make it private.  */
7398
7399 static tree
7400 c_parser_omp_for_loop (c_parser *parser)
7401 {
7402   tree decl, cond, incr, save_break, save_cont, body, init;
7403   location_t loc;
7404
7405   if (!c_parser_next_token_is_keyword (parser, RID_FOR))
7406     {
7407       c_parser_error (parser, "for statement expected");
7408       return NULL;
7409     }
7410   loc = c_parser_peek_token (parser)->location;
7411   c_parser_consume_token (parser);
7412
7413   if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
7414     return NULL;
7415
7416   /* Parse the initialization declaration or expression.  */
7417   if (c_parser_next_token_starts_declspecs (parser))
7418     {
7419       c_parser_declaration_or_fndef (parser, true, true, true, true);
7420       decl = check_for_loop_decls ();
7421       if (decl == NULL)
7422         goto error_init;
7423       init = decl;
7424     }
7425   else if (c_parser_next_token_is (parser, CPP_NAME)
7426            && c_parser_peek_2nd_token (parser)->type == CPP_EQ)
7427     {
7428       decl = c_parser_postfix_expression (parser).value;
7429
7430       c_parser_require (parser, CPP_EQ, "expected %<=%>");
7431
7432       init = c_parser_expr_no_commas (parser, NULL).value;
7433       init = build_modify_expr (decl, NOP_EXPR, init);
7434       init = c_process_expr_stmt (init);
7435
7436       c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
7437     }
7438   else
7439     goto error_init;
7440
7441   /* Parse the loop condition.  */
7442   cond = NULL_TREE;
7443   if (c_parser_next_token_is_not (parser, CPP_SEMICOLON))
7444     {
7445       cond = c_parser_expression_conv (parser).value;
7446       cond = c_objc_common_truthvalue_conversion (cond);
7447       if (CAN_HAVE_LOCATION_P (cond))
7448         SET_EXPR_LOCATION (cond, input_location);
7449     }
7450   c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
7451
7452   /* Parse the increment expression.  */
7453   incr = NULL_TREE;
7454   if (c_parser_next_token_is_not (parser, CPP_CLOSE_PAREN))
7455     incr = c_process_expr_stmt (c_parser_expression (parser).value);
7456   c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
7457
7458  parse_body:
7459   save_break = c_break_label;
7460   c_break_label = size_one_node;
7461   save_cont = c_cont_label;
7462   c_cont_label = NULL_TREE;
7463   body = push_stmt_list ();
7464
7465   add_stmt (c_parser_c99_block_statement (parser));
7466   if (c_cont_label)
7467     add_stmt (build1 (LABEL_EXPR, void_type_node, c_cont_label));
7468
7469   body = pop_stmt_list (body);
7470   c_break_label = save_break;
7471   c_cont_label = save_cont;
7472
7473   /* Only bother calling c_finish_omp_for if we havn't already generated
7474      an error from the initialization parsing.  */
7475   if (decl != NULL && decl != error_mark_node && init != error_mark_node)
7476     return c_finish_omp_for (loc, decl, init, cond, incr, body, NULL);
7477   return NULL;
7478
7479  error_init:
7480   c_parser_error (parser, "expected iteration declaration or initialization");
7481   c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
7482   decl = init = cond = incr = NULL_TREE;
7483   goto parse_body;
7484 }
7485
7486 /* OpenMP 2.5:
7487    #pragma omp for for-clause[optseq] new-line
7488      for-loop
7489 */
7490
7491 #define OMP_FOR_CLAUSE_MASK                             \
7492         ( (1u << PRAGMA_OMP_CLAUSE_PRIVATE)             \
7493         | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)        \
7494         | (1u << PRAGMA_OMP_CLAUSE_LASTPRIVATE)         \
7495         | (1u << PRAGMA_OMP_CLAUSE_REDUCTION)           \
7496         | (1u << PRAGMA_OMP_CLAUSE_ORDERED)             \
7497         | (1u << PRAGMA_OMP_CLAUSE_SCHEDULE)            \
7498         | (1u << PRAGMA_OMP_CLAUSE_NOWAIT))
7499
7500 static tree
7501 c_parser_omp_for (c_parser *parser)
7502 {
7503   tree block, clauses, ret;
7504
7505   clauses = c_parser_omp_all_clauses (parser, OMP_FOR_CLAUSE_MASK,
7506                                       "#pragma omp for");
7507
7508   block = c_begin_compound_stmt (true);
7509   ret = c_parser_omp_for_loop (parser);
7510   if (ret)
7511     OMP_FOR_CLAUSES (ret) = clauses;
7512   block = c_end_compound_stmt (block, true);
7513   add_stmt (block);
7514
7515   return ret;
7516 }
7517
7518 /* OpenMP 2.5:
7519    # pragma omp master new-line
7520      structured-block
7521 */
7522
7523 static tree
7524 c_parser_omp_master (c_parser *parser)
7525 {
7526   c_parser_skip_to_pragma_eol (parser);
7527   return c_finish_omp_master (c_parser_omp_structured_block (parser));
7528 }
7529
7530 /* OpenMP 2.5:
7531    # pragma omp ordered new-line
7532      structured-block
7533 */
7534
7535 static tree
7536 c_parser_omp_ordered (c_parser *parser)
7537 {
7538   c_parser_skip_to_pragma_eol (parser);
7539   return c_finish_omp_ordered (c_parser_omp_structured_block (parser));
7540 }
7541
7542 /* OpenMP 2.5:
7543
7544    section-scope:
7545      { section-sequence }
7546
7547    section-sequence:
7548      section-directive[opt] structured-block
7549      section-sequence section-directive structured-block  */
7550
7551 static tree
7552 c_parser_omp_sections_scope (c_parser *parser)
7553 {
7554   tree stmt, substmt;
7555   bool error_suppress = false;
7556   location_t loc;
7557
7558   if (!c_parser_require (parser, CPP_OPEN_BRACE, "expected %<{%>"))
7559     {
7560       /* Avoid skipping until the end of the block.  */
7561       parser->error = false;
7562       return NULL_TREE;
7563     }
7564
7565   stmt = push_stmt_list ();
7566
7567   loc = c_parser_peek_token (parser)->location;
7568   if (c_parser_peek_token (parser)->pragma_kind != PRAGMA_OMP_SECTION)
7569     {
7570       substmt = push_stmt_list ();
7571
7572       while (1)
7573         {
7574           c_parser_statement (parser);
7575
7576           if (c_parser_peek_token (parser)->pragma_kind == PRAGMA_OMP_SECTION)
7577             break;
7578           if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
7579             break;
7580           if (c_parser_next_token_is (parser, CPP_EOF))
7581             break;
7582         }
7583
7584       substmt = pop_stmt_list (substmt);
7585       substmt = build1 (OMP_SECTION, void_type_node, substmt);
7586       SET_EXPR_LOCATION (substmt, loc);
7587       add_stmt (substmt);
7588     }
7589
7590   while (1)
7591     {
7592       if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
7593         break;
7594       if (c_parser_next_token_is (parser, CPP_EOF))
7595         break;
7596
7597       loc = c_parser_peek_token (parser)->location;
7598       if (c_parser_peek_token (parser)->pragma_kind == PRAGMA_OMP_SECTION)
7599         {
7600           c_parser_consume_pragma (parser);
7601           c_parser_skip_to_pragma_eol (parser);
7602           error_suppress = false;
7603         }
7604       else if (!error_suppress)
7605         {
7606           error ("expected %<#pragma omp section%> or %<}%>");
7607           error_suppress = true;
7608         }
7609
7610       substmt = c_parser_omp_structured_block (parser);
7611       substmt = build1 (OMP_SECTION, void_type_node, substmt);
7612       SET_EXPR_LOCATION (substmt, loc);
7613       add_stmt (substmt);
7614     }
7615   c_parser_skip_until_found (parser, CPP_CLOSE_BRACE,
7616                              "expected %<#pragma omp section%> or %<}%>");
7617
7618   substmt = pop_stmt_list (stmt);
7619
7620   stmt = make_node (OMP_SECTIONS);
7621   TREE_TYPE (stmt) = void_type_node;
7622   OMP_SECTIONS_BODY (stmt) = substmt;
7623
7624   return add_stmt (stmt);
7625 }
7626
7627 /* OpenMP 2.5:
7628    # pragma omp sections sections-clause[optseq] newline
7629      sections-scope
7630 */
7631
7632 #define OMP_SECTIONS_CLAUSE_MASK                        \
7633         ( (1u << PRAGMA_OMP_CLAUSE_PRIVATE)             \
7634         | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)        \
7635         | (1u << PRAGMA_OMP_CLAUSE_LASTPRIVATE)         \
7636         | (1u << PRAGMA_OMP_CLAUSE_REDUCTION)           \
7637         | (1u << PRAGMA_OMP_CLAUSE_NOWAIT))
7638
7639 static tree
7640 c_parser_omp_sections (c_parser *parser)
7641 {
7642   tree block, clauses, ret;
7643
7644   clauses = c_parser_omp_all_clauses (parser, OMP_SECTIONS_CLAUSE_MASK,
7645                                       "#pragma omp sections");
7646
7647   block = c_begin_compound_stmt (true);
7648   ret = c_parser_omp_sections_scope (parser);
7649   if (ret)
7650     OMP_SECTIONS_CLAUSES (ret) = clauses;
7651   block = c_end_compound_stmt (block, true);
7652   add_stmt (block);
7653
7654   return ret;
7655 }
7656
7657 /* OpenMP 2.5:
7658    # pragma parallel parallel-clause new-line
7659    # pragma parallel for parallel-for-clause new-line
7660    # pragma parallel sections parallel-sections-clause new-line
7661 */
7662
7663 #define OMP_PARALLEL_CLAUSE_MASK                        \
7664         ( (1u << PRAGMA_OMP_CLAUSE_IF)                  \
7665         | (1u << PRAGMA_OMP_CLAUSE_PRIVATE)             \
7666         | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)        \
7667         | (1u << PRAGMA_OMP_CLAUSE_DEFAULT)             \
7668         | (1u << PRAGMA_OMP_CLAUSE_SHARED)              \
7669         | (1u << PRAGMA_OMP_CLAUSE_COPYIN)              \
7670         | (1u << PRAGMA_OMP_CLAUSE_REDUCTION)           \
7671         | (1u << PRAGMA_OMP_CLAUSE_NUM_THREADS))
7672
7673 static tree
7674 c_parser_omp_parallel (c_parser *parser)
7675 {
7676   enum pragma_kind p_kind = PRAGMA_OMP_PARALLEL;
7677   const char *p_name = "#pragma omp parallel";
7678   tree stmt, clauses, par_clause, ws_clause, block;
7679   unsigned int mask = OMP_PARALLEL_CLAUSE_MASK;
7680
7681   if (c_parser_next_token_is_keyword (parser, RID_FOR))
7682     {
7683       c_parser_consume_token (parser);
7684       p_kind = PRAGMA_OMP_PARALLEL_FOR;
7685       p_name = "#pragma omp parallel for";
7686       mask |= OMP_FOR_CLAUSE_MASK;
7687       mask &= ~(1u << PRAGMA_OMP_CLAUSE_NOWAIT);
7688     }
7689   else if (c_parser_next_token_is (parser, CPP_NAME))
7690     {
7691       const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
7692       if (strcmp (p, "sections") == 0)
7693         {
7694           c_parser_consume_token (parser);
7695           p_kind = PRAGMA_OMP_PARALLEL_SECTIONS;
7696           p_name = "#pragma omp parallel sections";
7697           mask |= OMP_SECTIONS_CLAUSE_MASK;
7698           mask &= ~(1u << PRAGMA_OMP_CLAUSE_NOWAIT);
7699         }
7700     }
7701
7702   clauses = c_parser_omp_all_clauses (parser, mask, p_name);
7703
7704   switch (p_kind)
7705     {
7706     case PRAGMA_OMP_PARALLEL:
7707       block = c_begin_omp_parallel ();
7708       c_parser_statement (parser);
7709       stmt = c_finish_omp_parallel (clauses, block);
7710       break;
7711
7712     case PRAGMA_OMP_PARALLEL_FOR:
7713       block = c_begin_omp_parallel ();
7714       c_split_parallel_clauses (clauses, &par_clause, &ws_clause);
7715       stmt = c_parser_omp_for_loop (parser);
7716       if (stmt)
7717         OMP_FOR_CLAUSES (stmt) = ws_clause;
7718       stmt = c_finish_omp_parallel (par_clause, block);
7719       OMP_PARALLEL_COMBINED (stmt) = 1;
7720       break;
7721
7722     case PRAGMA_OMP_PARALLEL_SECTIONS:
7723       block = c_begin_omp_parallel ();
7724       c_split_parallel_clauses (clauses, &par_clause, &ws_clause);
7725       stmt = c_parser_omp_sections_scope (parser);
7726       if (stmt)
7727         OMP_SECTIONS_CLAUSES (stmt) = ws_clause;
7728       stmt = c_finish_omp_parallel (par_clause, block);
7729       OMP_PARALLEL_COMBINED (stmt) = 1;
7730       break;
7731
7732     default:
7733       gcc_unreachable ();
7734     }
7735
7736   return stmt;
7737 }
7738
7739 /* OpenMP 2.5:
7740    # pragma omp single single-clause[optseq] new-line
7741      structured-block
7742 */
7743
7744 #define OMP_SINGLE_CLAUSE_MASK                          \
7745         ( (1u << PRAGMA_OMP_CLAUSE_PRIVATE)             \
7746         | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)        \
7747         | (1u << PRAGMA_OMP_CLAUSE_COPYPRIVATE)         \
7748         | (1u << PRAGMA_OMP_CLAUSE_NOWAIT))
7749
7750 static tree
7751 c_parser_omp_single (c_parser *parser)
7752 {
7753   tree stmt = make_node (OMP_SINGLE);
7754   TREE_TYPE (stmt) = void_type_node;
7755
7756   OMP_SINGLE_CLAUSES (stmt)
7757     = c_parser_omp_all_clauses (parser, OMP_SINGLE_CLAUSE_MASK,
7758                                 "#pragma omp single");
7759   OMP_SINGLE_BODY (stmt) = c_parser_omp_structured_block (parser);
7760
7761   return add_stmt (stmt);
7762 }
7763
7764
7765 /* Main entry point to parsing most OpenMP pragmas.  */
7766
7767 static void
7768 c_parser_omp_construct (c_parser *parser)
7769 {
7770   enum pragma_kind p_kind;
7771   location_t loc;
7772   tree stmt;
7773
7774   loc = c_parser_peek_token (parser)->location;
7775   p_kind = c_parser_peek_token (parser)->pragma_kind;
7776   c_parser_consume_pragma (parser);
7777
7778   /* For all constructs below except #pragma omp atomic
7779      MUST_NOT_THROW catch handlers are needed when exceptions
7780      are enabled.  */
7781   if (p_kind != PRAGMA_OMP_ATOMIC)
7782     c_maybe_initialize_eh ();
7783
7784   switch (p_kind)
7785     {
7786     case PRAGMA_OMP_ATOMIC:
7787       c_parser_omp_atomic (parser);
7788       return;
7789     case PRAGMA_OMP_CRITICAL:
7790       stmt = c_parser_omp_critical (parser);
7791       break;
7792     case PRAGMA_OMP_FOR:
7793       stmt = c_parser_omp_for (parser);
7794       break;
7795     case PRAGMA_OMP_MASTER:
7796       stmt = c_parser_omp_master (parser);
7797       break;
7798     case PRAGMA_OMP_ORDERED:
7799       stmt = c_parser_omp_ordered (parser);
7800       break;
7801     case PRAGMA_OMP_PARALLEL:
7802       stmt = c_parser_omp_parallel (parser);
7803       break;
7804     case PRAGMA_OMP_SECTIONS:
7805       stmt = c_parser_omp_sections (parser);
7806       break;
7807     case PRAGMA_OMP_SINGLE:
7808       stmt = c_parser_omp_single (parser);
7809       break;
7810     default:
7811       gcc_unreachable ();
7812     }
7813
7814   if (stmt)
7815     SET_EXPR_LOCATION (stmt, loc);
7816 }
7817
7818
7819 /* OpenMP 2.5:
7820    # pragma omp threadprivate (variable-list) */
7821
7822 static void
7823 c_parser_omp_threadprivate (c_parser *parser)
7824 {
7825   tree vars, t;
7826
7827   c_parser_consume_pragma (parser);
7828   vars = c_parser_omp_var_list_parens (parser, 0, NULL);
7829
7830   /* Mark every variable in VARS to be assigned thread local storage.  */
7831   for (t = vars; t; t = TREE_CHAIN (t))
7832     {
7833       tree v = TREE_PURPOSE (t);
7834
7835       /* If V had already been marked threadprivate, it doesn't matter
7836          whether it had been used prior to this point.  */
7837       if (TREE_USED (v) && !C_DECL_THREADPRIVATE_P (v))
7838         error ("%qE declared %<threadprivate%> after first use", v);
7839       else if (! TREE_STATIC (v) && ! DECL_EXTERNAL (v))
7840         error ("automatic variable %qE cannot be %<threadprivate%>", v);
7841       else if (! COMPLETE_TYPE_P (TREE_TYPE (v)))
7842         error ("%<threadprivate%> %qE has incomplete type", v);
7843       else
7844         {
7845           if (! DECL_THREAD_LOCAL_P (v))
7846             {
7847               DECL_TLS_MODEL (v) = decl_default_tls_model (v);
7848               /* If rtl has been already set for this var, call
7849                  make_decl_rtl once again, so that encode_section_info
7850                  has a chance to look at the new decl flags.  */
7851               if (DECL_RTL_SET_P (v))
7852                 make_decl_rtl (v);
7853             }
7854           C_DECL_THREADPRIVATE_P (v) = 1;
7855         }
7856     }
7857
7858   c_parser_skip_to_pragma_eol (parser);
7859 }
7860
7861 \f
7862 /* Parse a single source file.  */
7863
7864 void
7865 c_parse_file (void)
7866 {
7867   /* Use local storage to begin.  If the first token is a pragma, parse it.
7868      If it is #pragma GCC pch_preprocess, then this will load a PCH file
7869      which will cause garbage collection.  */
7870   c_parser tparser;
7871
7872   memset (&tparser, 0, sizeof tparser);
7873   the_parser = &tparser;
7874
7875   if (c_parser_peek_token (&tparser)->pragma_kind == PRAGMA_GCC_PCH_PREPROCESS)
7876     c_parser_pragma_pch_preprocess (&tparser);
7877
7878   the_parser = GGC_NEW (c_parser);
7879   *the_parser = tparser;
7880
7881   c_parser_translation_unit (the_parser);
7882   the_parser = NULL;
7883 }
7884
7885 #include "gt-c-parser.h"