OSDN Git Service

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