OSDN Git Service

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