OSDN Git Service

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