OSDN Git Service

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