OSDN Git Service

PR target/33135
[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, 2008, 2009, 2010, 2011,
4    2012 Free Software Foundation, Inc.
5
6    Parser actions based on the old Bison parser; structure somewhat
7    influenced by and fragments based on the C++ parser.
8
9 This file is part of GCC.
10
11 GCC is free software; you can redistribute it and/or modify it under
12 the terms of the GNU General Public License as published by the Free
13 Software Foundation; either version 3, or (at your option) any later
14 version.
15
16 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
17 WARRANTY; without even the implied warranty of MERCHANTABILITY or
18 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
19 for more details.
20
21 You should have received a copy of the GNU General Public License
22 along with GCC; see the file COPYING3.  If not see
23 <http://www.gnu.org/licenses/>.  */
24
25 /* TODO:
26
27    Make sure all relevant comments, and all relevant code from all
28    actions, brought over from old parser.  Verify exact correspondence
29    of syntax accepted.
30
31    Add testcases covering every input symbol in every state in old and
32    new parsers.
33
34    Include full syntax for GNU C, including erroneous cases accepted
35    with error messages, in syntax productions in comments.
36
37    Make more diagnostics in the front end generally take an explicit
38    location rather than implicitly using input_location.  */
39
40 #include "config.h"
41 #include "system.h"
42 #include "coretypes.h"
43 #include "tm.h"                 /* For rtl.h: needs enum reg_class.  */
44 #include "tree.h"
45 #include "langhooks.h"
46 #include "input.h"
47 #include "cpplib.h"
48 #include "timevar.h"
49 #include "c-family/c-pragma.h"
50 #include "c-tree.h"
51 #include "flags.h"
52 #include "output.h"
53 #include "ggc.h"
54 #include "c-family/c-common.h"
55 #include "c-family/c-objc.h"
56 #include "vec.h"
57 #include "target.h"
58 #include "cgraph.h"
59 #include "plugin.h"
60
61 \f
62 /* Initialization routine for this file.  */
63
64 void
65 c_parse_init (void)
66 {
67   /* The only initialization required is of the reserved word
68      identifiers.  */
69   unsigned int i;
70   tree id;
71   int mask = 0;
72
73   /* Make sure RID_MAX hasn't grown past the 8 bits used to hold the keyword in
74      the c_token structure.  */
75   gcc_assert (RID_MAX <= 255);
76
77   mask |= D_CXXONLY;
78   if (!flag_isoc99)
79     mask |= D_C99;
80   if (flag_no_asm)
81     {
82       mask |= D_ASM | D_EXT;
83       if (!flag_isoc99)
84         mask |= D_EXT89;
85     }
86   if (!c_dialect_objc ())
87     mask |= D_OBJC | D_CXX_OBJC;
88
89   ridpointers = ggc_alloc_cleared_vec_tree ((int) RID_MAX);
90   for (i = 0; i < num_c_common_reswords; i++)
91     {
92       /* If a keyword is disabled, do not enter it into the table
93          and so create a canonical spelling that isn't a keyword.  */
94       if (c_common_reswords[i].disable & mask)
95         {
96           if (warn_cxx_compat
97               && (c_common_reswords[i].disable & D_CXXWARN))
98             {
99               id = get_identifier (c_common_reswords[i].word);
100               C_SET_RID_CODE (id, RID_CXX_COMPAT_WARN);
101               C_IS_RESERVED_WORD (id) = 1;
102             }
103           continue;
104         }
105
106       id = get_identifier (c_common_reswords[i].word);
107       C_SET_RID_CODE (id, c_common_reswords[i].rid);
108       C_IS_RESERVED_WORD (id) = 1;
109       ridpointers [(int) c_common_reswords[i].rid] = id;
110     }
111 }
112 \f
113 /* The C lexer intermediates between the lexer in cpplib and c-lex.c
114    and the C parser.  Unlike the C++ lexer, the parser structure
115    stores the lexer information instead of using a separate structure.
116    Identifiers are separated into ordinary identifiers, type names,
117    keywords and some other Objective-C types of identifiers, and some
118    look-ahead is maintained.
119
120    ??? It might be a good idea to lex the whole file up front (as for
121    C++).  It would then be possible to share more of the C and C++
122    lexer code, if desired.  */
123
124 /* The following local token type is used.  */
125
126 /* A keyword.  */
127 #define CPP_KEYWORD ((enum cpp_ttype) (N_TTYPES + 1))
128
129 /* More information about the type of a CPP_NAME token.  */
130 typedef enum c_id_kind {
131   /* An ordinary identifier.  */
132   C_ID_ID,
133   /* An identifier declared as a typedef name.  */
134   C_ID_TYPENAME,
135   /* An identifier declared as an Objective-C class name.  */
136   C_ID_CLASSNAME,
137   /* An address space identifier.  */
138   C_ID_ADDRSPACE,
139   /* Not an identifier.  */
140   C_ID_NONE
141 } c_id_kind;
142
143 /* A single C token after string literal concatenation and conversion
144    of preprocessing tokens to tokens.  */
145 typedef struct GTY (()) c_token {
146   /* The kind of token.  */
147   ENUM_BITFIELD (cpp_ttype) type : 8;
148   /* If this token is a CPP_NAME, this value indicates whether also
149      declared as some kind of type.  Otherwise, it is C_ID_NONE.  */
150   ENUM_BITFIELD (c_id_kind) id_kind : 8;
151   /* If this token is a keyword, this value indicates which keyword.
152      Otherwise, this value is RID_MAX.  */
153   ENUM_BITFIELD (rid) keyword : 8;
154   /* If this token is a CPP_PRAGMA, this indicates the pragma that
155      was seen.  Otherwise it is PRAGMA_NONE.  */
156   ENUM_BITFIELD (pragma_kind) pragma_kind : 8;
157   /* The location at which this token was found.  */
158   location_t location;
159   /* The value associated with this token, if any.  */
160   tree value;
161 } c_token;
162
163 /* A parser structure recording information about the state and
164    context of parsing.  Includes lexer information with up to two
165    tokens of look-ahead; more are not needed for C.  */
166 typedef struct GTY(()) c_parser {
167   /* The look-ahead tokens.  */
168   c_token tokens[2];
169   /* How many look-ahead tokens are available (0, 1 or 2).  */
170   short tokens_avail;
171   /* True if a syntax error is being recovered from; false otherwise.
172      c_parser_error sets this flag.  It should clear this flag when
173      enough tokens have been consumed to recover from the error.  */
174   BOOL_BITFIELD error : 1;
175   /* True if we're processing a pragma, and shouldn't automatically
176      consume CPP_PRAGMA_EOL.  */
177   BOOL_BITFIELD in_pragma : 1;
178   /* True if we're parsing the outermost block of an if statement.  */
179   BOOL_BITFIELD in_if_block : 1;
180   /* True if we want to lex an untranslated string.  */
181   BOOL_BITFIELD lex_untranslated_string : 1;
182
183   /* Objective-C specific parser/lexer information.  */
184
185   /* True if we are in a context where the Objective-C "PQ" keywords
186      are considered keywords.  */
187   BOOL_BITFIELD objc_pq_context : 1;
188   /* True if we are parsing a (potential) Objective-C foreach
189      statement.  This is set to true after we parsed 'for (' and while
190      we wait for 'in' or ';' to decide if it's a standard C for loop or an
191      Objective-C foreach loop.  */
192   BOOL_BITFIELD objc_could_be_foreach_context : 1;
193   /* The following flag is needed to contextualize Objective-C lexical
194      analysis.  In some cases (e.g., 'int NSObject;'), it is
195      undesirable to bind an identifier to an Objective-C class, even
196      if a class with that name exists.  */
197   BOOL_BITFIELD objc_need_raw_identifier : 1;
198   /* Nonzero if we're processing a __transaction statement.  The value
199      is 1 | TM_STMT_ATTR_*.  */
200   unsigned int in_transaction : 4;
201   /* True if we are in a context where the Objective-C "Property attribute"
202      keywords are valid.  */
203   BOOL_BITFIELD objc_property_attr_context : 1;
204 } c_parser;
205
206
207 /* The actual parser and external interface.  ??? Does this need to be
208    garbage-collected?  */
209
210 static GTY (()) c_parser *the_parser;
211
212 /* Read in and lex a single token, storing it in *TOKEN.  */
213
214 static void
215 c_lex_one_token (c_parser *parser, c_token *token)
216 {
217   timevar_push (TV_LEX);
218
219   token->type = c_lex_with_flags (&token->value, &token->location, NULL,
220                                   (parser->lex_untranslated_string
221                                    ? C_LEX_STRING_NO_TRANSLATE : 0));
222   token->id_kind = C_ID_NONE;
223   token->keyword = RID_MAX;
224   token->pragma_kind = PRAGMA_NONE;
225
226   switch (token->type)
227     {
228     case CPP_NAME:
229       {
230         tree decl;
231
232         bool objc_force_identifier = parser->objc_need_raw_identifier;
233         if (c_dialect_objc ())
234           parser->objc_need_raw_identifier = false;
235
236         if (C_IS_RESERVED_WORD (token->value))
237           {
238             enum rid rid_code = C_RID_CODE (token->value);
239
240             if (rid_code == RID_CXX_COMPAT_WARN)
241               {
242                 warning_at (token->location,
243                             OPT_Wc___compat,
244                             "identifier %qE conflicts with C++ keyword",
245                             token->value);
246               }
247             else if (rid_code >= RID_FIRST_ADDR_SPACE
248                      && rid_code <= RID_LAST_ADDR_SPACE)
249               {
250                 token->id_kind = C_ID_ADDRSPACE;
251                 token->keyword = rid_code;
252                 break;
253               }
254             else if (c_dialect_objc () && OBJC_IS_PQ_KEYWORD (rid_code))
255               {
256                 /* We found an Objective-C "pq" keyword (in, out,
257                    inout, bycopy, byref, oneway).  They need special
258                    care because the interpretation depends on the
259                    context.  */
260                 if (parser->objc_pq_context)
261                   {
262                     token->type = CPP_KEYWORD;
263                     token->keyword = rid_code;
264                     break;
265                   }
266                 else if (parser->objc_could_be_foreach_context
267                          && rid_code == RID_IN)
268                   {
269                     /* We are in Objective-C, inside a (potential)
270                        foreach context (which means after having
271                        parsed 'for (', but before having parsed ';'),
272                        and we found 'in'.  We consider it the keyword
273                        which terminates the declaration at the
274                        beginning of a foreach-statement.  Note that
275                        this means you can't use 'in' for anything else
276                        in that context; in particular, in Objective-C
277                        you can't use 'in' as the name of the running
278                        variable in a C for loop.  We could potentially
279                        try to add code here to disambiguate, but it
280                        seems a reasonable limitation.  */
281                     token->type = CPP_KEYWORD;
282                     token->keyword = rid_code;
283                     break;
284                   }
285                 /* Else, "pq" keywords outside of the "pq" context are
286                    not keywords, and we fall through to the code for
287                    normal tokens.  */
288               }
289             else if (c_dialect_objc () && OBJC_IS_PATTR_KEYWORD (rid_code))
290               {
291                 /* We found an Objective-C "property attribute"
292                    keyword (getter, setter, readonly, etc). These are
293                    only valid in the property context.  */
294                 if (parser->objc_property_attr_context)
295                   {
296                     token->type = CPP_KEYWORD;
297                     token->keyword = rid_code;
298                     break;
299                   }
300                 /* Else they are not special keywords.
301                 */
302               }
303             else if (c_dialect_objc () 
304                      && (OBJC_IS_AT_KEYWORD (rid_code)
305                          || OBJC_IS_CXX_KEYWORD (rid_code)))
306               {
307                 /* We found one of the Objective-C "@" keywords (defs,
308                    selector, synchronized, etc) or one of the
309                    Objective-C "cxx" keywords (class, private,
310                    protected, public, try, catch, throw) without a
311                    preceding '@' sign.  Do nothing and fall through to
312                    the code for normal tokens (in C++ we would still
313                    consider the CXX ones keywords, but not in C).  */
314                 ;
315               }
316             else
317               {
318                 token->type = CPP_KEYWORD;
319                 token->keyword = rid_code;
320                 break;
321               }
322           }
323
324         decl = lookup_name (token->value);
325         if (decl)
326           {
327             if (TREE_CODE (decl) == TYPE_DECL)
328               {
329                 token->id_kind = C_ID_TYPENAME;
330                 break;
331               }
332           }
333         else if (c_dialect_objc ())
334           {
335             tree objc_interface_decl = objc_is_class_name (token->value);
336             /* Objective-C class names are in the same namespace as
337                variables and typedefs, and hence are shadowed by local
338                declarations.  */
339             if (objc_interface_decl
340                 && (!objc_force_identifier || global_bindings_p ()))
341               {
342                 token->value = objc_interface_decl;
343                 token->id_kind = C_ID_CLASSNAME;
344                 break;
345               }
346           }
347         token->id_kind = C_ID_ID;
348       }
349       break;
350     case CPP_AT_NAME:
351       /* This only happens in Objective-C; it must be a keyword.  */
352       token->type = CPP_KEYWORD;
353       switch (C_RID_CODE (token->value))
354         {
355           /* Replace 'class' with '@class', 'private' with '@private',
356              etc.  This prevents confusion with the C++ keyword
357              'class', and makes the tokens consistent with other
358              Objective-C 'AT' keywords.  For example '@class' is
359              reported as RID_AT_CLASS which is consistent with
360              '@synchronized', which is reported as
361              RID_AT_SYNCHRONIZED.
362           */
363         case RID_CLASS:     token->keyword = RID_AT_CLASS; break;
364         case RID_PRIVATE:   token->keyword = RID_AT_PRIVATE; break;
365         case RID_PROTECTED: token->keyword = RID_AT_PROTECTED; break;
366         case RID_PUBLIC:    token->keyword = RID_AT_PUBLIC; break;
367         case RID_THROW:     token->keyword = RID_AT_THROW; break;
368         case RID_TRY:       token->keyword = RID_AT_TRY; break;
369         case RID_CATCH:     token->keyword = RID_AT_CATCH; break;
370         default:            token->keyword = C_RID_CODE (token->value);
371         }
372       break;
373     case CPP_COLON:
374     case CPP_COMMA:
375     case CPP_CLOSE_PAREN:
376     case CPP_SEMICOLON:
377       /* These tokens may affect the interpretation of any identifiers
378          following, if doing Objective-C.  */
379       if (c_dialect_objc ())
380         parser->objc_need_raw_identifier = false;
381       break;
382     case CPP_PRAGMA:
383       /* We smuggled the cpp_token->u.pragma value in an INTEGER_CST.  */
384       token->pragma_kind = (enum pragma_kind) TREE_INT_CST_LOW (token->value);
385       token->value = NULL;
386       break;
387     default:
388       break;
389     }
390   timevar_pop (TV_LEX);
391 }
392
393 /* Return a pointer to the next token from PARSER, reading it in if
394    necessary.  */
395
396 static inline c_token *
397 c_parser_peek_token (c_parser *parser)
398 {
399   if (parser->tokens_avail == 0)
400     {
401       c_lex_one_token (parser, &parser->tokens[0]);
402       parser->tokens_avail = 1;
403     }
404   return &parser->tokens[0];
405 }
406
407 /* Return true if the next token from PARSER has the indicated
408    TYPE.  */
409
410 static inline bool
411 c_parser_next_token_is (c_parser *parser, enum cpp_ttype type)
412 {
413   return c_parser_peek_token (parser)->type == type;
414 }
415
416 /* Return true if the next token from PARSER does not have the
417    indicated TYPE.  */
418
419 static inline bool
420 c_parser_next_token_is_not (c_parser *parser, enum cpp_ttype type)
421 {
422   return !c_parser_next_token_is (parser, type);
423 }
424
425 /* Return true if the next token from PARSER is the indicated
426    KEYWORD.  */
427
428 static inline bool
429 c_parser_next_token_is_keyword (c_parser *parser, enum rid keyword)
430 {
431   return c_parser_peek_token (parser)->keyword == keyword;
432 }
433
434 /* Return a pointer to the next-but-one token from PARSER, reading it
435    in if necessary.  The next token is already read in.  */
436
437 static c_token *
438 c_parser_peek_2nd_token (c_parser *parser)
439 {
440   if (parser->tokens_avail >= 2)
441     return &parser->tokens[1];
442   gcc_assert (parser->tokens_avail == 1);
443   gcc_assert (parser->tokens[0].type != CPP_EOF);
444   gcc_assert (parser->tokens[0].type != CPP_PRAGMA_EOL);
445   c_lex_one_token (parser, &parser->tokens[1]);
446   parser->tokens_avail = 2;
447   return &parser->tokens[1];
448 }
449
450 /* Return true if TOKEN can start a type name,
451    false otherwise.  */
452 static bool
453 c_token_starts_typename (c_token *token)
454 {
455   switch (token->type)
456     {
457     case CPP_NAME:
458       switch (token->id_kind)
459         {
460         case C_ID_ID:
461           return false;
462         case C_ID_ADDRSPACE:
463           return true;
464         case C_ID_TYPENAME:
465           return true;
466         case C_ID_CLASSNAME:
467           gcc_assert (c_dialect_objc ());
468           return true;
469         default:
470           gcc_unreachable ();
471         }
472     case CPP_KEYWORD:
473       switch (token->keyword)
474         {
475         case RID_UNSIGNED:
476         case RID_LONG:
477         case RID_INT128:
478         case RID_SHORT:
479         case RID_SIGNED:
480         case RID_COMPLEX:
481         case RID_INT:
482         case RID_CHAR:
483         case RID_FLOAT:
484         case RID_DOUBLE:
485         case RID_VOID:
486         case RID_DFLOAT32:
487         case RID_DFLOAT64:
488         case RID_DFLOAT128:
489         case RID_BOOL:
490         case RID_ENUM:
491         case RID_STRUCT:
492         case RID_UNION:
493         case RID_TYPEOF:
494         case RID_CONST:
495         case RID_VOLATILE:
496         case RID_RESTRICT:
497         case RID_ATTRIBUTE:
498         case RID_FRACT:
499         case RID_ACCUM:
500         case RID_SAT:
501           return true;
502         default:
503           return false;
504         }
505     case CPP_LESS:
506       if (c_dialect_objc ())
507         return true;
508       return false;
509     default:
510       return false;
511     }
512 }
513
514 enum c_lookahead_kind {
515   /* Always treat unknown identifiers as typenames.  */
516   cla_prefer_type,
517
518   /* Could be parsing a nonabstract declarator.  Only treat an identifier
519      as a typename if followed by another identifier or a star.  */
520   cla_nonabstract_decl,
521
522   /* Never treat identifiers as typenames.  */
523   cla_prefer_id
524 };
525
526 /* Return true if the next token from PARSER can start a type name,
527    false otherwise.  LA specifies how to do lookahead in order to
528    detect unknown type names.  If unsure, pick CLA_PREFER_ID.  */
529
530 static inline bool
531 c_parser_next_tokens_start_typename (c_parser *parser, enum c_lookahead_kind la)
532 {
533   c_token *token = c_parser_peek_token (parser);
534   if (c_token_starts_typename (token))
535     return true;
536
537   /* Try a bit harder to detect an unknown typename.  */
538   if (la != cla_prefer_id
539       && token->type == CPP_NAME
540       && token->id_kind == C_ID_ID
541
542       /* Do not try too hard when we could have "object in array".  */
543       && !parser->objc_could_be_foreach_context
544
545       && (la == cla_prefer_type
546           || c_parser_peek_2nd_token (parser)->type == CPP_NAME
547           || c_parser_peek_2nd_token (parser)->type == CPP_MULT)
548
549       /* Only unknown identifiers.  */
550       && !lookup_name (token->value))
551     return true;
552
553   return false;
554 }
555
556 /* Return true if TOKEN is a type qualifier, false otherwise.  */
557 static bool
558 c_token_is_qualifier (c_token *token)
559 {
560   switch (token->type)
561     {
562     case CPP_NAME:
563       switch (token->id_kind)
564         {
565         case C_ID_ADDRSPACE:
566           return true;
567         default:
568           return false;
569         }
570     case CPP_KEYWORD:
571       switch (token->keyword)
572         {
573         case RID_CONST:
574         case RID_VOLATILE:
575         case RID_RESTRICT:
576         case RID_ATTRIBUTE:
577           return true;
578         default:
579           return false;
580         }
581     case CPP_LESS:
582       return false;
583     default:
584       gcc_unreachable ();
585     }
586 }
587
588 /* Return true if the next token from PARSER is a type qualifier,
589    false otherwise.  */
590 static inline bool
591 c_parser_next_token_is_qualifier (c_parser *parser)
592 {
593   c_token *token = c_parser_peek_token (parser);
594   return c_token_is_qualifier (token);
595 }
596
597 /* Return true if TOKEN can start declaration specifiers, false
598    otherwise.  */
599 static bool
600 c_token_starts_declspecs (c_token *token)
601 {
602   switch (token->type)
603     {
604     case CPP_NAME:
605       switch (token->id_kind)
606         {
607         case C_ID_ID:
608           return false;
609         case C_ID_ADDRSPACE:
610           return true;
611         case C_ID_TYPENAME:
612           return true;
613         case C_ID_CLASSNAME:
614           gcc_assert (c_dialect_objc ());
615           return true;
616         default:
617           gcc_unreachable ();
618         }
619     case CPP_KEYWORD:
620       switch (token->keyword)
621         {
622         case RID_STATIC:
623         case RID_EXTERN:
624         case RID_REGISTER:
625         case RID_TYPEDEF:
626         case RID_INLINE:
627         case RID_NORETURN:
628         case RID_AUTO:
629         case RID_THREAD:
630         case RID_UNSIGNED:
631         case RID_LONG:
632         case RID_INT128:
633         case RID_SHORT:
634         case RID_SIGNED:
635         case RID_COMPLEX:
636         case RID_INT:
637         case RID_CHAR:
638         case RID_FLOAT:
639         case RID_DOUBLE:
640         case RID_VOID:
641         case RID_DFLOAT32:
642         case RID_DFLOAT64:
643         case RID_DFLOAT128:
644         case RID_BOOL:
645         case RID_ENUM:
646         case RID_STRUCT:
647         case RID_UNION:
648         case RID_TYPEOF:
649         case RID_CONST:
650         case RID_VOLATILE:
651         case RID_RESTRICT:
652         case RID_ATTRIBUTE:
653         case RID_FRACT:
654         case RID_ACCUM:
655         case RID_SAT:
656         case RID_ALIGNAS:
657           return true;
658         default:
659           return false;
660         }
661     case CPP_LESS:
662       if (c_dialect_objc ())
663         return true;
664       return false;
665     default:
666       return false;
667     }
668 }
669
670
671 /* Return true if TOKEN can start declaration specifiers or a static
672    assertion, false otherwise.  */
673 static bool
674 c_token_starts_declaration (c_token *token)
675 {
676   if (c_token_starts_declspecs (token)
677       || token->keyword == RID_STATIC_ASSERT)
678     return true;
679   else
680     return false;
681 }
682
683 /* Return true if the next token from PARSER can start declaration
684    specifiers, false otherwise.  */
685 static inline bool
686 c_parser_next_token_starts_declspecs (c_parser *parser)
687 {
688   c_token *token = c_parser_peek_token (parser);
689
690   /* In Objective-C, a classname normally starts a declspecs unless it
691      is immediately followed by a dot.  In that case, it is the
692      Objective-C 2.0 "dot-syntax" for class objects, ie, calls the
693      setter/getter on the class.  c_token_starts_declspecs() can't
694      differentiate between the two cases because it only checks the
695      current token, so we have a special check here.  */
696   if (c_dialect_objc () 
697       && token->type == CPP_NAME
698       && token->id_kind == C_ID_CLASSNAME 
699       && c_parser_peek_2nd_token (parser)->type == CPP_DOT)
700     return false;
701
702   return c_token_starts_declspecs (token);
703 }
704
705 /* Return true if the next tokens from PARSER can start declaration
706    specifiers or a static assertion, false otherwise.  */
707 static inline bool
708 c_parser_next_tokens_start_declaration (c_parser *parser)
709 {
710   c_token *token = c_parser_peek_token (parser);
711
712   /* Same as above.  */
713   if (c_dialect_objc () 
714       && token->type == CPP_NAME
715       && token->id_kind == C_ID_CLASSNAME 
716       && c_parser_peek_2nd_token (parser)->type == CPP_DOT)
717     return false;
718
719   /* Labels do not start declarations.  */
720   if (token->type == CPP_NAME
721       && c_parser_peek_2nd_token (parser)->type == CPP_COLON)
722     return false;
723
724   if (c_token_starts_declaration (token))
725     return true;
726
727   if (c_parser_next_tokens_start_typename (parser, cla_nonabstract_decl))
728     return true;
729
730   return false;
731 }
732
733 /* Consume the next token from PARSER.  */
734
735 static void
736 c_parser_consume_token (c_parser *parser)
737 {
738   gcc_assert (parser->tokens_avail >= 1);
739   gcc_assert (parser->tokens[0].type != CPP_EOF);
740   gcc_assert (!parser->in_pragma || parser->tokens[0].type != CPP_PRAGMA_EOL);
741   gcc_assert (parser->error || parser->tokens[0].type != CPP_PRAGMA);
742   if (parser->tokens_avail == 2)
743     parser->tokens[0] = parser->tokens[1];
744   parser->tokens_avail--;
745 }
746
747 /* Expect the current token to be a #pragma.  Consume it and remember
748    that we've begun parsing a pragma.  */
749
750 static void
751 c_parser_consume_pragma (c_parser *parser)
752 {
753   gcc_assert (!parser->in_pragma);
754   gcc_assert (parser->tokens_avail >= 1);
755   gcc_assert (parser->tokens[0].type == CPP_PRAGMA);
756   if (parser->tokens_avail == 2)
757     parser->tokens[0] = parser->tokens[1];
758   parser->tokens_avail--;
759   parser->in_pragma = true;
760 }
761
762 /* Update the globals input_location and in_system_header from
763    TOKEN.  */
764 static inline void
765 c_parser_set_source_position_from_token (c_token *token)
766 {
767   if (token->type != CPP_EOF)
768     {
769       input_location = token->location;
770     }
771 }
772
773 /* Issue a diagnostic of the form
774       FILE:LINE: MESSAGE before TOKEN
775    where TOKEN is the next token in the input stream of PARSER.
776    MESSAGE (specified by the caller) is usually of the form "expected
777    OTHER-TOKEN".
778
779    Do not issue a diagnostic if still recovering from an error.
780
781    ??? This is taken from the C++ parser, but building up messages in
782    this way is not i18n-friendly and some other approach should be
783    used.  */
784
785 static void
786 c_parser_error (c_parser *parser, const char *gmsgid)
787 {
788   c_token *token = c_parser_peek_token (parser);
789   if (parser->error)
790     return;
791   parser->error = true;
792   if (!gmsgid)
793     return;
794   /* This diagnostic makes more sense if it is tagged to the line of
795      the token we just peeked at.  */
796   c_parser_set_source_position_from_token (token);
797   c_parse_error (gmsgid,
798                  /* Because c_parse_error does not understand
799                     CPP_KEYWORD, keywords are treated like
800                     identifiers.  */
801                  (token->type == CPP_KEYWORD ? CPP_NAME : token->type),
802                  /* ??? The C parser does not save the cpp flags of a
803                     token, we need to pass 0 here and we will not get
804                     the source spelling of some tokens but rather the
805                     canonical spelling.  */
806                  token->value, /*flags=*/0);
807 }
808
809 /* If the next token is of the indicated TYPE, consume it.  Otherwise,
810    issue the error MSGID.  If MSGID is NULL then a message has already
811    been produced and no message will be produced this time.  Returns
812    true if found, false otherwise.  */
813
814 static bool
815 c_parser_require (c_parser *parser,
816                   enum cpp_ttype type,
817                   const char *msgid)
818 {
819   if (c_parser_next_token_is (parser, type))
820     {
821       c_parser_consume_token (parser);
822       return true;
823     }
824   else
825     {
826       c_parser_error (parser, msgid);
827       return false;
828     }
829 }
830
831 /* If the next token is the indicated keyword, consume it.  Otherwise,
832    issue the error MSGID.  Returns true if found, false otherwise.  */
833
834 static bool
835 c_parser_require_keyword (c_parser *parser,
836                           enum rid keyword,
837                           const char *msgid)
838 {
839   if (c_parser_next_token_is_keyword (parser, keyword))
840     {
841       c_parser_consume_token (parser);
842       return true;
843     }
844   else
845     {
846       c_parser_error (parser, msgid);
847       return false;
848     }
849 }
850
851 /* Like c_parser_require, except that tokens will be skipped until the
852    desired token is found.  An error message is still produced if the
853    next token is not as expected.  If MSGID is NULL then a message has
854    already been produced and no message will be produced this
855    time.  */
856
857 static void
858 c_parser_skip_until_found (c_parser *parser,
859                            enum cpp_ttype type,
860                            const char *msgid)
861 {
862   unsigned nesting_depth = 0;
863
864   if (c_parser_require (parser, type, msgid))
865     return;
866
867   /* Skip tokens until the desired token is found.  */
868   while (true)
869     {
870       /* Peek at the next token.  */
871       c_token *token = c_parser_peek_token (parser);
872       /* If we've reached the token we want, consume it and stop.  */
873       if (token->type == type && !nesting_depth)
874         {
875           c_parser_consume_token (parser);
876           break;
877         }
878
879       /* If we've run out of tokens, stop.  */
880       if (token->type == CPP_EOF)
881         return;
882       if (token->type == CPP_PRAGMA_EOL && parser->in_pragma)
883         return;
884       if (token->type == CPP_OPEN_BRACE
885           || token->type == CPP_OPEN_PAREN
886           || token->type == CPP_OPEN_SQUARE)
887         ++nesting_depth;
888       else if (token->type == CPP_CLOSE_BRACE
889                || token->type == CPP_CLOSE_PAREN
890                || token->type == CPP_CLOSE_SQUARE)
891         {
892           if (nesting_depth-- == 0)
893             break;
894         }
895       /* Consume this token.  */
896       c_parser_consume_token (parser);
897     }
898   parser->error = false;
899 }
900
901 /* Skip tokens until the end of a parameter is found, but do not
902    consume the comma, semicolon or closing delimiter.  */
903
904 static void
905 c_parser_skip_to_end_of_parameter (c_parser *parser)
906 {
907   unsigned nesting_depth = 0;
908
909   while (true)
910     {
911       c_token *token = c_parser_peek_token (parser);
912       if ((token->type == CPP_COMMA || token->type == CPP_SEMICOLON)
913           && !nesting_depth)
914         break;
915       /* If we've run out of tokens, stop.  */
916       if (token->type == CPP_EOF)
917         return;
918       if (token->type == CPP_PRAGMA_EOL && parser->in_pragma)
919         return;
920       if (token->type == CPP_OPEN_BRACE
921           || token->type == CPP_OPEN_PAREN
922           || token->type == CPP_OPEN_SQUARE)
923         ++nesting_depth;
924       else if (token->type == CPP_CLOSE_BRACE
925                || token->type == CPP_CLOSE_PAREN
926                || token->type == CPP_CLOSE_SQUARE)
927         {
928           if (nesting_depth-- == 0)
929             break;
930         }
931       /* Consume this token.  */
932       c_parser_consume_token (parser);
933     }
934   parser->error = false;
935 }
936
937 /* Expect to be at the end of the pragma directive and consume an
938    end of line marker.  */
939
940 static void
941 c_parser_skip_to_pragma_eol (c_parser *parser)
942 {
943   gcc_assert (parser->in_pragma);
944   parser->in_pragma = false;
945
946   if (!c_parser_require (parser, CPP_PRAGMA_EOL, "expected end of line"))
947     while (true)
948       {
949         c_token *token = c_parser_peek_token (parser);
950         if (token->type == CPP_EOF)
951           break;
952         if (token->type == CPP_PRAGMA_EOL)
953           {
954             c_parser_consume_token (parser);
955             break;
956           }
957         c_parser_consume_token (parser);
958       }
959
960   parser->error = false;
961 }
962
963 /* Skip tokens until we have consumed an entire block, or until we
964    have consumed a non-nested ';'.  */
965
966 static void
967 c_parser_skip_to_end_of_block_or_statement (c_parser *parser)
968 {
969   unsigned nesting_depth = 0;
970   bool save_error = parser->error;
971
972   while (true)
973     {
974       c_token *token;
975
976       /* Peek at the next token.  */
977       token = c_parser_peek_token (parser);
978
979       switch (token->type)
980         {
981         case CPP_EOF:
982           return;
983
984         case CPP_PRAGMA_EOL:
985           if (parser->in_pragma)
986             return;
987           break;
988
989         case CPP_SEMICOLON:
990           /* If the next token is a ';', we have reached the
991              end of the statement.  */
992           if (!nesting_depth)
993             {
994               /* Consume the ';'.  */
995               c_parser_consume_token (parser);
996               goto finished;
997             }
998           break;
999
1000         case CPP_CLOSE_BRACE:
1001           /* If the next token is a non-nested '}', then we have
1002              reached the end of the current block.  */
1003           if (nesting_depth == 0 || --nesting_depth == 0)
1004             {
1005               c_parser_consume_token (parser);
1006               goto finished;
1007             }
1008           break;
1009
1010         case CPP_OPEN_BRACE:
1011           /* If it the next token is a '{', then we are entering a new
1012              block.  Consume the entire block.  */
1013           ++nesting_depth;
1014           break;
1015
1016         case CPP_PRAGMA:
1017           /* If we see a pragma, consume the whole thing at once.  We
1018              have some safeguards against consuming pragmas willy-nilly.
1019              Normally, we'd expect to be here with parser->error set,
1020              which disables these safeguards.  But it's possible to get
1021              here for secondary error recovery, after parser->error has
1022              been cleared.  */
1023           c_parser_consume_pragma (parser);
1024           c_parser_skip_to_pragma_eol (parser);
1025           parser->error = save_error;
1026           continue;
1027
1028         default:
1029           break;
1030         }
1031
1032       c_parser_consume_token (parser);
1033     }
1034
1035  finished:
1036   parser->error = false;
1037 }
1038
1039 /* CPP's options (initialized by c-opts.c).  */
1040 extern cpp_options *cpp_opts;
1041
1042 /* Save the warning flags which are controlled by __extension__.  */
1043
1044 static inline int
1045 disable_extension_diagnostics (void)
1046 {
1047   int ret = (pedantic
1048              | (warn_pointer_arith << 1)
1049              | (warn_traditional << 2)
1050              | (flag_iso << 3)
1051              | (warn_long_long << 4)
1052              | (warn_cxx_compat << 5)
1053              | (warn_overlength_strings << 6));
1054   cpp_opts->cpp_pedantic = pedantic = 0;
1055   warn_pointer_arith = 0;
1056   cpp_opts->cpp_warn_traditional = warn_traditional = 0;
1057   flag_iso = 0;
1058   cpp_opts->cpp_warn_long_long = warn_long_long = 0;
1059   warn_cxx_compat = 0;
1060   warn_overlength_strings = 0;
1061   return ret;
1062 }
1063
1064 /* Restore the warning flags which are controlled by __extension__.
1065    FLAGS is the return value from disable_extension_diagnostics.  */
1066
1067 static inline void
1068 restore_extension_diagnostics (int flags)
1069 {
1070   cpp_opts->cpp_pedantic = pedantic = flags & 1;
1071   warn_pointer_arith = (flags >> 1) & 1;
1072   cpp_opts->cpp_warn_traditional = warn_traditional = (flags >> 2) & 1;
1073   flag_iso = (flags >> 3) & 1;
1074   cpp_opts->cpp_warn_long_long = warn_long_long = (flags >> 4) & 1;
1075   warn_cxx_compat = (flags >> 5) & 1;
1076   warn_overlength_strings = (flags >> 6) & 1;
1077 }
1078
1079 /* Possibly kinds of declarator to parse.  */
1080 typedef enum c_dtr_syn {
1081   /* A normal declarator with an identifier.  */
1082   C_DTR_NORMAL,
1083   /* An abstract declarator (maybe empty).  */
1084   C_DTR_ABSTRACT,
1085   /* A parameter declarator: may be either, but after a type name does
1086      not redeclare a typedef name as an identifier if it can
1087      alternatively be interpreted as a typedef name; see DR#009,
1088      applied in C90 TC1, omitted from C99 and reapplied in C99 TC2
1089      following DR#249.  For example, given a typedef T, "int T" and
1090      "int *T" are valid parameter declarations redeclaring T, while
1091      "int (T)" and "int * (T)" and "int (T[])" and "int (T (int))" are
1092      abstract declarators rather than involving redundant parentheses;
1093      the same applies with attributes inside the parentheses before
1094      "T".  */
1095   C_DTR_PARM
1096 } c_dtr_syn;
1097
1098 /* The binary operation precedence levels, where 0 is a dummy lowest level
1099    used for the bottom of the stack.  */
1100 enum c_parser_prec {
1101   PREC_NONE,
1102   PREC_LOGOR,
1103   PREC_LOGAND,
1104   PREC_BITOR,
1105   PREC_BITXOR,
1106   PREC_BITAND,
1107   PREC_EQ,
1108   PREC_REL,
1109   PREC_SHIFT,
1110   PREC_ADD,
1111   PREC_MULT,
1112   NUM_PRECS
1113 };
1114
1115 static void c_parser_external_declaration (c_parser *);
1116 static void c_parser_asm_definition (c_parser *);
1117 static void c_parser_declaration_or_fndef (c_parser *, bool, bool, bool,
1118                                            bool, bool, tree *);
1119 static void c_parser_static_assert_declaration_no_semi (c_parser *);
1120 static void c_parser_static_assert_declaration (c_parser *);
1121 static void c_parser_declspecs (c_parser *, struct c_declspecs *, bool, bool,
1122                                 bool, enum c_lookahead_kind);
1123 static struct c_typespec c_parser_enum_specifier (c_parser *);
1124 static struct c_typespec c_parser_struct_or_union_specifier (c_parser *);
1125 static tree c_parser_struct_declaration (c_parser *);
1126 static struct c_typespec c_parser_typeof_specifier (c_parser *);
1127 static tree c_parser_alignas_specifier (c_parser *);
1128 static struct c_declarator *c_parser_declarator (c_parser *, bool, c_dtr_syn,
1129                                                  bool *);
1130 static struct c_declarator *c_parser_direct_declarator (c_parser *, bool,
1131                                                         c_dtr_syn, bool *);
1132 static struct c_declarator *c_parser_direct_declarator_inner (c_parser *,
1133                                                               bool,
1134                                                               struct c_declarator *);
1135 static struct c_arg_info *c_parser_parms_declarator (c_parser *, bool, tree);
1136 static struct c_arg_info *c_parser_parms_list_declarator (c_parser *, tree,
1137                                                           tree);
1138 static struct c_parm *c_parser_parameter_declaration (c_parser *, tree);
1139 static tree c_parser_simple_asm_expr (c_parser *);
1140 static tree c_parser_attributes (c_parser *);
1141 static struct c_type_name *c_parser_type_name (c_parser *);
1142 static struct c_expr c_parser_initializer (c_parser *);
1143 static struct c_expr c_parser_braced_init (c_parser *, tree, bool);
1144 static void c_parser_initelt (c_parser *, struct obstack *);
1145 static void c_parser_initval (c_parser *, struct c_expr *,
1146                               struct obstack *);
1147 static tree c_parser_compound_statement (c_parser *);
1148 static void c_parser_compound_statement_nostart (c_parser *);
1149 static void c_parser_label (c_parser *);
1150 static void c_parser_statement (c_parser *);
1151 static void c_parser_statement_after_labels (c_parser *);
1152 static void c_parser_if_statement (c_parser *);
1153 static void c_parser_switch_statement (c_parser *);
1154 static void c_parser_while_statement (c_parser *);
1155 static void c_parser_do_statement (c_parser *);
1156 static void c_parser_for_statement (c_parser *);
1157 static tree c_parser_asm_statement (c_parser *);
1158 static tree c_parser_asm_operands (c_parser *, bool);
1159 static tree c_parser_asm_goto_operands (c_parser *);
1160 static tree c_parser_asm_clobbers (c_parser *);
1161 static struct c_expr c_parser_expr_no_commas (c_parser *, struct c_expr *);
1162 static struct c_expr c_parser_conditional_expression (c_parser *,
1163                                                       struct c_expr *);
1164 static struct c_expr c_parser_binary_expression (c_parser *, struct c_expr *,
1165                                                  enum c_parser_prec);
1166 static struct c_expr c_parser_cast_expression (c_parser *, struct c_expr *);
1167 static struct c_expr c_parser_unary_expression (c_parser *);
1168 static struct c_expr c_parser_sizeof_expression (c_parser *);
1169 static struct c_expr c_parser_alignof_expression (c_parser *);
1170 static struct c_expr c_parser_postfix_expression (c_parser *);
1171 static struct c_expr c_parser_postfix_expression_after_paren_type (c_parser *,
1172                                                                    struct c_type_name *,
1173                                                                    location_t);
1174 static struct c_expr c_parser_postfix_expression_after_primary (c_parser *,
1175                                                                 location_t loc,
1176                                                                 struct c_expr);
1177 static tree c_parser_transaction (c_parser *, enum rid);
1178 static struct c_expr c_parser_transaction_expression (c_parser *, enum rid);
1179 static tree c_parser_transaction_cancel (c_parser *);
1180 static struct c_expr c_parser_expression (c_parser *);
1181 static struct c_expr c_parser_expression_conv (c_parser *);
1182 static VEC(tree,gc) *c_parser_expr_list (c_parser *, bool, bool,
1183                                          VEC(tree,gc) **);
1184 static void c_parser_omp_construct (c_parser *);
1185 static void c_parser_omp_threadprivate (c_parser *);
1186 static void c_parser_omp_barrier (c_parser *);
1187 static void c_parser_omp_flush (c_parser *);
1188 static void c_parser_omp_taskwait (c_parser *);
1189 static void c_parser_omp_taskyield (c_parser *);
1190
1191 enum pragma_context { pragma_external, pragma_stmt, pragma_compound };
1192 static bool c_parser_pragma (c_parser *, enum pragma_context);
1193
1194 /* These Objective-C parser functions are only ever called when
1195    compiling Objective-C.  */
1196 static void c_parser_objc_class_definition (c_parser *, tree);
1197 static void c_parser_objc_class_instance_variables (c_parser *);
1198 static void c_parser_objc_class_declaration (c_parser *);
1199 static void c_parser_objc_alias_declaration (c_parser *);
1200 static void c_parser_objc_protocol_definition (c_parser *, tree);
1201 static bool c_parser_objc_method_type (c_parser *);
1202 static void c_parser_objc_method_definition (c_parser *);
1203 static void c_parser_objc_methodprotolist (c_parser *);
1204 static void c_parser_objc_methodproto (c_parser *);
1205 static tree c_parser_objc_method_decl (c_parser *, bool, tree *, tree *);
1206 static tree c_parser_objc_type_name (c_parser *);
1207 static tree c_parser_objc_protocol_refs (c_parser *);
1208 static void c_parser_objc_try_catch_finally_statement (c_parser *);
1209 static void c_parser_objc_synchronized_statement (c_parser *);
1210 static tree c_parser_objc_selector (c_parser *);
1211 static tree c_parser_objc_selector_arg (c_parser *);
1212 static tree c_parser_objc_receiver (c_parser *);
1213 static tree c_parser_objc_message_args (c_parser *);
1214 static tree c_parser_objc_keywordexpr (c_parser *);
1215 static void c_parser_objc_at_property_declaration (c_parser *);
1216 static void c_parser_objc_at_synthesize_declaration (c_parser *);
1217 static void c_parser_objc_at_dynamic_declaration (c_parser *);
1218 static bool c_parser_objc_diagnose_bad_element_prefix
1219   (c_parser *, struct c_declspecs *);
1220
1221 /* Parse a translation unit (C90 6.7, C99 6.9).
1222
1223    translation-unit:
1224      external-declarations
1225
1226    external-declarations:
1227      external-declaration
1228      external-declarations external-declaration
1229
1230    GNU extensions:
1231
1232    translation-unit:
1233      empty
1234 */
1235
1236 static void
1237 c_parser_translation_unit (c_parser *parser)
1238 {
1239   if (c_parser_next_token_is (parser, CPP_EOF))
1240     {
1241       pedwarn (c_parser_peek_token (parser)->location, OPT_pedantic,
1242                "ISO C forbids an empty translation unit");
1243     }
1244   else
1245     {
1246       void *obstack_position = obstack_alloc (&parser_obstack, 0);
1247       mark_valid_location_for_stdc_pragma (false);
1248       do
1249         {
1250           ggc_collect ();
1251           c_parser_external_declaration (parser);
1252           obstack_free (&parser_obstack, obstack_position);
1253         }
1254       while (c_parser_next_token_is_not (parser, CPP_EOF));
1255     }
1256 }
1257
1258 /* Parse an external declaration (C90 6.7, C99 6.9).
1259
1260    external-declaration:
1261      function-definition
1262      declaration
1263
1264    GNU extensions:
1265
1266    external-declaration:
1267      asm-definition
1268      ;
1269      __extension__ external-declaration
1270
1271    Objective-C:
1272
1273    external-declaration:
1274      objc-class-definition
1275      objc-class-declaration
1276      objc-alias-declaration
1277      objc-protocol-definition
1278      objc-method-definition
1279      @end
1280 */
1281
1282 static void
1283 c_parser_external_declaration (c_parser *parser)
1284 {
1285   int ext;
1286   switch (c_parser_peek_token (parser)->type)
1287     {
1288     case CPP_KEYWORD:
1289       switch (c_parser_peek_token (parser)->keyword)
1290         {
1291         case RID_EXTENSION:
1292           ext = disable_extension_diagnostics ();
1293           c_parser_consume_token (parser);
1294           c_parser_external_declaration (parser);
1295           restore_extension_diagnostics (ext);
1296           break;
1297         case RID_ASM:
1298           c_parser_asm_definition (parser);
1299           break;
1300         case RID_AT_INTERFACE:
1301         case RID_AT_IMPLEMENTATION:
1302           gcc_assert (c_dialect_objc ());
1303           c_parser_objc_class_definition (parser, NULL_TREE);
1304           break;
1305         case RID_AT_CLASS:
1306           gcc_assert (c_dialect_objc ());
1307           c_parser_objc_class_declaration (parser);
1308           break;
1309         case RID_AT_ALIAS:
1310           gcc_assert (c_dialect_objc ());
1311           c_parser_objc_alias_declaration (parser);
1312           break;
1313         case RID_AT_PROTOCOL:
1314           gcc_assert (c_dialect_objc ());
1315           c_parser_objc_protocol_definition (parser, NULL_TREE);
1316           break;
1317         case RID_AT_PROPERTY:
1318           gcc_assert (c_dialect_objc ());
1319           c_parser_objc_at_property_declaration (parser);
1320           break;
1321         case RID_AT_SYNTHESIZE:
1322           gcc_assert (c_dialect_objc ());
1323           c_parser_objc_at_synthesize_declaration (parser);
1324           break;
1325         case RID_AT_DYNAMIC:
1326           gcc_assert (c_dialect_objc ());
1327           c_parser_objc_at_dynamic_declaration (parser);
1328           break;
1329         case RID_AT_END:
1330           gcc_assert (c_dialect_objc ());
1331           c_parser_consume_token (parser);
1332           objc_finish_implementation ();
1333           break;
1334         default:
1335           goto decl_or_fndef;
1336         }
1337       break;
1338     case CPP_SEMICOLON:
1339       pedwarn (c_parser_peek_token (parser)->location, OPT_pedantic,
1340                "ISO C does not allow extra %<;%> outside of a function");
1341       c_parser_consume_token (parser);
1342       break;
1343     case CPP_PRAGMA:
1344       mark_valid_location_for_stdc_pragma (true);
1345       c_parser_pragma (parser, pragma_external);
1346       mark_valid_location_for_stdc_pragma (false);
1347       break;
1348     case CPP_PLUS:
1349     case CPP_MINUS:
1350       if (c_dialect_objc ())
1351         {
1352           c_parser_objc_method_definition (parser);
1353           break;
1354         }
1355       /* Else fall through, and yield a syntax error trying to parse
1356          as a declaration or function definition.  */
1357     default:
1358     decl_or_fndef:
1359       /* A declaration or a function definition (or, in Objective-C,
1360          an @interface or @protocol with prefix attributes).  We can
1361          only tell which after parsing the declaration specifiers, if
1362          any, and the first declarator.  */
1363       c_parser_declaration_or_fndef (parser, true, true, true, false, true, NULL);
1364       break;
1365     }
1366 }
1367
1368 /* Parse a declaration or function definition (C90 6.5, 6.7.1, C99
1369    6.7, 6.9.1).  If FNDEF_OK is true, a function definition is
1370    accepted; otherwise (old-style parameter declarations) only other
1371    declarations are accepted.  If STATIC_ASSERT_OK is true, a static
1372    assertion is accepted; otherwise (old-style parameter declarations)
1373    it is not.  If NESTED is true, we are inside a function or parsing
1374    old-style parameter declarations; any functions encountered are
1375    nested functions and declaration specifiers are required; otherwise
1376    we are at top level and functions are normal functions and
1377    declaration specifiers may be optional.  If EMPTY_OK is true, empty
1378    declarations are OK (subject to all other constraints); otherwise
1379    (old-style parameter declarations) they are diagnosed.  If
1380    START_ATTR_OK is true, the declaration specifiers may start with
1381    attributes; otherwise they may not.
1382    OBJC_FOREACH_OBJECT_DECLARATION can be used to get back the parsed
1383    declaration when parsing an Objective-C foreach statement.
1384
1385    declaration:
1386      declaration-specifiers init-declarator-list[opt] ;
1387      static_assert-declaration
1388
1389    function-definition:
1390      declaration-specifiers[opt] declarator declaration-list[opt]
1391        compound-statement
1392
1393    declaration-list:
1394      declaration
1395      declaration-list declaration
1396
1397    init-declarator-list:
1398      init-declarator
1399      init-declarator-list , init-declarator
1400
1401    init-declarator:
1402      declarator simple-asm-expr[opt] attributes[opt]
1403      declarator simple-asm-expr[opt] attributes[opt] = initializer
1404
1405    GNU extensions:
1406
1407    nested-function-definition:
1408      declaration-specifiers declarator declaration-list[opt]
1409        compound-statement
1410
1411    Objective-C:
1412      attributes objc-class-definition
1413      attributes objc-category-definition
1414      attributes objc-protocol-definition
1415
1416    The simple-asm-expr and attributes are GNU extensions.
1417
1418    This function does not handle __extension__; that is handled in its
1419    callers.  ??? Following the old parser, __extension__ may start
1420    external declarations, declarations in functions and declarations
1421    at the start of "for" loops, but not old-style parameter
1422    declarations.
1423
1424    C99 requires declaration specifiers in a function definition; the
1425    absence is diagnosed through the diagnosis of implicit int.  In GNU
1426    C we also allow but diagnose declarations without declaration
1427    specifiers, but only at top level (elsewhere they conflict with
1428    other syntax).
1429
1430    In Objective-C, declarations of the looping variable in a foreach
1431    statement are exceptionally terminated by 'in' (for example, 'for
1432    (NSObject *object in array) { ... }').
1433
1434    OpenMP:
1435
1436    declaration:
1437      threadprivate-directive  */
1438
1439 static void
1440 c_parser_declaration_or_fndef (c_parser *parser, bool fndef_ok,
1441                                bool static_assert_ok, bool empty_ok,
1442                                bool nested, bool start_attr_ok,
1443                                tree *objc_foreach_object_declaration)
1444 {
1445   struct c_declspecs *specs;
1446   tree prefix_attrs;
1447   tree all_prefix_attrs;
1448   bool diagnosed_no_specs = false;
1449   location_t here = c_parser_peek_token (parser)->location;
1450
1451   if (static_assert_ok
1452       && c_parser_next_token_is_keyword (parser, RID_STATIC_ASSERT))
1453     {
1454       c_parser_static_assert_declaration (parser);
1455       return;
1456     }
1457   specs = build_null_declspecs ();
1458
1459   /* Try to detect an unknown type name when we have "A B" or "A *B".  */
1460   if (c_parser_peek_token (parser)->type == CPP_NAME
1461       && c_parser_peek_token (parser)->id_kind == C_ID_ID
1462       && (c_parser_peek_2nd_token (parser)->type == CPP_NAME
1463           || c_parser_peek_2nd_token (parser)->type == CPP_MULT)
1464       && (!nested || !lookup_name (c_parser_peek_token (parser)->value)))
1465     {
1466       error_at (here, "unknown type name %qE",
1467                 c_parser_peek_token (parser)->value);
1468
1469       /* Parse declspecs normally to get a correct pointer type, but avoid
1470          a further "fails to be a type name" error.  Refuse nested functions
1471          since it is not how the user likely wants us to recover.  */
1472       c_parser_peek_token (parser)->type = CPP_KEYWORD;
1473       c_parser_peek_token (parser)->keyword = RID_VOID;
1474       c_parser_peek_token (parser)->value = error_mark_node;
1475       fndef_ok = !nested;
1476     }
1477
1478   c_parser_declspecs (parser, specs, true, true, start_attr_ok, cla_nonabstract_decl);
1479   if (parser->error)
1480     {
1481       c_parser_skip_to_end_of_block_or_statement (parser);
1482       return;
1483     }
1484   if (nested && !specs->declspecs_seen_p)
1485     {
1486       c_parser_error (parser, "expected declaration specifiers");
1487       c_parser_skip_to_end_of_block_or_statement (parser);
1488       return;
1489     }
1490   finish_declspecs (specs);
1491   if (c_parser_next_token_is (parser, CPP_SEMICOLON))
1492     {
1493       if (empty_ok)
1494         shadow_tag (specs);
1495       else
1496         {
1497           shadow_tag_warned (specs, 1);
1498           pedwarn (here, 0, "empty declaration");
1499         }
1500       c_parser_consume_token (parser);
1501       return;
1502     }
1503
1504   /* Provide better error recovery.  Note that a type name here is usually
1505      better diagnosed as a redeclaration.  */
1506   if (empty_ok
1507       && specs->typespec_kind == ctsk_tagdef
1508       && c_parser_next_token_starts_declspecs (parser)
1509       && !c_parser_next_token_is (parser, CPP_NAME))
1510     {
1511       c_parser_error (parser, "expected %<;%>, identifier or %<(%>");
1512       parser->error = false;
1513       shadow_tag_warned (specs, 1);
1514       return;
1515     }
1516   else if (c_dialect_objc ())
1517     {
1518       /* Prefix attributes are an error on method decls.  */
1519       switch (c_parser_peek_token (parser)->type)
1520         {
1521           case CPP_PLUS:
1522           case CPP_MINUS:
1523             if (c_parser_objc_diagnose_bad_element_prefix (parser, specs))
1524               return;
1525             if (specs->attrs)
1526               {
1527                 warning_at (c_parser_peek_token (parser)->location, 
1528                             OPT_Wattributes,
1529                             "prefix attributes are ignored for methods");
1530                 specs->attrs = NULL_TREE;
1531               }
1532             if (fndef_ok)
1533               c_parser_objc_method_definition (parser);
1534             else
1535               c_parser_objc_methodproto (parser);
1536             return;
1537             break;
1538           default:
1539             break;
1540         }
1541       /* This is where we parse 'attributes @interface ...',
1542          'attributes @implementation ...', 'attributes @protocol ...'
1543          (where attributes could be, for example, __attribute__
1544          ((deprecated)).
1545       */
1546       switch (c_parser_peek_token (parser)->keyword)
1547         {
1548         case RID_AT_INTERFACE:
1549           {
1550             if (c_parser_objc_diagnose_bad_element_prefix (parser, specs))
1551               return;
1552             c_parser_objc_class_definition (parser, specs->attrs);
1553             return;
1554           }
1555           break;
1556         case RID_AT_IMPLEMENTATION:
1557           {
1558             if (c_parser_objc_diagnose_bad_element_prefix (parser, specs))
1559               return;
1560             if (specs->attrs)
1561               {
1562                 warning_at (c_parser_peek_token (parser)->location, 
1563                         OPT_Wattributes,
1564                         "prefix attributes are ignored for implementations");
1565                 specs->attrs = NULL_TREE;
1566               }
1567             c_parser_objc_class_definition (parser, NULL_TREE);     
1568             return;
1569           }
1570           break;
1571         case RID_AT_PROTOCOL:
1572           {
1573             if (c_parser_objc_diagnose_bad_element_prefix (parser, specs))
1574               return;
1575             c_parser_objc_protocol_definition (parser, specs->attrs);
1576             return;
1577           }
1578           break;
1579         case RID_AT_ALIAS:
1580         case RID_AT_CLASS:
1581         case RID_AT_END:
1582         case RID_AT_PROPERTY:
1583           if (specs->attrs)
1584             {
1585               c_parser_error (parser, "unexpected attribute");
1586               specs->attrs = NULL;
1587             }
1588           break;
1589         default:
1590           break;
1591         }
1592     }
1593   
1594   pending_xref_error ();
1595   prefix_attrs = specs->attrs;
1596   all_prefix_attrs = prefix_attrs;
1597   specs->attrs = NULL_TREE;
1598   while (true)
1599     {
1600       struct c_declarator *declarator;
1601       bool dummy = false;
1602       timevar_id_t tv;
1603       tree fnbody;
1604       /* Declaring either one or more declarators (in which case we
1605          should diagnose if there were no declaration specifiers) or a
1606          function definition (in which case the diagnostic for
1607          implicit int suffices).  */
1608       declarator = c_parser_declarator (parser, 
1609                                         specs->typespec_kind != ctsk_none,
1610                                         C_DTR_NORMAL, &dummy);
1611       if (declarator == NULL)
1612         {
1613           c_parser_skip_to_end_of_block_or_statement (parser);
1614           return;
1615         }
1616       if (c_parser_next_token_is (parser, CPP_EQ)
1617           || c_parser_next_token_is (parser, CPP_COMMA)
1618           || c_parser_next_token_is (parser, CPP_SEMICOLON)
1619           || c_parser_next_token_is_keyword (parser, RID_ASM)
1620           || c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE)
1621           || c_parser_next_token_is_keyword (parser, RID_IN))
1622         {
1623           tree asm_name = NULL_TREE;
1624           tree postfix_attrs = NULL_TREE;
1625           if (!diagnosed_no_specs && !specs->declspecs_seen_p)
1626             {
1627               diagnosed_no_specs = true;
1628               pedwarn (here, 0, "data definition has no type or storage class");
1629             }
1630           /* Having seen a data definition, there cannot now be a
1631              function definition.  */
1632           fndef_ok = false;
1633           if (c_parser_next_token_is_keyword (parser, RID_ASM))
1634             asm_name = c_parser_simple_asm_expr (parser);
1635           if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
1636             postfix_attrs = c_parser_attributes (parser);
1637           if (c_parser_next_token_is (parser, CPP_EQ))
1638             {
1639               tree d;
1640               struct c_expr init;
1641               location_t init_loc;
1642               c_parser_consume_token (parser);
1643               /* The declaration of the variable is in effect while
1644                  its initializer is parsed.  */
1645               d = start_decl (declarator, specs, true,
1646                               chainon (postfix_attrs, all_prefix_attrs));
1647               if (!d)
1648                 d = error_mark_node;
1649               start_init (d, asm_name, global_bindings_p ());
1650               init_loc = c_parser_peek_token (parser)->location;
1651               init = c_parser_initializer (parser);
1652               finish_init ();
1653               if (d != error_mark_node)
1654                 {
1655                   maybe_warn_string_init (TREE_TYPE (d), init);
1656                   finish_decl (d, init_loc, init.value,
1657                                init.original_type, asm_name);
1658                 }
1659             }
1660           else
1661             {
1662               tree d = start_decl (declarator, specs, false,
1663                                    chainon (postfix_attrs,
1664                                             all_prefix_attrs));
1665               if (d)
1666                 finish_decl (d, UNKNOWN_LOCATION, NULL_TREE,
1667                              NULL_TREE, asm_name);
1668               
1669               if (c_parser_next_token_is_keyword (parser, RID_IN))
1670                 {
1671                   if (d)
1672                     *objc_foreach_object_declaration = d;
1673                   else
1674                     *objc_foreach_object_declaration = error_mark_node;             
1675                 }
1676             }
1677           if (c_parser_next_token_is (parser, CPP_COMMA))
1678             {
1679               c_parser_consume_token (parser);
1680               if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
1681                 all_prefix_attrs = chainon (c_parser_attributes (parser),
1682                                             prefix_attrs);
1683               else
1684                 all_prefix_attrs = prefix_attrs;
1685               continue;
1686             }
1687           else if (c_parser_next_token_is (parser, CPP_SEMICOLON))
1688             {
1689               c_parser_consume_token (parser);
1690               return;
1691             }
1692           else if (c_parser_next_token_is_keyword (parser, RID_IN))
1693             {
1694               /* This can only happen in Objective-C: we found the
1695                  'in' that terminates the declaration inside an
1696                  Objective-C foreach statement.  Do not consume the
1697                  token, so that the caller can use it to determine
1698                  that this indeed is a foreach context.  */
1699               return;
1700             }
1701           else
1702             {
1703               c_parser_error (parser, "expected %<,%> or %<;%>");
1704               c_parser_skip_to_end_of_block_or_statement (parser);
1705               return;
1706             }
1707         }
1708       else if (!fndef_ok)
1709         {
1710           c_parser_error (parser, "expected %<=%>, %<,%>, %<;%>, "
1711                           "%<asm%> or %<__attribute__%>");
1712           c_parser_skip_to_end_of_block_or_statement (parser);
1713           return;
1714         }
1715       /* Function definition (nested or otherwise).  */
1716       if (nested)
1717         {
1718           pedwarn (here, OPT_pedantic, "ISO C forbids nested functions");
1719           c_push_function_context ();
1720         }
1721       if (!start_function (specs, declarator, all_prefix_attrs))
1722         {
1723           /* This can appear in many cases looking nothing like a
1724              function definition, so we don't give a more specific
1725              error suggesting there was one.  */
1726           c_parser_error (parser, "expected %<=%>, %<,%>, %<;%>, %<asm%> "
1727                           "or %<__attribute__%>");
1728           if (nested)
1729             c_pop_function_context ();
1730           break;
1731         }
1732
1733       if (DECL_DECLARED_INLINE_P (current_function_decl))
1734         tv = TV_PARSE_INLINE;
1735       else
1736         tv = TV_PARSE_FUNC;
1737       timevar_push (tv);
1738
1739       /* Parse old-style parameter declarations.  ??? Attributes are
1740          not allowed to start declaration specifiers here because of a
1741          syntax conflict between a function declaration with attribute
1742          suffix and a function definition with an attribute prefix on
1743          first old-style parameter declaration.  Following the old
1744          parser, they are not accepted on subsequent old-style
1745          parameter declarations either.  However, there is no
1746          ambiguity after the first declaration, nor indeed on the
1747          first as long as we don't allow postfix attributes after a
1748          declarator with a nonempty identifier list in a definition;
1749          and postfix attributes have never been accepted here in
1750          function definitions either.  */
1751       while (c_parser_next_token_is_not (parser, CPP_EOF)
1752              && c_parser_next_token_is_not (parser, CPP_OPEN_BRACE))
1753         c_parser_declaration_or_fndef (parser, false, false, false,
1754                                        true, false, NULL);
1755       store_parm_decls ();
1756       DECL_STRUCT_FUNCTION (current_function_decl)->function_start_locus
1757         = c_parser_peek_token (parser)->location;
1758       fnbody = c_parser_compound_statement (parser);
1759       if (nested)
1760         {
1761           tree decl = current_function_decl;
1762           /* Mark nested functions as needing static-chain initially.
1763              lower_nested_functions will recompute it but the
1764              DECL_STATIC_CHAIN flag is also used before that happens,
1765              by initializer_constant_valid_p.  See gcc.dg/nested-fn-2.c.  */
1766           DECL_STATIC_CHAIN (decl) = 1;
1767           add_stmt (fnbody);
1768           finish_function ();
1769           c_pop_function_context ();
1770           add_stmt (build_stmt (DECL_SOURCE_LOCATION (decl), DECL_EXPR, decl));
1771         }
1772       else
1773         {
1774           add_stmt (fnbody);
1775           finish_function ();
1776         }
1777
1778       timevar_pop (tv);
1779       break;
1780     }
1781 }
1782
1783 /* Parse an asm-definition (asm() outside a function body).  This is a
1784    GNU extension.
1785
1786    asm-definition:
1787      simple-asm-expr ;
1788 */
1789
1790 static void
1791 c_parser_asm_definition (c_parser *parser)
1792 {
1793   tree asm_str = c_parser_simple_asm_expr (parser);
1794   if (asm_str)
1795     cgraph_add_asm_node (asm_str);
1796   c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
1797 }
1798
1799 /* Parse a static assertion (C11 6.7.10).
1800
1801    static_assert-declaration:
1802      static_assert-declaration-no-semi ;
1803 */
1804
1805 static void
1806 c_parser_static_assert_declaration (c_parser *parser)
1807 {
1808   c_parser_static_assert_declaration_no_semi (parser);
1809   if (parser->error
1810       || !c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>"))
1811     c_parser_skip_to_end_of_block_or_statement (parser);
1812 }
1813
1814 /* Parse a static assertion (C11 6.7.10), without the trailing
1815    semicolon.
1816
1817    static_assert-declaration-no-semi:
1818      _Static_assert ( constant-expression , string-literal )
1819 */
1820
1821 static void
1822 c_parser_static_assert_declaration_no_semi (c_parser *parser)
1823 {
1824   location_t assert_loc, value_loc;
1825   tree value;
1826   tree string;
1827
1828   gcc_assert (c_parser_next_token_is_keyword (parser, RID_STATIC_ASSERT));
1829   assert_loc = c_parser_peek_token (parser)->location;
1830   if (!flag_isoc11)
1831     {
1832       if (flag_isoc99)
1833         pedwarn (assert_loc, OPT_pedantic,
1834                  "ISO C99 does not support %<_Static_assert%>");
1835       else
1836         pedwarn (assert_loc, OPT_pedantic,
1837                  "ISO C90 does not support %<_Static_assert%>");
1838     }
1839   c_parser_consume_token (parser);
1840   if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
1841     return;
1842   value_loc = c_parser_peek_token (parser)->location;
1843   value = c_parser_expr_no_commas (parser, NULL).value;
1844   parser->lex_untranslated_string = true;
1845   if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
1846     {
1847       parser->lex_untranslated_string = false;
1848       return;
1849     }
1850   switch (c_parser_peek_token (parser)->type)
1851     {
1852     case CPP_STRING:
1853     case CPP_STRING16:
1854     case CPP_STRING32:
1855     case CPP_WSTRING:
1856     case CPP_UTF8STRING:
1857       string = c_parser_peek_token (parser)->value;
1858       c_parser_consume_token (parser);
1859       parser->lex_untranslated_string = false;
1860       break;
1861     default:
1862       c_parser_error (parser, "expected string literal");
1863       parser->lex_untranslated_string = false;
1864       return;
1865     }
1866   c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>");
1867
1868   if (!INTEGRAL_TYPE_P (TREE_TYPE (value)))
1869     {
1870       error_at (value_loc, "expression in static assertion is not an integer");
1871       return;
1872     }
1873   if (TREE_CODE (value) != INTEGER_CST)
1874     {
1875       value = c_fully_fold (value, false, NULL);
1876       if (TREE_CODE (value) == INTEGER_CST)
1877         pedwarn (value_loc, OPT_pedantic, "expression in static assertion "
1878                  "is not an integer constant expression");
1879     }
1880   if (TREE_CODE (value) != INTEGER_CST)
1881     {
1882       error_at (value_loc, "expression in static assertion is not constant");
1883       return;
1884     }
1885   constant_expression_warning (value);
1886   if (integer_zerop (value))
1887     error_at (assert_loc, "static assertion failed: %E", string);
1888 }
1889
1890 /* Parse some declaration specifiers (possibly none) (C90 6.5, C99
1891    6.7), adding them to SPECS (which may already include some).
1892    Storage class specifiers are accepted iff SCSPEC_OK; type
1893    specifiers are accepted iff TYPESPEC_OK; attributes are accepted at
1894    the start iff START_ATTR_OK.
1895
1896    declaration-specifiers:
1897      storage-class-specifier declaration-specifiers[opt]
1898      type-specifier declaration-specifiers[opt]
1899      type-qualifier declaration-specifiers[opt]
1900      function-specifier declaration-specifiers[opt]
1901      alignment-specifier declaration-specifiers[opt]
1902
1903    Function specifiers (inline) are from C99, and are currently
1904    handled as storage class specifiers, as is __thread.  Alignment
1905    specifiers are from C11.
1906
1907    C90 6.5.1, C99 6.7.1:
1908    storage-class-specifier:
1909      typedef
1910      extern
1911      static
1912      auto
1913      register
1914
1915    C99 6.7.4:
1916    function-specifier:
1917      inline
1918      _Noreturn
1919
1920    (_Noreturn is new in C11.)
1921
1922    C90 6.5.2, C99 6.7.2:
1923    type-specifier:
1924      void
1925      char
1926      short
1927      int
1928      long
1929      float
1930      double
1931      signed
1932      unsigned
1933      _Bool
1934      _Complex
1935      [_Imaginary removed in C99 TC2]
1936      struct-or-union-specifier
1937      enum-specifier
1938      typedef-name
1939
1940    (_Bool and _Complex are new in C99.)
1941
1942    C90 6.5.3, C99 6.7.3:
1943
1944    type-qualifier:
1945      const
1946      restrict
1947      volatile
1948      address-space-qualifier
1949
1950    (restrict is new in C99.)
1951
1952    GNU extensions:
1953
1954    declaration-specifiers:
1955      attributes declaration-specifiers[opt]
1956
1957    type-qualifier:
1958      address-space
1959
1960    address-space:
1961      identifier recognized by the target
1962
1963    storage-class-specifier:
1964      __thread
1965
1966    type-specifier:
1967      typeof-specifier
1968      __int128
1969      _Decimal32
1970      _Decimal64
1971      _Decimal128
1972      _Fract
1973      _Accum
1974      _Sat
1975
1976   (_Fract, _Accum, and _Sat are new from ISO/IEC DTR 18037:
1977    http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1169.pdf)
1978
1979    Objective-C:
1980
1981    type-specifier:
1982      class-name objc-protocol-refs[opt]
1983      typedef-name objc-protocol-refs
1984      objc-protocol-refs
1985 */
1986
1987 static void
1988 c_parser_declspecs (c_parser *parser, struct c_declspecs *specs,
1989                     bool scspec_ok, bool typespec_ok, bool start_attr_ok,
1990                     enum c_lookahead_kind la)
1991 {
1992   bool attrs_ok = start_attr_ok;
1993   bool seen_type = specs->typespec_kind != ctsk_none;
1994
1995   if (!typespec_ok)
1996     gcc_assert (la == cla_prefer_id);
1997
1998   while (c_parser_next_token_is (parser, CPP_NAME)
1999          || c_parser_next_token_is (parser, CPP_KEYWORD)
2000          || (c_dialect_objc () && c_parser_next_token_is (parser, CPP_LESS)))
2001     {
2002       struct c_typespec t;
2003       tree attrs;
2004       tree align;
2005       location_t loc = c_parser_peek_token (parser)->location;
2006
2007       /* If we cannot accept a type, exit if the next token must start
2008          one.  Also, if we already have seen a tagged definition,
2009          a typename would be an error anyway and likely the user
2010          has simply forgotten a semicolon, so we exit.  */
2011       if ((!typespec_ok || specs->typespec_kind == ctsk_tagdef)
2012           && c_parser_next_tokens_start_typename (parser, la)
2013           && !c_parser_next_token_is_qualifier (parser))
2014         break;
2015
2016       if (c_parser_next_token_is (parser, CPP_NAME))
2017         {
2018           tree value = c_parser_peek_token (parser)->value;
2019           c_id_kind kind = c_parser_peek_token (parser)->id_kind;
2020
2021           if (kind == C_ID_ADDRSPACE)
2022             {
2023               addr_space_t as
2024                 = c_parser_peek_token (parser)->keyword - RID_FIRST_ADDR_SPACE;
2025               declspecs_add_addrspace (specs, as);
2026               c_parser_consume_token (parser);
2027               attrs_ok = true;
2028               continue;
2029             }
2030
2031           gcc_assert (!c_parser_next_token_is_qualifier (parser));
2032
2033           /* If we cannot accept a type, and the next token must start one,
2034              exit.  Do the same if we already have seen a tagged definition,
2035              since it would be an error anyway and likely the user has simply
2036              forgotten a semicolon.  */
2037           if (seen_type || !c_parser_next_tokens_start_typename (parser, la))
2038             break;
2039
2040           /* Now at an unknown typename (C_ID_ID), a C_ID_TYPENAME or
2041              a C_ID_CLASSNAME.  */
2042           c_parser_consume_token (parser);
2043           seen_type = true;
2044           attrs_ok = true;
2045           if (kind == C_ID_ID)
2046             {
2047               error ("unknown type name %qE", value);
2048               t.kind = ctsk_typedef;
2049               t.spec = error_mark_node;
2050             }
2051           else if (kind == C_ID_TYPENAME
2052                    && (!c_dialect_objc ()
2053                        || c_parser_next_token_is_not (parser, CPP_LESS)))
2054             {
2055               t.kind = ctsk_typedef;
2056               /* For a typedef name, record the meaning, not the name.
2057                  In case of 'foo foo, bar;'.  */
2058               t.spec = lookup_name (value);
2059             }
2060           else
2061             {
2062               tree proto = NULL_TREE;
2063               gcc_assert (c_dialect_objc ());
2064               t.kind = ctsk_objc;
2065               if (c_parser_next_token_is (parser, CPP_LESS))
2066                 proto = c_parser_objc_protocol_refs (parser);
2067               t.spec = objc_get_protocol_qualified_type (value, proto);
2068             }
2069           t.expr = NULL_TREE;
2070           t.expr_const_operands = true;
2071           declspecs_add_type (loc, specs, t);
2072           continue;
2073         }
2074       if (c_parser_next_token_is (parser, CPP_LESS))
2075         {
2076           /* Make "<SomeProtocol>" equivalent to "id <SomeProtocol>" -
2077              nisse@lysator.liu.se.  */
2078           tree proto;
2079           gcc_assert (c_dialect_objc ());
2080           if (!typespec_ok || seen_type)
2081             break;
2082           proto = c_parser_objc_protocol_refs (parser);
2083           t.kind = ctsk_objc;
2084           t.spec = objc_get_protocol_qualified_type (NULL_TREE, proto);
2085           t.expr = NULL_TREE;
2086           t.expr_const_operands = true;
2087           declspecs_add_type (loc, specs, t);
2088           continue;
2089         }
2090       gcc_assert (c_parser_next_token_is (parser, CPP_KEYWORD));
2091       switch (c_parser_peek_token (parser)->keyword)
2092         {
2093         case RID_STATIC:
2094         case RID_EXTERN:
2095         case RID_REGISTER:
2096         case RID_TYPEDEF:
2097         case RID_INLINE:
2098         case RID_NORETURN:
2099         case RID_AUTO:
2100         case RID_THREAD:
2101           if (!scspec_ok)
2102             goto out;
2103           attrs_ok = true;
2104           /* TODO: Distinguish between function specifiers (inline, noreturn)
2105              and storage class specifiers, either here or in
2106              declspecs_add_scspec.  */
2107           declspecs_add_scspec (specs, c_parser_peek_token (parser)->value);
2108           c_parser_consume_token (parser);
2109           break;
2110         case RID_UNSIGNED:
2111         case RID_LONG:
2112         case RID_INT128:
2113         case RID_SHORT:
2114         case RID_SIGNED:
2115         case RID_COMPLEX:
2116         case RID_INT:
2117         case RID_CHAR:
2118         case RID_FLOAT:
2119         case RID_DOUBLE:
2120         case RID_VOID:
2121         case RID_DFLOAT32:
2122         case RID_DFLOAT64:
2123         case RID_DFLOAT128:
2124         case RID_BOOL:
2125         case RID_FRACT:
2126         case RID_ACCUM:
2127         case RID_SAT:
2128           if (!typespec_ok)
2129             goto out;
2130           attrs_ok = true;
2131           seen_type = true;
2132           if (c_dialect_objc ())
2133             parser->objc_need_raw_identifier = true;
2134           t.kind = ctsk_resword;
2135           t.spec = c_parser_peek_token (parser)->value;
2136           t.expr = NULL_TREE;
2137           t.expr_const_operands = true;
2138           declspecs_add_type (loc, specs, t);
2139           c_parser_consume_token (parser);
2140           break;
2141         case RID_ENUM:
2142           if (!typespec_ok)
2143             goto out;
2144           attrs_ok = true;
2145           seen_type = true;
2146           t = c_parser_enum_specifier (parser);
2147           declspecs_add_type (loc, specs, t);
2148           break;
2149         case RID_STRUCT:
2150         case RID_UNION:
2151           if (!typespec_ok)
2152             goto out;
2153           attrs_ok = true;
2154           seen_type = true;
2155           t = c_parser_struct_or_union_specifier (parser);
2156           invoke_plugin_callbacks (PLUGIN_FINISH_TYPE, t.spec);
2157           declspecs_add_type (loc, specs, t);
2158           break;
2159         case RID_TYPEOF:
2160           /* ??? The old parser rejected typeof after other type
2161              specifiers, but is a syntax error the best way of
2162              handling this?  */
2163           if (!typespec_ok || seen_type)
2164             goto out;
2165           attrs_ok = true;
2166           seen_type = true;
2167           t = c_parser_typeof_specifier (parser);
2168           declspecs_add_type (loc, specs, t);
2169           break;
2170         case RID_CONST:
2171         case RID_VOLATILE:
2172         case RID_RESTRICT:
2173           attrs_ok = true;
2174           declspecs_add_qual (specs, c_parser_peek_token (parser)->value);
2175           c_parser_consume_token (parser);
2176           break;
2177         case RID_ATTRIBUTE:
2178           if (!attrs_ok)
2179             goto out;
2180           attrs = c_parser_attributes (parser);
2181           declspecs_add_attrs (specs, attrs);
2182           break;
2183         case RID_ALIGNAS:
2184           align = c_parser_alignas_specifier (parser);
2185           declspecs_add_alignas (specs, align);
2186           break;
2187         default:
2188           goto out;
2189         }
2190     }
2191  out: ;
2192 }
2193
2194 /* Parse an enum specifier (C90 6.5.2.2, C99 6.7.2.2).
2195
2196    enum-specifier:
2197      enum attributes[opt] identifier[opt] { enumerator-list } attributes[opt]
2198      enum attributes[opt] identifier[opt] { enumerator-list , } attributes[opt]
2199      enum attributes[opt] identifier
2200
2201    The form with trailing comma is new in C99.  The forms with
2202    attributes are GNU extensions.  In GNU C, we accept any expression
2203    without commas in the syntax (assignment expressions, not just
2204    conditional expressions); assignment expressions will be diagnosed
2205    as non-constant.
2206
2207    enumerator-list:
2208      enumerator
2209      enumerator-list , enumerator
2210
2211    enumerator:
2212      enumeration-constant
2213      enumeration-constant = constant-expression
2214 */
2215
2216 static struct c_typespec
2217 c_parser_enum_specifier (c_parser *parser)
2218 {
2219   struct c_typespec ret;
2220   tree attrs;
2221   tree ident = NULL_TREE;
2222   location_t enum_loc;
2223   location_t ident_loc = UNKNOWN_LOCATION;  /* Quiet warning.  */
2224   gcc_assert (c_parser_next_token_is_keyword (parser, RID_ENUM));
2225   enum_loc = c_parser_peek_token (parser)->location;
2226   c_parser_consume_token (parser);
2227   attrs = c_parser_attributes (parser);
2228   enum_loc = c_parser_peek_token (parser)->location;
2229   /* Set the location in case we create a decl now.  */
2230   c_parser_set_source_position_from_token (c_parser_peek_token (parser));
2231   if (c_parser_next_token_is (parser, CPP_NAME))
2232     {
2233       ident = c_parser_peek_token (parser)->value;
2234       ident_loc = c_parser_peek_token (parser)->location;
2235       enum_loc = ident_loc;
2236       c_parser_consume_token (parser);
2237     }
2238   if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
2239     {
2240       /* Parse an enum definition.  */
2241       struct c_enum_contents the_enum;
2242       tree type;
2243       tree postfix_attrs;
2244       /* We chain the enumerators in reverse order, then put them in
2245          forward order at the end.  */
2246       tree values;
2247       timevar_push (TV_PARSE_ENUM);
2248       type = start_enum (enum_loc, &the_enum, ident);
2249       values = NULL_TREE;
2250       c_parser_consume_token (parser);
2251       while (true)
2252         {
2253           tree enum_id;
2254           tree enum_value;
2255           tree enum_decl;
2256           bool seen_comma;
2257           c_token *token;
2258           location_t comma_loc = UNKNOWN_LOCATION;  /* Quiet warning.  */
2259           location_t decl_loc, value_loc;
2260           if (c_parser_next_token_is_not (parser, CPP_NAME))
2261             {
2262               c_parser_error (parser, "expected identifier");
2263               c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL);
2264               values = error_mark_node;
2265               break;
2266             }
2267           token = c_parser_peek_token (parser);
2268           enum_id = token->value;
2269           /* Set the location in case we create a decl now.  */
2270           c_parser_set_source_position_from_token (token);
2271           decl_loc = value_loc = token->location;
2272           c_parser_consume_token (parser);
2273           if (c_parser_next_token_is (parser, CPP_EQ))
2274             {
2275               c_parser_consume_token (parser);
2276               value_loc = c_parser_peek_token (parser)->location;
2277               enum_value = c_parser_expr_no_commas (parser, NULL).value;
2278             }
2279           else
2280             enum_value = NULL_TREE;
2281           enum_decl = build_enumerator (decl_loc, value_loc,
2282                                         &the_enum, enum_id, enum_value);
2283           TREE_CHAIN (enum_decl) = values;
2284           values = enum_decl;
2285           seen_comma = false;
2286           if (c_parser_next_token_is (parser, CPP_COMMA))
2287             {
2288               comma_loc = c_parser_peek_token (parser)->location;
2289               seen_comma = true;
2290               c_parser_consume_token (parser);
2291             }
2292           if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
2293             {
2294               if (seen_comma && !flag_isoc99)
2295                 pedwarn (comma_loc, OPT_pedantic, "comma at end of enumerator list");
2296               c_parser_consume_token (parser);
2297               break;
2298             }
2299           if (!seen_comma)
2300             {
2301               c_parser_error (parser, "expected %<,%> or %<}%>");
2302               c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL);
2303               values = error_mark_node;
2304               break;
2305             }
2306         }
2307       postfix_attrs = c_parser_attributes (parser);
2308       ret.spec = finish_enum (type, nreverse (values),
2309                               chainon (attrs, postfix_attrs));
2310       ret.kind = ctsk_tagdef;
2311       ret.expr = NULL_TREE;
2312       ret.expr_const_operands = true;
2313       timevar_pop (TV_PARSE_ENUM);
2314       return ret;
2315     }
2316   else if (!ident)
2317     {
2318       c_parser_error (parser, "expected %<{%>");
2319       ret.spec = error_mark_node;
2320       ret.kind = ctsk_tagref;
2321       ret.expr = NULL_TREE;
2322       ret.expr_const_operands = true;
2323       return ret;
2324     }
2325   ret = parser_xref_tag (ident_loc, ENUMERAL_TYPE, ident);
2326   /* In ISO C, enumerated types can be referred to only if already
2327      defined.  */
2328   if (pedantic && !COMPLETE_TYPE_P (ret.spec))
2329     {
2330       gcc_assert (ident);
2331       pedwarn (enum_loc, OPT_pedantic,
2332                "ISO C forbids forward references to %<enum%> types");
2333     }
2334   return ret;
2335 }
2336
2337 /* Parse a struct or union specifier (C90 6.5.2.1, C99 6.7.2.1).
2338
2339    struct-or-union-specifier:
2340      struct-or-union attributes[opt] identifier[opt]
2341        { struct-contents } attributes[opt]
2342      struct-or-union attributes[opt] identifier
2343
2344    struct-contents:
2345      struct-declaration-list
2346
2347    struct-declaration-list:
2348      struct-declaration ;
2349      struct-declaration-list struct-declaration ;
2350
2351    GNU extensions:
2352
2353    struct-contents:
2354      empty
2355      struct-declaration
2356      struct-declaration-list struct-declaration
2357
2358    struct-declaration-list:
2359      struct-declaration-list ;
2360      ;
2361
2362    (Note that in the syntax here, unlike that in ISO C, the semicolons
2363    are included here rather than in struct-declaration, in order to
2364    describe the syntax with extra semicolons and missing semicolon at
2365    end.)
2366
2367    Objective-C:
2368
2369    struct-declaration-list:
2370      @defs ( class-name )
2371
2372    (Note this does not include a trailing semicolon, but can be
2373    followed by further declarations, and gets a pedwarn-if-pedantic
2374    when followed by a semicolon.)  */
2375
2376 static struct c_typespec
2377 c_parser_struct_or_union_specifier (c_parser *parser)
2378 {
2379   struct c_typespec ret;
2380   tree attrs;
2381   tree ident = NULL_TREE;
2382   location_t struct_loc;
2383   location_t ident_loc = UNKNOWN_LOCATION;
2384   enum tree_code code;
2385   switch (c_parser_peek_token (parser)->keyword)
2386     {
2387     case RID_STRUCT:
2388       code = RECORD_TYPE;
2389       break;
2390     case RID_UNION:
2391       code = UNION_TYPE;
2392       break;
2393     default:
2394       gcc_unreachable ();
2395     }
2396   struct_loc = c_parser_peek_token (parser)->location;
2397   c_parser_consume_token (parser);
2398   attrs = c_parser_attributes (parser);
2399
2400   /* Set the location in case we create a decl now.  */
2401   c_parser_set_source_position_from_token (c_parser_peek_token (parser));
2402
2403   if (c_parser_next_token_is (parser, CPP_NAME))
2404     {
2405       ident = c_parser_peek_token (parser)->value;
2406       ident_loc = c_parser_peek_token (parser)->location;
2407       struct_loc = ident_loc;
2408       c_parser_consume_token (parser);
2409     }
2410   if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
2411     {
2412       /* Parse a struct or union definition.  Start the scope of the
2413          tag before parsing components.  */
2414       struct c_struct_parse_info *struct_info;
2415       tree type = start_struct (struct_loc, code, ident, &struct_info);
2416       tree postfix_attrs;
2417       /* We chain the components in reverse order, then put them in
2418          forward order at the end.  Each struct-declaration may
2419          declare multiple components (comma-separated), so we must use
2420          chainon to join them, although when parsing each
2421          struct-declaration we can use TREE_CHAIN directly.
2422
2423          The theory behind all this is that there will be more
2424          semicolon separated fields than comma separated fields, and
2425          so we'll be minimizing the number of node traversals required
2426          by chainon.  */
2427       tree contents;
2428       timevar_push (TV_PARSE_STRUCT);
2429       contents = NULL_TREE;
2430       c_parser_consume_token (parser);
2431       /* Handle the Objective-C @defs construct,
2432          e.g. foo(sizeof(struct{ @defs(ClassName) }));.  */
2433       if (c_parser_next_token_is_keyword (parser, RID_AT_DEFS))
2434         {
2435           tree name;
2436           gcc_assert (c_dialect_objc ());
2437           c_parser_consume_token (parser);
2438           if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
2439             goto end_at_defs;
2440           if (c_parser_next_token_is (parser, CPP_NAME)
2441               && c_parser_peek_token (parser)->id_kind == C_ID_CLASSNAME)
2442             {
2443               name = c_parser_peek_token (parser)->value;
2444               c_parser_consume_token (parser);
2445             }
2446           else
2447             {
2448               c_parser_error (parser, "expected class name");
2449               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
2450               goto end_at_defs;
2451             }
2452           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2453                                      "expected %<)%>");
2454           contents = nreverse (objc_get_class_ivars (name));
2455         }
2456     end_at_defs:
2457       /* Parse the struct-declarations and semicolons.  Problems with
2458          semicolons are diagnosed here; empty structures are diagnosed
2459          elsewhere.  */
2460       while (true)
2461         {
2462           tree decls;
2463           /* Parse any stray semicolon.  */
2464           if (c_parser_next_token_is (parser, CPP_SEMICOLON))
2465             {
2466               pedwarn (c_parser_peek_token (parser)->location, OPT_pedantic,
2467                        "extra semicolon in struct or union specified");
2468               c_parser_consume_token (parser);
2469               continue;
2470             }
2471           /* Stop if at the end of the struct or union contents.  */
2472           if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
2473             {
2474               c_parser_consume_token (parser);
2475               break;
2476             }
2477           /* Accept #pragmas at struct scope.  */
2478           if (c_parser_next_token_is (parser, CPP_PRAGMA))
2479             {
2480               c_parser_pragma (parser, pragma_external);
2481               continue;
2482             }
2483           /* Parse some comma-separated declarations, but not the
2484              trailing semicolon if any.  */
2485           decls = c_parser_struct_declaration (parser);
2486           contents = chainon (decls, contents);
2487           /* If no semicolon follows, either we have a parse error or
2488              are at the end of the struct or union and should
2489              pedwarn.  */
2490           if (c_parser_next_token_is (parser, CPP_SEMICOLON))
2491             c_parser_consume_token (parser);
2492           else
2493             {
2494               if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
2495                 pedwarn (c_parser_peek_token (parser)->location, 0,
2496                          "no semicolon at end of struct or union");
2497               else if (parser->error
2498                        || !c_parser_next_token_starts_declspecs (parser))
2499                 {
2500                   c_parser_error (parser, "expected %<;%>");
2501                   c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL);
2502                   break;
2503                 }
2504
2505               /* If we come here, we have already emitted an error
2506                  for an expected `;', identifier or `(', and we also
2507                  recovered already.  Go on with the next field. */
2508             }
2509         }
2510       postfix_attrs = c_parser_attributes (parser);
2511       ret.spec = finish_struct (struct_loc, type, nreverse (contents),
2512                                 chainon (attrs, postfix_attrs), struct_info);
2513       ret.kind = ctsk_tagdef;
2514       ret.expr = NULL_TREE;
2515       ret.expr_const_operands = true;
2516       timevar_pop (TV_PARSE_STRUCT);
2517       return ret;
2518     }
2519   else if (!ident)
2520     {
2521       c_parser_error (parser, "expected %<{%>");
2522       ret.spec = error_mark_node;
2523       ret.kind = ctsk_tagref;
2524       ret.expr = NULL_TREE;
2525       ret.expr_const_operands = true;
2526       return ret;
2527     }
2528   ret = parser_xref_tag (ident_loc, code, ident);
2529   return ret;
2530 }
2531
2532 /* Parse a struct-declaration (C90 6.5.2.1, C99 6.7.2.1), *without*
2533    the trailing semicolon.
2534
2535    struct-declaration:
2536      specifier-qualifier-list struct-declarator-list
2537      static_assert-declaration-no-semi
2538
2539    specifier-qualifier-list:
2540      type-specifier specifier-qualifier-list[opt]
2541      type-qualifier specifier-qualifier-list[opt]
2542      attributes specifier-qualifier-list[opt]
2543
2544    struct-declarator-list:
2545      struct-declarator
2546      struct-declarator-list , attributes[opt] struct-declarator
2547
2548    struct-declarator:
2549      declarator attributes[opt]
2550      declarator[opt] : constant-expression attributes[opt]
2551
2552    GNU extensions:
2553
2554    struct-declaration:
2555      __extension__ struct-declaration
2556      specifier-qualifier-list
2557
2558    Unlike the ISO C syntax, semicolons are handled elsewhere.  The use
2559    of attributes where shown is a GNU extension.  In GNU C, we accept
2560    any expression without commas in the syntax (assignment
2561    expressions, not just conditional expressions); assignment
2562    expressions will be diagnosed as non-constant.  */
2563
2564 static tree
2565 c_parser_struct_declaration (c_parser *parser)
2566 {
2567   struct c_declspecs *specs;
2568   tree prefix_attrs;
2569   tree all_prefix_attrs;
2570   tree decls;
2571   location_t decl_loc;
2572   if (c_parser_next_token_is_keyword (parser, RID_EXTENSION))
2573     {
2574       int ext;
2575       tree decl;
2576       ext = disable_extension_diagnostics ();
2577       c_parser_consume_token (parser);
2578       decl = c_parser_struct_declaration (parser);
2579       restore_extension_diagnostics (ext);
2580       return decl;
2581     }
2582   if (c_parser_next_token_is_keyword (parser, RID_STATIC_ASSERT))
2583     {
2584       c_parser_static_assert_declaration_no_semi (parser);
2585       return NULL_TREE;
2586     }
2587   specs = build_null_declspecs ();
2588   decl_loc = c_parser_peek_token (parser)->location;
2589   c_parser_declspecs (parser, specs, false, true, true, cla_nonabstract_decl);
2590   if (parser->error)
2591     return NULL_TREE;
2592   if (!specs->declspecs_seen_p)
2593     {
2594       c_parser_error (parser, "expected specifier-qualifier-list");
2595       return NULL_TREE;
2596     }
2597   finish_declspecs (specs);
2598   if (c_parser_next_token_is (parser, CPP_SEMICOLON)
2599       || c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
2600     {
2601       tree ret;
2602       if (specs->typespec_kind == ctsk_none)
2603         {
2604           pedwarn (decl_loc, OPT_pedantic,
2605                    "ISO C forbids member declarations with no members");
2606           shadow_tag_warned (specs, pedantic);
2607           ret = NULL_TREE;
2608         }
2609       else
2610         {
2611           /* Support for unnamed structs or unions as members of
2612              structs or unions (which is [a] useful and [b] supports
2613              MS P-SDK).  */
2614           tree attrs = NULL;
2615
2616           ret = grokfield (c_parser_peek_token (parser)->location,
2617                            build_id_declarator (NULL_TREE), specs,
2618                            NULL_TREE, &attrs);
2619           if (ret)
2620             decl_attributes (&ret, attrs, 0);
2621         }
2622       return ret;
2623     }
2624
2625   /* Provide better error recovery.  Note that a type name here is valid,
2626      and will be treated as a field name.  */
2627   if (specs->typespec_kind == ctsk_tagdef
2628       && TREE_CODE (specs->type) != ENUMERAL_TYPE
2629       && c_parser_next_token_starts_declspecs (parser)
2630       && !c_parser_next_token_is (parser, CPP_NAME))
2631     {
2632       c_parser_error (parser, "expected %<;%>, identifier or %<(%>");
2633       parser->error = false;
2634       return NULL_TREE;
2635     }
2636
2637   pending_xref_error ();
2638   prefix_attrs = specs->attrs;
2639   all_prefix_attrs = prefix_attrs;
2640   specs->attrs = NULL_TREE;
2641   decls = NULL_TREE;
2642   while (true)
2643     {
2644       /* Declaring one or more declarators or un-named bit-fields.  */
2645       struct c_declarator *declarator;
2646       bool dummy = false;
2647       if (c_parser_next_token_is (parser, CPP_COLON))
2648         declarator = build_id_declarator (NULL_TREE);
2649       else
2650         declarator = c_parser_declarator (parser,
2651                                           specs->typespec_kind != ctsk_none,
2652                                           C_DTR_NORMAL, &dummy);
2653       if (declarator == NULL)
2654         {
2655           c_parser_skip_to_end_of_block_or_statement (parser);
2656           break;
2657         }
2658       if (c_parser_next_token_is (parser, CPP_COLON)
2659           || c_parser_next_token_is (parser, CPP_COMMA)
2660           || c_parser_next_token_is (parser, CPP_SEMICOLON)
2661           || c_parser_next_token_is (parser, CPP_CLOSE_BRACE)
2662           || c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
2663         {
2664           tree postfix_attrs = NULL_TREE;
2665           tree width = NULL_TREE;
2666           tree d;
2667           if (c_parser_next_token_is (parser, CPP_COLON))
2668             {
2669               c_parser_consume_token (parser);
2670               width = c_parser_expr_no_commas (parser, NULL).value;
2671             }
2672           if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
2673             postfix_attrs = c_parser_attributes (parser);
2674           d = grokfield (c_parser_peek_token (parser)->location,
2675                          declarator, specs, width, &all_prefix_attrs);
2676           decl_attributes (&d, chainon (postfix_attrs,
2677                                         all_prefix_attrs), 0);
2678           DECL_CHAIN (d) = decls;
2679           decls = d;
2680           if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
2681             all_prefix_attrs = chainon (c_parser_attributes (parser),
2682                                         prefix_attrs);
2683           else
2684             all_prefix_attrs = prefix_attrs;
2685           if (c_parser_next_token_is (parser, CPP_COMMA))
2686             c_parser_consume_token (parser);
2687           else if (c_parser_next_token_is (parser, CPP_SEMICOLON)
2688                    || c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
2689             {
2690               /* Semicolon consumed in caller.  */
2691               break;
2692             }
2693           else
2694             {
2695               c_parser_error (parser, "expected %<,%>, %<;%> or %<}%>");
2696               break;
2697             }
2698         }
2699       else
2700         {
2701           c_parser_error (parser,
2702                           "expected %<:%>, %<,%>, %<;%>, %<}%> or "
2703                           "%<__attribute__%>");
2704           break;
2705         }
2706     }
2707   return decls;
2708 }
2709
2710 /* Parse a typeof specifier (a GNU extension).
2711
2712    typeof-specifier:
2713      typeof ( expression )
2714      typeof ( type-name )
2715 */
2716
2717 static struct c_typespec
2718 c_parser_typeof_specifier (c_parser *parser)
2719 {
2720   struct c_typespec ret;
2721   ret.kind = ctsk_typeof;
2722   ret.spec = error_mark_node;
2723   ret.expr = NULL_TREE;
2724   ret.expr_const_operands = true;
2725   gcc_assert (c_parser_next_token_is_keyword (parser, RID_TYPEOF));
2726   c_parser_consume_token (parser);
2727   c_inhibit_evaluation_warnings++;
2728   in_typeof++;
2729   if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
2730     {
2731       c_inhibit_evaluation_warnings--;
2732       in_typeof--;
2733       return ret;
2734     }
2735   if (c_parser_next_tokens_start_typename (parser, cla_prefer_id))
2736     {
2737       struct c_type_name *type = c_parser_type_name (parser);
2738       c_inhibit_evaluation_warnings--;
2739       in_typeof--;
2740       if (type != NULL)
2741         {
2742           ret.spec = groktypename (type, &ret.expr, &ret.expr_const_operands);
2743           pop_maybe_used (variably_modified_type_p (ret.spec, NULL_TREE));
2744         }
2745     }
2746   else
2747     {
2748       bool was_vm;
2749       location_t here = c_parser_peek_token (parser)->location;
2750       struct c_expr expr = c_parser_expression (parser);
2751       c_inhibit_evaluation_warnings--;
2752       in_typeof--;
2753       if (TREE_CODE (expr.value) == COMPONENT_REF
2754           && DECL_C_BIT_FIELD (TREE_OPERAND (expr.value, 1)))
2755         error_at (here, "%<typeof%> applied to a bit-field");
2756       mark_exp_read (expr.value);
2757       ret.spec = TREE_TYPE (expr.value);
2758       was_vm = variably_modified_type_p (ret.spec, NULL_TREE);
2759       /* This is returned with the type so that when the type is
2760          evaluated, this can be evaluated.  */
2761       if (was_vm)
2762         ret.expr = c_fully_fold (expr.value, false, &ret.expr_const_operands);
2763       pop_maybe_used (was_vm);
2764     }
2765   c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
2766   return ret;
2767 }
2768
2769 /* Parse an alignment-specifier.
2770
2771    C11 6.7.5:
2772
2773    alignment-specifier:
2774      _Alignas ( type-name )
2775      _Alignas ( constant-expression )
2776 */
2777
2778 static tree
2779 c_parser_alignas_specifier (c_parser * parser)
2780 {
2781   tree ret = error_mark_node;
2782   location_t loc = c_parser_peek_token (parser)->location;
2783   gcc_assert (c_parser_next_token_is_keyword (parser, RID_ALIGNAS));
2784   c_parser_consume_token (parser);
2785   if (!flag_isoc11)
2786     {
2787       if (flag_isoc99)
2788         pedwarn (loc, OPT_pedantic,
2789                  "ISO C99 does not support %<_Alignas%>");
2790       else
2791         pedwarn (loc, OPT_pedantic,
2792                  "ISO C90 does not support %<_Alignas%>");
2793     }
2794   if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
2795     return ret;
2796   if (c_parser_next_tokens_start_typename (parser, cla_prefer_id))
2797     {
2798       struct c_type_name *type = c_parser_type_name (parser);
2799       if (type != NULL)
2800         ret = c_alignof (loc, groktypename (type, NULL, NULL));
2801     }
2802   else
2803     ret = c_parser_expr_no_commas (parser, NULL).value;
2804   c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
2805   return ret;
2806 }
2807
2808 /* Parse a declarator, possibly an abstract declarator (C90 6.5.4,
2809    6.5.5, C99 6.7.5, 6.7.6).  If TYPE_SEEN_P then a typedef name may
2810    be redeclared; otherwise it may not.  KIND indicates which kind of
2811    declarator is wanted.  Returns a valid declarator except in the
2812    case of a syntax error in which case NULL is returned.  *SEEN_ID is
2813    set to true if an identifier being declared is seen; this is used
2814    to diagnose bad forms of abstract array declarators and to
2815    determine whether an identifier list is syntactically permitted.
2816
2817    declarator:
2818      pointer[opt] direct-declarator
2819
2820    direct-declarator:
2821      identifier
2822      ( attributes[opt] declarator )
2823      direct-declarator array-declarator
2824      direct-declarator ( parameter-type-list )
2825      direct-declarator ( identifier-list[opt] )
2826
2827    pointer:
2828      * type-qualifier-list[opt]
2829      * type-qualifier-list[opt] pointer
2830
2831    type-qualifier-list:
2832      type-qualifier
2833      attributes
2834      type-qualifier-list type-qualifier
2835      type-qualifier-list attributes
2836
2837    parameter-type-list:
2838      parameter-list
2839      parameter-list , ...
2840
2841    parameter-list:
2842      parameter-declaration
2843      parameter-list , parameter-declaration
2844
2845    parameter-declaration:
2846      declaration-specifiers declarator attributes[opt]
2847      declaration-specifiers abstract-declarator[opt] attributes[opt]
2848
2849    identifier-list:
2850      identifier
2851      identifier-list , identifier
2852
2853    abstract-declarator:
2854      pointer
2855      pointer[opt] direct-abstract-declarator
2856
2857    direct-abstract-declarator:
2858      ( attributes[opt] abstract-declarator )
2859      direct-abstract-declarator[opt] array-declarator
2860      direct-abstract-declarator[opt] ( parameter-type-list[opt] )
2861
2862    GNU extensions:
2863
2864    direct-declarator:
2865      direct-declarator ( parameter-forward-declarations
2866                          parameter-type-list[opt] )
2867
2868    direct-abstract-declarator:
2869      direct-abstract-declarator[opt] ( parameter-forward-declarations
2870                                        parameter-type-list[opt] )
2871
2872    parameter-forward-declarations:
2873      parameter-list ;
2874      parameter-forward-declarations parameter-list ;
2875
2876    The uses of attributes shown above are GNU extensions.
2877
2878    Some forms of array declarator are not included in C99 in the
2879    syntax for abstract declarators; these are disallowed elsewhere.
2880    This may be a defect (DR#289).
2881
2882    This function also accepts an omitted abstract declarator as being
2883    an abstract declarator, although not part of the formal syntax.  */
2884
2885 static struct c_declarator *
2886 c_parser_declarator (c_parser *parser, bool type_seen_p, c_dtr_syn kind,
2887                      bool *seen_id)
2888 {
2889   /* Parse any initial pointer part.  */
2890   if (c_parser_next_token_is (parser, CPP_MULT))
2891     {
2892       struct c_declspecs *quals_attrs = build_null_declspecs ();
2893       struct c_declarator *inner;
2894       c_parser_consume_token (parser);
2895       c_parser_declspecs (parser, quals_attrs, false, false, true, cla_prefer_id);
2896       inner = c_parser_declarator (parser, type_seen_p, kind, seen_id);
2897       if (inner == NULL)
2898         return NULL;
2899       else
2900         return make_pointer_declarator (quals_attrs, inner);
2901     }
2902   /* Now we have a direct declarator, direct abstract declarator or
2903      nothing (which counts as a direct abstract declarator here).  */
2904   return c_parser_direct_declarator (parser, type_seen_p, kind, seen_id);
2905 }
2906
2907 /* Parse a direct declarator or direct abstract declarator; arguments
2908    as c_parser_declarator.  */
2909
2910 static struct c_declarator *
2911 c_parser_direct_declarator (c_parser *parser, bool type_seen_p, c_dtr_syn kind,
2912                             bool *seen_id)
2913 {
2914   /* The direct declarator must start with an identifier (possibly
2915      omitted) or a parenthesized declarator (possibly abstract).  In
2916      an ordinary declarator, initial parentheses must start a
2917      parenthesized declarator.  In an abstract declarator or parameter
2918      declarator, they could start a parenthesized declarator or a
2919      parameter list.  To tell which, the open parenthesis and any
2920      following attributes must be read.  If a declaration specifier
2921      follows, then it is a parameter list; if the specifier is a
2922      typedef name, there might be an ambiguity about redeclaring it,
2923      which is resolved in the direction of treating it as a typedef
2924      name.  If a close parenthesis follows, it is also an empty
2925      parameter list, as the syntax does not permit empty abstract
2926      declarators.  Otherwise, it is a parenthesized declarator (in
2927      which case the analysis may be repeated inside it, recursively).
2928
2929      ??? There is an ambiguity in a parameter declaration "int
2930      (__attribute__((foo)) x)", where x is not a typedef name: it
2931      could be an abstract declarator for a function, or declare x with
2932      parentheses.  The proper resolution of this ambiguity needs
2933      documenting.  At present we follow an accident of the old
2934      parser's implementation, whereby the first parameter must have
2935      some declaration specifiers other than just attributes.  Thus as
2936      a parameter declaration it is treated as a parenthesized
2937      parameter named x, and as an abstract declarator it is
2938      rejected.
2939
2940      ??? Also following the old parser, attributes inside an empty
2941      parameter list are ignored, making it a list not yielding a
2942      prototype, rather than giving an error or making it have one
2943      parameter with implicit type int.
2944
2945      ??? Also following the old parser, typedef names may be
2946      redeclared in declarators, but not Objective-C class names.  */
2947
2948   if (kind != C_DTR_ABSTRACT
2949       && c_parser_next_token_is (parser, CPP_NAME)
2950       && ((type_seen_p
2951            && (c_parser_peek_token (parser)->id_kind == C_ID_TYPENAME
2952                || c_parser_peek_token (parser)->id_kind == C_ID_CLASSNAME))
2953           || c_parser_peek_token (parser)->id_kind == C_ID_ID))
2954     {
2955       struct c_declarator *inner
2956         = build_id_declarator (c_parser_peek_token (parser)->value);
2957       *seen_id = true;
2958       inner->id_loc = c_parser_peek_token (parser)->location;
2959       c_parser_consume_token (parser);
2960       return c_parser_direct_declarator_inner (parser, *seen_id, inner);
2961     }
2962
2963   if (kind != C_DTR_NORMAL
2964       && c_parser_next_token_is (parser, CPP_OPEN_SQUARE))
2965     {
2966       struct c_declarator *inner = build_id_declarator (NULL_TREE);
2967       return c_parser_direct_declarator_inner (parser, *seen_id, inner);
2968     }
2969
2970   /* Either we are at the end of an abstract declarator, or we have
2971      parentheses.  */
2972
2973   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
2974     {
2975       tree attrs;
2976       struct c_declarator *inner;
2977       c_parser_consume_token (parser);
2978       attrs = c_parser_attributes (parser);
2979       if (kind != C_DTR_NORMAL
2980           && (c_parser_next_token_starts_declspecs (parser)
2981               || c_parser_next_token_is (parser, CPP_CLOSE_PAREN)))
2982         {
2983           struct c_arg_info *args
2984             = c_parser_parms_declarator (parser, kind == C_DTR_NORMAL,
2985                                          attrs);
2986           if (args == NULL)
2987             return NULL;
2988           else
2989             {
2990               inner
2991                 = build_function_declarator (args,
2992                                              build_id_declarator (NULL_TREE));
2993               return c_parser_direct_declarator_inner (parser, *seen_id,
2994                                                        inner);
2995             }
2996         }
2997       /* A parenthesized declarator.  */
2998       inner = c_parser_declarator (parser, type_seen_p, kind, seen_id);
2999       if (inner != NULL && attrs != NULL)
3000         inner = build_attrs_declarator (attrs, inner);
3001       if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3002         {
3003           c_parser_consume_token (parser);
3004           if (inner == NULL)
3005             return NULL;
3006           else
3007             return c_parser_direct_declarator_inner (parser, *seen_id, inner);
3008         }
3009       else
3010         {
3011           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
3012                                      "expected %<)%>");
3013           return NULL;
3014         }
3015     }
3016   else
3017     {
3018       if (kind == C_DTR_NORMAL)
3019         {
3020           c_parser_error (parser, "expected identifier or %<(%>");
3021           return NULL;
3022         }
3023       else
3024         return build_id_declarator (NULL_TREE);
3025     }
3026 }
3027
3028 /* Parse part of a direct declarator or direct abstract declarator,
3029    given that some (in INNER) has already been parsed; ID_PRESENT is
3030    true if an identifier is present, false for an abstract
3031    declarator.  */
3032
3033 static struct c_declarator *
3034 c_parser_direct_declarator_inner (c_parser *parser, bool id_present,
3035                                   struct c_declarator *inner)
3036 {
3037   /* Parse a sequence of array declarators and parameter lists.  */
3038   if (c_parser_next_token_is (parser, CPP_OPEN_SQUARE))
3039     {
3040       location_t brace_loc = c_parser_peek_token (parser)->location;
3041       struct c_declarator *declarator;
3042       struct c_declspecs *quals_attrs = build_null_declspecs ();
3043       bool static_seen;
3044       bool star_seen;
3045       tree dimen;
3046       c_parser_consume_token (parser);
3047       c_parser_declspecs (parser, quals_attrs, false, false, true, cla_prefer_id);
3048       static_seen = c_parser_next_token_is_keyword (parser, RID_STATIC);
3049       if (static_seen)
3050         c_parser_consume_token (parser);
3051       if (static_seen && !quals_attrs->declspecs_seen_p)
3052         c_parser_declspecs (parser, quals_attrs, false, false, true, cla_prefer_id);
3053       if (!quals_attrs->declspecs_seen_p)
3054         quals_attrs = NULL;
3055       /* If "static" is present, there must be an array dimension.
3056          Otherwise, there may be a dimension, "*", or no
3057          dimension.  */
3058       if (static_seen)
3059         {
3060           star_seen = false;
3061           dimen = c_parser_expr_no_commas (parser, NULL).value;
3062         }
3063       else
3064         {
3065           if (c_parser_next_token_is (parser, CPP_CLOSE_SQUARE))
3066             {
3067               dimen = NULL_TREE;
3068               star_seen = false;
3069             }
3070           else if (c_parser_next_token_is (parser, CPP_MULT))
3071             {
3072               if (c_parser_peek_2nd_token (parser)->type == CPP_CLOSE_SQUARE)
3073                 {
3074                   dimen = NULL_TREE;
3075                   star_seen = true;
3076                   c_parser_consume_token (parser);
3077                 }
3078               else
3079                 {
3080                   star_seen = false;
3081                   dimen = c_parser_expr_no_commas (parser, NULL).value;
3082                 }
3083             }
3084           else
3085             {
3086               star_seen = false;
3087               dimen = c_parser_expr_no_commas (parser, NULL).value;
3088             }
3089         }
3090       if (c_parser_next_token_is (parser, CPP_CLOSE_SQUARE))
3091         c_parser_consume_token (parser);
3092       else
3093         {
3094           c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
3095                                      "expected %<]%>");
3096           return NULL;
3097         }
3098       if (dimen)
3099         mark_exp_read (dimen);
3100       declarator = build_array_declarator (brace_loc, dimen, quals_attrs,
3101                                            static_seen, star_seen);
3102       if (declarator == NULL)
3103         return NULL;
3104       inner = set_array_declarator_inner (declarator, inner);
3105       return c_parser_direct_declarator_inner (parser, id_present, inner);
3106     }
3107   else if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
3108     {
3109       tree attrs;
3110       struct c_arg_info *args;
3111       c_parser_consume_token (parser);
3112       attrs = c_parser_attributes (parser);
3113       args = c_parser_parms_declarator (parser, id_present, attrs);
3114       if (args == NULL)
3115         return NULL;
3116       else
3117         {
3118           inner = build_function_declarator (args, inner);
3119           return c_parser_direct_declarator_inner (parser, id_present, inner);
3120         }
3121     }
3122   return inner;
3123 }
3124
3125 /* Parse a parameter list or identifier list, including the closing
3126    parenthesis but not the opening one.  ATTRS are the attributes at
3127    the start of the list.  ID_LIST_OK is true if an identifier list is
3128    acceptable; such a list must not have attributes at the start.  */
3129
3130 static struct c_arg_info *
3131 c_parser_parms_declarator (c_parser *parser, bool id_list_ok, tree attrs)
3132 {
3133   push_scope ();
3134   declare_parm_level ();
3135   /* If the list starts with an identifier, it is an identifier list.
3136      Otherwise, it is either a prototype list or an empty list.  */
3137   if (id_list_ok
3138       && !attrs
3139       && c_parser_next_token_is (parser, CPP_NAME)
3140       && c_parser_peek_token (parser)->id_kind == C_ID_ID
3141       
3142       /* Look ahead to detect typos in type names.  */
3143       && c_parser_peek_2nd_token (parser)->type != CPP_NAME
3144       && c_parser_peek_2nd_token (parser)->type != CPP_MULT
3145       && c_parser_peek_2nd_token (parser)->type != CPP_OPEN_PAREN
3146       && c_parser_peek_2nd_token (parser)->type != CPP_OPEN_SQUARE)
3147     {
3148       tree list = NULL_TREE, *nextp = &list;
3149       while (c_parser_next_token_is (parser, CPP_NAME)
3150              && c_parser_peek_token (parser)->id_kind == C_ID_ID)
3151         {
3152           *nextp = build_tree_list (NULL_TREE,
3153                                     c_parser_peek_token (parser)->value);
3154           nextp = & TREE_CHAIN (*nextp);
3155           c_parser_consume_token (parser);
3156           if (c_parser_next_token_is_not (parser, CPP_COMMA))
3157             break;
3158           c_parser_consume_token (parser);
3159           if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3160             {
3161               c_parser_error (parser, "expected identifier");
3162               break;
3163             }
3164         }
3165       if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3166         {
3167           struct c_arg_info *ret = build_arg_info ();
3168           ret->types = list;
3169           c_parser_consume_token (parser);
3170           pop_scope ();
3171           return ret;
3172         }
3173       else
3174         {
3175           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
3176                                      "expected %<)%>");
3177           pop_scope ();
3178           return NULL;
3179         }
3180     }
3181   else
3182     {
3183       struct c_arg_info *ret = c_parser_parms_list_declarator (parser, attrs,
3184                                                                NULL);
3185       pop_scope ();
3186       return ret;
3187     }
3188 }
3189
3190 /* Parse a parameter list (possibly empty), including the closing
3191    parenthesis but not the opening one.  ATTRS are the attributes at
3192    the start of the list.  EXPR is NULL or an expression that needs to
3193    be evaluated for the side effects of array size expressions in the
3194    parameters.  */
3195
3196 static struct c_arg_info *
3197 c_parser_parms_list_declarator (c_parser *parser, tree attrs, tree expr)
3198 {
3199   bool bad_parm = false;
3200
3201   /* ??? Following the old parser, forward parameter declarations may
3202      use abstract declarators, and if no real parameter declarations
3203      follow the forward declarations then this is not diagnosed.  Also
3204      note as above that attributes are ignored as the only contents of
3205      the parentheses, or as the only contents after forward
3206      declarations.  */
3207   if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3208     {
3209       struct c_arg_info *ret = build_arg_info ();
3210       c_parser_consume_token (parser);
3211       return ret;
3212     }
3213   if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
3214     {
3215       struct c_arg_info *ret = build_arg_info ();
3216
3217       if (flag_allow_parameterless_variadic_functions)
3218         {
3219           /* F (...) is allowed.  */
3220           ret->types = NULL_TREE;
3221         }
3222       else
3223         {
3224           /* Suppress -Wold-style-definition for this case.  */
3225           ret->types = error_mark_node;
3226           error_at (c_parser_peek_token (parser)->location,
3227                     "ISO C requires a named argument before %<...%>");
3228         }
3229       c_parser_consume_token (parser);
3230       if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3231         {
3232           c_parser_consume_token (parser);
3233           return ret;
3234         }
3235       else
3236         {
3237           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
3238                                      "expected %<)%>");
3239           return NULL;
3240         }
3241     }
3242   /* Nonempty list of parameters, either terminated with semicolon
3243      (forward declarations; recurse) or with close parenthesis (normal
3244      function) or with ", ... )" (variadic function).  */
3245   while (true)
3246     {
3247       /* Parse a parameter.  */
3248       struct c_parm *parm = c_parser_parameter_declaration (parser, attrs);
3249       attrs = NULL_TREE;
3250       if (parm == NULL)
3251         bad_parm = true;
3252       else
3253         push_parm_decl (parm, &expr);
3254       if (c_parser_next_token_is (parser, CPP_SEMICOLON))
3255         {
3256           tree new_attrs;
3257           c_parser_consume_token (parser);
3258           mark_forward_parm_decls ();
3259           new_attrs = c_parser_attributes (parser);
3260           return c_parser_parms_list_declarator (parser, new_attrs, expr);
3261         }
3262       if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3263         {
3264           c_parser_consume_token (parser);
3265           if (bad_parm)
3266             return NULL;
3267           else
3268             return get_parm_info (false, expr);
3269         }
3270       if (!c_parser_require (parser, CPP_COMMA,
3271                              "expected %<;%>, %<,%> or %<)%>"))
3272         {
3273           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
3274           return NULL;
3275         }
3276       if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
3277         {
3278           c_parser_consume_token (parser);
3279           if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3280             {
3281               c_parser_consume_token (parser);
3282               if (bad_parm)
3283                 return NULL;
3284               else
3285                 return get_parm_info (true, expr);
3286             }
3287           else
3288             {
3289               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
3290                                          "expected %<)%>");
3291               return NULL;
3292             }
3293         }
3294     }
3295 }
3296
3297 /* Parse a parameter declaration.  ATTRS are the attributes at the
3298    start of the declaration if it is the first parameter.  */
3299
3300 static struct c_parm *
3301 c_parser_parameter_declaration (c_parser *parser, tree attrs)
3302 {
3303   struct c_declspecs *specs;
3304   struct c_declarator *declarator;
3305   tree prefix_attrs;
3306   tree postfix_attrs = NULL_TREE;
3307   bool dummy = false;
3308   if (!c_parser_next_token_starts_declspecs (parser))
3309     {
3310       c_token *token = c_parser_peek_token (parser);
3311       if (parser->error)
3312         return NULL;
3313       c_parser_set_source_position_from_token (token);
3314       if (c_parser_next_tokens_start_typename (parser, cla_prefer_type))
3315         {
3316           error ("unknown type name %qE", token->value);
3317           parser->error = true;
3318         }
3319       /* ??? In some Objective-C cases '...' isn't applicable so there
3320          should be a different message.  */
3321       else
3322         c_parser_error (parser,
3323                         "expected declaration specifiers or %<...%>");
3324       c_parser_skip_to_end_of_parameter (parser);
3325       return NULL;
3326     }
3327   specs = build_null_declspecs ();
3328   if (attrs)
3329     {
3330       declspecs_add_attrs (specs, attrs);
3331       attrs = NULL_TREE;
3332     }
3333   c_parser_declspecs (parser, specs, true, true, true, cla_nonabstract_decl);
3334   finish_declspecs (specs);
3335   pending_xref_error ();
3336   prefix_attrs = specs->attrs;
3337   specs->attrs = NULL_TREE;
3338   declarator = c_parser_declarator (parser,
3339                                     specs->typespec_kind != ctsk_none,
3340                                     C_DTR_PARM, &dummy);
3341   if (declarator == NULL)
3342     {
3343       c_parser_skip_until_found (parser, CPP_COMMA, NULL);
3344       return NULL;
3345     }
3346   if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
3347     postfix_attrs = c_parser_attributes (parser);
3348   return build_c_parm (specs, chainon (postfix_attrs, prefix_attrs),
3349                        declarator);
3350 }
3351
3352 /* Parse a string literal in an asm expression.  It should not be
3353    translated, and wide string literals are an error although
3354    permitted by the syntax.  This is a GNU extension.
3355
3356    asm-string-literal:
3357      string-literal
3358
3359    ??? At present, following the old parser, the caller needs to have
3360    set lex_untranslated_string to 1.  It would be better to follow the
3361    C++ parser rather than using this kludge.  */
3362
3363 static tree
3364 c_parser_asm_string_literal (c_parser *parser)
3365 {
3366   tree str;
3367   int save_flag = warn_overlength_strings;
3368   warn_overlength_strings = 0;
3369   if (c_parser_next_token_is (parser, CPP_STRING))
3370     {
3371       str = c_parser_peek_token (parser)->value;
3372       c_parser_consume_token (parser);
3373     }
3374   else if (c_parser_next_token_is (parser, CPP_WSTRING))
3375     {
3376       error_at (c_parser_peek_token (parser)->location,
3377                 "wide string literal in %<asm%>");
3378       str = build_string (1, "");
3379       c_parser_consume_token (parser);
3380     }
3381   else
3382     {
3383       c_parser_error (parser, "expected string literal");
3384       str = NULL_TREE;
3385     }
3386   warn_overlength_strings = save_flag;
3387   return str;
3388 }
3389
3390 /* Parse a simple asm expression.  This is used in restricted
3391    contexts, where a full expression with inputs and outputs does not
3392    make sense.  This is a GNU extension.
3393
3394    simple-asm-expr:
3395      asm ( asm-string-literal )
3396 */
3397
3398 static tree
3399 c_parser_simple_asm_expr (c_parser *parser)
3400 {
3401   tree str;
3402   gcc_assert (c_parser_next_token_is_keyword (parser, RID_ASM));
3403   /* ??? Follow the C++ parser rather than using the
3404      lex_untranslated_string kludge.  */
3405   parser->lex_untranslated_string = true;
3406   c_parser_consume_token (parser);
3407   if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
3408     {
3409       parser->lex_untranslated_string = false;
3410       return NULL_TREE;
3411     }
3412   str = c_parser_asm_string_literal (parser);
3413   parser->lex_untranslated_string = false;
3414   if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
3415     {
3416       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
3417       return NULL_TREE;
3418     }
3419   return str;
3420 }
3421
3422 static tree
3423 c_parser_attribute_any_word (c_parser *parser)
3424 {
3425   tree attr_name = NULL_TREE;
3426
3427   if (c_parser_next_token_is (parser, CPP_KEYWORD))
3428     {
3429       /* ??? See comment above about what keywords are accepted here.  */
3430       bool ok;
3431       switch (c_parser_peek_token (parser)->keyword)
3432         {
3433         case RID_STATIC:
3434         case RID_UNSIGNED:
3435         case RID_LONG:
3436         case RID_INT128:
3437         case RID_CONST:
3438         case RID_EXTERN:
3439         case RID_REGISTER:
3440         case RID_TYPEDEF:
3441         case RID_SHORT:
3442         case RID_INLINE:
3443         case RID_NORETURN:
3444         case RID_VOLATILE:
3445         case RID_SIGNED:
3446         case RID_AUTO:
3447         case RID_RESTRICT:
3448         case RID_COMPLEX:
3449         case RID_THREAD:
3450         case RID_INT:
3451         case RID_CHAR:
3452         case RID_FLOAT:
3453         case RID_DOUBLE:
3454         case RID_VOID:
3455         case RID_DFLOAT32:
3456         case RID_DFLOAT64:
3457         case RID_DFLOAT128:
3458         case RID_BOOL:
3459         case RID_FRACT:
3460         case RID_ACCUM:
3461         case RID_SAT:
3462         case RID_TRANSACTION_ATOMIC:
3463         case RID_TRANSACTION_CANCEL:
3464           ok = true;
3465           break;
3466         default:
3467           ok = false;
3468           break;
3469         }
3470       if (!ok)
3471         return NULL_TREE;
3472
3473       /* Accept __attribute__((__const)) as __attribute__((const)) etc.  */
3474       attr_name = ridpointers[(int) c_parser_peek_token (parser)->keyword];
3475     }
3476   else if (c_parser_next_token_is (parser, CPP_NAME))
3477     attr_name = c_parser_peek_token (parser)->value;
3478
3479   return attr_name;
3480 }
3481
3482 /* Parse (possibly empty) attributes.  This is a GNU extension.
3483
3484    attributes:
3485      empty
3486      attributes attribute
3487
3488    attribute:
3489      __attribute__ ( ( attribute-list ) )
3490
3491    attribute-list:
3492      attrib
3493      attribute_list , attrib
3494
3495    attrib:
3496      empty
3497      any-word
3498      any-word ( identifier )
3499      any-word ( identifier , nonempty-expr-list )
3500      any-word ( expr-list )
3501
3502    where the "identifier" must not be declared as a type, and
3503    "any-word" may be any identifier (including one declared as a
3504    type), a reserved word storage class specifier, type specifier or
3505    type qualifier.  ??? This still leaves out most reserved keywords
3506    (following the old parser), shouldn't we include them, and why not
3507    allow identifiers declared as types to start the arguments?  */
3508
3509 static tree
3510 c_parser_attributes (c_parser *parser)
3511 {
3512   tree attrs = NULL_TREE;
3513   while (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
3514     {
3515       /* ??? Follow the C++ parser rather than using the
3516          lex_untranslated_string kludge.  */
3517       parser->lex_untranslated_string = true;
3518       c_parser_consume_token (parser);
3519       if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
3520         {
3521           parser->lex_untranslated_string = false;
3522           return attrs;
3523         }
3524       if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
3525         {
3526           parser->lex_untranslated_string = false;
3527           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
3528           return attrs;
3529         }
3530       /* Parse the attribute list.  */
3531       while (c_parser_next_token_is (parser, CPP_COMMA)
3532              || c_parser_next_token_is (parser, CPP_NAME)
3533              || c_parser_next_token_is (parser, CPP_KEYWORD))
3534         {
3535           tree attr, attr_name, attr_args;
3536           VEC(tree,gc) *expr_list;
3537           if (c_parser_next_token_is (parser, CPP_COMMA))
3538             {
3539               c_parser_consume_token (parser);
3540               continue;
3541             }
3542
3543           attr_name = c_parser_attribute_any_word (parser);
3544           if (attr_name == NULL)
3545             break;
3546           c_parser_consume_token (parser);
3547           if (c_parser_next_token_is_not (parser, CPP_OPEN_PAREN))
3548             {
3549               attr = build_tree_list (attr_name, NULL_TREE);
3550               attrs = chainon (attrs, attr);
3551               continue;
3552             }
3553           c_parser_consume_token (parser);
3554           /* Parse the attribute contents.  If they start with an
3555              identifier which is followed by a comma or close
3556              parenthesis, then the arguments start with that
3557              identifier; otherwise they are an expression list.  
3558              In objective-c the identifier may be a classname.  */
3559           if (c_parser_next_token_is (parser, CPP_NAME)
3560               && (c_parser_peek_token (parser)->id_kind == C_ID_ID
3561                   || (c_dialect_objc () 
3562                       && c_parser_peek_token (parser)->id_kind == C_ID_CLASSNAME))
3563               && ((c_parser_peek_2nd_token (parser)->type == CPP_COMMA)
3564                   || (c_parser_peek_2nd_token (parser)->type
3565                       == CPP_CLOSE_PAREN)))
3566             {
3567               tree arg1 = c_parser_peek_token (parser)->value;
3568               c_parser_consume_token (parser);
3569               if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3570                 attr_args = build_tree_list (NULL_TREE, arg1);
3571               else
3572                 {
3573                   tree tree_list;
3574                   c_parser_consume_token (parser);
3575                   expr_list = c_parser_expr_list (parser, false, true, NULL);
3576                   tree_list = build_tree_list_vec (expr_list);
3577                   attr_args = tree_cons (NULL_TREE, arg1, tree_list);
3578                   release_tree_vector (expr_list);
3579                 }
3580             }
3581           else
3582             {
3583               if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3584                 attr_args = NULL_TREE;
3585               else
3586                 {
3587                   expr_list = c_parser_expr_list (parser, false, true, NULL);
3588                   attr_args = build_tree_list_vec (expr_list);
3589                   release_tree_vector (expr_list);
3590                 }
3591             }
3592           attr = build_tree_list (attr_name, attr_args);
3593           if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3594             c_parser_consume_token (parser);
3595           else
3596             {
3597               parser->lex_untranslated_string = false;
3598               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
3599                                          "expected %<)%>");
3600               return attrs;
3601             }
3602           attrs = chainon (attrs, attr);
3603         }
3604       if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3605         c_parser_consume_token (parser);
3606       else
3607         {
3608           parser->lex_untranslated_string = false;
3609           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
3610                                      "expected %<)%>");
3611           return attrs;
3612         }
3613       if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3614         c_parser_consume_token (parser);
3615       else
3616         {
3617           parser->lex_untranslated_string = false;
3618           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
3619                                      "expected %<)%>");
3620           return attrs;
3621         }
3622       parser->lex_untranslated_string = false;
3623     }
3624   return attrs;
3625 }
3626
3627 /* Parse a type name (C90 6.5.5, C99 6.7.6).
3628
3629    type-name:
3630      specifier-qualifier-list abstract-declarator[opt]
3631 */
3632
3633 static struct c_type_name *
3634 c_parser_type_name (c_parser *parser)
3635 {
3636   struct c_declspecs *specs = build_null_declspecs ();
3637   struct c_declarator *declarator;
3638   struct c_type_name *ret;
3639   bool dummy = false;
3640   c_parser_declspecs (parser, specs, false, true, true, cla_prefer_type);
3641   if (!specs->declspecs_seen_p)
3642     {
3643       c_parser_error (parser, "expected specifier-qualifier-list");
3644       return NULL;
3645     }
3646   if (specs->type != error_mark_node)
3647     {
3648       pending_xref_error ();
3649       finish_declspecs (specs);
3650     }
3651   declarator = c_parser_declarator (parser,
3652                                     specs->typespec_kind != ctsk_none,
3653                                     C_DTR_ABSTRACT, &dummy);
3654   if (declarator == NULL)
3655     return NULL;
3656   ret = XOBNEW (&parser_obstack, struct c_type_name);
3657   ret->specs = specs;
3658   ret->declarator = declarator;
3659   return ret;
3660 }
3661
3662 /* Parse an initializer (C90 6.5.7, C99 6.7.8).
3663
3664    initializer:
3665      assignment-expression
3666      { initializer-list }
3667      { initializer-list , }
3668
3669    initializer-list:
3670      designation[opt] initializer
3671      initializer-list , designation[opt] initializer
3672
3673    designation:
3674      designator-list =
3675
3676    designator-list:
3677      designator
3678      designator-list designator
3679
3680    designator:
3681      array-designator
3682      . identifier
3683
3684    array-designator:
3685      [ constant-expression ]
3686
3687    GNU extensions:
3688
3689    initializer:
3690      { }
3691
3692    designation:
3693      array-designator
3694      identifier :
3695
3696    array-designator:
3697      [ constant-expression ... constant-expression ]
3698
3699    Any expression without commas is accepted in the syntax for the
3700    constant-expressions, with non-constant expressions rejected later.
3701
3702    This function is only used for top-level initializers; for nested
3703    ones, see c_parser_initval.  */
3704
3705 static struct c_expr
3706 c_parser_initializer (c_parser *parser)
3707 {
3708   if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
3709     return c_parser_braced_init (parser, NULL_TREE, false);
3710   else
3711     {
3712       struct c_expr ret;
3713       location_t loc = c_parser_peek_token (parser)->location;
3714       ret = c_parser_expr_no_commas (parser, NULL);
3715       if (TREE_CODE (ret.value) != STRING_CST
3716           && TREE_CODE (ret.value) != COMPOUND_LITERAL_EXPR)
3717         ret = default_function_array_read_conversion (loc, ret);
3718       return ret;
3719     }
3720 }
3721
3722 /* Parse a braced initializer list.  TYPE is the type specified for a
3723    compound literal, and NULL_TREE for other initializers and for
3724    nested braced lists.  NESTED_P is true for nested braced lists,
3725    false for the list of a compound literal or the list that is the
3726    top-level initializer in a declaration.  */
3727
3728 static struct c_expr
3729 c_parser_braced_init (c_parser *parser, tree type, bool nested_p)
3730 {
3731   struct c_expr ret;
3732   struct obstack braced_init_obstack;
3733   location_t brace_loc = c_parser_peek_token (parser)->location;
3734   gcc_obstack_init (&braced_init_obstack);
3735   gcc_assert (c_parser_next_token_is (parser, CPP_OPEN_BRACE));
3736   c_parser_consume_token (parser);
3737   if (nested_p)
3738     push_init_level (0, &braced_init_obstack);
3739   else
3740     really_start_incremental_init (type);
3741   if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
3742     {
3743       pedwarn (brace_loc, OPT_pedantic, "ISO C forbids empty initializer braces");
3744     }
3745   else
3746     {
3747       /* Parse a non-empty initializer list, possibly with a trailing
3748          comma.  */
3749       while (true)
3750         {
3751           c_parser_initelt (parser, &braced_init_obstack);
3752           if (parser->error)
3753             break;
3754           if (c_parser_next_token_is (parser, CPP_COMMA))
3755             c_parser_consume_token (parser);
3756           else
3757             break;
3758           if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
3759             break;
3760         }
3761     }
3762   if (c_parser_next_token_is_not (parser, CPP_CLOSE_BRACE))
3763     {
3764       ret.value = error_mark_node;
3765       ret.original_code = ERROR_MARK;
3766       ret.original_type = NULL;
3767       c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, "expected %<}%>");
3768       pop_init_level (0, &braced_init_obstack);
3769       obstack_free (&braced_init_obstack, NULL);
3770       return ret;
3771     }
3772   c_parser_consume_token (parser);
3773   ret = pop_init_level (0, &braced_init_obstack);
3774   obstack_free (&braced_init_obstack, NULL);
3775   return ret;
3776 }
3777
3778 /* Parse a nested initializer, including designators.  */
3779
3780 static void
3781 c_parser_initelt (c_parser *parser, struct obstack * braced_init_obstack)
3782 {
3783   /* Parse any designator or designator list.  A single array
3784      designator may have the subsequent "=" omitted in GNU C, but a
3785      longer list or a structure member designator may not.  */
3786   if (c_parser_next_token_is (parser, CPP_NAME)
3787       && c_parser_peek_2nd_token (parser)->type == CPP_COLON)
3788     {
3789       /* Old-style structure member designator.  */
3790       set_init_label (c_parser_peek_token (parser)->value,
3791                       braced_init_obstack);
3792       /* Use the colon as the error location.  */
3793       pedwarn (c_parser_peek_2nd_token (parser)->location, OPT_pedantic,
3794                "obsolete use of designated initializer with %<:%>");
3795       c_parser_consume_token (parser);
3796       c_parser_consume_token (parser);
3797     }
3798   else
3799     {
3800       /* des_seen is 0 if there have been no designators, 1 if there
3801          has been a single array designator and 2 otherwise.  */
3802       int des_seen = 0;
3803       /* Location of a designator.  */
3804       location_t des_loc = UNKNOWN_LOCATION;  /* Quiet warning.  */
3805       while (c_parser_next_token_is (parser, CPP_OPEN_SQUARE)
3806              || c_parser_next_token_is (parser, CPP_DOT))
3807         {
3808           int des_prev = des_seen;
3809           if (!des_seen)
3810             des_loc = c_parser_peek_token (parser)->location;
3811           if (des_seen < 2)
3812             des_seen++;
3813           if (c_parser_next_token_is (parser, CPP_DOT))
3814             {
3815               des_seen = 2;
3816               c_parser_consume_token (parser);
3817               if (c_parser_next_token_is (parser, CPP_NAME))
3818                 {
3819                   set_init_label (c_parser_peek_token (parser)->value,
3820                                   braced_init_obstack);
3821                   c_parser_consume_token (parser);
3822                 }
3823               else
3824                 {
3825                   struct c_expr init;
3826                   init.value = error_mark_node;
3827                   init.original_code = ERROR_MARK;
3828                   init.original_type = NULL;
3829                   c_parser_error (parser, "expected identifier");
3830                   c_parser_skip_until_found (parser, CPP_COMMA, NULL);
3831                   process_init_element (init, false, braced_init_obstack);
3832                   return;
3833                 }
3834             }
3835           else
3836             {
3837               tree first, second;
3838               location_t ellipsis_loc = UNKNOWN_LOCATION;  /* Quiet warning.  */
3839               /* ??? Following the old parser, [ objc-receiver
3840                  objc-message-args ] is accepted as an initializer,
3841                  being distinguished from a designator by what follows
3842                  the first assignment expression inside the square
3843                  brackets, but after a first array designator a
3844                  subsequent square bracket is for Objective-C taken to
3845                  start an expression, using the obsolete form of
3846                  designated initializer without '=', rather than
3847                  possibly being a second level of designation: in LALR
3848                  terms, the '[' is shifted rather than reducing
3849                  designator to designator-list.  */
3850               if (des_prev == 1 && c_dialect_objc ())
3851                 {
3852                   des_seen = des_prev;
3853                   break;
3854                 }
3855               if (des_prev == 0 && c_dialect_objc ())
3856                 {
3857                   /* This might be an array designator or an
3858                      Objective-C message expression.  If the former,
3859                      continue parsing here; if the latter, parse the
3860                      remainder of the initializer given the starting
3861                      primary-expression.  ??? It might make sense to
3862                      distinguish when des_prev == 1 as well; see
3863                      previous comment.  */
3864                   tree rec, args;
3865                   struct c_expr mexpr;
3866                   c_parser_consume_token (parser);
3867                   if (c_parser_peek_token (parser)->type == CPP_NAME
3868                       && ((c_parser_peek_token (parser)->id_kind
3869                            == C_ID_TYPENAME)
3870                           || (c_parser_peek_token (parser)->id_kind
3871                               == C_ID_CLASSNAME)))
3872                     {
3873                       /* Type name receiver.  */
3874                       tree id = c_parser_peek_token (parser)->value;
3875                       c_parser_consume_token (parser);
3876                       rec = objc_get_class_reference (id);
3877                       goto parse_message_args;
3878                     }
3879                   first = c_parser_expr_no_commas (parser, NULL).value;
3880                   mark_exp_read (first);
3881                   if (c_parser_next_token_is (parser, CPP_ELLIPSIS)
3882                       || c_parser_next_token_is (parser, CPP_CLOSE_SQUARE))
3883                     goto array_desig_after_first;
3884                   /* Expression receiver.  So far only one part
3885                      without commas has been parsed; there might be
3886                      more of the expression.  */
3887                   rec = first;
3888                   while (c_parser_next_token_is (parser, CPP_COMMA))
3889                     {
3890                       struct c_expr next;
3891                       location_t comma_loc, exp_loc;
3892                       comma_loc = c_parser_peek_token (parser)->location;
3893                       c_parser_consume_token (parser);
3894                       exp_loc = c_parser_peek_token (parser)->location;
3895                       next = c_parser_expr_no_commas (parser, NULL);
3896                       next = default_function_array_read_conversion (exp_loc,
3897                                                                      next);
3898                       rec = build_compound_expr (comma_loc, rec, next.value);
3899                     }
3900                 parse_message_args:
3901                   /* Now parse the objc-message-args.  */
3902                   args = c_parser_objc_message_args (parser);
3903                   c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
3904                                              "expected %<]%>");
3905                   mexpr.value
3906                     = objc_build_message_expr (rec, args);
3907                   mexpr.original_code = ERROR_MARK;
3908                   mexpr.original_type = NULL;
3909                   /* Now parse and process the remainder of the
3910                      initializer, starting with this message
3911                      expression as a primary-expression.  */
3912                   c_parser_initval (parser, &mexpr, braced_init_obstack);
3913                   return;
3914                 }
3915               c_parser_consume_token (parser);
3916               first = c_parser_expr_no_commas (parser, NULL).value;
3917               mark_exp_read (first);
3918             array_desig_after_first:
3919               if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
3920                 {
3921                   ellipsis_loc = c_parser_peek_token (parser)->location;
3922                   c_parser_consume_token (parser);
3923                   second = c_parser_expr_no_commas (parser, NULL).value;
3924                   mark_exp_read (second);
3925                 }
3926               else
3927                 second = NULL_TREE;
3928               if (c_parser_next_token_is (parser, CPP_CLOSE_SQUARE))
3929                 {
3930                   c_parser_consume_token (parser);
3931                   set_init_index (first, second, braced_init_obstack);
3932                   if (second)
3933                     pedwarn (ellipsis_loc, OPT_pedantic,
3934                              "ISO C forbids specifying range of elements to initialize");
3935                 }
3936               else
3937                 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
3938                                            "expected %<]%>");
3939             }
3940         }
3941       if (des_seen >= 1)
3942         {
3943           if (c_parser_next_token_is (parser, CPP_EQ))
3944             {
3945               if (!flag_isoc99)
3946                 pedwarn (des_loc, OPT_pedantic,
3947                          "ISO C90 forbids specifying subobject to initialize");
3948               c_parser_consume_token (parser);
3949             }
3950           else
3951             {
3952               if (des_seen == 1)
3953                 pedwarn (c_parser_peek_token (parser)->location, OPT_pedantic,
3954                          "obsolete use of designated initializer without %<=%>");
3955               else
3956                 {
3957                   struct c_expr init;
3958                   init.value = error_mark_node;
3959                   init.original_code = ERROR_MARK;
3960                   init.original_type = NULL;
3961                   c_parser_error (parser, "expected %<=%>");
3962                   c_parser_skip_until_found (parser, CPP_COMMA, NULL);
3963                   process_init_element (init, false, braced_init_obstack);
3964                   return;
3965                 }
3966             }
3967         }
3968     }
3969   c_parser_initval (parser, NULL, braced_init_obstack);
3970 }
3971
3972 /* Parse a nested initializer; as c_parser_initializer but parses
3973    initializers within braced lists, after any designators have been
3974    applied.  If AFTER is not NULL then it is an Objective-C message
3975    expression which is the primary-expression starting the
3976    initializer.  */
3977
3978 static void
3979 c_parser_initval (c_parser *parser, struct c_expr *after,
3980                   struct obstack * braced_init_obstack)
3981 {
3982   struct c_expr init;
3983   gcc_assert (!after || c_dialect_objc ());
3984   if (c_parser_next_token_is (parser, CPP_OPEN_BRACE) && !after)
3985     init = c_parser_braced_init (parser, NULL_TREE, true);
3986   else
3987     {
3988       location_t loc = c_parser_peek_token (parser)->location;
3989       init = c_parser_expr_no_commas (parser, after);
3990       if (init.value != NULL_TREE
3991           && TREE_CODE (init.value) != STRING_CST
3992           && TREE_CODE (init.value) != COMPOUND_LITERAL_EXPR)
3993         init = default_function_array_read_conversion (loc, init);
3994     }
3995   process_init_element (init, false, braced_init_obstack);
3996 }
3997
3998 /* Parse a compound statement (possibly a function body) (C90 6.6.2,
3999    C99 6.8.2).
4000
4001    compound-statement:
4002      { block-item-list[opt] }
4003      { label-declarations block-item-list }
4004
4005    block-item-list:
4006      block-item
4007      block-item-list block-item
4008
4009    block-item:
4010      nested-declaration
4011      statement
4012
4013    nested-declaration:
4014      declaration
4015
4016    GNU extensions:
4017
4018    compound-statement:
4019      { label-declarations block-item-list }
4020
4021    nested-declaration:
4022      __extension__ nested-declaration
4023      nested-function-definition
4024
4025    label-declarations:
4026      label-declaration
4027      label-declarations label-declaration
4028
4029    label-declaration:
4030      __label__ identifier-list ;
4031
4032    Allowing the mixing of declarations and code is new in C99.  The
4033    GNU syntax also permits (not shown above) labels at the end of
4034    compound statements, which yield an error.  We don't allow labels
4035    on declarations; this might seem like a natural extension, but
4036    there would be a conflict between attributes on the label and
4037    prefix attributes on the declaration.  ??? The syntax follows the
4038    old parser in requiring something after label declarations.
4039    Although they are erroneous if the labels declared aren't defined,
4040    is it useful for the syntax to be this way?
4041
4042    OpenMP:
4043
4044    block-item:
4045      openmp-directive
4046
4047    openmp-directive:
4048      barrier-directive
4049      flush-directive  */
4050
4051 static tree
4052 c_parser_compound_statement (c_parser *parser)
4053 {
4054   tree stmt;
4055   location_t brace_loc;
4056   brace_loc = c_parser_peek_token (parser)->location;
4057   if (!c_parser_require (parser, CPP_OPEN_BRACE, "expected %<{%>"))
4058     {
4059       /* Ensure a scope is entered and left anyway to avoid confusion
4060          if we have just prepared to enter a function body.  */
4061       stmt = c_begin_compound_stmt (true);
4062       c_end_compound_stmt (brace_loc, stmt, true);
4063       return error_mark_node;
4064     }
4065   stmt = c_begin_compound_stmt (true);
4066   c_parser_compound_statement_nostart (parser);
4067   return c_end_compound_stmt (brace_loc, stmt, true);
4068 }
4069
4070 /* Parse a compound statement except for the opening brace.  This is
4071    used for parsing both compound statements and statement expressions
4072    (which follow different paths to handling the opening).  */
4073
4074 static void
4075 c_parser_compound_statement_nostart (c_parser *parser)
4076 {
4077   bool last_stmt = false;
4078   bool last_label = false;
4079   bool save_valid_for_pragma = valid_location_for_stdc_pragma_p ();
4080   location_t label_loc = UNKNOWN_LOCATION;  /* Quiet warning.  */
4081   if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
4082     {
4083       c_parser_consume_token (parser);
4084       return;
4085     }
4086   mark_valid_location_for_stdc_pragma (true);
4087   if (c_parser_next_token_is_keyword (parser, RID_LABEL))
4088     {
4089       /* Read zero or more forward-declarations for labels that nested
4090          functions can jump to.  */
4091       mark_valid_location_for_stdc_pragma (false);
4092       while (c_parser_next_token_is_keyword (parser, RID_LABEL))
4093         {
4094           label_loc = c_parser_peek_token (parser)->location;
4095           c_parser_consume_token (parser);
4096           /* Any identifiers, including those declared as type names,
4097              are OK here.  */
4098           while (true)
4099             {
4100               tree label;
4101               if (c_parser_next_token_is_not (parser, CPP_NAME))
4102                 {
4103                   c_parser_error (parser, "expected identifier");
4104                   break;
4105                 }
4106               label
4107                 = declare_label (c_parser_peek_token (parser)->value);
4108               C_DECLARED_LABEL_FLAG (label) = 1;
4109               add_stmt (build_stmt (label_loc, DECL_EXPR, label));
4110               c_parser_consume_token (parser);
4111               if (c_parser_next_token_is (parser, CPP_COMMA))
4112                 c_parser_consume_token (parser);
4113               else
4114                 break;
4115             }
4116           c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
4117         }
4118       pedwarn (label_loc, OPT_pedantic, "ISO C forbids label declarations");
4119     }
4120   /* We must now have at least one statement, label or declaration.  */
4121   if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
4122     {
4123       mark_valid_location_for_stdc_pragma (save_valid_for_pragma);
4124       c_parser_error (parser, "expected declaration or statement");
4125       c_parser_consume_token (parser);
4126       return;
4127     }
4128   while (c_parser_next_token_is_not (parser, CPP_CLOSE_BRACE))
4129     {
4130       location_t loc = c_parser_peek_token (parser)->location;
4131       if (c_parser_next_token_is_keyword (parser, RID_CASE)
4132           || c_parser_next_token_is_keyword (parser, RID_DEFAULT)
4133           || (c_parser_next_token_is (parser, CPP_NAME)
4134               && c_parser_peek_2nd_token (parser)->type == CPP_COLON))
4135         {
4136           if (c_parser_next_token_is_keyword (parser, RID_CASE))
4137             label_loc = c_parser_peek_2nd_token (parser)->location;
4138           else
4139             label_loc = c_parser_peek_token (parser)->location;
4140           last_label = true;
4141           last_stmt = false;
4142           mark_valid_location_for_stdc_pragma (false);
4143           c_parser_label (parser);
4144         }
4145       else if (!last_label
4146                && c_parser_next_tokens_start_declaration (parser))
4147         {
4148           last_label = false;
4149           mark_valid_location_for_stdc_pragma (false);
4150           c_parser_declaration_or_fndef (parser, true, true, true, true, true, NULL);
4151           if (last_stmt)
4152             pedwarn_c90 (loc,
4153                          (pedantic && !flag_isoc99)
4154                          ? OPT_pedantic
4155                          : OPT_Wdeclaration_after_statement,
4156                          "ISO C90 forbids mixed declarations and code");
4157           last_stmt = false;
4158         }
4159       else if (!last_label
4160                && c_parser_next_token_is_keyword (parser, RID_EXTENSION))
4161         {
4162           /* __extension__ can start a declaration, but is also an
4163              unary operator that can start an expression.  Consume all
4164              but the last of a possible series of __extension__ to
4165              determine which.  */
4166           while (c_parser_peek_2nd_token (parser)->type == CPP_KEYWORD
4167                  && (c_parser_peek_2nd_token (parser)->keyword
4168                      == RID_EXTENSION))
4169             c_parser_consume_token (parser);
4170           if (c_token_starts_declaration (c_parser_peek_2nd_token (parser)))
4171             {
4172               int ext;
4173               ext = disable_extension_diagnostics ();
4174               c_parser_consume_token (parser);
4175               last_label = false;
4176               mark_valid_location_for_stdc_pragma (false);
4177               c_parser_declaration_or_fndef (parser, true, true, true, true,
4178                                              true, NULL);
4179               /* Following the old parser, __extension__ does not
4180                  disable this diagnostic.  */
4181               restore_extension_diagnostics (ext);
4182               if (last_stmt)
4183                 pedwarn_c90 (loc, (pedantic && !flag_isoc99)
4184                              ? OPT_pedantic
4185                              : OPT_Wdeclaration_after_statement,
4186                              "ISO C90 forbids mixed declarations and code");
4187               last_stmt = false;
4188             }
4189           else
4190             goto statement;
4191         }
4192       else if (c_parser_next_token_is (parser, CPP_PRAGMA))
4193         {
4194           /* External pragmas, and some omp pragmas, are not associated
4195              with regular c code, and so are not to be considered statements
4196              syntactically.  This ensures that the user doesn't put them
4197              places that would turn into syntax errors if the directive
4198              were ignored.  */
4199           if (c_parser_pragma (parser, pragma_compound))
4200             last_label = false, last_stmt = true;
4201         }
4202       else if (c_parser_next_token_is (parser, CPP_EOF))
4203         {
4204           mark_valid_location_for_stdc_pragma (save_valid_for_pragma);
4205           c_parser_error (parser, "expected declaration or statement");
4206           return;
4207         }
4208       else if (c_parser_next_token_is_keyword (parser, RID_ELSE))
4209         {
4210           if (parser->in_if_block)
4211             {
4212               mark_valid_location_for_stdc_pragma (save_valid_for_pragma);
4213               error_at (loc, """expected %<}%> before %<else%>");
4214               return;
4215             }
4216           else
4217             {
4218               error_at (loc, "%<else%> without a previous %<if%>");
4219               c_parser_consume_token (parser);
4220               continue;
4221             }
4222         }
4223       else
4224         {
4225         statement:
4226           last_label = false;
4227           last_stmt = true;
4228           mark_valid_location_for_stdc_pragma (false);
4229           c_parser_statement_after_labels (parser);
4230         }
4231
4232       parser->error = false;
4233     }
4234   if (last_label)
4235     error_at (label_loc, "label at end of compound statement");
4236   c_parser_consume_token (parser);
4237   /* Restore the value we started with.  */
4238   mark_valid_location_for_stdc_pragma (save_valid_for_pragma);
4239 }
4240
4241 /* Parse a label (C90 6.6.1, C99 6.8.1).
4242
4243    label:
4244      identifier : attributes[opt]
4245      case constant-expression :
4246      default :
4247
4248    GNU extensions:
4249
4250    label:
4251      case constant-expression ... constant-expression :
4252
4253    The use of attributes on labels is a GNU extension.  The syntax in
4254    GNU C accepts any expressions without commas, non-constant
4255    expressions being rejected later.  */
4256
4257 static void
4258 c_parser_label (c_parser *parser)
4259 {
4260   location_t loc1 = c_parser_peek_token (parser)->location;
4261   tree label = NULL_TREE;
4262   if (c_parser_next_token_is_keyword (parser, RID_CASE))
4263     {
4264       tree exp1, exp2;
4265       c_parser_consume_token (parser);
4266       exp1 = c_parser_expr_no_commas (parser, NULL).value;
4267       if (c_parser_next_token_is (parser, CPP_COLON))
4268         {
4269           c_parser_consume_token (parser);
4270           label = do_case (loc1, exp1, NULL_TREE);
4271         }
4272       else if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
4273         {
4274           c_parser_consume_token (parser);
4275           exp2 = c_parser_expr_no_commas (parser, NULL).value;
4276           if (c_parser_require (parser, CPP_COLON, "expected %<:%>"))
4277             label = do_case (loc1, exp1, exp2);
4278         }
4279       else
4280         c_parser_error (parser, "expected %<:%> or %<...%>");
4281     }
4282   else if (c_parser_next_token_is_keyword (parser, RID_DEFAULT))
4283     {
4284       c_parser_consume_token (parser);
4285       if (c_parser_require (parser, CPP_COLON, "expected %<:%>"))
4286         label = do_case (loc1, NULL_TREE, NULL_TREE);
4287     }
4288   else
4289     {
4290       tree name = c_parser_peek_token (parser)->value;
4291       tree tlab;
4292       tree attrs;
4293       location_t loc2 = c_parser_peek_token (parser)->location;
4294       gcc_assert (c_parser_next_token_is (parser, CPP_NAME));
4295       c_parser_consume_token (parser);
4296       gcc_assert (c_parser_next_token_is (parser, CPP_COLON));
4297       c_parser_consume_token (parser);
4298       attrs = c_parser_attributes (parser);
4299       tlab = define_label (loc2, name);
4300       if (tlab)
4301         {
4302           decl_attributes (&tlab, attrs, 0);
4303           label = add_stmt (build_stmt (loc1, LABEL_EXPR, tlab));
4304         }
4305     }
4306   if (label)
4307     {
4308       if (c_parser_next_tokens_start_declaration (parser))
4309         {
4310           error_at (c_parser_peek_token (parser)->location,
4311                     "a label can only be part of a statement and "
4312                     "a declaration is not a statement");
4313           c_parser_declaration_or_fndef (parser, /*fndef_ok*/ false,
4314                                          /*static_assert_ok*/ true,
4315                                          /*nested*/ true, /*empty_ok*/ false,
4316                                          /*start_attr_ok*/ true, NULL);
4317         }
4318     }
4319 }
4320
4321 /* Parse a statement (C90 6.6, C99 6.8).
4322
4323    statement:
4324      labeled-statement
4325      compound-statement
4326      expression-statement
4327      selection-statement
4328      iteration-statement
4329      jump-statement
4330
4331    labeled-statement:
4332      label statement
4333
4334    expression-statement:
4335      expression[opt] ;
4336
4337    selection-statement:
4338      if-statement
4339      switch-statement
4340
4341    iteration-statement:
4342      while-statement
4343      do-statement
4344      for-statement
4345
4346    jump-statement:
4347      goto identifier ;
4348      continue ;
4349      break ;
4350      return expression[opt] ;
4351
4352    GNU extensions:
4353
4354    statement:
4355      asm-statement
4356
4357    jump-statement:
4358      goto * expression ;
4359
4360    Objective-C:
4361
4362    statement:
4363      objc-throw-statement
4364      objc-try-catch-statement
4365      objc-synchronized-statement
4366
4367    objc-throw-statement:
4368      @throw expression ;
4369      @throw ;
4370
4371    OpenMP:
4372
4373    statement:
4374      openmp-construct
4375
4376    openmp-construct:
4377      parallel-construct
4378      for-construct
4379      sections-construct
4380      single-construct
4381      parallel-for-construct
4382      parallel-sections-construct
4383      master-construct
4384      critical-construct
4385      atomic-construct
4386      ordered-construct
4387
4388    parallel-construct:
4389      parallel-directive structured-block
4390
4391    for-construct:
4392      for-directive iteration-statement
4393
4394    sections-construct:
4395      sections-directive section-scope
4396
4397    single-construct:
4398      single-directive structured-block
4399
4400    parallel-for-construct:
4401      parallel-for-directive iteration-statement
4402
4403    parallel-sections-construct:
4404      parallel-sections-directive section-scope
4405
4406    master-construct:
4407      master-directive structured-block
4408
4409    critical-construct:
4410      critical-directive structured-block
4411
4412    atomic-construct:
4413      atomic-directive expression-statement
4414
4415    ordered-construct:
4416      ordered-directive structured-block
4417
4418    Transactional Memory:
4419
4420    statement:
4421      transaction-statement
4422      transaction-cancel-statement
4423 */
4424
4425 static void
4426 c_parser_statement (c_parser *parser)
4427 {
4428   while (c_parser_next_token_is_keyword (parser, RID_CASE)
4429          || c_parser_next_token_is_keyword (parser, RID_DEFAULT)
4430          || (c_parser_next_token_is (parser, CPP_NAME)
4431              && c_parser_peek_2nd_token (parser)->type == CPP_COLON))
4432     c_parser_label (parser);
4433   c_parser_statement_after_labels (parser);
4434 }
4435
4436 /* Parse a statement, other than a labeled statement.  */
4437
4438 static void
4439 c_parser_statement_after_labels (c_parser *parser)
4440 {
4441   location_t loc = c_parser_peek_token (parser)->location;
4442   tree stmt = NULL_TREE;
4443   bool in_if_block = parser->in_if_block;
4444   parser->in_if_block = false;
4445   switch (c_parser_peek_token (parser)->type)
4446     {
4447     case CPP_OPEN_BRACE:
4448       add_stmt (c_parser_compound_statement (parser));
4449       break;
4450     case CPP_KEYWORD:
4451       switch (c_parser_peek_token (parser)->keyword)
4452         {
4453         case RID_IF:
4454           c_parser_if_statement (parser);
4455           break;
4456         case RID_SWITCH:
4457           c_parser_switch_statement (parser);
4458           break;
4459         case RID_WHILE:
4460           c_parser_while_statement (parser);
4461           break;
4462         case RID_DO:
4463           c_parser_do_statement (parser);
4464           break;
4465         case RID_FOR:
4466           c_parser_for_statement (parser);
4467           break;
4468         case RID_GOTO:
4469           c_parser_consume_token (parser);
4470           if (c_parser_next_token_is (parser, CPP_NAME))
4471             {
4472               stmt = c_finish_goto_label (loc,
4473                                           c_parser_peek_token (parser)->value);
4474               c_parser_consume_token (parser);
4475             }
4476           else if (c_parser_next_token_is (parser, CPP_MULT))
4477             {
4478               tree val;
4479
4480               c_parser_consume_token (parser);
4481               val = c_parser_expression (parser).value;
4482               mark_exp_read (val);
4483               stmt = c_finish_goto_ptr (loc, val);
4484             }
4485           else
4486             c_parser_error (parser, "expected identifier or %<*%>");
4487           goto expect_semicolon;
4488         case RID_CONTINUE:
4489           c_parser_consume_token (parser);
4490           stmt = c_finish_bc_stmt (loc, &c_cont_label, false);
4491           goto expect_semicolon;
4492         case RID_BREAK:
4493           c_parser_consume_token (parser);
4494           stmt = c_finish_bc_stmt (loc, &c_break_label, true);
4495           goto expect_semicolon;
4496         case RID_RETURN:
4497           c_parser_consume_token (parser);
4498           if (c_parser_next_token_is (parser, CPP_SEMICOLON))
4499             {
4500               stmt = c_finish_return (loc, NULL_TREE, NULL_TREE);
4501               c_parser_consume_token (parser);
4502             }
4503           else
4504             {
4505               struct c_expr expr = c_parser_expression_conv (parser);
4506               mark_exp_read (expr.value);
4507               stmt = c_finish_return (loc, expr.value, expr.original_type);
4508               goto expect_semicolon;
4509             }
4510           break;
4511         case RID_ASM:
4512           stmt = c_parser_asm_statement (parser);
4513           break;
4514         case RID_TRANSACTION_ATOMIC:
4515         case RID_TRANSACTION_RELAXED:
4516           stmt = c_parser_transaction (parser,
4517               c_parser_peek_token (parser)->keyword);
4518           break;
4519         case RID_TRANSACTION_CANCEL:
4520           stmt = c_parser_transaction_cancel (parser);
4521           goto expect_semicolon;
4522         case RID_AT_THROW:
4523           gcc_assert (c_dialect_objc ());
4524           c_parser_consume_token (parser);
4525           if (c_parser_next_token_is (parser, CPP_SEMICOLON))
4526             {
4527               stmt = objc_build_throw_stmt (loc, NULL_TREE);
4528               c_parser_consume_token (parser);
4529             }
4530           else
4531             {
4532               tree expr = c_parser_expression (parser).value;
4533               expr = c_fully_fold (expr, false, NULL);
4534               stmt = objc_build_throw_stmt (loc, expr);
4535               goto expect_semicolon;
4536             }
4537           break;
4538         case RID_AT_TRY:
4539           gcc_assert (c_dialect_objc ());
4540           c_parser_objc_try_catch_finally_statement (parser);
4541           break;
4542         case RID_AT_SYNCHRONIZED:
4543           gcc_assert (c_dialect_objc ());
4544           c_parser_objc_synchronized_statement (parser);
4545           break;
4546         default:
4547           goto expr_stmt;
4548         }
4549       break;
4550     case CPP_SEMICOLON:
4551       c_parser_consume_token (parser);
4552       break;
4553     case CPP_CLOSE_PAREN:
4554     case CPP_CLOSE_SQUARE:
4555       /* Avoid infinite loop in error recovery:
4556          c_parser_skip_until_found stops at a closing nesting
4557          delimiter without consuming it, but here we need to consume
4558          it to proceed further.  */
4559       c_parser_error (parser, "expected statement");
4560       c_parser_consume_token (parser);
4561       break;
4562     case CPP_PRAGMA:
4563       c_parser_pragma (parser, pragma_stmt);
4564       break;
4565     default:
4566     expr_stmt:
4567       stmt = c_finish_expr_stmt (loc, c_parser_expression_conv (parser).value);
4568     expect_semicolon:
4569       c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
4570       break;
4571     }
4572   /* Two cases cannot and do not have line numbers associated: If stmt
4573      is degenerate, such as "2;", then stmt is an INTEGER_CST, which
4574      cannot hold line numbers.  But that's OK because the statement
4575      will either be changed to a MODIFY_EXPR during gimplification of
4576      the statement expr, or discarded.  If stmt was compound, but
4577      without new variables, we will have skipped the creation of a
4578      BIND and will have a bare STATEMENT_LIST.  But that's OK because
4579      (recursively) all of the component statements should already have
4580      line numbers assigned.  ??? Can we discard no-op statements
4581      earlier?  */
4582   if (CAN_HAVE_LOCATION_P (stmt)
4583       && EXPR_LOCATION (stmt) == UNKNOWN_LOCATION)
4584     SET_EXPR_LOCATION (stmt, loc);
4585
4586   parser->in_if_block = in_if_block;
4587 }
4588
4589 /* Parse the condition from an if, do, while or for statements.  */
4590
4591 static tree
4592 c_parser_condition (c_parser *parser)
4593 {
4594   location_t loc = c_parser_peek_token (parser)->location;
4595   tree cond;
4596   cond = c_parser_expression_conv (parser).value;
4597   cond = c_objc_common_truthvalue_conversion (loc, cond);
4598   cond = c_fully_fold (cond, false, NULL);
4599   if (warn_sequence_point)
4600     verify_sequence_points (cond);
4601   return cond;
4602 }
4603
4604 /* Parse a parenthesized condition from an if, do or while statement.
4605
4606    condition:
4607      ( expression )
4608 */
4609 static tree
4610 c_parser_paren_condition (c_parser *parser)
4611 {
4612   tree cond;
4613   if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
4614     return error_mark_node;
4615   cond = c_parser_condition (parser);
4616   c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
4617   return cond;
4618 }
4619
4620 /* Parse a statement which is a block in C99.  */
4621
4622 static tree
4623 c_parser_c99_block_statement (c_parser *parser)
4624 {
4625   tree block = c_begin_compound_stmt (flag_isoc99);
4626   location_t loc = c_parser_peek_token (parser)->location;
4627   c_parser_statement (parser);
4628   return c_end_compound_stmt (loc, block, flag_isoc99);
4629 }
4630
4631 /* Parse the body of an if statement.  This is just parsing a
4632    statement but (a) it is a block in C99, (b) we track whether the
4633    body is an if statement for the sake of -Wparentheses warnings, (c)
4634    we handle an empty body specially for the sake of -Wempty-body
4635    warnings, and (d) we call parser_compound_statement directly
4636    because c_parser_statement_after_labels resets
4637    parser->in_if_block.  */
4638
4639 static tree
4640 c_parser_if_body (c_parser *parser, bool *if_p)
4641 {
4642   tree block = c_begin_compound_stmt (flag_isoc99);
4643   location_t body_loc = c_parser_peek_token (parser)->location;
4644   while (c_parser_next_token_is_keyword (parser, RID_CASE)
4645          || c_parser_next_token_is_keyword (parser, RID_DEFAULT)
4646          || (c_parser_next_token_is (parser, CPP_NAME)
4647              && c_parser_peek_2nd_token (parser)->type == CPP_COLON))
4648     c_parser_label (parser);
4649   *if_p = c_parser_next_token_is_keyword (parser, RID_IF);
4650   if (c_parser_next_token_is (parser, CPP_SEMICOLON))
4651     {
4652       location_t loc = c_parser_peek_token (parser)->location;
4653       add_stmt (build_empty_stmt (loc));
4654       c_parser_consume_token (parser);
4655       if (!c_parser_next_token_is_keyword (parser, RID_ELSE))
4656         warning_at (loc, OPT_Wempty_body,
4657                     "suggest braces around empty body in an %<if%> statement");
4658     }
4659   else if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
4660     add_stmt (c_parser_compound_statement (parser));
4661   else
4662     c_parser_statement_after_labels (parser);
4663   return c_end_compound_stmt (body_loc, block, flag_isoc99);
4664 }
4665
4666 /* Parse the else body of an if statement.  This is just parsing a
4667    statement but (a) it is a block in C99, (b) we handle an empty body
4668    specially for the sake of -Wempty-body warnings.  */
4669
4670 static tree
4671 c_parser_else_body (c_parser *parser)
4672 {
4673   location_t else_loc = c_parser_peek_token (parser)->location;
4674   tree block = c_begin_compound_stmt (flag_isoc99);
4675   while (c_parser_next_token_is_keyword (parser, RID_CASE)
4676          || c_parser_next_token_is_keyword (parser, RID_DEFAULT)
4677          || (c_parser_next_token_is (parser, CPP_NAME)
4678              && c_parser_peek_2nd_token (parser)->type == CPP_COLON))
4679     c_parser_label (parser);
4680   if (c_parser_next_token_is (parser, CPP_SEMICOLON))
4681     {
4682       location_t loc = c_parser_peek_token (parser)->location;
4683       warning_at (loc,
4684                   OPT_Wempty_body,
4685                  "suggest braces around empty body in an %<else%> statement");
4686       add_stmt (build_empty_stmt (loc));
4687       c_parser_consume_token (parser);
4688     }
4689   else
4690     c_parser_statement_after_labels (parser);
4691   return c_end_compound_stmt (else_loc, block, flag_isoc99);
4692 }
4693
4694 /* Parse an if statement (C90 6.6.4, C99 6.8.4).
4695
4696    if-statement:
4697      if ( expression ) statement
4698      if ( expression ) statement else statement
4699 */
4700
4701 static void
4702 c_parser_if_statement (c_parser *parser)
4703 {
4704   tree block;
4705   location_t loc;
4706   tree cond;
4707   bool first_if = false;
4708   tree first_body, second_body;
4709   bool in_if_block;
4710
4711   gcc_assert (c_parser_next_token_is_keyword (parser, RID_IF));
4712   c_parser_consume_token (parser);
4713   block = c_begin_compound_stmt (flag_isoc99);
4714   loc = c_parser_peek_token (parser)->location;
4715   cond = c_parser_paren_condition (parser);
4716   in_if_block = parser->in_if_block;
4717   parser->in_if_block = true;
4718   first_body = c_parser_if_body (parser, &first_if);
4719   parser->in_if_block = in_if_block;
4720   if (c_parser_next_token_is_keyword (parser, RID_ELSE))
4721     {
4722       c_parser_consume_token (parser);
4723       second_body = c_parser_else_body (parser);
4724     }
4725   else
4726     second_body = NULL_TREE;
4727   c_finish_if_stmt (loc, cond, first_body, second_body, first_if);
4728   add_stmt (c_end_compound_stmt (loc, block, flag_isoc99));
4729 }
4730
4731 /* Parse a switch statement (C90 6.6.4, C99 6.8.4).
4732
4733    switch-statement:
4734      switch (expression) statement
4735 */
4736
4737 static void
4738 c_parser_switch_statement (c_parser *parser)
4739 {
4740   tree block, expr, body, save_break;
4741   location_t switch_loc = c_parser_peek_token (parser)->location;
4742   location_t switch_cond_loc;
4743   gcc_assert (c_parser_next_token_is_keyword (parser, RID_SWITCH));
4744   c_parser_consume_token (parser);
4745   block = c_begin_compound_stmt (flag_isoc99);
4746   if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
4747     {
4748       switch_cond_loc = c_parser_peek_token (parser)->location;
4749       expr = c_parser_expression (parser).value;
4750       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
4751     }
4752   else
4753     {
4754       switch_cond_loc = UNKNOWN_LOCATION;
4755       expr = error_mark_node;
4756     }
4757   c_start_case (switch_loc, switch_cond_loc, expr);
4758   save_break = c_break_label;
4759   c_break_label = NULL_TREE;
4760   body = c_parser_c99_block_statement (parser);
4761   c_finish_case (body);
4762   if (c_break_label)
4763     {
4764       location_t here = c_parser_peek_token (parser)->location;
4765       tree t = build1 (LABEL_EXPR, void_type_node, c_break_label);
4766       SET_EXPR_LOCATION (t, here);
4767       add_stmt (t);
4768     }
4769   c_break_label = save_break;
4770   add_stmt (c_end_compound_stmt (switch_loc, block, flag_isoc99));
4771 }
4772
4773 /* Parse a while statement (C90 6.6.5, C99 6.8.5).
4774
4775    while-statement:
4776       while (expression) statement
4777 */
4778
4779 static void
4780 c_parser_while_statement (c_parser *parser)
4781 {
4782   tree block, cond, body, save_break, save_cont;
4783   location_t loc;
4784   gcc_assert (c_parser_next_token_is_keyword (parser, RID_WHILE));
4785   c_parser_consume_token (parser);
4786   block = c_begin_compound_stmt (flag_isoc99);
4787   loc = c_parser_peek_token (parser)->location;
4788   cond = c_parser_paren_condition (parser);
4789   save_break = c_break_label;
4790   c_break_label = NULL_TREE;
4791   save_cont = c_cont_label;
4792   c_cont_label = NULL_TREE;
4793   body = c_parser_c99_block_statement (parser);
4794   c_finish_loop (loc, cond, NULL, body, c_break_label, c_cont_label, true);
4795   add_stmt (c_end_compound_stmt (loc, block, flag_isoc99));
4796   c_break_label = save_break;
4797   c_cont_label = save_cont;
4798 }
4799
4800 /* Parse a do statement (C90 6.6.5, C99 6.8.5).
4801
4802    do-statement:
4803      do statement while ( expression ) ;
4804 */
4805
4806 static void
4807 c_parser_do_statement (c_parser *parser)
4808 {
4809   tree block, cond, body, save_break, save_cont, new_break, new_cont;
4810   location_t loc;
4811   gcc_assert (c_parser_next_token_is_keyword (parser, RID_DO));
4812   c_parser_consume_token (parser);
4813   if (c_parser_next_token_is (parser, CPP_SEMICOLON))
4814     warning_at (c_parser_peek_token (parser)->location,
4815                 OPT_Wempty_body,
4816                 "suggest braces around empty body in %<do%> statement");
4817   block = c_begin_compound_stmt (flag_isoc99);
4818   loc = c_parser_peek_token (parser)->location;
4819   save_break = c_break_label;
4820   c_break_label = NULL_TREE;
4821   save_cont = c_cont_label;
4822   c_cont_label = NULL_TREE;
4823   body = c_parser_c99_block_statement (parser);
4824   c_parser_require_keyword (parser, RID_WHILE, "expected %<while%>");
4825   new_break = c_break_label;
4826   c_break_label = save_break;
4827   new_cont = c_cont_label;
4828   c_cont_label = save_cont;
4829   cond = c_parser_paren_condition (parser);
4830   if (!c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>"))
4831     c_parser_skip_to_end_of_block_or_statement (parser);
4832   c_finish_loop (loc, cond, NULL, body, new_break, new_cont, false);
4833   add_stmt (c_end_compound_stmt (loc, block, flag_isoc99));
4834 }
4835
4836 /* Parse a for statement (C90 6.6.5, C99 6.8.5).
4837
4838    for-statement:
4839      for ( expression[opt] ; expression[opt] ; expression[opt] ) statement
4840      for ( nested-declaration expression[opt] ; expression[opt] ) statement
4841
4842    The form with a declaration is new in C99.
4843
4844    ??? In accordance with the old parser, the declaration may be a
4845    nested function, which is then rejected in check_for_loop_decls,
4846    but does it make any sense for this to be included in the grammar?
4847    Note in particular that the nested function does not include a
4848    trailing ';', whereas the "declaration" production includes one.
4849    Also, can we reject bad declarations earlier and cheaper than
4850    check_for_loop_decls?
4851
4852    In Objective-C, there are two additional variants:
4853
4854    foreach-statement:
4855      for ( expression in expresssion ) statement
4856      for ( declaration in expression ) statement
4857
4858    This is inconsistent with C, because the second variant is allowed
4859    even if c99 is not enabled.
4860
4861    The rest of the comment documents these Objective-C foreach-statement.
4862
4863    Here is the canonical example of the first variant:
4864     for (object in array)    { do something with object }
4865    we call the first expression ("object") the "object_expression" and 
4866    the second expression ("array") the "collection_expression".
4867    object_expression must be an lvalue of type "id" (a generic Objective-C
4868    object) because the loop works by assigning to object_expression the
4869    various objects from the collection_expression.  collection_expression
4870    must evaluate to something of type "id" which responds to the method
4871    countByEnumeratingWithState:objects:count:.
4872
4873    The canonical example of the second variant is:
4874     for (id object in array)    { do something with object }
4875    which is completely equivalent to
4876     {
4877       id object;
4878       for (object in array) { do something with object }
4879     }
4880    Note that initizializing 'object' in some way (eg, "for ((object =
4881    xxx) in array) { do something with object }") is possibly
4882    technically valid, but completely pointless as 'object' will be
4883    assigned to something else as soon as the loop starts.  We should
4884    most likely reject it (TODO).
4885
4886    The beginning of the Objective-C foreach-statement looks exactly
4887    like the beginning of the for-statement, and we can tell it is a
4888    foreach-statement only because the initial declaration or
4889    expression is terminated by 'in' instead of ';'.
4890 */
4891
4892 static void
4893 c_parser_for_statement (c_parser *parser)
4894 {
4895   tree block, cond, incr, save_break, save_cont, body;
4896   /* The following are only used when parsing an ObjC foreach statement.  */
4897   tree object_expression;
4898   /* Silence the bogus uninitialized warning.  */
4899   tree collection_expression = NULL;
4900   location_t loc = c_parser_peek_token (parser)->location;
4901   location_t for_loc = c_parser_peek_token (parser)->location;
4902   bool is_foreach_statement = false;
4903   gcc_assert (c_parser_next_token_is_keyword (parser, RID_FOR));
4904   c_parser_consume_token (parser);
4905   /* Open a compound statement in Objective-C as well, just in case this is
4906      as foreach expression.  */
4907   block = c_begin_compound_stmt (flag_isoc99 || c_dialect_objc ());
4908   cond = error_mark_node;
4909   incr = error_mark_node;
4910   if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
4911     {
4912       /* Parse the initialization declaration or expression.  */
4913       object_expression = error_mark_node;
4914       parser->objc_could_be_foreach_context = c_dialect_objc ();
4915       if (c_parser_next_token_is (parser, CPP_SEMICOLON))
4916         {
4917           parser->objc_could_be_foreach_context = false;
4918           c_parser_consume_token (parser);
4919           c_finish_expr_stmt (loc, NULL_TREE);
4920         }
4921       else if (c_parser_next_tokens_start_declaration (parser))
4922         {
4923           c_parser_declaration_or_fndef (parser, true, true, true, true, true, 
4924                                          &object_expression);
4925           parser->objc_could_be_foreach_context = false;
4926           
4927           if (c_parser_next_token_is_keyword (parser, RID_IN))
4928             {
4929               c_parser_consume_token (parser);
4930               is_foreach_statement = true;
4931               if (check_for_loop_decls (for_loc, true) == NULL_TREE)
4932                 c_parser_error (parser, "multiple iterating variables in fast enumeration");
4933             }
4934           else
4935             check_for_loop_decls (for_loc, flag_isoc99);
4936         }
4937       else if (c_parser_next_token_is_keyword (parser, RID_EXTENSION))
4938         {
4939           /* __extension__ can start a declaration, but is also an
4940              unary operator that can start an expression.  Consume all
4941              but the last of a possible series of __extension__ to
4942              determine which.  */
4943           while (c_parser_peek_2nd_token (parser)->type == CPP_KEYWORD
4944                  && (c_parser_peek_2nd_token (parser)->keyword
4945                      == RID_EXTENSION))
4946             c_parser_consume_token (parser);
4947           if (c_token_starts_declaration (c_parser_peek_2nd_token (parser)))
4948             {
4949               int ext;
4950               ext = disable_extension_diagnostics ();
4951               c_parser_consume_token (parser);
4952               c_parser_declaration_or_fndef (parser, true, true, true, true,
4953                                              true, &object_expression);
4954               parser->objc_could_be_foreach_context = false;
4955               
4956               restore_extension_diagnostics (ext);
4957               if (c_parser_next_token_is_keyword (parser, RID_IN))
4958                 {
4959                   c_parser_consume_token (parser);
4960                   is_foreach_statement = true;
4961                   if (check_for_loop_decls (for_loc, true) == NULL_TREE)
4962                     c_parser_error (parser, "multiple iterating variables in fast enumeration");
4963                 }
4964               else
4965                 check_for_loop_decls (for_loc, flag_isoc99);
4966             }
4967           else
4968             goto init_expr;
4969         }
4970       else
4971         {
4972         init_expr:
4973           {
4974             tree init_expression;
4975             init_expression = c_parser_expression (parser).value;
4976             parser->objc_could_be_foreach_context = false;
4977             if (c_parser_next_token_is_keyword (parser, RID_IN))
4978               {
4979                 c_parser_consume_token (parser);
4980                 is_foreach_statement = true;
4981                 if (! lvalue_p (init_expression))
4982                   c_parser_error (parser, "invalid iterating variable in fast enumeration");
4983                 object_expression = c_fully_fold (init_expression, false, NULL);
4984               }
4985             else
4986               {
4987                 c_finish_expr_stmt (loc, init_expression);
4988                 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
4989               }
4990           }
4991         }
4992       /* Parse the loop condition.  In the case of a foreach
4993          statement, there is no loop condition.  */
4994       gcc_assert (!parser->objc_could_be_foreach_context);
4995       if (!is_foreach_statement)
4996         {
4997           if (c_parser_next_token_is (parser, CPP_SEMICOLON))
4998             {
4999               c_parser_consume_token (parser);
5000               cond = NULL_TREE;
5001             }
5002           else
5003             {
5004               cond = c_parser_condition (parser);
5005               c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
5006             }
5007         }
5008       /* Parse the increment expression (the third expression in a
5009          for-statement).  In the case of a foreach-statement, this is
5010          the expression that follows the 'in'.  */
5011       if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
5012         {
5013           if (is_foreach_statement)
5014             {
5015               c_parser_error (parser, "missing collection in fast enumeration");
5016               collection_expression = error_mark_node;
5017             }
5018           else
5019             incr = c_process_expr_stmt (loc, NULL_TREE);
5020         }
5021       else
5022         {
5023           if (is_foreach_statement)
5024             collection_expression = c_fully_fold (c_parser_expression (parser).value,
5025                                                   false, NULL);
5026           else
5027             incr = c_process_expr_stmt (loc, c_parser_expression (parser).value);
5028         }
5029       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
5030     }
5031   save_break = c_break_label;
5032   c_break_label = NULL_TREE;
5033   save_cont = c_cont_label;
5034   c_cont_label = NULL_TREE;
5035   body = c_parser_c99_block_statement (parser);
5036   if (is_foreach_statement)
5037     objc_finish_foreach_loop (loc, object_expression, collection_expression, body, c_break_label, c_cont_label);
5038   else
5039     c_finish_loop (loc, cond, incr, body, c_break_label, c_cont_label, true);
5040   add_stmt (c_end_compound_stmt (loc, block, flag_isoc99 || c_dialect_objc ()));
5041   c_break_label = save_break;
5042   c_cont_label = save_cont;
5043 }
5044
5045 /* Parse an asm statement, a GNU extension.  This is a full-blown asm
5046    statement with inputs, outputs, clobbers, and volatile tag
5047    allowed.
5048
5049    asm-statement:
5050      asm type-qualifier[opt] ( asm-argument ) ;
5051      asm type-qualifier[opt] goto ( asm-goto-argument ) ;
5052
5053    asm-argument:
5054      asm-string-literal
5055      asm-string-literal : asm-operands[opt]
5056      asm-string-literal : asm-operands[opt] : asm-operands[opt]
5057      asm-string-literal : asm-operands[opt] : asm-operands[opt] : asm-clobbers[opt]
5058
5059    asm-goto-argument:
5060      asm-string-literal : : asm-operands[opt] : asm-clobbers[opt] \
5061        : asm-goto-operands
5062
5063    Qualifiers other than volatile are accepted in the syntax but
5064    warned for.  */
5065
5066 static tree
5067 c_parser_asm_statement (c_parser *parser)
5068 {
5069   tree quals, str, outputs, inputs, clobbers, labels, ret;
5070   bool simple, is_goto;
5071   location_t asm_loc = c_parser_peek_token (parser)->location;
5072   int section, nsections;
5073
5074   gcc_assert (c_parser_next_token_is_keyword (parser, RID_ASM));
5075   c_parser_consume_token (parser);
5076   if (c_parser_next_token_is_keyword (parser, RID_VOLATILE))
5077     {
5078       quals = c_parser_peek_token (parser)->value;
5079       c_parser_consume_token (parser);
5080     }
5081   else if (c_parser_next_token_is_keyword (parser, RID_CONST)
5082            || c_parser_next_token_is_keyword (parser, RID_RESTRICT))
5083     {
5084       warning_at (c_parser_peek_token (parser)->location,
5085                   0,
5086                   "%E qualifier ignored on asm",
5087                   c_parser_peek_token (parser)->value);
5088       quals = NULL_TREE;
5089       c_parser_consume_token (parser);
5090     }
5091   else
5092     quals = NULL_TREE;
5093
5094   is_goto = false;
5095   if (c_parser_next_token_is_keyword (parser, RID_GOTO))
5096     {
5097       c_parser_consume_token (parser);
5098       is_goto = true;
5099     }
5100
5101   /* ??? Follow the C++ parser rather than using the
5102      lex_untranslated_string kludge.  */
5103   parser->lex_untranslated_string = true;
5104   ret = NULL;
5105
5106   if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5107     goto error;
5108
5109   str = c_parser_asm_string_literal (parser);
5110   if (str == NULL_TREE)
5111     goto error_close_paren;
5112
5113   simple = true;
5114   outputs = NULL_TREE;
5115   inputs = NULL_TREE;
5116   clobbers = NULL_TREE;
5117   labels = NULL_TREE;
5118
5119   if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN) && !is_goto)
5120     goto done_asm;
5121
5122   /* Parse each colon-delimited section of operands.  */
5123   nsections = 3 + is_goto;
5124   for (section = 0; section < nsections; ++section)
5125     {
5126       if (!c_parser_require (parser, CPP_COLON,
5127                              is_goto
5128                              ? "expected %<:%>"
5129                              : "expected %<:%> or %<)%>"))
5130         goto error_close_paren;
5131
5132       /* Once past any colon, we're no longer a simple asm.  */
5133       simple = false;
5134
5135       if ((!c_parser_next_token_is (parser, CPP_COLON)
5136            && !c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
5137           || section == 3)
5138         switch (section)
5139           {
5140           case 0:
5141             /* For asm goto, we don't allow output operands, but reserve
5142                the slot for a future extension that does allow them.  */
5143             if (!is_goto)
5144               outputs = c_parser_asm_operands (parser, false);
5145             break;
5146           case 1:
5147             inputs = c_parser_asm_operands (parser, true);
5148             break;
5149           case 2:
5150             clobbers = c_parser_asm_clobbers (parser);
5151             break;
5152           case 3:
5153             labels = c_parser_asm_goto_operands (parser);
5154             break;
5155           default:
5156             gcc_unreachable ();
5157           }
5158
5159       if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN) && !is_goto)
5160         goto done_asm;
5161     }
5162
5163  done_asm:
5164   if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
5165     {
5166       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5167       goto error;
5168     }
5169
5170   if (!c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>"))
5171     c_parser_skip_to_end_of_block_or_statement (parser);
5172
5173   ret = build_asm_stmt (quals, build_asm_expr (asm_loc, str, outputs, inputs,
5174                                                clobbers, labels, simple));
5175
5176  error:
5177   parser->lex_untranslated_string = false;
5178   return ret;
5179
5180  error_close_paren:
5181   c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5182   goto error;
5183 }
5184
5185 /* Parse asm operands, a GNU extension.  If CONVERT_P (for inputs but
5186    not outputs), apply the default conversion of functions and arrays
5187    to pointers.
5188
5189    asm-operands:
5190      asm-operand
5191      asm-operands , asm-operand
5192
5193    asm-operand:
5194      asm-string-literal ( expression )
5195      [ identifier ] asm-string-literal ( expression )
5196 */
5197
5198 static tree
5199 c_parser_asm_operands (c_parser *parser, bool convert_p)
5200 {
5201   tree list = NULL_TREE;
5202   location_t loc;
5203   while (true)
5204     {
5205       tree name, str;
5206       struct c_expr expr;
5207       if (c_parser_next_token_is (parser, CPP_OPEN_SQUARE))
5208         {
5209           c_parser_consume_token (parser);
5210           if (c_parser_next_token_is (parser, CPP_NAME))
5211             {
5212               tree id = c_parser_peek_token (parser)->value;
5213               c_parser_consume_token (parser);
5214               name = build_string (IDENTIFIER_LENGTH (id),
5215                                    IDENTIFIER_POINTER (id));
5216             }
5217           else
5218             {
5219               c_parser_error (parser, "expected identifier");
5220               c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, NULL);
5221               return NULL_TREE;
5222             }
5223           c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
5224                                      "expected %<]%>");
5225         }
5226       else
5227         name = NULL_TREE;
5228       str = c_parser_asm_string_literal (parser);
5229       if (str == NULL_TREE)
5230         return NULL_TREE;
5231       parser->lex_untranslated_string = false;
5232       if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5233         {
5234           parser->lex_untranslated_string = true;
5235           return NULL_TREE;
5236         }
5237       loc = c_parser_peek_token (parser)->location;
5238       expr = c_parser_expression (parser);
5239       mark_exp_read (expr.value);
5240       if (convert_p)
5241         expr = default_function_array_conversion (loc, expr);
5242       expr.value = c_fully_fold (expr.value, false, NULL);
5243       parser->lex_untranslated_string = true;
5244       if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
5245         {
5246           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5247           return NULL_TREE;
5248         }
5249       list = chainon (list, build_tree_list (build_tree_list (name, str),
5250                                              expr.value));
5251       if (c_parser_next_token_is (parser, CPP_COMMA))
5252         c_parser_consume_token (parser);
5253       else
5254         break;
5255     }
5256   return list;
5257 }
5258
5259 /* Parse asm clobbers, a GNU extension.
5260
5261    asm-clobbers:
5262      asm-string-literal
5263      asm-clobbers , asm-string-literal
5264 */
5265
5266 static tree
5267 c_parser_asm_clobbers (c_parser *parser)
5268 {
5269   tree list = NULL_TREE;
5270   while (true)
5271     {
5272       tree str = c_parser_asm_string_literal (parser);
5273       if (str)
5274         list = tree_cons (NULL_TREE, str, list);
5275       else
5276         return NULL_TREE;
5277       if (c_parser_next_token_is (parser, CPP_COMMA))
5278         c_parser_consume_token (parser);
5279       else
5280         break;
5281     }
5282   return list;
5283 }
5284
5285 /* Parse asm goto labels, a GNU extension.
5286
5287    asm-goto-operands:
5288      identifier
5289      asm-goto-operands , identifier
5290 */
5291
5292 static tree
5293 c_parser_asm_goto_operands (c_parser *parser)
5294 {
5295   tree list = NULL_TREE;
5296   while (true)
5297     {
5298       tree name, label;
5299
5300       if (c_parser_next_token_is (parser, CPP_NAME))
5301         {
5302           c_token *tok = c_parser_peek_token (parser);
5303           name = tok->value;
5304           label = lookup_label_for_goto (tok->location, name);
5305           c_parser_consume_token (parser);
5306           TREE_USED (label) = 1;
5307         }
5308       else
5309         {
5310           c_parser_error (parser, "expected identifier");
5311           return NULL_TREE;
5312         }
5313
5314       name = build_string (IDENTIFIER_LENGTH (name),
5315                            IDENTIFIER_POINTER (name));
5316       list = tree_cons (name, label, list);
5317       if (c_parser_next_token_is (parser, CPP_COMMA))
5318         c_parser_consume_token (parser);
5319       else
5320         return nreverse (list);
5321     }
5322 }
5323
5324 /* Parse an expression other than a compound expression; that is, an
5325    assignment expression (C90 6.3.16, C99 6.5.16).  If AFTER is not
5326    NULL then it is an Objective-C message expression which is the
5327    primary-expression starting the expression as an initializer.
5328
5329    assignment-expression:
5330      conditional-expression
5331      unary-expression assignment-operator assignment-expression
5332
5333    assignment-operator: one of
5334      = *= /= %= += -= <<= >>= &= ^= |=
5335
5336    In GNU C we accept any conditional expression on the LHS and
5337    diagnose the invalid lvalue rather than producing a syntax
5338    error.  */
5339
5340 static struct c_expr
5341 c_parser_expr_no_commas (c_parser *parser, struct c_expr *after)
5342 {
5343   struct c_expr lhs, rhs, ret;
5344   enum tree_code code;
5345   location_t op_location, exp_location;
5346   gcc_assert (!after || c_dialect_objc ());
5347   lhs = c_parser_conditional_expression (parser, after);
5348   op_location = c_parser_peek_token (parser)->location;
5349   switch (c_parser_peek_token (parser)->type)
5350     {
5351     case CPP_EQ:
5352       code = NOP_EXPR;
5353       break;
5354     case CPP_MULT_EQ:
5355       code = MULT_EXPR;
5356       break;
5357     case CPP_DIV_EQ:
5358       code = TRUNC_DIV_EXPR;
5359       break;
5360     case CPP_MOD_EQ:
5361       code = TRUNC_MOD_EXPR;
5362       break;
5363     case CPP_PLUS_EQ:
5364       code = PLUS_EXPR;
5365       break;
5366     case CPP_MINUS_EQ:
5367       code = MINUS_EXPR;
5368       break;
5369     case CPP_LSHIFT_EQ:
5370       code = LSHIFT_EXPR;
5371       break;
5372     case CPP_RSHIFT_EQ:
5373       code = RSHIFT_EXPR;
5374       break;
5375     case CPP_AND_EQ:
5376       code = BIT_AND_EXPR;
5377       break;
5378     case CPP_XOR_EQ:
5379       code = BIT_XOR_EXPR;
5380       break;
5381     case CPP_OR_EQ:
5382       code = BIT_IOR_EXPR;
5383       break;
5384     default:
5385       return lhs;
5386     }
5387   c_parser_consume_token (parser);
5388   exp_location = c_parser_peek_token (parser)->location;
5389   rhs = c_parser_expr_no_commas (parser, NULL);
5390   rhs = default_function_array_read_conversion (exp_location, rhs);
5391   ret.value = build_modify_expr (op_location, lhs.value, lhs.original_type,
5392                                  code, exp_location, rhs.value,
5393                                  rhs.original_type);
5394   if (code == NOP_EXPR)
5395     ret.original_code = MODIFY_EXPR;
5396   else
5397     {
5398       TREE_NO_WARNING (ret.value) = 1;
5399       ret.original_code = ERROR_MARK;
5400     }
5401   ret.original_type = NULL;
5402   return ret;
5403 }
5404
5405 /* Parse a conditional expression (C90 6.3.15, C99 6.5.15).  If AFTER
5406    is not NULL then it is an Objective-C message expression which is
5407    the primary-expression starting the expression as an initializer.
5408
5409    conditional-expression:
5410      logical-OR-expression
5411      logical-OR-expression ? expression : conditional-expression
5412
5413    GNU extensions:
5414
5415    conditional-expression:
5416      logical-OR-expression ? : conditional-expression
5417 */
5418
5419 static struct c_expr
5420 c_parser_conditional_expression (c_parser *parser, struct c_expr *after)
5421 {
5422   struct c_expr cond, exp1, exp2, ret;
5423   location_t cond_loc, colon_loc, middle_loc;
5424
5425   gcc_assert (!after || c_dialect_objc ());
5426
5427   cond = c_parser_binary_expression (parser, after, PREC_NONE);
5428
5429   if (c_parser_next_token_is_not (parser, CPP_QUERY))
5430     return cond;
5431   cond_loc = c_parser_peek_token (parser)->location;
5432   cond = default_function_array_read_conversion (cond_loc, cond);
5433   c_parser_consume_token (parser);
5434   if (c_parser_next_token_is (parser, CPP_COLON))
5435     {
5436       tree eptype = NULL_TREE;
5437
5438       middle_loc = c_parser_peek_token (parser)->location;
5439       pedwarn (middle_loc, OPT_pedantic, 
5440                "ISO C forbids omitting the middle term of a ?: expression");
5441       warn_for_omitted_condop (middle_loc, cond.value);
5442       if (TREE_CODE (cond.value) == EXCESS_PRECISION_EXPR)
5443         {
5444           eptype = TREE_TYPE (cond.value);
5445           cond.value = TREE_OPERAND (cond.value, 0);
5446         }
5447       /* Make sure first operand is calculated only once.  */
5448       exp1.value = c_save_expr (default_conversion (cond.value));
5449       if (eptype)
5450         exp1.value = build1 (EXCESS_PRECISION_EXPR, eptype, exp1.value);
5451       exp1.original_type = NULL;
5452       cond.value = c_objc_common_truthvalue_conversion (cond_loc, exp1.value);
5453       c_inhibit_evaluation_warnings += cond.value == truthvalue_true_node;
5454     }
5455   else
5456     {
5457       cond.value
5458         = c_objc_common_truthvalue_conversion
5459         (cond_loc, default_conversion (cond.value));
5460       c_inhibit_evaluation_warnings += cond.value == truthvalue_false_node;
5461       exp1 = c_parser_expression_conv (parser);
5462       mark_exp_read (exp1.value);
5463       c_inhibit_evaluation_warnings +=
5464         ((cond.value == truthvalue_true_node)
5465          - (cond.value == truthvalue_false_node));
5466     }
5467
5468   colon_loc = c_parser_peek_token (parser)->location;
5469   if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
5470     {
5471       c_inhibit_evaluation_warnings -= cond.value == truthvalue_true_node;
5472       ret.value = error_mark_node;
5473       ret.original_code = ERROR_MARK;
5474       ret.original_type = NULL;
5475       return ret;
5476     }
5477   {
5478     location_t exp2_loc = c_parser_peek_token (parser)->location;
5479     exp2 = c_parser_conditional_expression (parser, NULL);
5480     exp2 = default_function_array_read_conversion (exp2_loc, exp2);
5481   }
5482   c_inhibit_evaluation_warnings -= cond.value == truthvalue_true_node;
5483   ret.value = build_conditional_expr (colon_loc, cond.value,
5484                                       cond.original_code == C_MAYBE_CONST_EXPR,
5485                                       exp1.value, exp1.original_type,
5486                                       exp2.value, exp2.original_type);
5487   ret.original_code = ERROR_MARK;
5488   if (exp1.value == error_mark_node || exp2.value == error_mark_node)
5489     ret.original_type = NULL;
5490   else
5491     {
5492       tree t1, t2;
5493
5494       /* If both sides are enum type, the default conversion will have
5495          made the type of the result be an integer type.  We want to
5496          remember the enum types we started with.  */
5497       t1 = exp1.original_type ? exp1.original_type : TREE_TYPE (exp1.value);
5498       t2 = exp2.original_type ? exp2.original_type : TREE_TYPE (exp2.value);
5499       ret.original_type = ((t1 != error_mark_node
5500                             && t2 != error_mark_node
5501                             && (TYPE_MAIN_VARIANT (t1)
5502                                 == TYPE_MAIN_VARIANT (t2)))
5503                            ? t1
5504                            : NULL);
5505     }
5506   return ret;
5507 }
5508
5509 /* Parse a binary expression; that is, a logical-OR-expression (C90
5510    6.3.5-6.3.14, C99 6.5.5-6.5.14).  If AFTER is not NULL then it is
5511    an Objective-C message expression which is the primary-expression
5512    starting the expression as an initializer.  PREC is the starting
5513    precedence, usually PREC_NONE.
5514
5515    multiplicative-expression:
5516      cast-expression
5517      multiplicative-expression * cast-expression
5518      multiplicative-expression / cast-expression
5519      multiplicative-expression % cast-expression
5520
5521    additive-expression:
5522      multiplicative-expression
5523      additive-expression + multiplicative-expression
5524      additive-expression - multiplicative-expression
5525
5526    shift-expression:
5527      additive-expression
5528      shift-expression << additive-expression
5529      shift-expression >> additive-expression
5530
5531    relational-expression:
5532      shift-expression
5533      relational-expression < shift-expression
5534      relational-expression > shift-expression
5535      relational-expression <= shift-expression
5536      relational-expression >= shift-expression
5537
5538    equality-expression:
5539      relational-expression
5540      equality-expression == relational-expression
5541      equality-expression != relational-expression
5542
5543    AND-expression:
5544      equality-expression
5545      AND-expression & equality-expression
5546
5547    exclusive-OR-expression:
5548      AND-expression
5549      exclusive-OR-expression ^ AND-expression
5550
5551    inclusive-OR-expression:
5552      exclusive-OR-expression
5553      inclusive-OR-expression | exclusive-OR-expression
5554
5555    logical-AND-expression:
5556      inclusive-OR-expression
5557      logical-AND-expression && inclusive-OR-expression
5558
5559    logical-OR-expression:
5560      logical-AND-expression
5561      logical-OR-expression || logical-AND-expression
5562 */
5563
5564 static struct c_expr
5565 c_parser_binary_expression (c_parser *parser, struct c_expr *after,
5566                             enum c_parser_prec prec)
5567 {
5568   /* A binary expression is parsed using operator-precedence parsing,
5569      with the operands being cast expressions.  All the binary
5570      operators are left-associative.  Thus a binary expression is of
5571      form:
5572
5573      E0 op1 E1 op2 E2 ...
5574
5575      which we represent on a stack.  On the stack, the precedence
5576      levels are strictly increasing.  When a new operator is
5577      encountered of higher precedence than that at the top of the
5578      stack, it is pushed; its LHS is the top expression, and its RHS
5579      is everything parsed until it is popped.  When a new operator is
5580      encountered with precedence less than or equal to that at the top
5581      of the stack, triples E[i-1] op[i] E[i] are popped and replaced
5582      by the result of the operation until the operator at the top of
5583      the stack has lower precedence than the new operator or there is
5584      only one element on the stack; then the top expression is the LHS
5585      of the new operator.  In the case of logical AND and OR
5586      expressions, we also need to adjust c_inhibit_evaluation_warnings
5587      as appropriate when the operators are pushed and popped.  */
5588
5589   struct {
5590     /* The expression at this stack level.  */
5591     struct c_expr expr;
5592     /* The precedence of the operator on its left, PREC_NONE at the
5593        bottom of the stack.  */
5594     enum c_parser_prec prec;
5595     /* The operation on its left.  */
5596     enum tree_code op;
5597     /* The source location of this operation.  */
5598     location_t loc;
5599   } stack[NUM_PRECS];
5600   int sp;
5601   /* Location of the binary operator.  */
5602   location_t binary_loc = UNKNOWN_LOCATION;  /* Quiet warning.  */
5603 #define POP                                                                   \
5604   do {                                                                        \
5605     switch (stack[sp].op)                                                     \
5606       {                                                                       \
5607       case TRUTH_ANDIF_EXPR:                                                  \
5608         c_inhibit_evaluation_warnings -= (stack[sp - 1].expr.value            \
5609                                           == truthvalue_false_node);          \
5610         break;                                                                \
5611       case TRUTH_ORIF_EXPR:                                                   \
5612         c_inhibit_evaluation_warnings -= (stack[sp - 1].expr.value            \
5613                                           == truthvalue_true_node);           \
5614         break;                                                                \
5615       default:                                                                \
5616         break;                                                                \
5617       }                                                                       \
5618     stack[sp - 1].expr                                                        \
5619       = default_function_array_read_conversion (stack[sp - 1].loc,            \
5620                                                 stack[sp - 1].expr);          \
5621     stack[sp].expr                                                            \
5622       = default_function_array_read_conversion (stack[sp].loc,                \
5623                                                 stack[sp].expr);              \
5624     stack[sp - 1].expr = parser_build_binary_op (stack[sp].loc,               \
5625                                                  stack[sp].op,                \
5626                                                  stack[sp - 1].expr,          \
5627                                                  stack[sp].expr);             \
5628     sp--;                                                                     \
5629   } while (0)
5630   gcc_assert (!after || c_dialect_objc ());
5631   stack[0].loc = c_parser_peek_token (parser)->location;
5632   stack[0].expr = c_parser_cast_expression (parser, after);
5633   stack[0].prec = prec;
5634   sp = 0;
5635   while (true)
5636     {
5637       enum c_parser_prec oprec;
5638       enum tree_code ocode;
5639       if (parser->error)
5640         goto out;
5641       switch (c_parser_peek_token (parser)->type)
5642         {
5643         case CPP_MULT:
5644           oprec = PREC_MULT;
5645           ocode = MULT_EXPR;
5646           break;
5647         case CPP_DIV:
5648           oprec = PREC_MULT;
5649           ocode = TRUNC_DIV_EXPR;
5650           break;
5651         case CPP_MOD:
5652           oprec = PREC_MULT;
5653           ocode = TRUNC_MOD_EXPR;
5654           break;
5655         case CPP_PLUS:
5656           oprec = PREC_ADD;
5657           ocode = PLUS_EXPR;
5658           break;
5659         case CPP_MINUS:
5660           oprec = PREC_ADD;
5661           ocode = MINUS_EXPR;
5662           break;
5663         case CPP_LSHIFT:
5664           oprec = PREC_SHIFT;
5665           ocode = LSHIFT_EXPR;
5666           break;
5667         case CPP_RSHIFT:
5668           oprec = PREC_SHIFT;
5669           ocode = RSHIFT_EXPR;
5670           break;
5671         case CPP_LESS:
5672           oprec = PREC_REL;
5673           ocode = LT_EXPR;
5674           break;
5675         case CPP_GREATER:
5676           oprec = PREC_REL;
5677           ocode = GT_EXPR;
5678           break;
5679         case CPP_LESS_EQ:
5680           oprec = PREC_REL;
5681           ocode = LE_EXPR;
5682           break;
5683         case CPP_GREATER_EQ:
5684           oprec = PREC_REL;
5685           ocode = GE_EXPR;
5686           break;
5687         case CPP_EQ_EQ:
5688           oprec = PREC_EQ;
5689           ocode = EQ_EXPR;
5690           break;
5691         case CPP_NOT_EQ:
5692           oprec = PREC_EQ;
5693           ocode = NE_EXPR;
5694           break;
5695         case CPP_AND:
5696           oprec = PREC_BITAND;
5697           ocode = BIT_AND_EXPR;
5698           break;
5699         case CPP_XOR:
5700           oprec = PREC_BITXOR;
5701           ocode = BIT_XOR_EXPR;
5702           break;
5703         case CPP_OR:
5704           oprec = PREC_BITOR;
5705           ocode = BIT_IOR_EXPR;
5706           break;
5707         case CPP_AND_AND:
5708           oprec = PREC_LOGAND;
5709           ocode = TRUTH_ANDIF_EXPR;
5710           break;
5711         case CPP_OR_OR:
5712           oprec = PREC_LOGOR;
5713           ocode = TRUTH_ORIF_EXPR;
5714           break;
5715         default:
5716           /* Not a binary operator, so end of the binary
5717              expression.  */
5718           goto out;
5719         }
5720       binary_loc = c_parser_peek_token (parser)->location;
5721       while (oprec <= stack[sp].prec)
5722         {
5723           if (sp == 0)
5724             goto out;
5725           POP;
5726         }
5727       c_parser_consume_token (parser);
5728       switch (ocode)
5729         {
5730         case TRUTH_ANDIF_EXPR:
5731           stack[sp].expr
5732             = default_function_array_read_conversion (stack[sp].loc,
5733                                                       stack[sp].expr);
5734           stack[sp].expr.value = c_objc_common_truthvalue_conversion
5735             (stack[sp].loc, default_conversion (stack[sp].expr.value));
5736           c_inhibit_evaluation_warnings += (stack[sp].expr.value
5737                                             == truthvalue_false_node);
5738           break;
5739         case TRUTH_ORIF_EXPR:
5740           stack[sp].expr
5741             = default_function_array_read_conversion (stack[sp].loc,
5742                                                       stack[sp].expr);
5743           stack[sp].expr.value = c_objc_common_truthvalue_conversion
5744             (stack[sp].loc, default_conversion (stack[sp].expr.value));
5745           c_inhibit_evaluation_warnings += (stack[sp].expr.value
5746                                             == truthvalue_true_node);
5747           break;
5748         default:
5749           break;
5750         }
5751       sp++;
5752       stack[sp].loc = binary_loc;
5753       stack[sp].expr = c_parser_cast_expression (parser, NULL);
5754       stack[sp].prec = oprec;
5755       stack[sp].op = ocode;
5756       stack[sp].loc = binary_loc;
5757     }
5758  out:
5759   while (sp > 0)
5760     POP;
5761   return stack[0].expr;
5762 #undef POP
5763 }
5764
5765 /* Parse a cast expression (C90 6.3.4, C99 6.5.4).  If AFTER is not
5766    NULL then it is an Objective-C message expression which is the
5767    primary-expression starting the expression as an initializer.
5768
5769    cast-expression:
5770      unary-expression
5771      ( type-name ) unary-expression
5772 */
5773
5774 static struct c_expr
5775 c_parser_cast_expression (c_parser *parser, struct c_expr *after)
5776 {
5777   location_t cast_loc = c_parser_peek_token (parser)->location;
5778   gcc_assert (!after || c_dialect_objc ());
5779   if (after)
5780     return c_parser_postfix_expression_after_primary (parser,
5781                                                       cast_loc, *after);
5782   /* If the expression begins with a parenthesized type name, it may
5783      be either a cast or a compound literal; we need to see whether
5784      the next character is '{' to tell the difference.  If not, it is
5785      an unary expression.  Full detection of unknown typenames here
5786      would require a 3-token lookahead.  */
5787   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)
5788       && c_token_starts_typename (c_parser_peek_2nd_token (parser)))
5789     {
5790       struct c_type_name *type_name;
5791       struct c_expr ret;
5792       struct c_expr expr;
5793       c_parser_consume_token (parser);
5794       type_name = c_parser_type_name (parser);
5795       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
5796       if (type_name == NULL)
5797         {
5798           ret.value = error_mark_node;
5799           ret.original_code = ERROR_MARK;
5800           ret.original_type = NULL;
5801           return ret;
5802         }
5803
5804       /* Save casted types in the function's used types hash table.  */
5805       used_types_insert (type_name->specs->type);
5806
5807       if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
5808         return c_parser_postfix_expression_after_paren_type (parser, type_name,
5809                                                              cast_loc);
5810       {
5811         location_t expr_loc = c_parser_peek_token (parser)->location;
5812         expr = c_parser_cast_expression (parser, NULL);
5813         expr = default_function_array_read_conversion (expr_loc, expr);
5814       }
5815       ret.value = c_cast_expr (cast_loc, type_name, expr.value);
5816       ret.original_code = ERROR_MARK;
5817       ret.original_type = NULL;
5818       return ret;
5819     }
5820   else
5821     return c_parser_unary_expression (parser);
5822 }
5823
5824 /* Parse an unary expression (C90 6.3.3, C99 6.5.3).
5825
5826    unary-expression:
5827      postfix-expression
5828      ++ unary-expression
5829      -- unary-expression
5830      unary-operator cast-expression
5831      sizeof unary-expression
5832      sizeof ( type-name )
5833
5834    unary-operator: one of
5835      & * + - ~ !
5836
5837    GNU extensions:
5838
5839    unary-expression:
5840      __alignof__ unary-expression
5841      __alignof__ ( type-name )
5842      && identifier
5843
5844    (C11 permits _Alignof with type names only.)
5845
5846    unary-operator: one of
5847      __extension__ __real__ __imag__
5848
5849    Transactional Memory:
5850
5851    unary-expression:
5852      transaction-expression
5853
5854    In addition, the GNU syntax treats ++ and -- as unary operators, so
5855    they may be applied to cast expressions with errors for non-lvalues
5856    given later.  */
5857
5858 static struct c_expr
5859 c_parser_unary_expression (c_parser *parser)
5860 {
5861   int ext;
5862   struct c_expr ret, op;
5863   location_t op_loc = c_parser_peek_token (parser)->location;
5864   location_t exp_loc;
5865   ret.original_code = ERROR_MARK;
5866   ret.original_type = NULL;
5867   switch (c_parser_peek_token (parser)->type)
5868     {
5869     case CPP_PLUS_PLUS:
5870       c_parser_consume_token (parser);
5871       exp_loc = c_parser_peek_token (parser)->location;
5872       op = c_parser_cast_expression (parser, NULL);
5873       op = default_function_array_read_conversion (exp_loc, op);
5874       return parser_build_unary_op (op_loc, PREINCREMENT_EXPR, op);
5875     case CPP_MINUS_MINUS:
5876       c_parser_consume_token (parser);
5877       exp_loc = c_parser_peek_token (parser)->location;
5878       op = c_parser_cast_expression (parser, NULL);
5879       op = default_function_array_read_conversion (exp_loc, op);
5880       return parser_build_unary_op (op_loc, PREDECREMENT_EXPR, op);
5881     case CPP_AND:
5882       c_parser_consume_token (parser);
5883       op = c_parser_cast_expression (parser, NULL);
5884       mark_exp_read (op.value);
5885       return parser_build_unary_op (op_loc, ADDR_EXPR, op);
5886     case CPP_MULT:
5887       c_parser_consume_token (parser);
5888       exp_loc = c_parser_peek_token (parser)->location;
5889       op = c_parser_cast_expression (parser, NULL);
5890       op = default_function_array_read_conversion (exp_loc, op);
5891       ret.value = build_indirect_ref (op_loc, op.value, RO_UNARY_STAR);
5892       return ret;
5893     case CPP_PLUS:
5894       if (!c_dialect_objc () && !in_system_header)
5895         warning_at (op_loc,
5896                     OPT_Wtraditional,
5897                     "traditional C rejects the unary plus operator");
5898       c_parser_consume_token (parser);
5899       exp_loc = c_parser_peek_token (parser)->location;
5900       op = c_parser_cast_expression (parser, NULL);
5901       op = default_function_array_read_conversion (exp_loc, op);
5902       return parser_build_unary_op (op_loc, CONVERT_EXPR, op);
5903     case CPP_MINUS:
5904       c_parser_consume_token (parser);
5905       exp_loc = c_parser_peek_token (parser)->location;
5906       op = c_parser_cast_expression (parser, NULL);
5907       op = default_function_array_read_conversion (exp_loc, op);
5908       return parser_build_unary_op (op_loc, NEGATE_EXPR, op);
5909     case CPP_COMPL:
5910       c_parser_consume_token (parser);
5911       exp_loc = c_parser_peek_token (parser)->location;
5912       op = c_parser_cast_expression (parser, NULL);
5913       op = default_function_array_read_conversion (exp_loc, op);
5914       return parser_build_unary_op (op_loc, BIT_NOT_EXPR, op);
5915     case CPP_NOT:
5916       c_parser_consume_token (parser);
5917       exp_loc = c_parser_peek_token (parser)->location;
5918       op = c_parser_cast_expression (parser, NULL);
5919       op = default_function_array_read_conversion (exp_loc, op);
5920       return parser_build_unary_op (op_loc, TRUTH_NOT_EXPR, op);
5921     case CPP_AND_AND:
5922       /* Refer to the address of a label as a pointer.  */
5923       c_parser_consume_token (parser);
5924       if (c_parser_next_token_is (parser, CPP_NAME))
5925         {
5926           ret.value = finish_label_address_expr
5927             (c_parser_peek_token (parser)->value, op_loc);
5928           c_parser_consume_token (parser);
5929         }
5930       else
5931         {
5932           c_parser_error (parser, "expected identifier");
5933           ret.value = error_mark_node;
5934         }
5935         return ret;
5936     case CPP_KEYWORD:
5937       switch (c_parser_peek_token (parser)->keyword)
5938         {
5939         case RID_SIZEOF:
5940           return c_parser_sizeof_expression (parser);
5941         case RID_ALIGNOF:
5942           return c_parser_alignof_expression (parser);
5943         case RID_EXTENSION:
5944           c_parser_consume_token (parser);
5945           ext = disable_extension_diagnostics ();
5946           ret = c_parser_cast_expression (parser, NULL);
5947           restore_extension_diagnostics (ext);
5948           return ret;
5949         case RID_REALPART:
5950           c_parser_consume_token (parser);
5951           exp_loc = c_parser_peek_token (parser)->location;
5952           op = c_parser_cast_expression (parser, NULL);
5953           op = default_function_array_conversion (exp_loc, op);
5954           return parser_build_unary_op (op_loc, REALPART_EXPR, op);
5955         case RID_IMAGPART:
5956           c_parser_consume_token (parser);
5957           exp_loc = c_parser_peek_token (parser)->location;
5958           op = c_parser_cast_expression (parser, NULL);
5959           op = default_function_array_conversion (exp_loc, op);
5960           return parser_build_unary_op (op_loc, IMAGPART_EXPR, op);
5961         case RID_TRANSACTION_ATOMIC:
5962         case RID_TRANSACTION_RELAXED:
5963           return c_parser_transaction_expression (parser,
5964               c_parser_peek_token (parser)->keyword);
5965         default:
5966           return c_parser_postfix_expression (parser);
5967         }
5968     default:
5969       return c_parser_postfix_expression (parser);
5970     }
5971 }
5972
5973 /* Parse a sizeof expression.  */
5974
5975 static struct c_expr
5976 c_parser_sizeof_expression (c_parser *parser)
5977 {
5978   struct c_expr expr;
5979   location_t expr_loc;
5980   gcc_assert (c_parser_next_token_is_keyword (parser, RID_SIZEOF));
5981   c_parser_consume_token (parser);
5982   c_inhibit_evaluation_warnings++;
5983   in_sizeof++;
5984   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)
5985       && c_token_starts_typename (c_parser_peek_2nd_token (parser)))
5986     {
5987       /* Either sizeof ( type-name ) or sizeof unary-expression
5988          starting with a compound literal.  */
5989       struct c_type_name *type_name;
5990       c_parser_consume_token (parser);
5991       expr_loc = c_parser_peek_token (parser)->location;
5992       type_name = c_parser_type_name (parser);
5993       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
5994       if (type_name == NULL)
5995         {
5996           struct c_expr ret;
5997           c_inhibit_evaluation_warnings--;
5998           in_sizeof--;
5999           ret.value = error_mark_node;
6000           ret.original_code = ERROR_MARK;
6001           ret.original_type = NULL;
6002           return ret;
6003         }
6004       if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
6005         {
6006           expr = c_parser_postfix_expression_after_paren_type (parser,
6007                                                                type_name,
6008                                                                expr_loc);
6009           goto sizeof_expr;
6010         }
6011       /* sizeof ( type-name ).  */
6012       c_inhibit_evaluation_warnings--;
6013       in_sizeof--;
6014       return c_expr_sizeof_type (expr_loc, type_name);
6015     }
6016   else
6017     {
6018       expr_loc = c_parser_peek_token (parser)->location;
6019       expr = c_parser_unary_expression (parser);
6020     sizeof_expr:
6021       c_inhibit_evaluation_warnings--;
6022       in_sizeof--;
6023       mark_exp_read (expr.value);
6024       if (TREE_CODE (expr.value) == COMPONENT_REF
6025           && DECL_C_BIT_FIELD (TREE_OPERAND (expr.value, 1)))
6026         error_at (expr_loc, "%<sizeof%> applied to a bit-field");
6027       return c_expr_sizeof_expr (expr_loc, expr);
6028     }
6029 }
6030
6031 /* Parse an alignof expression.  */
6032
6033 static struct c_expr
6034 c_parser_alignof_expression (c_parser *parser)
6035 {
6036   struct c_expr expr;
6037   location_t loc = c_parser_peek_token (parser)->location;
6038   tree alignof_spelling = c_parser_peek_token (parser)->value;
6039   gcc_assert (c_parser_next_token_is_keyword (parser, RID_ALIGNOF));
6040   /* A diagnostic is not required for the use of this identifier in
6041      the implementation namespace; only diagnose it for the C11
6042      spelling because of existing code using the other spellings.  */
6043   if (!flag_isoc11
6044       && strcmp (IDENTIFIER_POINTER (alignof_spelling), "_Alignof") == 0)
6045     {
6046       if (flag_isoc99)
6047         pedwarn (loc, OPT_pedantic, "ISO C99 does not support %qE",
6048                  alignof_spelling);
6049       else
6050         pedwarn (loc, OPT_pedantic, "ISO C90 does not support %qE",
6051                  alignof_spelling);
6052     }
6053   c_parser_consume_token (parser);
6054   c_inhibit_evaluation_warnings++;
6055   in_alignof++;
6056   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)
6057       && c_token_starts_typename (c_parser_peek_2nd_token (parser)))
6058     {
6059       /* Either __alignof__ ( type-name ) or __alignof__
6060          unary-expression starting with a compound literal.  */
6061       location_t loc;
6062       struct c_type_name *type_name;
6063       struct c_expr ret;
6064       c_parser_consume_token (parser);
6065       loc = c_parser_peek_token (parser)->location;
6066       type_name = c_parser_type_name (parser);
6067       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
6068       if (type_name == NULL)
6069         {
6070           struct c_expr ret;
6071           c_inhibit_evaluation_warnings--;
6072           in_alignof--;
6073           ret.value = error_mark_node;
6074           ret.original_code = ERROR_MARK;
6075           ret.original_type = NULL;
6076           return ret;
6077         }
6078       if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
6079         {
6080           expr = c_parser_postfix_expression_after_paren_type (parser,
6081                                                                type_name,
6082                                                                loc);
6083           goto alignof_expr;
6084         }
6085       /* alignof ( type-name ).  */
6086       c_inhibit_evaluation_warnings--;
6087       in_alignof--;
6088       ret.value = c_alignof (loc, groktypename (type_name, NULL, NULL));
6089       ret.original_code = ERROR_MARK;
6090       ret.original_type = NULL;
6091       return ret;
6092     }
6093   else
6094     {
6095       struct c_expr ret;
6096       expr = c_parser_unary_expression (parser);
6097     alignof_expr:
6098       mark_exp_read (expr.value);
6099       c_inhibit_evaluation_warnings--;
6100       in_alignof--;
6101       pedwarn (loc, OPT_pedantic, "ISO C does not allow %<%E (expression)%>",
6102                alignof_spelling);
6103       ret.value = c_alignof_expr (loc, expr.value);
6104       ret.original_code = ERROR_MARK;
6105       ret.original_type = NULL;
6106       return ret;
6107     }
6108 }
6109
6110 /* Helper function to read arguments of builtins which are interfaces
6111    for the middle-end nodes like COMPLEX_EXPR, VEC_PERM_EXPR and
6112    others.  The name of the builtin is passed using BNAME parameter.
6113    Function returns true if there were no errors while parsing and
6114    stores the arguments in CEXPR_LIST.  */
6115 static bool
6116 c_parser_get_builtin_args (c_parser *parser, const char *bname,
6117                            VEC(c_expr_t,gc) **ret_cexpr_list)
6118 {
6119   location_t loc = c_parser_peek_token (parser)->location;
6120   VEC (c_expr_t,gc) *cexpr_list;
6121   c_expr_t expr;
6122
6123   *ret_cexpr_list = NULL;
6124   if (c_parser_next_token_is_not (parser, CPP_OPEN_PAREN))
6125     {
6126       error_at (loc, "cannot take address of %qs", bname);
6127       return false;
6128     }
6129
6130   c_parser_consume_token (parser);
6131
6132   if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
6133     {
6134       c_parser_consume_token (parser);
6135       return true;
6136     }
6137
6138   expr = c_parser_expr_no_commas (parser, NULL);
6139   cexpr_list = VEC_alloc (c_expr_t, gc, 1);
6140   C_EXPR_APPEND (cexpr_list, expr);
6141   while (c_parser_next_token_is (parser, CPP_COMMA))
6142     {
6143       c_parser_consume_token (parser);
6144       expr = c_parser_expr_no_commas (parser, NULL);
6145       C_EXPR_APPEND (cexpr_list, expr);
6146     }
6147
6148   if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
6149     return false;
6150
6151   *ret_cexpr_list = cexpr_list;
6152   return true;
6153 }
6154
6155
6156 /* Parse a postfix expression (C90 6.3.1-6.3.2, C99 6.5.1-6.5.2).
6157
6158    postfix-expression:
6159      primary-expression
6160      postfix-expression [ expression ]
6161      postfix-expression ( argument-expression-list[opt] )
6162      postfix-expression . identifier
6163      postfix-expression -> identifier
6164      postfix-expression ++
6165      postfix-expression --
6166      ( type-name ) { initializer-list }
6167      ( type-name ) { initializer-list , }
6168
6169    argument-expression-list:
6170      argument-expression
6171      argument-expression-list , argument-expression
6172
6173    primary-expression:
6174      identifier
6175      constant
6176      string-literal
6177      ( expression )
6178
6179    GNU extensions:
6180
6181    primary-expression:
6182      __func__
6183        (treated as a keyword in GNU C)
6184      __FUNCTION__
6185      __PRETTY_FUNCTION__
6186      ( compound-statement )
6187      __builtin_va_arg ( assignment-expression , type-name )
6188      __builtin_offsetof ( type-name , offsetof-member-designator )
6189      __builtin_choose_expr ( assignment-expression ,
6190                              assignment-expression ,
6191                              assignment-expression )
6192      __builtin_types_compatible_p ( type-name , type-name )
6193      __builtin_complex ( assignment-expression , assignment-expression )
6194      __builtin_shuffle ( assignment-expression , assignment-expression )
6195      __builtin_shuffle ( assignment-expression , 
6196                          assignment-expression ,
6197                          assignment-expression, )
6198
6199    offsetof-member-designator:
6200      identifier
6201      offsetof-member-designator . identifier
6202      offsetof-member-designator [ expression ]
6203
6204    Objective-C:
6205
6206    primary-expression:
6207      [ objc-receiver objc-message-args ]
6208      @selector ( objc-selector-arg )
6209      @protocol ( identifier )
6210      @encode ( type-name )
6211      objc-string-literal
6212      Classname . identifier
6213 */
6214
6215 static struct c_expr
6216 c_parser_postfix_expression (c_parser *parser)
6217 {
6218   struct c_expr expr, e1;
6219   struct c_type_name *t1, *t2;
6220   location_t loc = c_parser_peek_token (parser)->location;;
6221   expr.original_code = ERROR_MARK;
6222   expr.original_type = NULL;
6223   switch (c_parser_peek_token (parser)->type)
6224     {
6225     case CPP_NUMBER:
6226       expr.value = c_parser_peek_token (parser)->value;
6227       loc = c_parser_peek_token (parser)->location;
6228       c_parser_consume_token (parser);
6229       if (TREE_CODE (expr.value) == FIXED_CST
6230           && !targetm.fixed_point_supported_p ())
6231         {
6232           error_at (loc, "fixed-point types not supported for this target");
6233           expr.value = error_mark_node;
6234         }
6235       break;
6236     case CPP_CHAR:
6237     case CPP_CHAR16:
6238     case CPP_CHAR32:
6239     case CPP_WCHAR:
6240       expr.value = c_parser_peek_token (parser)->value;
6241       c_parser_consume_token (parser);
6242       break;
6243     case CPP_STRING:
6244     case CPP_STRING16:
6245     case CPP_STRING32:
6246     case CPP_WSTRING:
6247     case CPP_UTF8STRING:
6248       expr.value = c_parser_peek_token (parser)->value;
6249       expr.original_code = STRING_CST;
6250       c_parser_consume_token (parser);
6251       break;
6252     case CPP_OBJC_STRING:
6253       gcc_assert (c_dialect_objc ());
6254       expr.value
6255         = objc_build_string_object (c_parser_peek_token (parser)->value);
6256       c_parser_consume_token (parser);
6257       break;
6258     case CPP_NAME:
6259       switch (c_parser_peek_token (parser)->id_kind)
6260         {
6261         case C_ID_ID:
6262           {
6263             tree id = c_parser_peek_token (parser)->value;
6264             c_parser_consume_token (parser);
6265             expr.value = build_external_ref (loc, id,
6266                                              (c_parser_peek_token (parser)->type
6267                                               == CPP_OPEN_PAREN),
6268                                              &expr.original_type);
6269             break;
6270           }
6271         case C_ID_CLASSNAME:
6272           {
6273             /* Here we parse the Objective-C 2.0 Class.name dot
6274                syntax.  */
6275             tree class_name = c_parser_peek_token (parser)->value;
6276             tree component;
6277             c_parser_consume_token (parser);
6278             gcc_assert (c_dialect_objc ());
6279             if (!c_parser_require (parser, CPP_DOT, "expected %<.%>"))
6280               {
6281                 expr.value = error_mark_node;
6282                 break;
6283               }
6284             if (c_parser_next_token_is_not (parser, CPP_NAME))
6285               {
6286                 c_parser_error (parser, "expected identifier");
6287                 expr.value = error_mark_node;
6288                 break;
6289               }
6290             component = c_parser_peek_token (parser)->value;
6291             c_parser_consume_token (parser);
6292             expr.value = objc_build_class_component_ref (class_name, 
6293                                                          component);
6294             break;
6295           }
6296         default:
6297           c_parser_error (parser, "expected expression");
6298           expr.value = error_mark_node;
6299           break;
6300         }
6301       break;
6302     case CPP_OPEN_PAREN:
6303       /* A parenthesized expression, statement expression or compound
6304          literal.  */
6305       if (c_parser_peek_2nd_token (parser)->type == CPP_OPEN_BRACE)
6306         {
6307           /* A statement expression.  */
6308           tree stmt;
6309           location_t brace_loc;
6310           c_parser_consume_token (parser);
6311           brace_loc = c_parser_peek_token (parser)->location;
6312           c_parser_consume_token (parser);
6313           if (!building_stmt_list_p ())
6314             {
6315               error_at (loc, "braced-group within expression allowed "
6316                         "only inside a function");
6317               parser->error = true;
6318               c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL);
6319               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
6320               expr.value = error_mark_node;
6321               break;
6322             }
6323           stmt = c_begin_stmt_expr ();
6324           c_parser_compound_statement_nostart (parser);
6325           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
6326                                      "expected %<)%>");
6327           pedwarn (loc, OPT_pedantic,
6328                    "ISO C forbids braced-groups within expressions");
6329           expr.value = c_finish_stmt_expr (brace_loc, stmt);
6330           mark_exp_read (expr.value);
6331         }
6332       else if (c_token_starts_typename (c_parser_peek_2nd_token (parser)))
6333         {
6334           /* A compound literal.  ??? Can we actually get here rather
6335              than going directly to
6336              c_parser_postfix_expression_after_paren_type from
6337              elsewhere?  */
6338           location_t loc;
6339           struct c_type_name *type_name;
6340           c_parser_consume_token (parser);
6341           loc = c_parser_peek_token (parser)->location;
6342           type_name = c_parser_type_name (parser);
6343           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
6344                                      "expected %<)%>");
6345           if (type_name == NULL)
6346             {
6347               expr.value = error_mark_node;
6348             }
6349           else
6350             expr = c_parser_postfix_expression_after_paren_type (parser,
6351                                                                  type_name,
6352                                                                  loc);
6353         }
6354       else
6355         {
6356           /* A parenthesized expression.  */
6357           c_parser_consume_token (parser);
6358           expr = c_parser_expression (parser);
6359           if (TREE_CODE (expr.value) == MODIFY_EXPR)
6360             TREE_NO_WARNING (expr.value) = 1;
6361           if (expr.original_code != C_MAYBE_CONST_EXPR)
6362             expr.original_code = ERROR_MARK;
6363           /* Don't change EXPR.ORIGINAL_TYPE.  */
6364           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
6365                                      "expected %<)%>");
6366         }
6367       break;
6368     case CPP_KEYWORD:
6369       switch (c_parser_peek_token (parser)->keyword)
6370         {
6371         case RID_FUNCTION_NAME:
6372         case RID_PRETTY_FUNCTION_NAME:
6373         case RID_C99_FUNCTION_NAME:
6374           expr.value = fname_decl (loc,
6375                                    c_parser_peek_token (parser)->keyword,
6376                                    c_parser_peek_token (parser)->value);
6377           c_parser_consume_token (parser);
6378           break;
6379         case RID_VA_ARG:
6380           c_parser_consume_token (parser);
6381           if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
6382             {
6383               expr.value = error_mark_node;
6384               break;
6385             }
6386           e1 = c_parser_expr_no_commas (parser, NULL);
6387           mark_exp_read (e1.value);
6388           e1.value = c_fully_fold (e1.value, false, NULL);
6389           if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
6390             {
6391               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
6392               expr.value = error_mark_node;
6393               break;
6394             }
6395           loc = c_parser_peek_token (parser)->location;
6396           t1 = c_parser_type_name (parser);
6397           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
6398                                      "expected %<)%>");
6399           if (t1 == NULL)
6400             {
6401               expr.value = error_mark_node;
6402             }
6403           else
6404             {
6405               tree type_expr = NULL_TREE;
6406               expr.value = c_build_va_arg (loc, e1.value,
6407                                            groktypename (t1, &type_expr, NULL));
6408               if (type_expr)
6409                 {
6410                   expr.value = build2 (C_MAYBE_CONST_EXPR,
6411                                        TREE_TYPE (expr.value), type_expr,
6412                                        expr.value);
6413                   C_MAYBE_CONST_EXPR_NON_CONST (expr.value) = true;
6414                 }
6415             }
6416           break;
6417         case RID_OFFSETOF:
6418           c_parser_consume_token (parser);
6419           if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
6420             {
6421               expr.value = error_mark_node;
6422               break;
6423             }
6424           t1 = c_parser_type_name (parser);
6425           if (t1 == NULL)
6426             parser->error = true;
6427           if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
6428             gcc_assert (parser->error);
6429           if (parser->error)
6430             {
6431               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
6432               expr.value = error_mark_node;
6433               break;
6434             }
6435
6436           {
6437             tree type = groktypename (t1, NULL, NULL);
6438             tree offsetof_ref;
6439             if (type == error_mark_node)
6440               offsetof_ref = error_mark_node;
6441             else
6442               {
6443                 offsetof_ref = build1 (INDIRECT_REF, type, null_pointer_node);
6444                 SET_EXPR_LOCATION (offsetof_ref, loc);
6445               }
6446             /* Parse the second argument to __builtin_offsetof.  We
6447                must have one identifier, and beyond that we want to
6448                accept sub structure and sub array references.  */
6449             if (c_parser_next_token_is (parser, CPP_NAME))
6450               {
6451                 offsetof_ref = build_component_ref
6452                   (loc, offsetof_ref, c_parser_peek_token (parser)->value);
6453                 c_parser_consume_token (parser);
6454                 while (c_parser_next_token_is (parser, CPP_DOT)
6455                        || c_parser_next_token_is (parser,
6456                                                   CPP_OPEN_SQUARE)
6457                        || c_parser_next_token_is (parser,
6458                                                   CPP_DEREF))
6459                   {
6460                     if (c_parser_next_token_is (parser, CPP_DEREF))
6461                       {
6462                         loc = c_parser_peek_token (parser)->location;
6463                         offsetof_ref = build_array_ref (loc,
6464                                                         offsetof_ref,
6465                                                         integer_zero_node);
6466                         goto do_dot;
6467                       }
6468                     else if (c_parser_next_token_is (parser, CPP_DOT))
6469                       {
6470                       do_dot:
6471                         c_parser_consume_token (parser);
6472                         if (c_parser_next_token_is_not (parser,
6473                                                         CPP_NAME))
6474                           {
6475                             c_parser_error (parser, "expected identifier");
6476                             break;
6477                           }
6478                         offsetof_ref = build_component_ref
6479                           (loc, offsetof_ref,
6480                            c_parser_peek_token (parser)->value);
6481                         c_parser_consume_token (parser);
6482                       }
6483                     else
6484                       {
6485                         tree idx;
6486                         loc = c_parser_peek_token (parser)->location;
6487                         c_parser_consume_token (parser);
6488                         idx = c_parser_expression (parser).value;
6489                         idx = c_fully_fold (idx, false, NULL);
6490                         c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
6491                                                    "expected %<]%>");
6492                         offsetof_ref = build_array_ref (loc, offsetof_ref, idx);
6493                       }
6494                   }
6495               }
6496             else
6497               c_parser_error (parser, "expected identifier");
6498             c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
6499                                        "expected %<)%>");
6500             expr.value = fold_offsetof (offsetof_ref);
6501           }
6502           break;
6503         case RID_CHOOSE_EXPR:
6504           {
6505             VEC (c_expr_t, gc) *cexpr_list;
6506             c_expr_t *e1_p, *e2_p, *e3_p;
6507             tree c;
6508
6509             c_parser_consume_token (parser);
6510             if (!c_parser_get_builtin_args (parser,
6511                                             "__builtin_choose_expr",
6512                                             &cexpr_list))
6513               {
6514                 expr.value = error_mark_node;
6515                 break;
6516               }
6517
6518             if (VEC_length (c_expr_t, cexpr_list) != 3)
6519               {
6520                 error_at (loc, "wrong number of arguments to "
6521                                "%<__builtin_choose_expr%>");
6522                 expr.value = error_mark_node;
6523                 break;
6524               }
6525
6526             e1_p = VEC_index (c_expr_t, cexpr_list, 0);
6527             e2_p = VEC_index (c_expr_t, cexpr_list, 1);
6528             e3_p = VEC_index (c_expr_t, cexpr_list, 2);
6529
6530             c = e1_p->value;
6531             mark_exp_read (e2_p->value);
6532             mark_exp_read (e3_p->value);
6533             if (TREE_CODE (c) != INTEGER_CST
6534                 || !INTEGRAL_TYPE_P (TREE_TYPE (c)))
6535               error_at (loc,
6536                         "first argument to %<__builtin_choose_expr%> not"
6537                         " a constant");
6538             constant_expression_warning (c);
6539             expr = integer_zerop (c) ? *e3_p : *e2_p;
6540             break;
6541           }
6542         case RID_TYPES_COMPATIBLE_P:
6543           c_parser_consume_token (parser);
6544           if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
6545             {
6546               expr.value = error_mark_node;
6547               break;
6548             }
6549           t1 = c_parser_type_name (parser);
6550           if (t1 == NULL)
6551             {
6552               expr.value = error_mark_node;
6553               break;
6554             }
6555           if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
6556             {
6557               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
6558               expr.value = error_mark_node;
6559               break;
6560             }
6561           t2 = c_parser_type_name (parser);
6562           if (t2 == NULL)
6563             {
6564               expr.value = error_mark_node;
6565               break;
6566             }
6567           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
6568                                      "expected %<)%>");
6569           {
6570             tree e1, e2;
6571             e1 = groktypename (t1, NULL, NULL);
6572             e2 = groktypename (t2, NULL, NULL);
6573             if (e1 == error_mark_node || e2 == error_mark_node)
6574               {
6575                 expr.value = error_mark_node;
6576                 break;
6577               }
6578
6579             e1 = TYPE_MAIN_VARIANT (e1);
6580             e2 = TYPE_MAIN_VARIANT (e2);
6581
6582             expr.value
6583               = comptypes (e1, e2) ? integer_one_node : integer_zero_node;
6584           }
6585           break;
6586         case RID_BUILTIN_COMPLEX:
6587           {
6588             VEC(c_expr_t, gc) *cexpr_list;
6589             c_expr_t *e1_p, *e2_p;
6590
6591             c_parser_consume_token (parser);
6592             if (!c_parser_get_builtin_args (parser,
6593                                             "__builtin_complex",
6594                                             &cexpr_list))
6595               {
6596                 expr.value = error_mark_node;
6597                 break;
6598               }
6599
6600             if (VEC_length (c_expr_t, cexpr_list) != 2)
6601               {
6602                 error_at (loc, "wrong number of arguments to "
6603                                "%<__builtin_complex%>");
6604                 expr.value = error_mark_node;
6605                 break;
6606               }
6607
6608             e1_p = VEC_index (c_expr_t, cexpr_list, 0);
6609             e2_p = VEC_index (c_expr_t, cexpr_list, 1);
6610
6611             mark_exp_read (e1_p->value);
6612             if (TREE_CODE (e1_p->value) == EXCESS_PRECISION_EXPR)
6613               e1_p->value = convert (TREE_TYPE (e1_p->value),
6614                                      TREE_OPERAND (e1_p->value, 0));
6615             mark_exp_read (e2_p->value);
6616             if (TREE_CODE (e2_p->value) == EXCESS_PRECISION_EXPR)
6617               e2_p->value = convert (TREE_TYPE (e2_p->value),
6618                                      TREE_OPERAND (e2_p->value, 0));
6619             if (!SCALAR_FLOAT_TYPE_P (TREE_TYPE (e1_p->value))
6620                 || DECIMAL_FLOAT_TYPE_P (TREE_TYPE (e1_p->value))
6621                 || !SCALAR_FLOAT_TYPE_P (TREE_TYPE (e2_p->value))
6622                 || DECIMAL_FLOAT_TYPE_P (TREE_TYPE (e2_p->value)))
6623               {
6624                 error_at (loc, "%<__builtin_complex%> operand "
6625                           "not of real binary floating-point type");
6626                 expr.value = error_mark_node;
6627                 break;
6628               }
6629             if (TYPE_MAIN_VARIANT (TREE_TYPE (e1_p->value))
6630                 != TYPE_MAIN_VARIANT (TREE_TYPE (e2_p->value)))
6631               {
6632                 error_at (loc,
6633                           "%<__builtin_complex%> operands of different types");
6634                 expr.value = error_mark_node;
6635                 break;
6636               }
6637             if (!flag_isoc99)
6638               pedwarn (loc, OPT_pedantic,
6639                        "ISO C90 does not support complex types");
6640             expr.value = build2 (COMPLEX_EXPR,
6641                                  build_complex_type
6642                                    (TYPE_MAIN_VARIANT
6643                                      (TREE_TYPE (e1_p->value))),
6644                                  e1_p->value, e2_p->value);
6645             break;
6646           }
6647         case RID_BUILTIN_SHUFFLE:
6648           {
6649             VEC(c_expr_t,gc) *cexpr_list;
6650             unsigned int i;
6651             c_expr_t *p;
6652
6653             c_parser_consume_token (parser);
6654             if (!c_parser_get_builtin_args (parser,
6655                                             "__builtin_shuffle",
6656                                             &cexpr_list))
6657               {
6658                 expr.value = error_mark_node;
6659                 break;
6660               }
6661
6662             FOR_EACH_VEC_ELT (c_expr_t, cexpr_list, i, p)
6663               mark_exp_read (p->value);
6664
6665             if (VEC_length (c_expr_t, cexpr_list) == 2)
6666               expr.value =
6667                 c_build_vec_perm_expr
6668                   (loc, VEC_index (c_expr_t, cexpr_list, 0)->value,
6669                    NULL_TREE, VEC_index (c_expr_t, cexpr_list, 1)->value);
6670
6671             else if (VEC_length (c_expr_t, cexpr_list) == 3)
6672               expr.value =
6673                 c_build_vec_perm_expr
6674                   (loc, VEC_index (c_expr_t, cexpr_list, 0)->value,
6675                    VEC_index (c_expr_t, cexpr_list, 1)->value,
6676                    VEC_index (c_expr_t, cexpr_list, 2)->value);
6677             else
6678               {
6679                 error_at (loc, "wrong number of arguments to "
6680                                "%<__builtin_shuffle%>");
6681                 expr.value = error_mark_node;
6682               }
6683             break;
6684           }
6685         case RID_AT_SELECTOR:
6686           gcc_assert (c_dialect_objc ());
6687           c_parser_consume_token (parser);
6688           if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
6689             {
6690               expr.value = error_mark_node;
6691               break;
6692             }
6693           {
6694             tree sel = c_parser_objc_selector_arg (parser);
6695             c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
6696                                        "expected %<)%>");
6697             expr.value = objc_build_selector_expr (loc, sel);
6698           }
6699           break;
6700         case RID_AT_PROTOCOL:
6701           gcc_assert (c_dialect_objc ());
6702           c_parser_consume_token (parser);
6703           if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
6704             {
6705               expr.value = error_mark_node;
6706               break;
6707             }
6708           if (c_parser_next_token_is_not (parser, CPP_NAME))
6709             {
6710               c_parser_error (parser, "expected identifier");
6711               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
6712               expr.value = error_mark_node;
6713               break;
6714             }
6715           {
6716             tree id = c_parser_peek_token (parser)->value;
6717             c_parser_consume_token (parser);
6718             c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
6719                                        "expected %<)%>");
6720             expr.value = objc_build_protocol_expr (id);
6721           }
6722           break;
6723         case RID_AT_ENCODE:
6724           /* Extension to support C-structures in the archiver.  */
6725           gcc_assert (c_dialect_objc ());
6726           c_parser_consume_token (parser);
6727           if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
6728             {
6729               expr.value = error_mark_node;
6730               break;
6731             }
6732           t1 = c_parser_type_name (parser);
6733           if (t1 == NULL)
6734             {
6735               expr.value = error_mark_node;
6736               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
6737               break;
6738             }
6739           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
6740                                      "expected %<)%>");
6741           {
6742             tree type = groktypename (t1, NULL, NULL);
6743             expr.value = objc_build_encode_expr (type);
6744           }
6745           break;
6746         default:
6747           c_parser_error (parser, "expected expression");
6748           expr.value = error_mark_node;
6749           break;
6750         }
6751       break;
6752     case CPP_OPEN_SQUARE:
6753       if (c_dialect_objc ())
6754         {
6755           tree receiver, args;
6756           c_parser_consume_token (parser);
6757           receiver = c_parser_objc_receiver (parser);
6758           args = c_parser_objc_message_args (parser);
6759           c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
6760                                      "expected %<]%>");
6761           expr.value = objc_build_message_expr (receiver, args);
6762           break;
6763         }
6764       /* Else fall through to report error.  */
6765     default:
6766       c_parser_error (parser, "expected expression");
6767       expr.value = error_mark_node;
6768       break;
6769     }
6770   return c_parser_postfix_expression_after_primary (parser, loc, expr);
6771 }
6772
6773 /* Parse a postfix expression after a parenthesized type name: the
6774    brace-enclosed initializer of a compound literal, possibly followed
6775    by some postfix operators.  This is separate because it is not
6776    possible to tell until after the type name whether a cast
6777    expression has a cast or a compound literal, or whether the operand
6778    of sizeof is a parenthesized type name or starts with a compound
6779    literal.  TYPE_LOC is the location where TYPE_NAME starts--the
6780    location of the first token after the parentheses around the type
6781    name.  */
6782
6783 static struct c_expr
6784 c_parser_postfix_expression_after_paren_type (c_parser *parser,
6785                                               struct c_type_name *type_name,
6786                                               location_t type_loc)
6787 {
6788   tree type;
6789   struct c_expr init;
6790   bool non_const;
6791   struct c_expr expr;
6792   location_t start_loc;
6793   tree type_expr = NULL_TREE;
6794   bool type_expr_const = true;
6795   check_compound_literal_type (type_loc, type_name);
6796   start_init (NULL_TREE, NULL, 0);
6797   type = groktypename (type_name, &type_expr, &type_expr_const);
6798   start_loc = c_parser_peek_token (parser)->location;
6799   if (type != error_mark_node && C_TYPE_VARIABLE_SIZE (type))
6800     {
6801       error_at (type_loc, "compound literal has variable size");
6802       type = error_mark_node;
6803     }
6804   init = c_parser_braced_init (parser, type, false);
6805   finish_init ();
6806   maybe_warn_string_init (type, init);
6807
6808   if (type != error_mark_node
6809       && !ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (type))
6810       && current_function_decl)
6811     {
6812       error ("compound literal qualified by address-space qualifier");
6813       type = error_mark_node;
6814     }
6815
6816   if (!flag_isoc99)
6817     pedwarn (start_loc, OPT_pedantic, "ISO C90 forbids compound literals");
6818   non_const = ((init.value && TREE_CODE (init.value) == CONSTRUCTOR)
6819                ? CONSTRUCTOR_NON_CONST (init.value)
6820                : init.original_code == C_MAYBE_CONST_EXPR);
6821   non_const |= !type_expr_const;
6822   expr.value = build_compound_literal (start_loc, type, init.value, non_const);
6823   expr.original_code = ERROR_MARK;
6824   expr.original_type = NULL;
6825   if (type_expr)
6826     {
6827       if (TREE_CODE (expr.value) == C_MAYBE_CONST_EXPR)
6828         {
6829           gcc_assert (C_MAYBE_CONST_EXPR_PRE (expr.value) == NULL_TREE);
6830           C_MAYBE_CONST_EXPR_PRE (expr.value) = type_expr;
6831         }
6832       else
6833         {
6834           gcc_assert (!non_const);
6835           expr.value = build2 (C_MAYBE_CONST_EXPR, type,
6836                                type_expr, expr.value);
6837         }
6838     }
6839   return c_parser_postfix_expression_after_primary (parser, start_loc, expr);
6840 }
6841
6842 /* Parse a postfix expression after the initial primary or compound
6843    literal; that is, parse a series of postfix operators.
6844
6845    EXPR_LOC is the location of the primary expression.  */
6846
6847 static struct c_expr
6848 c_parser_postfix_expression_after_primary (c_parser *parser,
6849                                            location_t expr_loc,
6850                                            struct c_expr expr)
6851 {
6852   struct c_expr orig_expr;
6853   tree ident, idx;
6854   VEC(tree,gc) *exprlist;
6855   VEC(tree,gc) *origtypes;
6856   while (true)
6857     {
6858       location_t op_loc = c_parser_peek_token (parser)->location;
6859       switch (c_parser_peek_token (parser)->type)
6860         {
6861         case CPP_OPEN_SQUARE:
6862           /* Array reference.  */
6863           c_parser_consume_token (parser);
6864           idx = c_parser_expression (parser).value;
6865           c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
6866                                      "expected %<]%>");
6867           expr.value = build_array_ref (op_loc, expr.value, idx);
6868           expr.original_code = ERROR_MARK;
6869           expr.original_type = NULL;
6870           break;
6871         case CPP_OPEN_PAREN:
6872           /* Function call.  */
6873           c_parser_consume_token (parser);
6874           if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
6875             exprlist = NULL;
6876           else
6877             exprlist = c_parser_expr_list (parser, true, false, &origtypes);
6878           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
6879                                      "expected %<)%>");
6880           orig_expr = expr;
6881           mark_exp_read (expr.value);
6882           /* FIXME diagnostics: Ideally we want the FUNCNAME, not the
6883              "(" after the FUNCNAME, which is what we have now.    */
6884           expr.value = build_function_call_vec (op_loc, expr.value, exprlist,
6885                                                 origtypes);
6886           expr.original_code = ERROR_MARK;
6887           if (TREE_CODE (expr.value) == INTEGER_CST
6888               && TREE_CODE (orig_expr.value) == FUNCTION_DECL
6889               && DECL_BUILT_IN_CLASS (orig_expr.value) == BUILT_IN_NORMAL
6890               && DECL_FUNCTION_CODE (orig_expr.value) == BUILT_IN_CONSTANT_P)
6891             expr.original_code = C_MAYBE_CONST_EXPR;
6892           expr.original_type = NULL;
6893           if (exprlist != NULL)
6894             {
6895               release_tree_vector (exprlist);
6896               release_tree_vector (origtypes);
6897             }
6898           break;
6899         case CPP_DOT:
6900           /* Structure element reference.  */
6901           c_parser_consume_token (parser);
6902           expr = default_function_array_conversion (expr_loc, expr);
6903           if (c_parser_next_token_is (parser, CPP_NAME))
6904             ident = c_parser_peek_token (parser)->value;
6905           else
6906             {
6907               c_parser_error (parser, "expected identifier");
6908               expr.value = error_mark_node;
6909               expr.original_code = ERROR_MARK;
6910               expr.original_type = NULL;
6911               return expr;
6912             }
6913           c_parser_consume_token (parser);
6914           expr.value = build_component_ref (op_loc, expr.value, ident);
6915           expr.original_code = ERROR_MARK;
6916           if (TREE_CODE (expr.value) != COMPONENT_REF)
6917             expr.original_type = NULL;
6918           else
6919             {
6920               /* Remember the original type of a bitfield.  */
6921               tree field = TREE_OPERAND (expr.value, 1);
6922               if (TREE_CODE (field) != FIELD_DECL)
6923                 expr.original_type = NULL;
6924               else
6925                 expr.original_type = DECL_BIT_FIELD_TYPE (field);
6926             }
6927           break;
6928         case CPP_DEREF:
6929           /* Structure element reference.  */
6930           c_parser_consume_token (parser);
6931           expr = default_function_array_conversion (expr_loc, expr);
6932           if (c_parser_next_token_is (parser, CPP_NAME))
6933             ident = c_parser_peek_token (parser)->value;
6934           else
6935             {
6936               c_parser_error (parser, "expected identifier");
6937               expr.value = error_mark_node;
6938               expr.original_code = ERROR_MARK;
6939               expr.original_type = NULL;
6940               return expr;
6941             }
6942           c_parser_consume_token (parser);
6943           expr.value = build_component_ref (op_loc,
6944                                             build_indirect_ref (op_loc,
6945                                                                 expr.value,
6946                                                                 RO_ARROW),
6947                                             ident);
6948           expr.original_code = ERROR_MARK;
6949           if (TREE_CODE (expr.value) != COMPONENT_REF)
6950             expr.original_type = NULL;
6951           else
6952             {
6953               /* Remember the original type of a bitfield.  */
6954               tree field = TREE_OPERAND (expr.value, 1);
6955               if (TREE_CODE (field) != FIELD_DECL)
6956                 expr.original_type = NULL;
6957               else
6958                 expr.original_type = DECL_BIT_FIELD_TYPE (field);
6959             }
6960           break;
6961         case CPP_PLUS_PLUS:
6962           /* Postincrement.  */
6963           c_parser_consume_token (parser);
6964           expr = default_function_array_read_conversion (expr_loc, expr);
6965           expr.value = build_unary_op (op_loc,
6966                                        POSTINCREMENT_EXPR, expr.value, 0);
6967           expr.original_code = ERROR_MARK;
6968           expr.original_type = NULL;
6969           break;
6970         case CPP_MINUS_MINUS:
6971           /* Postdecrement.  */
6972           c_parser_consume_token (parser);
6973           expr = default_function_array_read_conversion (expr_loc, expr);
6974           expr.value = build_unary_op (op_loc,
6975                                        POSTDECREMENT_EXPR, expr.value, 0);
6976           expr.original_code = ERROR_MARK;
6977           expr.original_type = NULL;
6978           break;
6979         default:
6980           return expr;
6981         }
6982     }
6983 }
6984
6985 /* Parse an expression (C90 6.3.17, C99 6.5.17).
6986
6987    expression:
6988      assignment-expression
6989      expression , assignment-expression
6990 */
6991
6992 static struct c_expr
6993 c_parser_expression (c_parser *parser)
6994 {
6995   struct c_expr expr;
6996   expr = c_parser_expr_no_commas (parser, NULL);
6997   while (c_parser_next_token_is (parser, CPP_COMMA))
6998     {
6999       struct c_expr next;
7000       tree lhsval;
7001       location_t loc = c_parser_peek_token (parser)->location;
7002       location_t expr_loc;
7003       c_parser_consume_token (parser);
7004       expr_loc = c_parser_peek_token (parser)->location;
7005       lhsval = expr.value;
7006       while (TREE_CODE (lhsval) == COMPOUND_EXPR)
7007         lhsval = TREE_OPERAND (lhsval, 1);
7008       if (DECL_P (lhsval) || handled_component_p (lhsval))
7009         mark_exp_read (lhsval);
7010       next = c_parser_expr_no_commas (parser, NULL);
7011       next = default_function_array_conversion (expr_loc, next);
7012       expr.value = build_compound_expr (loc, expr.value, next.value);
7013       expr.original_code = COMPOUND_EXPR;
7014       expr.original_type = next.original_type;
7015     }
7016   return expr;
7017 }
7018
7019 /* Parse an expression and convert functions or arrays to
7020    pointers.  */
7021
7022 static struct c_expr
7023 c_parser_expression_conv (c_parser *parser)
7024 {
7025   struct c_expr expr;
7026   location_t loc = c_parser_peek_token (parser)->location;
7027   expr = c_parser_expression (parser);
7028   expr = default_function_array_conversion (loc, expr);
7029   return expr;
7030 }
7031
7032 /* Parse a non-empty list of expressions.  If CONVERT_P, convert
7033    functions and arrays to pointers.  If FOLD_P, fold the expressions.
7034
7035    nonempty-expr-list:
7036      assignment-expression
7037      nonempty-expr-list , assignment-expression
7038 */
7039
7040 static VEC(tree,gc) *
7041 c_parser_expr_list (c_parser *parser, bool convert_p, bool fold_p,
7042                     VEC(tree,gc) **p_orig_types)
7043 {
7044   VEC(tree,gc) *ret;
7045   VEC(tree,gc) *orig_types;
7046   struct c_expr expr;
7047   location_t loc = c_parser_peek_token (parser)->location;
7048
7049   ret = make_tree_vector ();
7050   if (p_orig_types == NULL)
7051     orig_types = NULL;
7052   else
7053     orig_types = make_tree_vector ();
7054
7055   expr = c_parser_expr_no_commas (parser, NULL);
7056   if (convert_p)
7057     expr = default_function_array_read_conversion (loc, expr);
7058   if (fold_p)
7059     expr.value = c_fully_fold (expr.value, false, NULL);
7060   VEC_quick_push (tree, ret, expr.value);
7061   if (orig_types != NULL)
7062     VEC_quick_push (tree, orig_types, expr.original_type);
7063   while (c_parser_next_token_is (parser, CPP_COMMA))
7064     {
7065       c_parser_consume_token (parser);
7066       loc = c_parser_peek_token (parser)->location;
7067       expr = c_parser_expr_no_commas (parser, NULL);
7068       if (convert_p)
7069         expr = default_function_array_read_conversion (loc, expr);
7070       if (fold_p)
7071         expr.value = c_fully_fold (expr.value, false, NULL);
7072       VEC_safe_push (tree, gc, ret, expr.value);
7073       if (orig_types != NULL)
7074         VEC_safe_push (tree, gc, orig_types, expr.original_type);
7075     }
7076   if (orig_types != NULL)
7077     *p_orig_types = orig_types;
7078   return ret;
7079 }
7080 \f
7081 /* Parse Objective-C-specific constructs.  */
7082
7083 /* Parse an objc-class-definition.
7084
7085    objc-class-definition:
7086      @interface identifier objc-superclass[opt] objc-protocol-refs[opt]
7087        objc-class-instance-variables[opt] objc-methodprotolist @end
7088      @implementation identifier objc-superclass[opt]
7089        objc-class-instance-variables[opt]
7090      @interface identifier ( identifier ) objc-protocol-refs[opt]
7091        objc-methodprotolist @end
7092      @interface identifier ( ) objc-protocol-refs[opt]
7093        objc-methodprotolist @end
7094      @implementation identifier ( identifier )
7095
7096    objc-superclass:
7097      : identifier
7098
7099    "@interface identifier (" must start "@interface identifier (
7100    identifier ) ...": objc-methodprotolist in the first production may
7101    not start with a parenthesized identifier as a declarator of a data
7102    definition with no declaration specifiers if the objc-superclass,
7103    objc-protocol-refs and objc-class-instance-variables are omitted.  */
7104
7105 static void
7106 c_parser_objc_class_definition (c_parser *parser, tree attributes)
7107 {
7108   bool iface_p;
7109   tree id1;
7110   tree superclass;
7111   if (c_parser_next_token_is_keyword (parser, RID_AT_INTERFACE))
7112     iface_p = true;
7113   else if (c_parser_next_token_is_keyword (parser, RID_AT_IMPLEMENTATION))
7114     iface_p = false;
7115   else
7116     gcc_unreachable ();
7117
7118   c_parser_consume_token (parser);
7119   if (c_parser_next_token_is_not (parser, CPP_NAME))
7120     {
7121       c_parser_error (parser, "expected identifier");
7122       return;
7123     }
7124   id1 = c_parser_peek_token (parser)->value;
7125   c_parser_consume_token (parser);
7126   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
7127     {
7128       /* We have a category or class extension.  */
7129       tree id2;
7130       tree proto = NULL_TREE;
7131       c_parser_consume_token (parser);
7132       if (c_parser_next_token_is_not (parser, CPP_NAME))
7133         {
7134           if (iface_p && c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
7135             {
7136               /* We have a class extension.  */
7137               id2 = NULL_TREE;
7138             }
7139           else
7140             {
7141               c_parser_error (parser, "expected identifier or %<)%>");
7142               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
7143               return;
7144             }
7145         }
7146       else
7147         {
7148           id2 = c_parser_peek_token (parser)->value;
7149           c_parser_consume_token (parser);
7150         }
7151       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
7152       if (!iface_p)
7153         {
7154           objc_start_category_implementation (id1, id2);
7155           return;
7156         }
7157       if (c_parser_next_token_is (parser, CPP_LESS))
7158         proto = c_parser_objc_protocol_refs (parser);
7159       objc_start_category_interface (id1, id2, proto, attributes);
7160       c_parser_objc_methodprotolist (parser);
7161       c_parser_require_keyword (parser, RID_AT_END, "expected %<@end%>");
7162       objc_finish_interface ();
7163       return;
7164     }
7165   if (c_parser_next_token_is (parser, CPP_COLON))
7166     {
7167       c_parser_consume_token (parser);
7168       if (c_parser_next_token_is_not (parser, CPP_NAME))
7169         {
7170           c_parser_error (parser, "expected identifier");
7171           return;
7172         }
7173       superclass = c_parser_peek_token (parser)->value;
7174       c_parser_consume_token (parser);
7175     }
7176   else
7177     superclass = NULL_TREE;
7178   if (iface_p)
7179     {
7180       tree proto = NULL_TREE;
7181       if (c_parser_next_token_is (parser, CPP_LESS))
7182         proto = c_parser_objc_protocol_refs (parser);
7183       objc_start_class_interface (id1, superclass, proto, attributes);
7184     }
7185   else
7186     objc_start_class_implementation (id1, superclass);
7187   if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
7188     c_parser_objc_class_instance_variables (parser);
7189   if (iface_p)
7190     {
7191       objc_continue_interface ();
7192       c_parser_objc_methodprotolist (parser);
7193       c_parser_require_keyword (parser, RID_AT_END, "expected %<@end%>");
7194       objc_finish_interface ();
7195     }
7196   else
7197     {
7198       objc_continue_implementation ();
7199       return;
7200     }
7201 }
7202
7203 /* Parse objc-class-instance-variables.
7204
7205    objc-class-instance-variables:
7206      { objc-instance-variable-decl-list[opt] }
7207
7208    objc-instance-variable-decl-list:
7209      objc-visibility-spec
7210      objc-instance-variable-decl ;
7211      ;
7212      objc-instance-variable-decl-list objc-visibility-spec
7213      objc-instance-variable-decl-list objc-instance-variable-decl ;
7214      objc-instance-variable-decl-list ;
7215
7216    objc-visibility-spec:
7217      @private
7218      @protected
7219      @public
7220
7221    objc-instance-variable-decl:
7222      struct-declaration
7223 */
7224
7225 static void
7226 c_parser_objc_class_instance_variables (c_parser *parser)
7227 {
7228   gcc_assert (c_parser_next_token_is (parser, CPP_OPEN_BRACE));
7229   c_parser_consume_token (parser);
7230   while (c_parser_next_token_is_not (parser, CPP_EOF))
7231     {
7232       tree decls;
7233       /* Parse any stray semicolon.  */
7234       if (c_parser_next_token_is (parser, CPP_SEMICOLON))
7235         {
7236           pedwarn (c_parser_peek_token (parser)->location, OPT_pedantic,
7237                    "extra semicolon");
7238           c_parser_consume_token (parser);
7239           continue;
7240         }
7241       /* Stop if at the end of the instance variables.  */
7242       if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
7243         {
7244           c_parser_consume_token (parser);
7245           break;
7246         }
7247       /* Parse any objc-visibility-spec.  */
7248       if (c_parser_next_token_is_keyword (parser, RID_AT_PRIVATE))
7249         {
7250           c_parser_consume_token (parser);
7251           objc_set_visibility (OBJC_IVAR_VIS_PRIVATE);
7252           continue;
7253         }
7254       else if (c_parser_next_token_is_keyword (parser, RID_AT_PROTECTED))
7255         {
7256           c_parser_consume_token (parser);
7257           objc_set_visibility (OBJC_IVAR_VIS_PROTECTED);
7258           continue;
7259         }
7260       else if (c_parser_next_token_is_keyword (parser, RID_AT_PUBLIC))
7261         {
7262           c_parser_consume_token (parser);
7263           objc_set_visibility (OBJC_IVAR_VIS_PUBLIC);
7264           continue;
7265         }
7266       else if (c_parser_next_token_is_keyword (parser, RID_AT_PACKAGE))
7267         {
7268           c_parser_consume_token (parser);
7269           objc_set_visibility (OBJC_IVAR_VIS_PACKAGE);
7270           continue;
7271         }
7272       else if (c_parser_next_token_is (parser, CPP_PRAGMA))
7273         {
7274           c_parser_pragma (parser, pragma_external);
7275           continue;
7276         }
7277
7278       /* Parse some comma-separated declarations.  */
7279       decls = c_parser_struct_declaration (parser);
7280       if (decls == NULL)
7281         {
7282           /* There is a syntax error.  We want to skip the offending
7283              tokens up to the next ';' (included) or '}'
7284              (excluded).  */
7285           
7286           /* First, skip manually a ')' or ']'.  This is because they
7287              reduce the nesting level, so c_parser_skip_until_found()
7288              wouldn't be able to skip past them.  */
7289           c_token *token = c_parser_peek_token (parser);
7290           if (token->type == CPP_CLOSE_PAREN || token->type == CPP_CLOSE_SQUARE)
7291             c_parser_consume_token (parser);
7292
7293           /* Then, do the standard skipping.  */
7294           c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
7295
7296           /* We hopefully recovered.  Start normal parsing again.  */
7297           parser->error = false;
7298           continue;
7299         }
7300       else
7301         {
7302           /* Comma-separated instance variables are chained together
7303              in reverse order; add them one by one.  */
7304           tree ivar = nreverse (decls);
7305           for (; ivar; ivar = DECL_CHAIN (ivar))
7306             objc_add_instance_variable (copy_node (ivar));
7307         }
7308       c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
7309     }
7310 }
7311
7312 /* Parse an objc-class-declaration.
7313
7314    objc-class-declaration:
7315      @class identifier-list ;
7316 */
7317
7318 static void
7319 c_parser_objc_class_declaration (c_parser *parser)
7320 {
7321   gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_CLASS));
7322   c_parser_consume_token (parser);
7323   /* Any identifiers, including those declared as type names, are OK
7324      here.  */
7325   while (true)
7326     {
7327       tree id;
7328       if (c_parser_next_token_is_not (parser, CPP_NAME))
7329         {
7330           c_parser_error (parser, "expected identifier");
7331           c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
7332           parser->error = false;
7333           return;
7334         }
7335       id = c_parser_peek_token (parser)->value;
7336       objc_declare_class (id);
7337       c_parser_consume_token (parser);
7338       if (c_parser_next_token_is (parser, CPP_COMMA))
7339         c_parser_consume_token (parser);
7340       else
7341         break;
7342     }
7343   c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
7344 }
7345
7346 /* Parse an objc-alias-declaration.
7347
7348    objc-alias-declaration:
7349      @compatibility_alias identifier identifier ;
7350 */
7351
7352 static void
7353 c_parser_objc_alias_declaration (c_parser *parser)
7354 {
7355   tree id1, id2;
7356   gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_ALIAS));
7357   c_parser_consume_token (parser);
7358   if (c_parser_next_token_is_not (parser, CPP_NAME))
7359     {
7360       c_parser_error (parser, "expected identifier");
7361       c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
7362       return;
7363     }
7364   id1 = c_parser_peek_token (parser)->value;
7365   c_parser_consume_token (parser);
7366   if (c_parser_next_token_is_not (parser, CPP_NAME))
7367     {
7368       c_parser_error (parser, "expected identifier");
7369       c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
7370       return;
7371     }
7372   id2 = c_parser_peek_token (parser)->value;
7373   c_parser_consume_token (parser);
7374   c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
7375   objc_declare_alias (id1, id2);
7376 }
7377
7378 /* Parse an objc-protocol-definition.
7379
7380    objc-protocol-definition:
7381      @protocol identifier objc-protocol-refs[opt] objc-methodprotolist @end
7382      @protocol identifier-list ;
7383
7384    "@protocol identifier ;" should be resolved as "@protocol
7385    identifier-list ;": objc-methodprotolist may not start with a
7386    semicolon in the first alternative if objc-protocol-refs are
7387    omitted.  */
7388
7389 static void
7390 c_parser_objc_protocol_definition (c_parser *parser, tree attributes)
7391 {
7392   gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_PROTOCOL));
7393
7394   c_parser_consume_token (parser);
7395   if (c_parser_next_token_is_not (parser, CPP_NAME))
7396     {
7397       c_parser_error (parser, "expected identifier");
7398       return;
7399     }
7400   if (c_parser_peek_2nd_token (parser)->type == CPP_COMMA
7401       || c_parser_peek_2nd_token (parser)->type == CPP_SEMICOLON)
7402     {
7403       /* Any identifiers, including those declared as type names, are
7404          OK here.  */
7405       while (true)
7406         {
7407           tree id;
7408           if (c_parser_next_token_is_not (parser, CPP_NAME))
7409             {
7410               c_parser_error (parser, "expected identifier");
7411               break;
7412             }
7413           id = c_parser_peek_token (parser)->value;
7414           objc_declare_protocol (id, attributes);
7415           c_parser_consume_token (parser);
7416           if (c_parser_next_token_is (parser, CPP_COMMA))
7417             c_parser_consume_token (parser);
7418           else
7419             break;
7420         }
7421       c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
7422     }
7423   else
7424     {
7425       tree id = c_parser_peek_token (parser)->value;
7426       tree proto = NULL_TREE;
7427       c_parser_consume_token (parser);
7428       if (c_parser_next_token_is (parser, CPP_LESS))
7429         proto = c_parser_objc_protocol_refs (parser);
7430       parser->objc_pq_context = true;
7431       objc_start_protocol (id, proto, attributes);
7432       c_parser_objc_methodprotolist (parser);
7433       c_parser_require_keyword (parser, RID_AT_END, "expected %<@end%>");
7434       parser->objc_pq_context = false;
7435       objc_finish_interface ();
7436     }
7437 }
7438
7439 /* Parse an objc-method-type.
7440
7441    objc-method-type:
7442      +
7443      -
7444
7445    Return true if it is a class method (+) and false if it is
7446    an instance method (-).
7447 */
7448 static inline bool
7449 c_parser_objc_method_type (c_parser *parser)
7450 {
7451   switch (c_parser_peek_token (parser)->type)
7452     {
7453     case CPP_PLUS:
7454       c_parser_consume_token (parser);
7455       return true;
7456     case CPP_MINUS:
7457       c_parser_consume_token (parser);
7458       return false;
7459     default:
7460       gcc_unreachable ();
7461     }
7462 }
7463
7464 /* Parse an objc-method-definition.
7465
7466    objc-method-definition:
7467      objc-method-type objc-method-decl ;[opt] compound-statement
7468 */
7469
7470 static void
7471 c_parser_objc_method_definition (c_parser *parser)
7472 {
7473   bool is_class_method = c_parser_objc_method_type (parser);
7474   tree decl, attributes = NULL_TREE, expr = NULL_TREE;
7475   parser->objc_pq_context = true;
7476   decl = c_parser_objc_method_decl (parser, is_class_method, &attributes,
7477                                     &expr);
7478   if (decl == error_mark_node)
7479     return;  /* Bail here. */
7480
7481   if (c_parser_next_token_is (parser, CPP_SEMICOLON))
7482     {
7483       c_parser_consume_token (parser);
7484       pedwarn (c_parser_peek_token (parser)->location, OPT_pedantic,
7485                "extra semicolon in method definition specified");
7486     }
7487
7488   if (!c_parser_next_token_is (parser, CPP_OPEN_BRACE))
7489     {
7490       c_parser_error (parser, "expected %<{%>");
7491       return;
7492     }
7493
7494   parser->objc_pq_context = false;
7495   if (objc_start_method_definition (is_class_method, decl, attributes, expr))
7496     {
7497       add_stmt (c_parser_compound_statement (parser));
7498       objc_finish_method_definition (current_function_decl);
7499     }
7500   else
7501     {
7502       /* This code is executed when we find a method definition
7503          outside of an @implementation context (or invalid for other
7504          reasons).  Parse the method (to keep going) but do not emit
7505          any code.
7506       */
7507       c_parser_compound_statement (parser);
7508     }
7509 }
7510
7511 /* Parse an objc-methodprotolist.
7512
7513    objc-methodprotolist:
7514      empty
7515      objc-methodprotolist objc-methodproto
7516      objc-methodprotolist declaration
7517      objc-methodprotolist ;
7518      @optional
7519      @required
7520
7521    The declaration is a data definition, which may be missing
7522    declaration specifiers under the same rules and diagnostics as
7523    other data definitions outside functions, and the stray semicolon
7524    is diagnosed the same way as a stray semicolon outside a
7525    function.  */
7526
7527 static void
7528 c_parser_objc_methodprotolist (c_parser *parser)
7529 {
7530   while (true)
7531     {
7532       /* The list is terminated by @end.  */
7533       switch (c_parser_peek_token (parser)->type)
7534         {
7535         case CPP_SEMICOLON:
7536           pedwarn (c_parser_peek_token (parser)->location, OPT_pedantic,
7537                    "ISO C does not allow extra %<;%> outside of a function");
7538           c_parser_consume_token (parser);
7539           break;
7540         case CPP_PLUS:
7541         case CPP_MINUS:
7542           c_parser_objc_methodproto (parser);
7543           break;
7544         case CPP_PRAGMA:
7545           c_parser_pragma (parser, pragma_external);
7546           break;
7547         case CPP_EOF:
7548           return;
7549         default:
7550           if (c_parser_next_token_is_keyword (parser, RID_AT_END))
7551             return;
7552           else if (c_parser_next_token_is_keyword (parser, RID_AT_PROPERTY))
7553             c_parser_objc_at_property_declaration (parser);
7554           else if (c_parser_next_token_is_keyword (parser, RID_AT_OPTIONAL))
7555             {
7556               objc_set_method_opt (true);
7557               c_parser_consume_token (parser);
7558             }
7559           else if (c_parser_next_token_is_keyword (parser, RID_AT_REQUIRED))
7560             {
7561               objc_set_method_opt (false);
7562               c_parser_consume_token (parser);
7563             }
7564           else
7565             c_parser_declaration_or_fndef (parser, false, false, true,
7566                                            false, true, NULL);
7567           break;
7568         }
7569     }
7570 }
7571
7572 /* Parse an objc-methodproto.
7573
7574    objc-methodproto:
7575      objc-method-type objc-method-decl ;
7576 */
7577
7578 static void
7579 c_parser_objc_methodproto (c_parser *parser)
7580 {
7581   bool is_class_method = c_parser_objc_method_type (parser);
7582   tree decl, attributes = NULL_TREE;
7583
7584   /* Remember protocol qualifiers in prototypes.  */
7585   parser->objc_pq_context = true;
7586   decl = c_parser_objc_method_decl (parser, is_class_method, &attributes,
7587                                     NULL);
7588   /* Forget protocol qualifiers now.  */
7589   parser->objc_pq_context = false;
7590
7591   /* Do not allow the presence of attributes to hide an erroneous 
7592      method implementation in the interface section.  */
7593   if (!c_parser_next_token_is (parser, CPP_SEMICOLON))
7594     {
7595       c_parser_error (parser, "expected %<;%>");
7596       return;
7597     }
7598   
7599   if (decl != error_mark_node)
7600     objc_add_method_declaration (is_class_method, decl, attributes);
7601
7602   c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
7603 }
7604
7605 /* If we are at a position that method attributes may be present, check that 
7606    there are not any parsed already (a syntax error) and then collect any 
7607    specified at the current location.  Finally, if new attributes were present,
7608    check that the next token is legal ( ';' for decls and '{' for defs).  */
7609    
7610 static bool 
7611 c_parser_objc_maybe_method_attributes (c_parser* parser, tree* attributes)
7612 {
7613   bool bad = false;
7614   if (*attributes)
7615     {
7616       c_parser_error (parser, 
7617                     "method attributes must be specified at the end only");
7618       *attributes = NULL_TREE;
7619       bad = true;
7620     }
7621
7622   if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
7623     *attributes = c_parser_attributes (parser);
7624
7625   /* If there were no attributes here, just report any earlier error.  */
7626   if (*attributes == NULL_TREE || bad)
7627     return bad;
7628
7629   /* If the attributes are followed by a ; or {, then just report any earlier
7630      error.  */
7631   if (c_parser_next_token_is (parser, CPP_SEMICOLON)
7632       || c_parser_next_token_is (parser, CPP_OPEN_BRACE))
7633     return bad;
7634
7635   /* We've got attributes, but not at the end.  */
7636   c_parser_error (parser, 
7637                   "expected %<;%> or %<{%> after method attribute definition");
7638   return true;
7639 }
7640
7641 /* Parse an objc-method-decl.
7642
7643    objc-method-decl:
7644      ( objc-type-name ) objc-selector
7645      objc-selector
7646      ( objc-type-name ) objc-keyword-selector objc-optparmlist
7647      objc-keyword-selector objc-optparmlist
7648      attributes
7649
7650    objc-keyword-selector:
7651      objc-keyword-decl
7652      objc-keyword-selector objc-keyword-decl
7653
7654    objc-keyword-decl:
7655      objc-selector : ( objc-type-name ) identifier
7656      objc-selector : identifier
7657      : ( objc-type-name ) identifier
7658      : identifier
7659
7660    objc-optparmlist:
7661      objc-optparms objc-optellipsis
7662
7663    objc-optparms:
7664      empty
7665      objc-opt-parms , parameter-declaration
7666
7667    objc-optellipsis:
7668      empty
7669      , ...
7670 */
7671
7672 static tree
7673 c_parser_objc_method_decl (c_parser *parser, bool is_class_method,
7674                            tree *attributes, tree *expr)
7675 {
7676   tree type = NULL_TREE;
7677   tree sel;
7678   tree parms = NULL_TREE;
7679   bool ellipsis = false;
7680   bool attr_err = false;
7681
7682   *attributes = NULL_TREE;
7683   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
7684     {
7685       c_parser_consume_token (parser);
7686       type = c_parser_objc_type_name (parser);
7687       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
7688     }
7689   sel = c_parser_objc_selector (parser);
7690   /* If there is no selector, or a colon follows, we have an
7691      objc-keyword-selector.  If there is a selector, and a colon does
7692      not follow, that selector ends the objc-method-decl.  */
7693   if (!sel || c_parser_next_token_is (parser, CPP_COLON))
7694     {
7695       tree tsel = sel;
7696       tree list = NULL_TREE;
7697       while (true)
7698         {
7699           tree atype = NULL_TREE, id, keyworddecl;
7700           tree param_attr = NULL_TREE;
7701           if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
7702             break;
7703           if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
7704             {
7705               c_parser_consume_token (parser);
7706               atype = c_parser_objc_type_name (parser);
7707               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
7708                                          "expected %<)%>");
7709             }
7710           /* New ObjC allows attributes on method parameters.  */
7711           if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
7712             param_attr = c_parser_attributes (parser);
7713           if (c_parser_next_token_is_not (parser, CPP_NAME))
7714             {
7715               c_parser_error (parser, "expected identifier");
7716               return error_mark_node;
7717             }
7718           id = c_parser_peek_token (parser)->value;
7719           c_parser_consume_token (parser);
7720           keyworddecl = objc_build_keyword_decl (tsel, atype, id, param_attr);
7721           list = chainon (list, keyworddecl);
7722           tsel = c_parser_objc_selector (parser);
7723           if (!tsel && c_parser_next_token_is_not (parser, CPP_COLON))
7724             break;
7725         }
7726
7727       attr_err |= c_parser_objc_maybe_method_attributes (parser, attributes) ;
7728
7729       /* Parse the optional parameter list.  Optional Objective-C
7730          method parameters follow the C syntax, and may include '...'
7731          to denote a variable number of arguments.  */
7732       parms = make_node (TREE_LIST);
7733       while (c_parser_next_token_is (parser, CPP_COMMA))
7734         {
7735           struct c_parm *parm;
7736           c_parser_consume_token (parser);
7737           if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
7738             {
7739               ellipsis = true;
7740               c_parser_consume_token (parser);
7741               attr_err |= c_parser_objc_maybe_method_attributes 
7742                                                 (parser, attributes) ;
7743               break;
7744             }
7745           parm = c_parser_parameter_declaration (parser, NULL_TREE);
7746           if (parm == NULL)
7747             break;
7748           parms = chainon (parms,
7749                            build_tree_list (NULL_TREE, grokparm (parm, expr)));
7750         }
7751       sel = list;
7752     }
7753   else
7754     attr_err |= c_parser_objc_maybe_method_attributes (parser, attributes) ;
7755
7756   if (sel == NULL)
7757     {
7758       c_parser_error (parser, "objective-c method declaration is expected");
7759       return error_mark_node;
7760     }
7761
7762   if (attr_err)
7763     return error_mark_node;
7764
7765   return objc_build_method_signature (is_class_method, type, sel, parms, ellipsis);
7766 }
7767
7768 /* Parse an objc-type-name.
7769
7770    objc-type-name:
7771      objc-type-qualifiers[opt] type-name
7772      objc-type-qualifiers[opt]
7773
7774    objc-type-qualifiers:
7775      objc-type-qualifier
7776      objc-type-qualifiers objc-type-qualifier
7777
7778    objc-type-qualifier: one of
7779      in out inout bycopy byref oneway
7780 */
7781
7782 static tree
7783 c_parser_objc_type_name (c_parser *parser)
7784 {
7785   tree quals = NULL_TREE;
7786   struct c_type_name *type_name = NULL;
7787   tree type = NULL_TREE;
7788   while (true)
7789     {
7790       c_token *token = c_parser_peek_token (parser);
7791       if (token->type == CPP_KEYWORD
7792           && (token->keyword == RID_IN
7793               || token->keyword == RID_OUT
7794               || token->keyword == RID_INOUT
7795               || token->keyword == RID_BYCOPY
7796               || token->keyword == RID_BYREF
7797               || token->keyword == RID_ONEWAY))
7798         {
7799           quals = chainon (build_tree_list (NULL_TREE, token->value), quals);
7800           c_parser_consume_token (parser);
7801         }
7802       else
7803         break;
7804     }
7805   if (c_parser_next_tokens_start_typename (parser, cla_prefer_type))
7806     type_name = c_parser_type_name (parser);
7807   if (type_name)
7808     type = groktypename (type_name, NULL, NULL);
7809
7810   /* If the type is unknown, and error has already been produced and
7811      we need to recover from the error.  In that case, use NULL_TREE
7812      for the type, as if no type had been specified; this will use the
7813      default type ('id') which is good for error recovery.  */
7814   if (type == error_mark_node)
7815     type = NULL_TREE;
7816
7817   return build_tree_list (quals, type);
7818 }
7819
7820 /* Parse objc-protocol-refs.
7821
7822    objc-protocol-refs:
7823      < identifier-list >
7824 */
7825
7826 static tree
7827 c_parser_objc_protocol_refs (c_parser *parser)
7828 {
7829   tree list = NULL_TREE;
7830   gcc_assert (c_parser_next_token_is (parser, CPP_LESS));
7831   c_parser_consume_token (parser);
7832   /* Any identifiers, including those declared as type names, are OK
7833      here.  */
7834   while (true)
7835     {
7836       tree id;
7837       if (c_parser_next_token_is_not (parser, CPP_NAME))
7838         {
7839           c_parser_error (parser, "expected identifier");
7840           break;
7841         }
7842       id = c_parser_peek_token (parser)->value;
7843       list = chainon (list, build_tree_list (NULL_TREE, id));
7844       c_parser_consume_token (parser);
7845       if (c_parser_next_token_is (parser, CPP_COMMA))
7846         c_parser_consume_token (parser);
7847       else
7848         break;
7849     }
7850   c_parser_require (parser, CPP_GREATER, "expected %<>%>");
7851   return list;
7852 }
7853
7854 /* Parse an objc-try-catch-finally-statement.
7855
7856    objc-try-catch-finally-statement:
7857      @try compound-statement objc-catch-list[opt]
7858      @try compound-statement objc-catch-list[opt] @finally compound-statement
7859
7860    objc-catch-list:
7861      @catch ( objc-catch-parameter-declaration ) compound-statement
7862      objc-catch-list @catch ( objc-catch-parameter-declaration ) compound-statement
7863
7864    objc-catch-parameter-declaration:
7865      parameter-declaration
7866      '...'
7867
7868    where '...' is to be interpreted literally, that is, it means CPP_ELLIPSIS.
7869
7870    PS: This function is identical to cp_parser_objc_try_catch_finally_statement
7871    for C++.  Keep them in sync.  */   
7872
7873 static void
7874 c_parser_objc_try_catch_finally_statement (c_parser *parser)
7875 {
7876   location_t location;
7877   tree stmt;
7878
7879   gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_TRY));
7880   c_parser_consume_token (parser);
7881   location = c_parser_peek_token (parser)->location;
7882   objc_maybe_warn_exceptions (location);
7883   stmt = c_parser_compound_statement (parser);
7884   objc_begin_try_stmt (location, stmt);
7885
7886   while (c_parser_next_token_is_keyword (parser, RID_AT_CATCH))
7887     {
7888       struct c_parm *parm;
7889       tree parameter_declaration = error_mark_node;
7890       bool seen_open_paren = false;
7891
7892       c_parser_consume_token (parser);
7893       if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
7894         seen_open_paren = true;
7895       if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
7896         {
7897           /* We have "@catch (...)" (where the '...' are literally
7898              what is in the code).  Skip the '...'.
7899              parameter_declaration is set to NULL_TREE, and
7900              objc_being_catch_clauses() knows that that means
7901              '...'.  */
7902           c_parser_consume_token (parser);
7903           parameter_declaration = NULL_TREE;
7904         }
7905       else
7906         {
7907           /* We have "@catch (NSException *exception)" or something
7908              like that.  Parse the parameter declaration.  */
7909           parm = c_parser_parameter_declaration (parser, NULL_TREE);
7910           if (parm == NULL)
7911             parameter_declaration = error_mark_node;
7912           else
7913             parameter_declaration = grokparm (parm, NULL);
7914         }
7915       if (seen_open_paren)
7916         c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>");
7917       else
7918         {
7919           /* If there was no open parenthesis, we are recovering from
7920              an error, and we are trying to figure out what mistake
7921              the user has made.  */
7922
7923           /* If there is an immediate closing parenthesis, the user
7924              probably forgot the opening one (ie, they typed "@catch
7925              NSException *e)".  Parse the closing parenthesis and keep
7926              going.  */
7927           if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
7928             c_parser_consume_token (parser);
7929           
7930           /* If these is no immediate closing parenthesis, the user
7931              probably doesn't know that parenthesis are required at
7932              all (ie, they typed "@catch NSException *e").  So, just
7933              forget about the closing parenthesis and keep going.  */
7934         }
7935       objc_begin_catch_clause (parameter_declaration);
7936       if (c_parser_require (parser, CPP_OPEN_BRACE, "expected %<{%>"))
7937         c_parser_compound_statement_nostart (parser);
7938       objc_finish_catch_clause ();
7939     }
7940   if (c_parser_next_token_is_keyword (parser, RID_AT_FINALLY))
7941     {
7942       c_parser_consume_token (parser);
7943       location = c_parser_peek_token (parser)->location;
7944       stmt = c_parser_compound_statement (parser);
7945       objc_build_finally_clause (location, stmt);
7946     }
7947   objc_finish_try_stmt ();
7948 }
7949
7950 /* Parse an objc-synchronized-statement.
7951
7952    objc-synchronized-statement:
7953      @synchronized ( expression ) compound-statement
7954 */
7955
7956 static void
7957 c_parser_objc_synchronized_statement (c_parser *parser)
7958 {
7959   location_t loc;
7960   tree expr, stmt;
7961   gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_SYNCHRONIZED));
7962   c_parser_consume_token (parser);
7963   loc = c_parser_peek_token (parser)->location;
7964   objc_maybe_warn_exceptions (loc);
7965   if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
7966     {
7967       expr = c_parser_expression (parser).value;
7968       expr = c_fully_fold (expr, false, NULL);
7969       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
7970     }
7971   else
7972     expr = error_mark_node;
7973   stmt = c_parser_compound_statement (parser);
7974   objc_build_synchronized (loc, expr, stmt);
7975 }
7976
7977 /* Parse an objc-selector; return NULL_TREE without an error if the
7978    next token is not an objc-selector.
7979
7980    objc-selector:
7981      identifier
7982      one of
7983        enum struct union if else while do for switch case default
7984        break continue return goto asm sizeof typeof __alignof
7985        unsigned long const short volatile signed restrict _Complex
7986        in out inout bycopy byref oneway int char float double void _Bool
7987
7988    ??? Why this selection of keywords but not, for example, storage
7989    class specifiers?  */
7990
7991 static tree
7992 c_parser_objc_selector (c_parser *parser)
7993 {
7994   c_token *token = c_parser_peek_token (parser);
7995   tree value = token->value;
7996   if (token->type == CPP_NAME)
7997     {
7998       c_parser_consume_token (parser);
7999       return value;
8000     }
8001   if (token->type != CPP_KEYWORD)
8002     return NULL_TREE;
8003   switch (token->keyword)
8004     {
8005     case RID_ENUM:
8006     case RID_STRUCT:
8007     case RID_UNION:
8008     case RID_IF:
8009     case RID_ELSE:
8010     case RID_WHILE:
8011     case RID_DO:
8012     case RID_FOR:
8013     case RID_SWITCH:
8014     case RID_CASE:
8015     case RID_DEFAULT:
8016     case RID_BREAK:
8017     case RID_CONTINUE:
8018     case RID_RETURN:
8019     case RID_GOTO:
8020     case RID_ASM:
8021     case RID_SIZEOF:
8022     case RID_TYPEOF:
8023     case RID_ALIGNOF:
8024     case RID_UNSIGNED:
8025     case RID_LONG:
8026     case RID_INT128:
8027     case RID_CONST:
8028     case RID_SHORT:
8029     case RID_VOLATILE:
8030     case RID_SIGNED:
8031     case RID_RESTRICT:
8032     case RID_COMPLEX:
8033     case RID_IN:
8034     case RID_OUT:
8035     case RID_INOUT:
8036     case RID_BYCOPY:
8037     case RID_BYREF:
8038     case RID_ONEWAY:
8039     case RID_INT:
8040     case RID_CHAR:
8041     case RID_FLOAT:
8042     case RID_DOUBLE:
8043     case RID_VOID:
8044     case RID_BOOL:
8045       c_parser_consume_token (parser);
8046       return value;
8047     default:
8048       return NULL_TREE;
8049     }
8050 }
8051
8052 /* Parse an objc-selector-arg.
8053
8054    objc-selector-arg:
8055      objc-selector
8056      objc-keywordname-list
8057
8058    objc-keywordname-list:
8059      objc-keywordname
8060      objc-keywordname-list objc-keywordname
8061
8062    objc-keywordname:
8063      objc-selector :
8064      :
8065 */
8066
8067 static tree
8068 c_parser_objc_selector_arg (c_parser *parser)
8069 {
8070   tree sel = c_parser_objc_selector (parser);
8071   tree list = NULL_TREE;
8072   if (sel && c_parser_next_token_is_not (parser, CPP_COLON))
8073     return sel;
8074   while (true)
8075     {
8076       if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
8077         return list;
8078       list = chainon (list, build_tree_list (sel, NULL_TREE));
8079       sel = c_parser_objc_selector (parser);
8080       if (!sel && c_parser_next_token_is_not (parser, CPP_COLON))
8081         break;
8082     }
8083   return list;
8084 }
8085
8086 /* Parse an objc-receiver.
8087
8088    objc-receiver:
8089      expression
8090      class-name
8091      type-name
8092 */
8093
8094 static tree
8095 c_parser_objc_receiver (c_parser *parser)
8096 {
8097   if (c_parser_peek_token (parser)->type == CPP_NAME
8098       && (c_parser_peek_token (parser)->id_kind == C_ID_TYPENAME
8099           || c_parser_peek_token (parser)->id_kind == C_ID_CLASSNAME))
8100     {
8101       tree id = c_parser_peek_token (parser)->value;
8102       c_parser_consume_token (parser);
8103       return objc_get_class_reference (id);
8104     }
8105   return c_fully_fold (c_parser_expression (parser).value, false, NULL);
8106 }
8107
8108 /* Parse objc-message-args.
8109
8110    objc-message-args:
8111      objc-selector
8112      objc-keywordarg-list
8113
8114    objc-keywordarg-list:
8115      objc-keywordarg
8116      objc-keywordarg-list objc-keywordarg
8117
8118    objc-keywordarg:
8119      objc-selector : objc-keywordexpr
8120      : objc-keywordexpr
8121 */
8122
8123 static tree
8124 c_parser_objc_message_args (c_parser *parser)
8125 {
8126   tree sel = c_parser_objc_selector (parser);
8127   tree list = NULL_TREE;
8128   if (sel && c_parser_next_token_is_not (parser, CPP_COLON))
8129     return sel;
8130   while (true)
8131     {
8132       tree keywordexpr;
8133       if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
8134         return error_mark_node;
8135       keywordexpr = c_parser_objc_keywordexpr (parser);
8136       list = chainon (list, build_tree_list (sel, keywordexpr));
8137       sel = c_parser_objc_selector (parser);
8138       if (!sel && c_parser_next_token_is_not (parser, CPP_COLON))
8139         break;
8140     }
8141   return list;
8142 }
8143
8144 /* Parse an objc-keywordexpr.
8145
8146    objc-keywordexpr:
8147      nonempty-expr-list
8148 */
8149
8150 static tree
8151 c_parser_objc_keywordexpr (c_parser *parser)
8152 {
8153   tree ret;
8154   VEC(tree,gc) *expr_list = c_parser_expr_list (parser, true, true, NULL);
8155   if (VEC_length (tree, expr_list) == 1)
8156     {
8157       /* Just return the expression, remove a level of
8158          indirection.  */
8159       ret = VEC_index (tree, expr_list, 0);
8160     }
8161   else
8162     {
8163       /* We have a comma expression, we will collapse later.  */
8164       ret = build_tree_list_vec (expr_list);
8165     }
8166   release_tree_vector (expr_list);
8167   return ret;
8168 }
8169
8170 /* A check, needed in several places, that ObjC interface, implementation or
8171    method definitions are not prefixed by incorrect items.  */
8172 static bool
8173 c_parser_objc_diagnose_bad_element_prefix (c_parser *parser, 
8174                                            struct c_declspecs *specs)
8175 {
8176   if (!specs->declspecs_seen_p || specs->non_sc_seen_p
8177       || specs->typespec_kind != ctsk_none)
8178     {
8179       c_parser_error (parser, 
8180                       "no type or storage class may be specified here,");
8181       c_parser_skip_to_end_of_block_or_statement (parser);
8182       return true;
8183     }
8184   return false;
8185 }
8186
8187 /* Parse an Objective-C @property declaration.  The syntax is:
8188
8189    objc-property-declaration:
8190      '@property' objc-property-attributes[opt] struct-declaration ;
8191
8192    objc-property-attributes:
8193     '(' objc-property-attribute-list ')'
8194
8195    objc-property-attribute-list:
8196      objc-property-attribute
8197      objc-property-attribute-list, objc-property-attribute
8198
8199    objc-property-attribute
8200      'getter' = identifier
8201      'setter' = identifier
8202      'readonly'
8203      'readwrite'
8204      'assign'
8205      'retain'
8206      'copy'
8207      'nonatomic'
8208
8209   For example:
8210     @property NSString *name;
8211     @property (readonly) id object;
8212     @property (retain, nonatomic, getter=getTheName) id name;
8213     @property int a, b, c;
8214
8215   PS: This function is identical to cp_parser_objc_at_propery_declaration
8216   for C++.  Keep them in sync.  */
8217 static void
8218 c_parser_objc_at_property_declaration (c_parser *parser)
8219 {
8220   /* The following variables hold the attributes of the properties as
8221      parsed.  They are 'false' or 'NULL_TREE' if the attribute was not
8222      seen.  When we see an attribute, we set them to 'true' (if they
8223      are boolean properties) or to the identifier (if they have an
8224      argument, ie, for getter and setter).  Note that here we only
8225      parse the list of attributes, check the syntax and accumulate the
8226      attributes that we find.  objc_add_property_declaration() will
8227      then process the information.  */
8228   bool property_assign = false;
8229   bool property_copy = false;
8230   tree property_getter_ident = NULL_TREE;
8231   bool property_nonatomic = false;
8232   bool property_readonly = false;
8233   bool property_readwrite = false;
8234   bool property_retain = false;
8235   tree property_setter_ident = NULL_TREE;
8236
8237   /* 'properties' is the list of properties that we read.  Usually a
8238      single one, but maybe more (eg, in "@property int a, b, c;" there
8239      are three).  */
8240   tree properties;
8241   location_t loc;
8242
8243   loc = c_parser_peek_token (parser)->location;
8244   gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_PROPERTY));
8245
8246   c_parser_consume_token (parser);  /* Eat '@property'.  */
8247
8248   /* Parse the optional attribute list...  */
8249   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
8250     {
8251       /* Eat the '(' */
8252       c_parser_consume_token (parser);
8253       
8254       /* Property attribute keywords are valid now.  */
8255       parser->objc_property_attr_context = true;
8256
8257       while (true)
8258         {
8259           bool syntax_error = false;
8260           c_token *token = c_parser_peek_token (parser);
8261           enum rid keyword;
8262
8263           if (token->type != CPP_KEYWORD)
8264             {
8265               if (token->type == CPP_CLOSE_PAREN)
8266                 c_parser_error (parser, "expected identifier");
8267               else
8268                 {
8269                   c_parser_consume_token (parser);
8270                   c_parser_error (parser, "unknown property attribute");
8271                 }
8272               break;
8273             }
8274           keyword = token->keyword;
8275           c_parser_consume_token (parser);
8276           switch (keyword)
8277             {
8278             case RID_ASSIGN:    property_assign = true;    break;
8279             case RID_COPY:      property_copy = true;      break;
8280             case RID_NONATOMIC: property_nonatomic = true; break;
8281             case RID_READONLY:  property_readonly = true;  break;
8282             case RID_READWRITE: property_readwrite = true; break;
8283             case RID_RETAIN:    property_retain = true;    break;
8284
8285             case RID_GETTER:
8286             case RID_SETTER:
8287               if (c_parser_next_token_is_not (parser, CPP_EQ))
8288                 {
8289                   if (keyword == RID_GETTER)
8290                     c_parser_error (parser,
8291                                     "missing %<=%> (after %<getter%> attribute)");
8292                   else
8293                     c_parser_error (parser,
8294                                     "missing %<=%> (after %<setter%> attribute)");
8295                   syntax_error = true;
8296                   break;
8297                 }
8298               c_parser_consume_token (parser); /* eat the = */
8299               if (c_parser_next_token_is_not (parser, CPP_NAME))
8300                 {
8301                   c_parser_error (parser, "expected identifier");
8302                   syntax_error = true;
8303                   break;
8304                 }
8305               if (keyword == RID_SETTER)
8306                 {
8307                   if (property_setter_ident != NULL_TREE)
8308                     c_parser_error (parser, "the %<setter%> attribute may only be specified once");
8309                   else
8310                     property_setter_ident = c_parser_peek_token (parser)->value;
8311                   c_parser_consume_token (parser);
8312                   if (c_parser_next_token_is_not (parser, CPP_COLON))
8313                     c_parser_error (parser, "setter name must terminate with %<:%>");
8314                   else
8315                     c_parser_consume_token (parser);
8316                 }
8317               else
8318                 {
8319                   if (property_getter_ident != NULL_TREE)
8320                     c_parser_error (parser, "the %<getter%> attribute may only be specified once");
8321                   else
8322                     property_getter_ident = c_parser_peek_token (parser)->value;
8323                   c_parser_consume_token (parser);
8324                 }
8325               break;
8326             default:
8327               c_parser_error (parser, "unknown property attribute");
8328               syntax_error = true;
8329               break;
8330             }
8331
8332           if (syntax_error)
8333             break;
8334           
8335           if (c_parser_next_token_is (parser, CPP_COMMA))
8336             c_parser_consume_token (parser);
8337           else
8338             break;
8339         }
8340       parser->objc_property_attr_context = false;
8341       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
8342     }
8343   /* ... and the property declaration(s).  */
8344   properties = c_parser_struct_declaration (parser);
8345
8346   if (properties == error_mark_node)
8347     {
8348       c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
8349       parser->error = false;
8350       return;
8351     }
8352
8353   if (properties == NULL_TREE)
8354     c_parser_error (parser, "expected identifier");
8355   else
8356     {
8357       /* Comma-separated properties are chained together in
8358          reverse order; add them one by one.  */
8359       properties = nreverse (properties);
8360       
8361       for (; properties; properties = TREE_CHAIN (properties))
8362         objc_add_property_declaration (loc, copy_node (properties),
8363                                        property_readonly, property_readwrite,
8364                                        property_assign, property_retain,
8365                                        property_copy, property_nonatomic,
8366                                        property_getter_ident, property_setter_ident);
8367     }
8368
8369   c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
8370   parser->error = false;
8371 }
8372
8373 /* Parse an Objective-C @synthesize declaration.  The syntax is:
8374
8375    objc-synthesize-declaration:
8376      @synthesize objc-synthesize-identifier-list ;
8377
8378    objc-synthesize-identifier-list:
8379      objc-synthesize-identifier
8380      objc-synthesize-identifier-list, objc-synthesize-identifier
8381
8382    objc-synthesize-identifier
8383      identifier
8384      identifier = identifier
8385
8386   For example:
8387     @synthesize MyProperty;
8388     @synthesize OneProperty, AnotherProperty=MyIvar, YetAnotherProperty;
8389
8390   PS: This function is identical to cp_parser_objc_at_synthesize_declaration
8391   for C++.  Keep them in sync.
8392 */
8393 static void
8394 c_parser_objc_at_synthesize_declaration (c_parser *parser)
8395 {
8396   tree list = NULL_TREE;
8397   location_t loc;
8398   gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_SYNTHESIZE));
8399   loc = c_parser_peek_token (parser)->location;
8400
8401   c_parser_consume_token (parser);
8402   while (true)
8403     {
8404       tree property, ivar;
8405       if (c_parser_next_token_is_not (parser, CPP_NAME))
8406         {
8407           c_parser_error (parser, "expected identifier");
8408           c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
8409           /* Once we find the semicolon, we can resume normal parsing.
8410              We have to reset parser->error manually because
8411              c_parser_skip_until_found() won't reset it for us if the
8412              next token is precisely a semicolon.  */
8413           parser->error = false;
8414           return;
8415         }
8416       property = c_parser_peek_token (parser)->value;
8417       c_parser_consume_token (parser);
8418       if (c_parser_next_token_is (parser, CPP_EQ))
8419         {
8420           c_parser_consume_token (parser);
8421           if (c_parser_next_token_is_not (parser, CPP_NAME))
8422             {
8423               c_parser_error (parser, "expected identifier");
8424               c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
8425               parser->error = false;
8426               return;
8427             }
8428           ivar = c_parser_peek_token (parser)->value;
8429           c_parser_consume_token (parser);
8430         }
8431       else
8432         ivar = NULL_TREE;
8433       list = chainon (list, build_tree_list (ivar, property));
8434       if (c_parser_next_token_is (parser, CPP_COMMA))
8435         c_parser_consume_token (parser);
8436       else
8437         break;
8438     }
8439   c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
8440   objc_add_synthesize_declaration (loc, list);
8441 }
8442
8443 /* Parse an Objective-C @dynamic declaration.  The syntax is:
8444
8445    objc-dynamic-declaration:
8446      @dynamic identifier-list ;
8447
8448    For example:
8449      @dynamic MyProperty;
8450      @dynamic MyProperty, AnotherProperty;
8451
8452   PS: This function is identical to cp_parser_objc_at_dynamic_declaration
8453   for C++.  Keep them in sync.
8454 */
8455 static void
8456 c_parser_objc_at_dynamic_declaration (c_parser *parser)
8457 {
8458   tree list = NULL_TREE;
8459   location_t loc;
8460   gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_DYNAMIC));
8461   loc = c_parser_peek_token (parser)->location;
8462
8463   c_parser_consume_token (parser);
8464   while (true)
8465     {
8466       tree property;
8467       if (c_parser_next_token_is_not (parser, CPP_NAME))
8468         {
8469           c_parser_error (parser, "expected identifier");
8470           c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
8471           parser->error = false;
8472           return;
8473         }
8474       property = c_parser_peek_token (parser)->value;
8475       list = chainon (list, build_tree_list (NULL_TREE, property));
8476       c_parser_consume_token (parser);
8477       if (c_parser_next_token_is (parser, CPP_COMMA))
8478         c_parser_consume_token (parser);
8479       else
8480         break;
8481     }
8482   c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
8483   objc_add_dynamic_declaration (loc, list);
8484 }
8485
8486 \f
8487 /* Handle pragmas.  Some OpenMP pragmas are associated with, and therefore
8488    should be considered, statements.  ALLOW_STMT is true if we're within
8489    the context of a function and such pragmas are to be allowed.  Returns
8490    true if we actually parsed such a pragma.  */
8491
8492 static bool
8493 c_parser_pragma (c_parser *parser, enum pragma_context context)
8494 {
8495   unsigned int id;
8496
8497   id = c_parser_peek_token (parser)->pragma_kind;
8498   gcc_assert (id != PRAGMA_NONE);
8499
8500   switch (id)
8501     {
8502     case PRAGMA_OMP_BARRIER:
8503       if (context != pragma_compound)
8504         {
8505           if (context == pragma_stmt)
8506             c_parser_error (parser, "%<#pragma omp barrier%> may only be "
8507                             "used in compound statements");
8508           goto bad_stmt;
8509         }
8510       c_parser_omp_barrier (parser);
8511       return false;
8512
8513     case PRAGMA_OMP_FLUSH:
8514       if (context != pragma_compound)
8515         {
8516           if (context == pragma_stmt)
8517             c_parser_error (parser, "%<#pragma omp flush%> may only be "
8518                             "used in compound statements");
8519           goto bad_stmt;
8520         }
8521       c_parser_omp_flush (parser);
8522       return false;
8523
8524     case PRAGMA_OMP_TASKWAIT:
8525       if (context != pragma_compound)
8526         {
8527           if (context == pragma_stmt)
8528             c_parser_error (parser, "%<#pragma omp taskwait%> may only be "
8529                             "used in compound statements");
8530           goto bad_stmt;
8531         }
8532       c_parser_omp_taskwait (parser);
8533       return false;
8534
8535     case PRAGMA_OMP_TASKYIELD:
8536       if (context != pragma_compound)
8537         {
8538           if (context == pragma_stmt)
8539             c_parser_error (parser, "%<#pragma omp taskyield%> may only be "
8540                             "used in compound statements");
8541           goto bad_stmt;
8542         }
8543       c_parser_omp_taskyield (parser);
8544       return false;
8545
8546     case PRAGMA_OMP_THREADPRIVATE:
8547       c_parser_omp_threadprivate (parser);
8548       return false;
8549
8550     case PRAGMA_OMP_SECTION:
8551       error_at (c_parser_peek_token (parser)->location,
8552                 "%<#pragma omp section%> may only be used in "
8553                 "%<#pragma omp sections%> construct");
8554       c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL);
8555       return false;
8556
8557     case PRAGMA_GCC_PCH_PREPROCESS:
8558       c_parser_error (parser, "%<#pragma GCC pch_preprocess%> must be first");
8559       c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL);
8560       return false;
8561
8562     default:
8563       if (id < PRAGMA_FIRST_EXTERNAL)
8564         {
8565           if (context == pragma_external)
8566             {
8567             bad_stmt:
8568               c_parser_error (parser, "expected declaration specifiers");
8569               c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL);
8570               return false;
8571             }
8572           c_parser_omp_construct (parser);
8573           return true;
8574         }
8575       break;
8576     }
8577
8578   c_parser_consume_pragma (parser);
8579   c_invoke_pragma_handler (id);
8580
8581   /* Skip to EOL, but suppress any error message.  Those will have been
8582      generated by the handler routine through calling error, as opposed
8583      to calling c_parser_error.  */
8584   parser->error = true;
8585   c_parser_skip_to_pragma_eol (parser);
8586
8587   return false;
8588 }
8589
8590 /* The interface the pragma parsers have to the lexer.  */
8591
8592 enum cpp_ttype
8593 pragma_lex (tree *value)
8594 {
8595   c_token *tok = c_parser_peek_token (the_parser);
8596   enum cpp_ttype ret = tok->type;
8597
8598   *value = tok->value;
8599   if (ret == CPP_PRAGMA_EOL || ret == CPP_EOF)
8600     ret = CPP_EOF;
8601   else
8602     {
8603       if (ret == CPP_KEYWORD)
8604         ret = CPP_NAME;
8605       c_parser_consume_token (the_parser);
8606     }
8607
8608   return ret;
8609 }
8610
8611 static void
8612 c_parser_pragma_pch_preprocess (c_parser *parser)
8613 {
8614   tree name = NULL;
8615
8616   c_parser_consume_pragma (parser);
8617   if (c_parser_next_token_is (parser, CPP_STRING))
8618     {
8619       name = c_parser_peek_token (parser)->value;
8620       c_parser_consume_token (parser);
8621     }
8622   else
8623     c_parser_error (parser, "expected string literal");
8624   c_parser_skip_to_pragma_eol (parser);
8625
8626   if (name)
8627     c_common_pch_pragma (parse_in, TREE_STRING_POINTER (name));
8628 }
8629 \f
8630 /* OpenMP 2.5 parsing routines.  */
8631
8632 /* Returns name of the next clause.
8633    If the clause is not recognized PRAGMA_OMP_CLAUSE_NONE is returned and
8634    the token is not consumed.  Otherwise appropriate pragma_omp_clause is
8635    returned and the token is consumed.  */
8636
8637 static pragma_omp_clause
8638 c_parser_omp_clause_name (c_parser *parser)
8639 {
8640   pragma_omp_clause result = PRAGMA_OMP_CLAUSE_NONE;
8641
8642   if (c_parser_next_token_is_keyword (parser, RID_IF))
8643     result = PRAGMA_OMP_CLAUSE_IF;
8644   else if (c_parser_next_token_is_keyword (parser, RID_DEFAULT))
8645     result = PRAGMA_OMP_CLAUSE_DEFAULT;
8646   else if (c_parser_next_token_is (parser, CPP_NAME))
8647     {
8648       const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
8649
8650       switch (p[0])
8651         {
8652         case 'c':
8653           if (!strcmp ("collapse", p))
8654             result = PRAGMA_OMP_CLAUSE_COLLAPSE;
8655           else if (!strcmp ("copyin", p))
8656             result = PRAGMA_OMP_CLAUSE_COPYIN;
8657           else if (!strcmp ("copyprivate", p))
8658             result = PRAGMA_OMP_CLAUSE_COPYPRIVATE;
8659           break;
8660         case 'f':
8661           if (!strcmp ("final", p))
8662             result = PRAGMA_OMP_CLAUSE_FINAL;
8663           else if (!strcmp ("firstprivate", p))
8664             result = PRAGMA_OMP_CLAUSE_FIRSTPRIVATE;
8665           break;
8666         case 'l':
8667           if (!strcmp ("lastprivate", p))
8668             result = PRAGMA_OMP_CLAUSE_LASTPRIVATE;
8669           break;
8670         case 'm':
8671           if (!strcmp ("mergeable", p))
8672             result = PRAGMA_OMP_CLAUSE_MERGEABLE;
8673           break;
8674         case 'n':
8675           if (!strcmp ("nowait", p))
8676             result = PRAGMA_OMP_CLAUSE_NOWAIT;
8677           else if (!strcmp ("num_threads", p))
8678             result = PRAGMA_OMP_CLAUSE_NUM_THREADS;
8679           break;
8680         case 'o':
8681           if (!strcmp ("ordered", p))
8682             result = PRAGMA_OMP_CLAUSE_ORDERED;
8683           break;
8684         case 'p':
8685           if (!strcmp ("private", p))
8686             result = PRAGMA_OMP_CLAUSE_PRIVATE;
8687           break;
8688         case 'r':
8689           if (!strcmp ("reduction", p))
8690             result = PRAGMA_OMP_CLAUSE_REDUCTION;
8691           break;
8692         case 's':
8693           if (!strcmp ("schedule", p))
8694             result = PRAGMA_OMP_CLAUSE_SCHEDULE;
8695           else if (!strcmp ("shared", p))
8696             result = PRAGMA_OMP_CLAUSE_SHARED;
8697           break;
8698         case 'u':
8699           if (!strcmp ("untied", p))
8700             result = PRAGMA_OMP_CLAUSE_UNTIED;
8701           break;
8702         }
8703     }
8704
8705   if (result != PRAGMA_OMP_CLAUSE_NONE)
8706     c_parser_consume_token (parser);
8707
8708   return result;
8709 }
8710
8711 /* Validate that a clause of the given type does not already exist.  */
8712
8713 static void
8714 check_no_duplicate_clause (tree clauses, enum omp_clause_code code,
8715                            const char *name)
8716 {
8717   tree c;
8718
8719   for (c = clauses; c ; c = OMP_CLAUSE_CHAIN (c))
8720     if (OMP_CLAUSE_CODE (c) == code)
8721       {
8722         location_t loc = OMP_CLAUSE_LOCATION (c);
8723         error_at (loc, "too many %qs clauses", name);
8724         break;
8725       }
8726 }
8727
8728 /* OpenMP 2.5:
8729    variable-list:
8730      identifier
8731      variable-list , identifier
8732
8733    If KIND is nonzero, create the appropriate node and install the
8734    decl in OMP_CLAUSE_DECL and add the node to the head of the list.
8735    If KIND is nonzero, CLAUSE_LOC is the location of the clause.
8736
8737    If KIND is zero, create a TREE_LIST with the decl in TREE_PURPOSE;
8738    return the list created.  */
8739
8740 static tree
8741 c_parser_omp_variable_list (c_parser *parser,
8742                             location_t clause_loc,
8743                             enum omp_clause_code kind,
8744                             tree list)
8745 {
8746   if (c_parser_next_token_is_not (parser, CPP_NAME)
8747       || c_parser_peek_token (parser)->id_kind != C_ID_ID)
8748     c_parser_error (parser, "expected identifier");
8749
8750   while (c_parser_next_token_is (parser, CPP_NAME)
8751          && c_parser_peek_token (parser)->id_kind == C_ID_ID)
8752     {
8753       tree t = lookup_name (c_parser_peek_token (parser)->value);
8754
8755       if (t == NULL_TREE)
8756         undeclared_variable (c_parser_peek_token (parser)->location,
8757                              c_parser_peek_token (parser)->value);
8758       else if (t == error_mark_node)
8759         ;
8760       else if (kind != 0)
8761         {
8762           tree u = build_omp_clause (clause_loc, kind);
8763           OMP_CLAUSE_DECL (u) = t;
8764           OMP_CLAUSE_CHAIN (u) = list;
8765           list = u;
8766         }
8767       else
8768         list = tree_cons (t, NULL_TREE, list);
8769
8770       c_parser_consume_token (parser);
8771
8772       if (c_parser_next_token_is_not (parser, CPP_COMMA))
8773         break;
8774
8775       c_parser_consume_token (parser);
8776     }
8777
8778   return list;
8779 }
8780
8781 /* Similarly, but expect leading and trailing parenthesis.  This is a very
8782    common case for omp clauses.  */
8783
8784 static tree
8785 c_parser_omp_var_list_parens (c_parser *parser, enum omp_clause_code kind,
8786                               tree list)
8787 {
8788   /* The clauses location.  */
8789   location_t loc = c_parser_peek_token (parser)->location;
8790
8791   if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
8792     {
8793       list = c_parser_omp_variable_list (parser, loc, kind, list);
8794       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
8795     }
8796   return list;
8797 }
8798
8799 /* OpenMP 3.0:
8800    collapse ( constant-expression ) */
8801
8802 static tree
8803 c_parser_omp_clause_collapse (c_parser *parser, tree list)
8804 {
8805   tree c, num = error_mark_node;
8806   HOST_WIDE_INT n;
8807   location_t loc;
8808
8809   check_no_duplicate_clause (list, OMP_CLAUSE_COLLAPSE, "collapse");
8810
8811   loc = c_parser_peek_token (parser)->location;
8812   if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
8813     {
8814       num = c_parser_expr_no_commas (parser, NULL).value;
8815       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
8816     }
8817   if (num == error_mark_node)
8818     return list;
8819   if (!INTEGRAL_TYPE_P (TREE_TYPE (num))
8820       || !host_integerp (num, 0)
8821       || (n = tree_low_cst (num, 0)) <= 0
8822       || (int) n != n)
8823     {
8824       error_at (loc,
8825                 "collapse argument needs positive constant integer expression");
8826       return list;
8827     }
8828   c = build_omp_clause (loc, OMP_CLAUSE_COLLAPSE);
8829   OMP_CLAUSE_COLLAPSE_EXPR (c) = num;
8830   OMP_CLAUSE_CHAIN (c) = list;
8831   return c;
8832 }
8833
8834 /* OpenMP 2.5:
8835    copyin ( variable-list ) */
8836
8837 static tree
8838 c_parser_omp_clause_copyin (c_parser *parser, tree list)
8839 {
8840   return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_COPYIN, list);
8841 }
8842
8843 /* OpenMP 2.5:
8844    copyprivate ( variable-list ) */
8845
8846 static tree
8847 c_parser_omp_clause_copyprivate (c_parser *parser, tree list)
8848 {
8849   return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_COPYPRIVATE, list);
8850 }
8851
8852 /* OpenMP 2.5:
8853    default ( shared | none ) */
8854
8855 static tree
8856 c_parser_omp_clause_default (c_parser *parser, tree list)
8857 {
8858   enum omp_clause_default_kind kind = OMP_CLAUSE_DEFAULT_UNSPECIFIED;
8859   location_t loc = c_parser_peek_token (parser)->location;
8860   tree c;
8861
8862   if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
8863     return list;
8864   if (c_parser_next_token_is (parser, CPP_NAME))
8865     {
8866       const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
8867
8868       switch (p[0])
8869         {
8870         case 'n':
8871           if (strcmp ("none", p) != 0)
8872             goto invalid_kind;
8873           kind = OMP_CLAUSE_DEFAULT_NONE;
8874           break;
8875
8876         case 's':
8877           if (strcmp ("shared", p) != 0)
8878             goto invalid_kind;
8879           kind = OMP_CLAUSE_DEFAULT_SHARED;
8880           break;
8881
8882         default:
8883           goto invalid_kind;
8884         }
8885
8886       c_parser_consume_token (parser);
8887     }
8888   else
8889     {
8890     invalid_kind:
8891       c_parser_error (parser, "expected %<none%> or %<shared%>");
8892     }
8893   c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
8894
8895   if (kind == OMP_CLAUSE_DEFAULT_UNSPECIFIED)
8896     return list;
8897
8898   check_no_duplicate_clause (list, OMP_CLAUSE_DEFAULT, "default");
8899   c = build_omp_clause (loc, OMP_CLAUSE_DEFAULT);
8900   OMP_CLAUSE_CHAIN (c) = list;
8901   OMP_CLAUSE_DEFAULT_KIND (c) = kind;
8902
8903   return c;
8904 }
8905
8906 /* OpenMP 2.5:
8907    firstprivate ( variable-list ) */
8908
8909 static tree
8910 c_parser_omp_clause_firstprivate (c_parser *parser, tree list)
8911 {
8912   return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_FIRSTPRIVATE, list);
8913 }
8914
8915 /* OpenMP 3.1:
8916    final ( expression ) */
8917
8918 static tree
8919 c_parser_omp_clause_final (c_parser *parser, tree list)
8920 {
8921   location_t loc = c_parser_peek_token (parser)->location;
8922   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
8923     {
8924       tree t = c_parser_paren_condition (parser);
8925       tree c;
8926
8927       check_no_duplicate_clause (list, OMP_CLAUSE_FINAL, "final");
8928
8929       c = build_omp_clause (loc, OMP_CLAUSE_FINAL);
8930       OMP_CLAUSE_FINAL_EXPR (c) = t;
8931       OMP_CLAUSE_CHAIN (c) = list;
8932       list = c;
8933     }
8934   else
8935     c_parser_error (parser, "expected %<(%>");
8936
8937   return list;
8938 }
8939
8940 /* OpenMP 2.5:
8941    if ( expression ) */
8942
8943 static tree
8944 c_parser_omp_clause_if (c_parser *parser, tree list)
8945 {
8946   location_t loc = c_parser_peek_token (parser)->location;
8947   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
8948     {
8949       tree t = c_parser_paren_condition (parser);
8950       tree c;
8951
8952       check_no_duplicate_clause (list, OMP_CLAUSE_IF, "if");
8953
8954       c = build_omp_clause (loc, OMP_CLAUSE_IF);
8955       OMP_CLAUSE_IF_EXPR (c) = t;
8956       OMP_CLAUSE_CHAIN (c) = list;
8957       list = c;
8958     }
8959   else
8960     c_parser_error (parser, "expected %<(%>");
8961
8962   return list;
8963 }
8964
8965 /* OpenMP 2.5:
8966    lastprivate ( variable-list ) */
8967
8968 static tree
8969 c_parser_omp_clause_lastprivate (c_parser *parser, tree list)
8970 {
8971   return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_LASTPRIVATE, list);
8972 }
8973
8974 /* OpenMP 3.1:
8975    mergeable */
8976
8977 static tree
8978 c_parser_omp_clause_mergeable (c_parser *parser ATTRIBUTE_UNUSED, tree list)
8979 {
8980   tree c;
8981
8982   /* FIXME: Should we allow duplicates?  */
8983   check_no_duplicate_clause (list, OMP_CLAUSE_MERGEABLE, "mergeable");
8984
8985   c = build_omp_clause (c_parser_peek_token (parser)->location,
8986                         OMP_CLAUSE_MERGEABLE);
8987   OMP_CLAUSE_CHAIN (c) = list;
8988
8989   return c;
8990 }
8991
8992 /* OpenMP 2.5:
8993    nowait */
8994
8995 static tree
8996 c_parser_omp_clause_nowait (c_parser *parser ATTRIBUTE_UNUSED, tree list)
8997 {
8998   tree c;
8999   location_t loc = c_parser_peek_token (parser)->location;
9000
9001   check_no_duplicate_clause (list, OMP_CLAUSE_NOWAIT, "nowait");
9002
9003   c = build_omp_clause (loc, OMP_CLAUSE_NOWAIT);
9004   OMP_CLAUSE_CHAIN (c) = list;
9005   return c;
9006 }
9007
9008 /* OpenMP 2.5:
9009    num_threads ( expression ) */
9010
9011 static tree
9012 c_parser_omp_clause_num_threads (c_parser *parser, tree list)
9013 {
9014   location_t num_threads_loc = c_parser_peek_token (parser)->location;
9015   if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
9016     {
9017       location_t expr_loc = c_parser_peek_token (parser)->location;
9018       tree c, t = c_parser_expression (parser).value;
9019       mark_exp_read (t);
9020       t = c_fully_fold (t, false, NULL);
9021
9022       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
9023
9024       if (!INTEGRAL_TYPE_P (TREE_TYPE (t)))
9025         {
9026           c_parser_error (parser, "expected integer expression");
9027           return list;
9028         }
9029
9030       /* Attempt to statically determine when the number isn't positive.  */
9031       c = fold_build2_loc (expr_loc, LE_EXPR, boolean_type_node, t,
9032                        build_int_cst (TREE_TYPE (t), 0));
9033       if (CAN_HAVE_LOCATION_P (c))
9034         SET_EXPR_LOCATION (c, expr_loc);
9035       if (c == boolean_true_node)
9036         {
9037           warning_at (expr_loc, 0,
9038                       "%<num_threads%> value must be positive");
9039           t = integer_one_node;
9040         }
9041
9042       check_no_duplicate_clause (list, OMP_CLAUSE_NUM_THREADS, "num_threads");
9043
9044       c = build_omp_clause (num_threads_loc, OMP_CLAUSE_NUM_THREADS);
9045       OMP_CLAUSE_NUM_THREADS_EXPR (c) = t;
9046       OMP_CLAUSE_CHAIN (c) = list;
9047       list = c;
9048     }
9049
9050   return list;
9051 }
9052
9053 /* OpenMP 2.5:
9054    ordered */
9055
9056 static tree
9057 c_parser_omp_clause_ordered (c_parser *parser, tree list)
9058 {
9059   tree c;
9060
9061   check_no_duplicate_clause (list, OMP_CLAUSE_ORDERED, "ordered");
9062
9063   c = build_omp_clause (c_parser_peek_token (parser)->location,
9064                         OMP_CLAUSE_ORDERED);
9065   OMP_CLAUSE_CHAIN (c) = list;
9066
9067   return c;
9068 }
9069
9070 /* OpenMP 2.5:
9071    private ( variable-list ) */
9072
9073 static tree
9074 c_parser_omp_clause_private (c_parser *parser, tree list)
9075 {
9076   return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_PRIVATE, list);
9077 }
9078
9079 /* OpenMP 2.5:
9080    reduction ( reduction-operator : variable-list )
9081
9082    reduction-operator:
9083      One of: + * - & ^ | && ||
9084      
9085    OpenMP 3.1:
9086    
9087    reduction-operator:
9088      One of: + * - & ^ | && || max min  */
9089
9090 static tree
9091 c_parser_omp_clause_reduction (c_parser *parser, tree list)
9092 {
9093   location_t clause_loc = c_parser_peek_token (parser)->location;
9094   if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
9095     {
9096       enum tree_code code;
9097
9098       switch (c_parser_peek_token (parser)->type)
9099         {
9100         case CPP_PLUS:
9101           code = PLUS_EXPR;
9102           break;
9103         case CPP_MULT:
9104           code = MULT_EXPR;
9105           break;
9106         case CPP_MINUS:
9107           code = MINUS_EXPR;
9108           break;
9109         case CPP_AND:
9110           code = BIT_AND_EXPR;
9111           break;
9112         case CPP_XOR:
9113           code = BIT_XOR_EXPR;
9114           break;
9115         case CPP_OR:
9116           code = BIT_IOR_EXPR;
9117           break;
9118         case CPP_AND_AND:
9119           code = TRUTH_ANDIF_EXPR;
9120           break;
9121         case CPP_OR_OR:
9122           code = TRUTH_ORIF_EXPR;
9123           break;
9124         case CPP_NAME:
9125           {
9126             const char *p
9127               = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
9128             if (strcmp (p, "min") == 0)
9129               {
9130                 code = MIN_EXPR;
9131                 break;
9132               }
9133             if (strcmp (p, "max") == 0)
9134               {
9135                 code = MAX_EXPR;
9136                 break;
9137               }
9138           }
9139           /* FALLTHRU */
9140         default:
9141           c_parser_error (parser,
9142                           "expected %<+%>, %<*%>, %<-%>, %<&%>, "
9143                           "%<^%>, %<|%>, %<&&%>, %<||%>, %<min%> or %<max%>");
9144           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 0);
9145           return list;
9146         }
9147       c_parser_consume_token (parser);
9148       if (c_parser_require (parser, CPP_COLON, "expected %<:%>"))
9149         {
9150           tree nl, c;
9151
9152           nl = c_parser_omp_variable_list (parser, clause_loc,
9153                                            OMP_CLAUSE_REDUCTION, list);
9154           for (c = nl; c != list; c = OMP_CLAUSE_CHAIN (c))
9155             OMP_CLAUSE_REDUCTION_CODE (c) = code;
9156
9157           list = nl;
9158         }
9159       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
9160     }
9161   return list;
9162 }
9163
9164 /* OpenMP 2.5:
9165    schedule ( schedule-kind )
9166    schedule ( schedule-kind , expression )
9167
9168    schedule-kind:
9169      static | dynamic | guided | runtime | auto
9170 */
9171
9172 static tree
9173 c_parser_omp_clause_schedule (c_parser *parser, tree list)
9174 {
9175   tree c, t;
9176   location_t loc = c_parser_peek_token (parser)->location;
9177
9178   if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
9179     return list;
9180
9181   c = build_omp_clause (loc, OMP_CLAUSE_SCHEDULE);
9182
9183   if (c_parser_next_token_is (parser, CPP_NAME))
9184     {
9185       tree kind = c_parser_peek_token (parser)->value;
9186       const char *p = IDENTIFIER_POINTER (kind);
9187
9188       switch (p[0])
9189         {
9190         case 'd':
9191           if (strcmp ("dynamic", p) != 0)
9192             goto invalid_kind;
9193           OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_DYNAMIC;
9194           break;
9195
9196         case 'g':
9197           if (strcmp ("guided", p) != 0)
9198             goto invalid_kind;
9199           OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_GUIDED;
9200           break;
9201
9202         case 'r':
9203           if (strcmp ("runtime", p) != 0)
9204             goto invalid_kind;
9205           OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_RUNTIME;
9206           break;
9207
9208         default:
9209           goto invalid_kind;
9210         }
9211     }
9212   else if (c_parser_next_token_is_keyword (parser, RID_STATIC))
9213     OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_STATIC;
9214   else if (c_parser_next_token_is_keyword (parser, RID_AUTO))
9215     OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_AUTO;
9216   else
9217     goto invalid_kind;
9218
9219   c_parser_consume_token (parser);
9220   if (c_parser_next_token_is (parser, CPP_COMMA))
9221     {
9222       location_t here;
9223       c_parser_consume_token (parser);
9224
9225       here = c_parser_peek_token (parser)->location;
9226       t = c_parser_expr_no_commas (parser, NULL).value;
9227       mark_exp_read (t);
9228       t = c_fully_fold (t, false, NULL);
9229
9230       if (OMP_CLAUSE_SCHEDULE_KIND (c) == OMP_CLAUSE_SCHEDULE_RUNTIME)
9231         error_at (here, "schedule %<runtime%> does not take "
9232                   "a %<chunk_size%> parameter");
9233       else if (OMP_CLAUSE_SCHEDULE_KIND (c) == OMP_CLAUSE_SCHEDULE_AUTO)
9234         error_at (here,
9235                   "schedule %<auto%> does not take "
9236                   "a %<chunk_size%> parameter");
9237       else if (TREE_CODE (TREE_TYPE (t)) == INTEGER_TYPE)
9238         OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (c) = t;
9239       else
9240         c_parser_error (parser, "expected integer expression");
9241
9242       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
9243     }
9244   else
9245     c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
9246                                "expected %<,%> or %<)%>");
9247
9248   check_no_duplicate_clause (list, OMP_CLAUSE_SCHEDULE, "schedule");
9249   OMP_CLAUSE_CHAIN (c) = list;
9250   return c;
9251
9252  invalid_kind:
9253   c_parser_error (parser, "invalid schedule kind");
9254   c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 0);
9255   return list;
9256 }
9257
9258 /* OpenMP 2.5:
9259    shared ( variable-list ) */
9260
9261 static tree
9262 c_parser_omp_clause_shared (c_parser *parser, tree list)
9263 {
9264   return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_SHARED, list);
9265 }
9266
9267 /* OpenMP 3.0:
9268    untied */
9269
9270 static tree
9271 c_parser_omp_clause_untied (c_parser *parser ATTRIBUTE_UNUSED, tree list)
9272 {
9273   tree c;
9274
9275   /* FIXME: Should we allow duplicates?  */
9276   check_no_duplicate_clause (list, OMP_CLAUSE_UNTIED, "untied");
9277
9278   c = build_omp_clause (c_parser_peek_token (parser)->location,
9279                         OMP_CLAUSE_UNTIED);
9280   OMP_CLAUSE_CHAIN (c) = list;
9281
9282   return c;
9283 }
9284
9285 /* Parse all OpenMP clauses.  The set clauses allowed by the directive
9286    is a bitmask in MASK.  Return the list of clauses found; the result
9287    of clause default goes in *pdefault.  */
9288
9289 static tree
9290 c_parser_omp_all_clauses (c_parser *parser, unsigned int mask,
9291                           const char *where)
9292 {
9293   tree clauses = NULL;
9294   bool first = true;
9295
9296   while (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL))
9297     {
9298       location_t here;
9299       pragma_omp_clause c_kind;
9300       const char *c_name;
9301       tree prev = clauses;
9302
9303       if (!first && c_parser_next_token_is (parser, CPP_COMMA))
9304         c_parser_consume_token (parser);
9305
9306       first = false;
9307       here = c_parser_peek_token (parser)->location;
9308       c_kind = c_parser_omp_clause_name (parser);
9309
9310       switch (c_kind)
9311         {
9312         case PRAGMA_OMP_CLAUSE_COLLAPSE:
9313           clauses = c_parser_omp_clause_collapse (parser, clauses);
9314           c_name = "collapse";
9315           break;
9316         case PRAGMA_OMP_CLAUSE_COPYIN:
9317           clauses = c_parser_omp_clause_copyin (parser, clauses);
9318           c_name = "copyin";
9319           break;
9320         case PRAGMA_OMP_CLAUSE_COPYPRIVATE:
9321           clauses = c_parser_omp_clause_copyprivate (parser, clauses);
9322           c_name = "copyprivate";
9323           break;
9324         case PRAGMA_OMP_CLAUSE_DEFAULT:
9325           clauses = c_parser_omp_clause_default (parser, clauses);
9326           c_name = "default";
9327           break;
9328         case PRAGMA_OMP_CLAUSE_FIRSTPRIVATE:
9329           clauses = c_parser_omp_clause_firstprivate (parser, clauses);
9330           c_name = "firstprivate";
9331           break;
9332         case PRAGMA_OMP_CLAUSE_FINAL:
9333           clauses = c_parser_omp_clause_final (parser, clauses);
9334           c_name = "final";
9335           break;
9336         case PRAGMA_OMP_CLAUSE_IF:
9337           clauses = c_parser_omp_clause_if (parser, clauses);
9338           c_name = "if";
9339           break;
9340         case PRAGMA_OMP_CLAUSE_LASTPRIVATE:
9341           clauses = c_parser_omp_clause_lastprivate (parser, clauses);
9342           c_name = "lastprivate";
9343           break;
9344         case PRAGMA_OMP_CLAUSE_MERGEABLE:
9345           clauses = c_parser_omp_clause_mergeable (parser, clauses);
9346           c_name = "mergeable";
9347           break;
9348         case PRAGMA_OMP_CLAUSE_NOWAIT:
9349           clauses = c_parser_omp_clause_nowait (parser, clauses);
9350           c_name = "nowait";
9351           break;
9352         case PRAGMA_OMP_CLAUSE_NUM_THREADS:
9353           clauses = c_parser_omp_clause_num_threads (parser, clauses);
9354           c_name = "num_threads";
9355           break;
9356         case PRAGMA_OMP_CLAUSE_ORDERED:
9357           clauses = c_parser_omp_clause_ordered (parser, clauses);
9358           c_name = "ordered";
9359           break;
9360         case PRAGMA_OMP_CLAUSE_PRIVATE:
9361           clauses = c_parser_omp_clause_private (parser, clauses);
9362           c_name = "private";
9363           break;
9364         case PRAGMA_OMP_CLAUSE_REDUCTION:
9365           clauses = c_parser_omp_clause_reduction (parser, clauses);
9366           c_name = "reduction";
9367           break;
9368         case PRAGMA_OMP_CLAUSE_SCHEDULE:
9369           clauses = c_parser_omp_clause_schedule (parser, clauses);
9370           c_name = "schedule";
9371           break;
9372         case PRAGMA_OMP_CLAUSE_SHARED:
9373           clauses = c_parser_omp_clause_shared (parser, clauses);
9374           c_name = "shared";
9375           break;
9376         case PRAGMA_OMP_CLAUSE_UNTIED:
9377           clauses = c_parser_omp_clause_untied (parser, clauses);
9378           c_name = "untied";
9379           break;
9380         default:
9381           c_parser_error (parser, "expected %<#pragma omp%> clause");
9382           goto saw_error;
9383         }
9384
9385       if (((mask >> c_kind) & 1) == 0 && !parser->error)
9386         {
9387           /* Remove the invalid clause(s) from the list to avoid
9388              confusing the rest of the compiler.  */
9389           clauses = prev;
9390           error_at (here, "%qs is not valid for %qs", c_name, where);
9391         }
9392     }
9393
9394  saw_error:
9395   c_parser_skip_to_pragma_eol (parser);
9396
9397   return c_finish_omp_clauses (clauses);
9398 }
9399
9400 /* OpenMP 2.5:
9401    structured-block:
9402      statement
9403
9404    In practice, we're also interested in adding the statement to an
9405    outer node.  So it is convenient if we work around the fact that
9406    c_parser_statement calls add_stmt.  */
9407
9408 static tree
9409 c_parser_omp_structured_block (c_parser *parser)
9410 {
9411   tree stmt = push_stmt_list ();
9412   c_parser_statement (parser);
9413   return pop_stmt_list (stmt);
9414 }
9415
9416 /* OpenMP 2.5:
9417    # pragma omp atomic new-line
9418      expression-stmt
9419
9420    expression-stmt:
9421      x binop= expr | x++ | ++x | x-- | --x
9422    binop:
9423      +, *, -, /, &, ^, |, <<, >>
9424
9425   where x is an lvalue expression with scalar type.
9426
9427    OpenMP 3.1:
9428    # pragma omp atomic new-line
9429      update-stmt
9430
9431    # pragma omp atomic read new-line
9432      read-stmt
9433
9434    # pragma omp atomic write new-line
9435      write-stmt
9436
9437    # pragma omp atomic update new-line
9438      update-stmt
9439
9440    # pragma omp atomic capture new-line
9441      capture-stmt
9442
9443    # pragma omp atomic capture new-line
9444      capture-block
9445
9446    read-stmt:
9447      v = x
9448    write-stmt:
9449      x = expr
9450    update-stmt:
9451      expression-stmt | x = x binop expr
9452    capture-stmt:
9453      v = x binop= expr | v = x++ | v = ++x | v = x-- | v = --x
9454    capture-block:
9455      { v = x; update-stmt; } | { update-stmt; v = x; }
9456
9457   where x and v are lvalue expressions with scalar type.
9458
9459   LOC is the location of the #pragma token.  */
9460
9461 static void
9462 c_parser_omp_atomic (location_t loc, c_parser *parser)
9463 {
9464   tree lhs = NULL_TREE, rhs = NULL_TREE, v = NULL_TREE;
9465   tree lhs1 = NULL_TREE, rhs1 = NULL_TREE;
9466   tree stmt, orig_lhs;
9467   enum tree_code code = OMP_ATOMIC, opcode = NOP_EXPR;
9468   struct c_expr rhs_expr;
9469   bool structured_block = false;
9470
9471   if (c_parser_next_token_is (parser, CPP_NAME))
9472     {
9473       const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
9474
9475       if (!strcmp (p, "read"))
9476         code = OMP_ATOMIC_READ;
9477       else if (!strcmp (p, "write"))
9478         code = NOP_EXPR;
9479       else if (!strcmp (p, "update"))
9480         code = OMP_ATOMIC;
9481       else if (!strcmp (p, "capture"))
9482         code = OMP_ATOMIC_CAPTURE_NEW;
9483       else
9484         p = NULL;
9485       if (p)
9486         c_parser_consume_token (parser);
9487     }
9488   c_parser_skip_to_pragma_eol (parser);
9489
9490   switch (code)
9491     {
9492     case OMP_ATOMIC_READ:
9493     case NOP_EXPR: /* atomic write */
9494       v = c_parser_unary_expression (parser).value;
9495       v = c_fully_fold (v, false, NULL);
9496       if (v == error_mark_node)
9497         goto saw_error;
9498       loc = c_parser_peek_token (parser)->location;
9499       if (!c_parser_require (parser, CPP_EQ, "expected %<=%>"))
9500         goto saw_error;
9501       if (code == NOP_EXPR)
9502         lhs = c_parser_expression (parser).value;
9503       else
9504         lhs = c_parser_unary_expression (parser).value;
9505       lhs = c_fully_fold (lhs, false, NULL);
9506       if (lhs == error_mark_node)
9507         goto saw_error;
9508       if (code == NOP_EXPR)
9509         {
9510           /* atomic write is represented by OMP_ATOMIC with NOP_EXPR
9511              opcode.  */
9512           code = OMP_ATOMIC;
9513           rhs = lhs;
9514           lhs = v;
9515           v = NULL_TREE;
9516         }
9517       goto done;
9518     case OMP_ATOMIC_CAPTURE_NEW:
9519       if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
9520         {
9521           c_parser_consume_token (parser);
9522           structured_block = true;
9523         }
9524       else
9525         {
9526           v = c_parser_unary_expression (parser).value;
9527           v = c_fully_fold (v, false, NULL);
9528           if (v == error_mark_node)
9529             goto saw_error;
9530           if (!c_parser_require (parser, CPP_EQ, "expected %<=%>"))
9531             goto saw_error;
9532         }
9533       break;
9534     default:
9535       break;
9536     }
9537
9538   /* For structured_block case we don't know yet whether
9539      old or new x should be captured.  */
9540 restart:
9541   lhs = c_parser_unary_expression (parser).value;
9542   lhs = c_fully_fold (lhs, false, NULL);
9543   orig_lhs = lhs;
9544   switch (TREE_CODE (lhs))
9545     {
9546     case ERROR_MARK:
9547     saw_error:
9548       c_parser_skip_to_end_of_block_or_statement (parser);
9549       if (structured_block)
9550         {
9551           if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
9552             c_parser_consume_token (parser);
9553           else if (code == OMP_ATOMIC_CAPTURE_NEW)
9554             {
9555               c_parser_skip_to_end_of_block_or_statement (parser);
9556               if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
9557                 c_parser_consume_token (parser);
9558             }
9559         }
9560       return;
9561
9562     case POSTINCREMENT_EXPR:
9563       if (code == OMP_ATOMIC_CAPTURE_NEW && !structured_block)
9564         code = OMP_ATOMIC_CAPTURE_OLD;
9565       /* FALLTHROUGH */
9566     case PREINCREMENT_EXPR:
9567       lhs = TREE_OPERAND (lhs, 0);
9568       opcode = PLUS_EXPR;
9569       rhs = integer_one_node;
9570       break;
9571
9572     case POSTDECREMENT_EXPR:
9573       if (code == OMP_ATOMIC_CAPTURE_NEW && !structured_block)
9574         code = OMP_ATOMIC_CAPTURE_OLD;
9575       /* FALLTHROUGH */
9576     case PREDECREMENT_EXPR:
9577       lhs = TREE_OPERAND (lhs, 0);
9578       opcode = MINUS_EXPR;
9579       rhs = integer_one_node;
9580       break;
9581
9582     case COMPOUND_EXPR:
9583       if (TREE_CODE (TREE_OPERAND (lhs, 0)) == SAVE_EXPR
9584           && TREE_CODE (TREE_OPERAND (lhs, 1)) == COMPOUND_EXPR
9585           && TREE_CODE (TREE_OPERAND (TREE_OPERAND (lhs, 1), 0)) == MODIFY_EXPR
9586           && TREE_OPERAND (TREE_OPERAND (lhs, 1), 1) == TREE_OPERAND (lhs, 0)
9587           && TREE_CODE (TREE_TYPE (TREE_OPERAND (TREE_OPERAND
9588                                               (TREE_OPERAND (lhs, 1), 0), 0)))
9589              == BOOLEAN_TYPE)
9590         /* Undo effects of boolean_increment for post {in,de}crement.  */
9591         lhs = TREE_OPERAND (TREE_OPERAND (lhs, 1), 0);
9592       /* FALLTHRU */
9593     case MODIFY_EXPR:
9594       if (TREE_CODE (lhs) == MODIFY_EXPR
9595           && TREE_CODE (TREE_TYPE (TREE_OPERAND (lhs, 0))) == BOOLEAN_TYPE)
9596         {
9597           /* Undo effects of boolean_increment.  */
9598           if (integer_onep (TREE_OPERAND (lhs, 1)))
9599             {
9600               /* This is pre or post increment.  */
9601               rhs = TREE_OPERAND (lhs, 1);
9602               lhs = TREE_OPERAND (lhs, 0);
9603               opcode = NOP_EXPR;
9604               if (code == OMP_ATOMIC_CAPTURE_NEW
9605                   && !structured_block
9606                   && TREE_CODE (orig_lhs) == COMPOUND_EXPR)
9607                 code = OMP_ATOMIC_CAPTURE_OLD;
9608               break;
9609             }
9610           if (TREE_CODE (TREE_OPERAND (lhs, 1)) == TRUTH_NOT_EXPR
9611               && TREE_OPERAND (lhs, 0)
9612                  == TREE_OPERAND (TREE_OPERAND (lhs, 1), 0))
9613             {
9614               /* This is pre or post decrement.  */
9615               rhs = TREE_OPERAND (lhs, 1);
9616               lhs = TREE_OPERAND (lhs, 0);
9617               opcode = NOP_EXPR;
9618               if (code == OMP_ATOMIC_CAPTURE_NEW
9619                   && !structured_block
9620                   && TREE_CODE (orig_lhs) == COMPOUND_EXPR)
9621                 code = OMP_ATOMIC_CAPTURE_OLD;
9622               break;
9623             }
9624         }
9625       /* FALLTHRU */
9626     default:
9627       switch (c_parser_peek_token (parser)->type)
9628         {
9629         case CPP_MULT_EQ:
9630           opcode = MULT_EXPR;
9631           break;
9632         case CPP_DIV_EQ:
9633           opcode = TRUNC_DIV_EXPR;
9634           break;
9635         case CPP_PLUS_EQ:
9636           opcode = PLUS_EXPR;
9637           break;
9638         case CPP_MINUS_EQ:
9639           opcode = MINUS_EXPR;
9640           break;
9641         case CPP_LSHIFT_EQ:
9642           opcode = LSHIFT_EXPR;
9643           break;
9644         case CPP_RSHIFT_EQ:
9645           opcode = RSHIFT_EXPR;
9646           break;
9647         case CPP_AND_EQ:
9648           opcode = BIT_AND_EXPR;
9649           break;
9650         case CPP_OR_EQ:
9651           opcode = BIT_IOR_EXPR;
9652           break;
9653         case CPP_XOR_EQ:
9654           opcode = BIT_XOR_EXPR;
9655           break;
9656         case CPP_EQ:
9657           if (structured_block || code == OMP_ATOMIC)
9658             {
9659               location_t aloc = c_parser_peek_token (parser)->location;
9660               location_t rhs_loc;
9661               enum c_parser_prec oprec = PREC_NONE;
9662
9663               c_parser_consume_token (parser);
9664               rhs1 = c_parser_unary_expression (parser).value;
9665               rhs1 = c_fully_fold (rhs1, false, NULL);
9666               if (rhs1 == error_mark_node)
9667                 goto saw_error;
9668               switch (c_parser_peek_token (parser)->type)
9669                 {
9670                 case CPP_SEMICOLON:
9671                   if (code == OMP_ATOMIC_CAPTURE_NEW)
9672                     {
9673                       code = OMP_ATOMIC_CAPTURE_OLD;
9674                       v = lhs;
9675                       lhs = NULL_TREE;
9676                       lhs1 = rhs1;
9677                       rhs1 = NULL_TREE;
9678                       c_parser_consume_token (parser);
9679                       goto restart;
9680                     }
9681                   c_parser_error (parser,
9682                                   "invalid form of %<#pragma omp atomic%>");
9683                   goto saw_error;
9684                 case CPP_MULT:
9685                   opcode = MULT_EXPR;
9686                   oprec = PREC_MULT;
9687                   break;
9688                 case CPP_DIV:
9689                   opcode = TRUNC_DIV_EXPR;
9690                   oprec = PREC_MULT;
9691                   break;
9692                 case CPP_PLUS:
9693                   opcode = PLUS_EXPR;
9694                   oprec = PREC_ADD;
9695                   break;
9696                 case CPP_MINUS:
9697                   opcode = MINUS_EXPR;
9698                   oprec = PREC_ADD;
9699                   break;
9700                 case CPP_LSHIFT:
9701                   opcode = LSHIFT_EXPR;
9702                   oprec = PREC_SHIFT;
9703                   break;
9704                 case CPP_RSHIFT:
9705                   opcode = RSHIFT_EXPR;
9706                   oprec = PREC_SHIFT;
9707                   break;
9708                 case CPP_AND:
9709                   opcode = BIT_AND_EXPR;
9710                   oprec = PREC_BITAND;
9711                   break;
9712                 case CPP_OR:
9713                   opcode = BIT_IOR_EXPR;
9714                   oprec = PREC_BITOR;
9715                   break;
9716                 case CPP_XOR:
9717                   opcode = BIT_XOR_EXPR;
9718                   oprec = PREC_BITXOR;
9719                   break;
9720                 default:
9721                   c_parser_error (parser,
9722                                   "invalid operator for %<#pragma omp atomic%>");
9723                   goto saw_error;
9724                 }
9725               loc = aloc;
9726               c_parser_consume_token (parser);
9727               rhs_loc = c_parser_peek_token (parser)->location;
9728               if (commutative_tree_code (opcode))
9729                 oprec = (enum c_parser_prec) (oprec - 1);
9730               rhs_expr = c_parser_binary_expression (parser, NULL, oprec);
9731               rhs_expr = default_function_array_read_conversion (rhs_loc,
9732                                                                  rhs_expr);
9733               rhs = rhs_expr.value;
9734               rhs = c_fully_fold (rhs, false, NULL);
9735               goto stmt_done; 
9736             }
9737           /* FALLTHROUGH */
9738         default:
9739           c_parser_error (parser,
9740                           "invalid operator for %<#pragma omp atomic%>");
9741           goto saw_error;
9742         }
9743
9744       /* Arrange to pass the location of the assignment operator to
9745          c_finish_omp_atomic.  */
9746       loc = c_parser_peek_token (parser)->location;
9747       c_parser_consume_token (parser);
9748       {
9749         location_t rhs_loc = c_parser_peek_token (parser)->location;
9750         rhs_expr = c_parser_expression (parser);
9751         rhs_expr = default_function_array_read_conversion (rhs_loc, rhs_expr);
9752       }
9753       rhs = rhs_expr.value;
9754       rhs = c_fully_fold (rhs, false, NULL);
9755       break;
9756     }
9757 stmt_done:
9758   if (structured_block && code == OMP_ATOMIC_CAPTURE_NEW)
9759     {
9760       if (!c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>"))
9761         goto saw_error;
9762       v = c_parser_unary_expression (parser).value;
9763       v = c_fully_fold (v, false, NULL);
9764       if (v == error_mark_node)
9765         goto saw_error;
9766       if (!c_parser_require (parser, CPP_EQ, "expected %<=%>"))
9767         goto saw_error;
9768       lhs1 = c_parser_unary_expression (parser).value;
9769       lhs1 = c_fully_fold (lhs1, false, NULL);
9770       if (lhs1 == error_mark_node)
9771         goto saw_error;
9772     }
9773   if (structured_block)
9774     {
9775       c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
9776       c_parser_require (parser, CPP_CLOSE_BRACE, "expected %<}%>");
9777     }
9778 done:
9779   stmt = c_finish_omp_atomic (loc, code, opcode, lhs, rhs, v, lhs1, rhs1);
9780   if (stmt != error_mark_node)
9781     add_stmt (stmt);
9782
9783   if (!structured_block)
9784     c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
9785 }
9786
9787
9788 /* OpenMP 2.5:
9789    # pragma omp barrier new-line
9790 */
9791
9792 static void
9793 c_parser_omp_barrier (c_parser *parser)
9794 {
9795   location_t loc = c_parser_peek_token (parser)->location;
9796   c_parser_consume_pragma (parser);
9797   c_parser_skip_to_pragma_eol (parser);
9798
9799   c_finish_omp_barrier (loc);
9800 }
9801
9802 /* OpenMP 2.5:
9803    # pragma omp critical [(name)] new-line
9804      structured-block
9805
9806   LOC is the location of the #pragma itself.  */
9807
9808 static tree
9809 c_parser_omp_critical (location_t loc, c_parser *parser)
9810 {
9811   tree stmt, name = NULL;
9812
9813   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
9814     {
9815       c_parser_consume_token (parser);
9816       if (c_parser_next_token_is (parser, CPP_NAME))
9817         {
9818           name = c_parser_peek_token (parser)->value;
9819           c_parser_consume_token (parser);
9820           c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>");
9821         }
9822       else
9823         c_parser_error (parser, "expected identifier");
9824     }
9825   else if (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL))
9826     c_parser_error (parser, "expected %<(%> or end of line");
9827   c_parser_skip_to_pragma_eol (parser);
9828
9829   stmt = c_parser_omp_structured_block (parser);
9830   return c_finish_omp_critical (loc, stmt, name);
9831 }
9832
9833 /* OpenMP 2.5:
9834    # pragma omp flush flush-vars[opt] new-line
9835
9836    flush-vars:
9837      ( variable-list ) */
9838
9839 static void
9840 c_parser_omp_flush (c_parser *parser)
9841 {
9842   location_t loc = c_parser_peek_token (parser)->location;
9843   c_parser_consume_pragma (parser);
9844   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
9845     c_parser_omp_var_list_parens (parser, OMP_CLAUSE_ERROR, NULL);
9846   else if (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL))
9847     c_parser_error (parser, "expected %<(%> or end of line");
9848   c_parser_skip_to_pragma_eol (parser);
9849
9850   c_finish_omp_flush (loc);
9851 }
9852
9853 /* Parse the restricted form of the for statement allowed by OpenMP.
9854    The real trick here is to determine the loop control variable early
9855    so that we can push a new decl if necessary to make it private.
9856    LOC is the location of the OMP in "#pragma omp".  */
9857
9858 static tree
9859 c_parser_omp_for_loop (location_t loc,
9860                        c_parser *parser, tree clauses, tree *par_clauses)
9861 {
9862   tree decl, cond, incr, save_break, save_cont, body, init, stmt, cl;
9863   tree declv, condv, incrv, initv, ret = NULL;
9864   bool fail = false, open_brace_parsed = false;
9865   int i, collapse = 1, nbraces = 0;
9866   location_t for_loc;
9867   VEC(tree,gc) *for_block = make_tree_vector ();
9868
9869   for (cl = clauses; cl; cl = OMP_CLAUSE_CHAIN (cl))
9870     if (OMP_CLAUSE_CODE (cl) == OMP_CLAUSE_COLLAPSE)
9871       collapse = tree_low_cst (OMP_CLAUSE_COLLAPSE_EXPR (cl), 0);
9872
9873   gcc_assert (collapse >= 1);
9874
9875   declv = make_tree_vec (collapse);
9876   initv = make_tree_vec (collapse);
9877   condv = make_tree_vec (collapse);
9878   incrv = make_tree_vec (collapse);
9879
9880   if (!c_parser_next_token_is_keyword (parser, RID_FOR))
9881     {
9882       c_parser_error (parser, "for statement expected");
9883       return NULL;
9884     }
9885   for_loc = c_parser_peek_token (parser)->location;
9886   c_parser_consume_token (parser);
9887
9888   for (i = 0; i < collapse; i++)
9889     {
9890       int bracecount = 0;
9891
9892       if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
9893         goto pop_scopes;
9894
9895       /* Parse the initialization declaration or expression.  */
9896       if (c_parser_next_tokens_start_declaration (parser))
9897         {
9898           if (i > 0)
9899             VEC_safe_push (tree, gc, for_block, c_begin_compound_stmt (true));
9900           c_parser_declaration_or_fndef (parser, true, true, true, true, true, NULL);
9901           decl = check_for_loop_decls (for_loc, flag_isoc99);
9902           if (decl == NULL)
9903             goto error_init;
9904           if (DECL_INITIAL (decl) == error_mark_node)
9905             decl = error_mark_node;
9906           init = decl;
9907         }
9908       else if (c_parser_next_token_is (parser, CPP_NAME)
9909                && c_parser_peek_2nd_token (parser)->type == CPP_EQ)
9910         {
9911           struct c_expr decl_exp;
9912           struct c_expr init_exp;
9913           location_t init_loc;
9914
9915           decl_exp = c_parser_postfix_expression (parser);
9916           decl = decl_exp.value;
9917
9918           c_parser_require (parser, CPP_EQ, "expected %<=%>");
9919
9920           init_loc = c_parser_peek_token (parser)->location;
9921           init_exp = c_parser_expr_no_commas (parser, NULL);
9922           init_exp = default_function_array_read_conversion (init_loc,
9923                                                              init_exp);
9924           init = build_modify_expr (init_loc, decl, decl_exp.original_type,
9925                                     NOP_EXPR, init_loc, init_exp.value,
9926                                     init_exp.original_type);
9927           init = c_process_expr_stmt (init_loc, init);
9928
9929           c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
9930         }
9931       else
9932         {
9933         error_init:
9934           c_parser_error (parser,
9935                           "expected iteration declaration or initialization");
9936           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
9937                                      "expected %<)%>");
9938           fail = true;
9939           goto parse_next;
9940         }
9941
9942       /* Parse the loop condition.  */
9943       cond = NULL_TREE;
9944       if (c_parser_next_token_is_not (parser, CPP_SEMICOLON))
9945         {
9946           location_t cond_loc = c_parser_peek_token (parser)->location;
9947           struct c_expr cond_expr = c_parser_binary_expression (parser, NULL,
9948                                                                 PREC_NONE);
9949
9950           cond = cond_expr.value;
9951           cond = c_objc_common_truthvalue_conversion (cond_loc, cond);
9952           cond = c_fully_fold (cond, false, NULL);
9953           switch (cond_expr.original_code)
9954             {
9955             case GT_EXPR:
9956             case GE_EXPR:
9957             case LT_EXPR:
9958             case LE_EXPR:
9959               break;
9960             default:
9961               /* Can't be cond = error_mark_node, because we want to preserve
9962                  the location until c_finish_omp_for.  */
9963               cond = build1 (NOP_EXPR, boolean_type_node, error_mark_node);
9964               break;
9965             }
9966           protected_set_expr_location (cond, cond_loc);
9967         }
9968       c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
9969
9970       /* Parse the increment expression.  */
9971       incr = NULL_TREE;
9972       if (c_parser_next_token_is_not (parser, CPP_CLOSE_PAREN))
9973         {
9974           location_t incr_loc = c_parser_peek_token (parser)->location;
9975
9976           incr = c_process_expr_stmt (incr_loc,
9977                                       c_parser_expression (parser).value);
9978         }
9979       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
9980
9981       if (decl == NULL || decl == error_mark_node || init == error_mark_node)
9982         fail = true;
9983       else
9984         {
9985           TREE_VEC_ELT (declv, i) = decl;
9986           TREE_VEC_ELT (initv, i) = init;
9987           TREE_VEC_ELT (condv, i) = cond;
9988           TREE_VEC_ELT (incrv, i) = incr;
9989         }
9990
9991     parse_next:
9992       if (i == collapse - 1)
9993         break;
9994
9995       /* FIXME: OpenMP 3.0 draft isn't very clear on what exactly is allowed
9996          in between the collapsed for loops to be still considered perfectly
9997          nested.  Hopefully the final version clarifies this.
9998          For now handle (multiple) {'s and empty statements.  */
9999       do
10000         {
10001           if (c_parser_next_token_is_keyword (parser, RID_FOR))
10002             {
10003               c_parser_consume_token (parser);
10004               break;
10005             }
10006           else if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
10007             {
10008               c_parser_consume_token (parser);
10009               bracecount++;
10010             }
10011           else if (bracecount
10012                    && c_parser_next_token_is (parser, CPP_SEMICOLON))
10013             c_parser_consume_token (parser);
10014           else
10015             {
10016               c_parser_error (parser, "not enough perfectly nested loops");
10017               if (bracecount)
10018                 {
10019                   open_brace_parsed = true;
10020                   bracecount--;
10021                 }
10022               fail = true;
10023               collapse = 0;
10024               break;
10025             }
10026         }
10027       while (1);
10028
10029       nbraces += bracecount;
10030     }
10031
10032   save_break = c_break_label;
10033   c_break_label = size_one_node;
10034   save_cont = c_cont_label;
10035   c_cont_label = NULL_TREE;
10036   body = push_stmt_list ();
10037
10038   if (open_brace_parsed)
10039     {
10040       location_t here = c_parser_peek_token (parser)->location;
10041       stmt = c_begin_compound_stmt (true);
10042       c_parser_compound_statement_nostart (parser);
10043       add_stmt (c_end_compound_stmt (here, stmt, true));
10044     }
10045   else
10046     add_stmt (c_parser_c99_block_statement (parser));
10047   if (c_cont_label)
10048     {
10049       tree t = build1 (LABEL_EXPR, void_type_node, c_cont_label);
10050       SET_EXPR_LOCATION (t, loc);
10051       add_stmt (t);
10052     }
10053
10054   body = pop_stmt_list (body);
10055   c_break_label = save_break;
10056   c_cont_label = save_cont;
10057
10058   while (nbraces)
10059     {
10060       if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
10061         {
10062           c_parser_consume_token (parser);
10063           nbraces--;
10064         }
10065       else if (c_parser_next_token_is (parser, CPP_SEMICOLON))
10066         c_parser_consume_token (parser);
10067       else
10068         {
10069           c_parser_error (parser, "collapsed loops not perfectly nested");
10070           while (nbraces)
10071             {
10072               location_t here = c_parser_peek_token (parser)->location;
10073               stmt = c_begin_compound_stmt (true);
10074               add_stmt (body);
10075               c_parser_compound_statement_nostart (parser);
10076               body = c_end_compound_stmt (here, stmt, true);
10077               nbraces--;
10078             }
10079           goto pop_scopes;
10080         }
10081     }
10082
10083   /* Only bother calling c_finish_omp_for if we haven't already generated
10084      an error from the initialization parsing.  */
10085   if (!fail)
10086     {
10087       stmt = c_finish_omp_for (loc, declv, initv, condv, incrv, body, NULL);
10088       if (stmt)
10089         {
10090           if (par_clauses != NULL)
10091             {
10092               tree *c;
10093               for (c = par_clauses; *c ; )
10094                 if (OMP_CLAUSE_CODE (*c) != OMP_CLAUSE_FIRSTPRIVATE
10095                     && OMP_CLAUSE_CODE (*c) != OMP_CLAUSE_LASTPRIVATE)
10096                   c = &OMP_CLAUSE_CHAIN (*c);
10097                 else
10098                   {
10099                     for (i = 0; i < collapse; i++)
10100                       if (TREE_VEC_ELT (declv, i) == OMP_CLAUSE_DECL (*c))
10101                         break;
10102                     if (i == collapse)
10103                       c = &OMP_CLAUSE_CHAIN (*c);
10104                     else if (OMP_CLAUSE_CODE (*c) == OMP_CLAUSE_FIRSTPRIVATE)
10105                       {
10106                         error_at (loc,
10107                                   "iteration variable %qD should not be firstprivate",
10108                                   OMP_CLAUSE_DECL (*c));
10109                         *c = OMP_CLAUSE_CHAIN (*c);
10110                       }
10111                     else
10112                       {
10113                         /* Copy lastprivate (decl) clause to OMP_FOR_CLAUSES,
10114                            change it to shared (decl) in
10115                            OMP_PARALLEL_CLAUSES.  */
10116                         tree l = build_omp_clause (OMP_CLAUSE_LOCATION (*c),
10117                                                    OMP_CLAUSE_LASTPRIVATE);
10118                         OMP_CLAUSE_DECL (l) = OMP_CLAUSE_DECL (*c);
10119                         OMP_CLAUSE_CHAIN (l) = clauses;
10120                         clauses = l;
10121                         OMP_CLAUSE_SET_CODE (*c, OMP_CLAUSE_SHARED);
10122                       }
10123                   }
10124             }
10125           OMP_FOR_CLAUSES (stmt) = clauses;
10126         }
10127       ret = stmt;
10128     }
10129 pop_scopes:
10130   while (!VEC_empty (tree, for_block))
10131     {
10132       /* FIXME diagnostics: LOC below should be the actual location of
10133          this particular for block.  We need to build a list of
10134          locations to go along with FOR_BLOCK.  */
10135       stmt = c_end_compound_stmt (loc, VEC_pop (tree, for_block), true);
10136       add_stmt (stmt);
10137     }
10138   release_tree_vector (for_block);
10139   return ret;
10140 }
10141
10142 /* OpenMP 2.5:
10143    #pragma omp for for-clause[optseq] new-line
10144      for-loop
10145
10146    LOC is the location of the #pragma token.
10147 */
10148
10149 #define OMP_FOR_CLAUSE_MASK                             \
10150         ( (1u << PRAGMA_OMP_CLAUSE_PRIVATE)             \
10151         | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)        \
10152         | (1u << PRAGMA_OMP_CLAUSE_LASTPRIVATE)         \
10153         | (1u << PRAGMA_OMP_CLAUSE_REDUCTION)           \
10154         | (1u << PRAGMA_OMP_CLAUSE_ORDERED)             \
10155         | (1u << PRAGMA_OMP_CLAUSE_SCHEDULE)            \
10156         | (1u << PRAGMA_OMP_CLAUSE_COLLAPSE)            \
10157         | (1u << PRAGMA_OMP_CLAUSE_NOWAIT))
10158
10159 static tree
10160 c_parser_omp_for (location_t loc, c_parser *parser)
10161 {
10162   tree block, clauses, ret;
10163
10164   clauses = c_parser_omp_all_clauses (parser, OMP_FOR_CLAUSE_MASK,
10165                                       "#pragma omp for");
10166
10167   block = c_begin_compound_stmt (true);
10168   ret = c_parser_omp_for_loop (loc, parser, clauses, NULL);
10169   block = c_end_compound_stmt (loc, block, true);
10170   add_stmt (block);
10171
10172   return ret;
10173 }
10174
10175 /* OpenMP 2.5:
10176    # pragma omp master new-line
10177      structured-block
10178
10179    LOC is the location of the #pragma token.
10180 */
10181
10182 static tree
10183 c_parser_omp_master (location_t loc, c_parser *parser)
10184 {
10185   c_parser_skip_to_pragma_eol (parser);
10186   return c_finish_omp_master (loc, c_parser_omp_structured_block (parser));
10187 }
10188
10189 /* OpenMP 2.5:
10190    # pragma omp ordered new-line
10191      structured-block
10192
10193    LOC is the location of the #pragma itself.
10194 */
10195
10196 static tree
10197 c_parser_omp_ordered (location_t loc, c_parser *parser)
10198 {
10199   c_parser_skip_to_pragma_eol (parser);
10200   return c_finish_omp_ordered (loc, c_parser_omp_structured_block (parser));
10201 }
10202
10203 /* OpenMP 2.5:
10204
10205    section-scope:
10206      { section-sequence }
10207
10208    section-sequence:
10209      section-directive[opt] structured-block
10210      section-sequence section-directive structured-block
10211
10212     SECTIONS_LOC is the location of the #pragma omp sections.  */
10213
10214 static tree
10215 c_parser_omp_sections_scope (location_t sections_loc, c_parser *parser)
10216 {
10217   tree stmt, substmt;
10218   bool error_suppress = false;
10219   location_t loc;
10220
10221   loc = c_parser_peek_token (parser)->location;
10222   if (!c_parser_require (parser, CPP_OPEN_BRACE, "expected %<{%>"))
10223     {
10224       /* Avoid skipping until the end of the block.  */
10225       parser->error = false;
10226       return NULL_TREE;
10227     }
10228
10229   stmt = push_stmt_list ();
10230
10231   if (c_parser_peek_token (parser)->pragma_kind != PRAGMA_OMP_SECTION)
10232     {
10233       substmt = push_stmt_list ();
10234
10235       while (1)
10236         {
10237           c_parser_statement (parser);
10238
10239           if (c_parser_peek_token (parser)->pragma_kind == PRAGMA_OMP_SECTION)
10240             break;
10241           if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
10242             break;
10243           if (c_parser_next_token_is (parser, CPP_EOF))
10244             break;
10245         }
10246
10247       substmt = pop_stmt_list (substmt);
10248       substmt = build1 (OMP_SECTION, void_type_node, substmt);
10249       SET_EXPR_LOCATION (substmt, loc);
10250       add_stmt (substmt);
10251     }
10252
10253   while (1)
10254     {
10255       if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
10256         break;
10257       if (c_parser_next_token_is (parser, CPP_EOF))
10258         break;
10259
10260       loc = c_parser_peek_token (parser)->location;
10261       if (c_parser_peek_token (parser)->pragma_kind == PRAGMA_OMP_SECTION)
10262         {
10263           c_parser_consume_pragma (parser);
10264           c_parser_skip_to_pragma_eol (parser);
10265           error_suppress = false;
10266         }
10267       else if (!error_suppress)
10268         {
10269           error_at (loc, "expected %<#pragma omp section%> or %<}%>");
10270           error_suppress = true;
10271         }
10272
10273       substmt = c_parser_omp_structured_block (parser);
10274       substmt = build1 (OMP_SECTION, void_type_node, substmt);
10275       SET_EXPR_LOCATION (substmt, loc);
10276       add_stmt (substmt);
10277     }
10278   c_parser_skip_until_found (parser, CPP_CLOSE_BRACE,
10279                              "expected %<#pragma omp section%> or %<}%>");
10280
10281   substmt = pop_stmt_list (stmt);
10282
10283   stmt = make_node (OMP_SECTIONS);
10284   SET_EXPR_LOCATION (stmt, sections_loc);
10285   TREE_TYPE (stmt) = void_type_node;
10286   OMP_SECTIONS_BODY (stmt) = substmt;
10287
10288   return add_stmt (stmt);
10289 }
10290
10291 /* OpenMP 2.5:
10292    # pragma omp sections sections-clause[optseq] newline
10293      sections-scope
10294
10295    LOC is the location of the #pragma token.
10296 */
10297
10298 #define OMP_SECTIONS_CLAUSE_MASK                        \
10299         ( (1u << PRAGMA_OMP_CLAUSE_PRIVATE)             \
10300         | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)        \
10301         | (1u << PRAGMA_OMP_CLAUSE_LASTPRIVATE)         \
10302         | (1u << PRAGMA_OMP_CLAUSE_REDUCTION)           \
10303         | (1u << PRAGMA_OMP_CLAUSE_NOWAIT))
10304
10305 static tree
10306 c_parser_omp_sections (location_t loc, c_parser *parser)
10307 {
10308   tree block, clauses, ret;
10309
10310   clauses = c_parser_omp_all_clauses (parser, OMP_SECTIONS_CLAUSE_MASK,
10311                                       "#pragma omp sections");
10312
10313   block = c_begin_compound_stmt (true);
10314   ret = c_parser_omp_sections_scope (loc, parser);
10315   if (ret)
10316     OMP_SECTIONS_CLAUSES (ret) = clauses;
10317   block = c_end_compound_stmt (loc, block, true);
10318   add_stmt (block);
10319
10320   return ret;
10321 }
10322
10323 /* OpenMP 2.5:
10324    # pragma parallel parallel-clause new-line
10325    # pragma parallel for parallel-for-clause new-line
10326    # pragma parallel sections parallel-sections-clause new-line
10327
10328    LOC is the location of the #pragma token.
10329 */
10330
10331 #define OMP_PARALLEL_CLAUSE_MASK                        \
10332         ( (1u << PRAGMA_OMP_CLAUSE_IF)                  \
10333         | (1u << PRAGMA_OMP_CLAUSE_PRIVATE)             \
10334         | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)        \
10335         | (1u << PRAGMA_OMP_CLAUSE_DEFAULT)             \
10336         | (1u << PRAGMA_OMP_CLAUSE_SHARED)              \
10337         | (1u << PRAGMA_OMP_CLAUSE_COPYIN)              \
10338         | (1u << PRAGMA_OMP_CLAUSE_REDUCTION)           \
10339         | (1u << PRAGMA_OMP_CLAUSE_NUM_THREADS))
10340
10341 static tree
10342 c_parser_omp_parallel (location_t loc, c_parser *parser)
10343 {
10344   enum pragma_kind p_kind = PRAGMA_OMP_PARALLEL;
10345   const char *p_name = "#pragma omp parallel";
10346   tree stmt, clauses, par_clause, ws_clause, block;
10347   unsigned int mask = OMP_PARALLEL_CLAUSE_MASK;
10348
10349   if (c_parser_next_token_is_keyword (parser, RID_FOR))
10350     {
10351       c_parser_consume_token (parser);
10352       p_kind = PRAGMA_OMP_PARALLEL_FOR;
10353       p_name = "#pragma omp parallel for";
10354       mask |= OMP_FOR_CLAUSE_MASK;
10355       mask &= ~(1u << PRAGMA_OMP_CLAUSE_NOWAIT);
10356     }
10357   else if (c_parser_next_token_is (parser, CPP_NAME))
10358     {
10359       const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
10360       if (strcmp (p, "sections") == 0)
10361         {
10362           c_parser_consume_token (parser);
10363           p_kind = PRAGMA_OMP_PARALLEL_SECTIONS;
10364           p_name = "#pragma omp parallel sections";
10365           mask |= OMP_SECTIONS_CLAUSE_MASK;
10366           mask &= ~(1u << PRAGMA_OMP_CLAUSE_NOWAIT);
10367         }
10368     }
10369
10370   clauses = c_parser_omp_all_clauses (parser, mask, p_name);
10371
10372   switch (p_kind)
10373     {
10374     case PRAGMA_OMP_PARALLEL:
10375       block = c_begin_omp_parallel ();
10376       c_parser_statement (parser);
10377       stmt = c_finish_omp_parallel (loc, clauses, block);
10378       break;
10379
10380     case PRAGMA_OMP_PARALLEL_FOR:
10381       block = c_begin_omp_parallel ();
10382       c_split_parallel_clauses (loc, clauses, &par_clause, &ws_clause);
10383       c_parser_omp_for_loop (loc, parser, ws_clause, &par_clause);
10384       stmt = c_finish_omp_parallel (loc, par_clause, block);
10385       OMP_PARALLEL_COMBINED (stmt) = 1;
10386       break;
10387
10388     case PRAGMA_OMP_PARALLEL_SECTIONS:
10389       block = c_begin_omp_parallel ();
10390       c_split_parallel_clauses (loc, clauses, &par_clause, &ws_clause);
10391       stmt = c_parser_omp_sections_scope (loc, parser);
10392       if (stmt)
10393         OMP_SECTIONS_CLAUSES (stmt) = ws_clause;
10394       stmt = c_finish_omp_parallel (loc, par_clause, block);
10395       OMP_PARALLEL_COMBINED (stmt) = 1;
10396       break;
10397
10398     default:
10399       gcc_unreachable ();
10400     }
10401
10402   return stmt;
10403 }
10404
10405 /* OpenMP 2.5:
10406    # pragma omp single single-clause[optseq] new-line
10407      structured-block
10408
10409    LOC is the location of the #pragma.
10410 */
10411
10412 #define OMP_SINGLE_CLAUSE_MASK                          \
10413         ( (1u << PRAGMA_OMP_CLAUSE_PRIVATE)             \
10414         | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)        \
10415         | (1u << PRAGMA_OMP_CLAUSE_COPYPRIVATE)         \
10416         | (1u << PRAGMA_OMP_CLAUSE_NOWAIT))
10417
10418 static tree
10419 c_parser_omp_single (location_t loc, c_parser *parser)
10420 {
10421   tree stmt = make_node (OMP_SINGLE);
10422   SET_EXPR_LOCATION (stmt, loc);
10423   TREE_TYPE (stmt) = void_type_node;
10424
10425   OMP_SINGLE_CLAUSES (stmt)
10426     = c_parser_omp_all_clauses (parser, OMP_SINGLE_CLAUSE_MASK,
10427                                 "#pragma omp single");
10428   OMP_SINGLE_BODY (stmt) = c_parser_omp_structured_block (parser);
10429
10430   return add_stmt (stmt);
10431 }
10432
10433 /* OpenMP 3.0:
10434    # pragma omp task task-clause[optseq] new-line
10435
10436    LOC is the location of the #pragma.
10437 */
10438
10439 #define OMP_TASK_CLAUSE_MASK                            \
10440         ( (1u << PRAGMA_OMP_CLAUSE_IF)                  \
10441         | (1u << PRAGMA_OMP_CLAUSE_UNTIED)              \
10442         | (1u << PRAGMA_OMP_CLAUSE_DEFAULT)             \
10443         | (1u << PRAGMA_OMP_CLAUSE_PRIVATE)             \
10444         | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)        \
10445         | (1u << PRAGMA_OMP_CLAUSE_SHARED)              \
10446         | (1u << PRAGMA_OMP_CLAUSE_FINAL)               \
10447         | (1u << PRAGMA_OMP_CLAUSE_MERGEABLE))
10448
10449 static tree
10450 c_parser_omp_task (location_t loc, c_parser *parser)
10451 {
10452   tree clauses, block;
10453
10454   clauses = c_parser_omp_all_clauses (parser, OMP_TASK_CLAUSE_MASK,
10455                                       "#pragma omp task");
10456
10457   block = c_begin_omp_task ();
10458   c_parser_statement (parser);
10459   return c_finish_omp_task (loc, clauses, block);
10460 }
10461
10462 /* OpenMP 3.0:
10463    # pragma omp taskwait new-line
10464 */
10465
10466 static void
10467 c_parser_omp_taskwait (c_parser *parser)
10468 {
10469   location_t loc = c_parser_peek_token (parser)->location;
10470   c_parser_consume_pragma (parser);
10471   c_parser_skip_to_pragma_eol (parser);
10472
10473   c_finish_omp_taskwait (loc);
10474 }
10475
10476 /* OpenMP 3.1:
10477    # pragma omp taskyield new-line
10478 */
10479
10480 static void
10481 c_parser_omp_taskyield (c_parser *parser)
10482 {
10483   location_t loc = c_parser_peek_token (parser)->location;
10484   c_parser_consume_pragma (parser);
10485   c_parser_skip_to_pragma_eol (parser);
10486
10487   c_finish_omp_taskyield (loc);
10488 }
10489
10490 /* Main entry point to parsing most OpenMP pragmas.  */
10491
10492 static void
10493 c_parser_omp_construct (c_parser *parser)
10494 {
10495   enum pragma_kind p_kind;
10496   location_t loc;
10497   tree stmt;
10498
10499   loc = c_parser_peek_token (parser)->location;
10500   p_kind = c_parser_peek_token (parser)->pragma_kind;
10501   c_parser_consume_pragma (parser);
10502
10503   switch (p_kind)
10504     {
10505     case PRAGMA_OMP_ATOMIC:
10506       c_parser_omp_atomic (loc, parser);
10507       return;
10508     case PRAGMA_OMP_CRITICAL:
10509       stmt = c_parser_omp_critical (loc, parser);
10510       break;
10511     case PRAGMA_OMP_FOR:
10512       stmt = c_parser_omp_for (loc, parser);
10513       break;
10514     case PRAGMA_OMP_MASTER:
10515       stmt = c_parser_omp_master (loc, parser);
10516       break;
10517     case PRAGMA_OMP_ORDERED:
10518       stmt = c_parser_omp_ordered (loc, parser);
10519       break;
10520     case PRAGMA_OMP_PARALLEL:
10521       stmt = c_parser_omp_parallel (loc, parser);
10522       break;
10523     case PRAGMA_OMP_SECTIONS:
10524       stmt = c_parser_omp_sections (loc, parser);
10525       break;
10526     case PRAGMA_OMP_SINGLE:
10527       stmt = c_parser_omp_single (loc, parser);
10528       break;
10529     case PRAGMA_OMP_TASK:
10530       stmt = c_parser_omp_task (loc, parser);
10531       break;
10532     default:
10533       gcc_unreachable ();
10534     }
10535
10536   if (stmt)
10537     gcc_assert (EXPR_LOCATION (stmt) != UNKNOWN_LOCATION);
10538 }
10539
10540
10541 /* OpenMP 2.5:
10542    # pragma omp threadprivate (variable-list) */
10543
10544 static void
10545 c_parser_omp_threadprivate (c_parser *parser)
10546 {
10547   tree vars, t;
10548   location_t loc;
10549
10550   c_parser_consume_pragma (parser);
10551   loc = c_parser_peek_token (parser)->location;
10552   vars = c_parser_omp_var_list_parens (parser, OMP_CLAUSE_ERROR, NULL);
10553
10554   /* Mark every variable in VARS to be assigned thread local storage.  */
10555   for (t = vars; t; t = TREE_CHAIN (t))
10556     {
10557       tree v = TREE_PURPOSE (t);
10558
10559       /* FIXME diagnostics: Ideally we should keep individual
10560          locations for all the variables in the var list to make the
10561          following errors more precise.  Perhaps
10562          c_parser_omp_var_list_parens() should construct a list of
10563          locations to go along with the var list.  */
10564
10565       /* If V had already been marked threadprivate, it doesn't matter
10566          whether it had been used prior to this point.  */
10567       if (TREE_CODE (v) != VAR_DECL)
10568         error_at (loc, "%qD is not a variable", v);
10569       else if (TREE_USED (v) && !C_DECL_THREADPRIVATE_P (v))
10570         error_at (loc, "%qE declared %<threadprivate%> after first use", v);
10571       else if (! TREE_STATIC (v) && ! DECL_EXTERNAL (v))
10572         error_at (loc, "automatic variable %qE cannot be %<threadprivate%>", v);
10573       else if (TREE_TYPE (v) == error_mark_node)
10574         ;
10575       else if (! COMPLETE_TYPE_P (TREE_TYPE (v)))
10576         error_at (loc, "%<threadprivate%> %qE has incomplete type", v);
10577       else
10578         {
10579           if (! DECL_THREAD_LOCAL_P (v))
10580             {
10581               DECL_TLS_MODEL (v) = decl_default_tls_model (v);
10582               /* If rtl has been already set for this var, call
10583                  make_decl_rtl once again, so that encode_section_info
10584                  has a chance to look at the new decl flags.  */
10585               if (DECL_RTL_SET_P (v))
10586                 make_decl_rtl (v);
10587             }
10588           C_DECL_THREADPRIVATE_P (v) = 1;
10589         }
10590     }
10591
10592   c_parser_skip_to_pragma_eol (parser);
10593 }
10594
10595 /* Parse a transaction attribute (GCC Extension).
10596
10597    transaction-attribute:
10598      attributes
10599      [ [ any-word ] ]
10600
10601    The transactional memory language description is written for C++,
10602    and uses the C++0x attribute syntax.  For compatibility, allow the
10603    bracket style for transactions in C as well.  */
10604
10605 static tree
10606 c_parser_transaction_attributes (c_parser *parser)
10607 {
10608   tree attr_name, attr = NULL;
10609
10610   if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
10611     return c_parser_attributes (parser);
10612
10613   if (!c_parser_next_token_is (parser, CPP_OPEN_SQUARE))
10614     return NULL_TREE;
10615   c_parser_consume_token (parser);
10616   if (!c_parser_require (parser, CPP_OPEN_SQUARE, "expected %<[%>"))
10617     goto error1;
10618
10619   attr_name = c_parser_attribute_any_word (parser);
10620   if (attr_name)
10621     {
10622       c_parser_consume_token (parser);
10623       attr = build_tree_list (attr_name, NULL_TREE);
10624     }
10625   else
10626     c_parser_error (parser, "expected identifier");
10627
10628   c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, "expected %<]%>");
10629  error1:
10630   c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, "expected %<]%>");
10631   return attr;
10632 }
10633
10634 /* Parse a __transaction_atomic or __transaction_relaxed statement
10635    (GCC Extension).
10636
10637    transaction-statement:
10638      __transaction_atomic transaction-attribute[opt] compound-statement
10639      __transaction_relaxed compound-statement
10640
10641    Note that the only valid attribute is: "outer".
10642 */
10643
10644 static tree
10645 c_parser_transaction (c_parser *parser, enum rid keyword)
10646 {
10647   unsigned int old_in = parser->in_transaction;
10648   unsigned int this_in = 1, new_in;
10649   location_t loc = c_parser_peek_token (parser)->location;
10650   tree stmt, attrs;
10651
10652   gcc_assert ((keyword == RID_TRANSACTION_ATOMIC
10653       || keyword == RID_TRANSACTION_RELAXED)
10654       && c_parser_next_token_is_keyword (parser, keyword));
10655   c_parser_consume_token (parser);
10656
10657   if (keyword == RID_TRANSACTION_RELAXED)
10658     this_in |= TM_STMT_ATTR_RELAXED;
10659   else
10660     {
10661       attrs = c_parser_transaction_attributes (parser);
10662       if (attrs)
10663         this_in |= parse_tm_stmt_attr (attrs, TM_STMT_ATTR_OUTER);
10664     }
10665
10666   /* Keep track if we're in the lexical scope of an outer transaction.  */
10667   new_in = this_in | (old_in & TM_STMT_ATTR_OUTER);
10668
10669   parser->in_transaction = new_in;
10670   stmt = c_parser_compound_statement (parser);
10671   parser->in_transaction = old_in;
10672
10673   if (flag_tm)
10674     stmt = c_finish_transaction (loc, stmt, this_in);
10675   else
10676     error_at (loc, (keyword == RID_TRANSACTION_ATOMIC ?
10677         "%<__transaction_atomic%> without transactional memory support enabled"
10678         : "%<__transaction_relaxed %> "
10679         "without transactional memory support enabled"));
10680
10681   return stmt;
10682 }
10683
10684 /* Parse a __transaction_atomic or __transaction_relaxed expression
10685    (GCC Extension).
10686
10687    transaction-expression:
10688      __transaction_atomic ( expression )
10689      __transaction_relaxed ( expression )
10690 */
10691
10692 static struct c_expr
10693 c_parser_transaction_expression (c_parser *parser, enum rid keyword)
10694 {
10695   struct c_expr ret;
10696   unsigned int old_in = parser->in_transaction;
10697   unsigned int this_in = 1;
10698   location_t loc = c_parser_peek_token (parser)->location;
10699   tree attrs;
10700
10701   gcc_assert ((keyword == RID_TRANSACTION_ATOMIC
10702       || keyword == RID_TRANSACTION_RELAXED)
10703       && c_parser_next_token_is_keyword (parser, keyword));
10704   c_parser_consume_token (parser);
10705
10706   if (keyword == RID_TRANSACTION_RELAXED)
10707     this_in |= TM_STMT_ATTR_RELAXED;
10708   else
10709     {
10710       attrs = c_parser_transaction_attributes (parser);
10711       if (attrs)
10712         this_in |= parse_tm_stmt_attr (attrs, 0);
10713     }
10714
10715   parser->in_transaction = this_in;
10716   if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
10717     {
10718       tree expr = c_parser_expression (parser).value;
10719       ret.original_type = TREE_TYPE (expr);
10720       ret.value = build1 (TRANSACTION_EXPR, ret.original_type, expr);
10721       if (this_in & TM_STMT_ATTR_RELAXED)
10722         TRANSACTION_EXPR_RELAXED (ret.value) = 1;
10723       SET_EXPR_LOCATION (ret.value, loc);
10724       ret.original_code = TRANSACTION_EXPR;
10725       if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
10726         {
10727           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
10728           goto error;
10729         }
10730     }
10731   else
10732     {
10733      error:
10734       ret.value = error_mark_node;
10735       ret.original_code = ERROR_MARK;
10736       ret.original_type = NULL;
10737     }
10738   parser->in_transaction = old_in;
10739
10740   if (!flag_tm)
10741     error_at (loc, (keyword == RID_TRANSACTION_ATOMIC ?
10742         "%<__transaction_atomic%> without transactional memory support enabled"
10743         : "%<__transaction_relaxed %> "
10744         "without transactional memory support enabled"));
10745
10746   return ret;
10747 }
10748
10749 /* Parse a __transaction_cancel statement (GCC Extension).
10750
10751    transaction-cancel-statement:
10752      __transaction_cancel transaction-attribute[opt] ;
10753
10754    Note that the only valid attribute is "outer".
10755 */
10756
10757 static tree
10758 c_parser_transaction_cancel(c_parser *parser)
10759 {
10760   location_t loc = c_parser_peek_token (parser)->location;
10761   tree attrs;
10762   bool is_outer = false;
10763
10764   gcc_assert (c_parser_next_token_is_keyword (parser, RID_TRANSACTION_CANCEL));
10765   c_parser_consume_token (parser);
10766
10767   attrs = c_parser_transaction_attributes (parser);
10768   if (attrs)
10769     is_outer = (parse_tm_stmt_attr (attrs, TM_STMT_ATTR_OUTER) != 0);
10770
10771   if (!flag_tm)
10772     {
10773       error_at (loc, "%<__transaction_cancel%> without "
10774                 "transactional memory support enabled");
10775       goto ret_error;
10776     }
10777   else if (parser->in_transaction & TM_STMT_ATTR_RELAXED)
10778     {
10779       error_at (loc, "%<__transaction_cancel%> within a "
10780                 "%<__transaction_relaxed%>");
10781       goto ret_error;
10782     }
10783   else if (is_outer)
10784     {
10785       if ((parser->in_transaction & TM_STMT_ATTR_OUTER) == 0
10786           && !is_tm_may_cancel_outer (current_function_decl))
10787         {
10788           error_at (loc, "outer %<__transaction_cancel%> not "
10789                     "within outer %<__transaction_atomic%>");
10790           error_at (loc, "  or a %<transaction_may_cancel_outer%> function");
10791           goto ret_error;
10792         }
10793     }
10794   else if (parser->in_transaction == 0)
10795     {
10796       error_at (loc, "%<__transaction_cancel%> not within "
10797                 "%<__transaction_atomic%>");
10798       goto ret_error;
10799     }
10800
10801   return add_stmt (build_tm_abort_call (loc, is_outer));
10802
10803  ret_error:
10804   return build1 (NOP_EXPR, void_type_node, error_mark_node);
10805 }
10806 \f
10807 /* Parse a single source file.  */
10808
10809 void
10810 c_parse_file (void)
10811 {
10812   /* Use local storage to begin.  If the first token is a pragma, parse it.
10813      If it is #pragma GCC pch_preprocess, then this will load a PCH file
10814      which will cause garbage collection.  */
10815   c_parser tparser;
10816
10817   memset (&tparser, 0, sizeof tparser);
10818   the_parser = &tparser;
10819
10820   if (c_parser_peek_token (&tparser)->pragma_kind == PRAGMA_GCC_PCH_PREPROCESS)
10821     c_parser_pragma_pch_preprocess (&tparser);
10822
10823   the_parser = ggc_alloc_c_parser ();
10824   *the_parser = tparser;
10825
10826   /* Initialize EH, if we've been told to do so.  */
10827   if (flag_exceptions)
10828     using_eh_for_cleanups ();
10829
10830   c_parser_translation_unit (the_parser);
10831   the_parser = NULL;
10832 }
10833
10834 #include "gt-c-parser.h"