OSDN Git Service

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