OSDN Git Service

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