OSDN Git Service

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