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