OSDN Git Service

* dwarf2out.c (gen_compile_unit_die): Use DW_LANG_Go for Go.
[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    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
6651             c_parser_consume_token (parser);
6652             if (!c_parser_get_builtin_args (parser,
6653                                             "__builtin_shuffle",
6654                                             &cexpr_list))
6655               {
6656                 expr.value = error_mark_node;
6657                 break;
6658               }
6659
6660             if (VEC_length (c_expr_t, cexpr_list) == 2)
6661               expr.value =
6662                 c_build_vec_perm_expr
6663                   (loc, VEC_index (c_expr_t, cexpr_list, 0)->value,
6664                    NULL_TREE, VEC_index (c_expr_t, cexpr_list, 1)->value);
6665
6666             else if (VEC_length (c_expr_t, cexpr_list) == 3)
6667               expr.value =
6668                 c_build_vec_perm_expr
6669                   (loc, VEC_index (c_expr_t, cexpr_list, 0)->value,
6670                    VEC_index (c_expr_t, cexpr_list, 1)->value,
6671                    VEC_index (c_expr_t, cexpr_list, 2)->value);
6672             else
6673               {
6674                 error_at (loc, "wrong number of arguments to "
6675                                "%<__builtin_shuffle%>");
6676                 expr.value = error_mark_node;
6677               }
6678             break;
6679           }
6680         case RID_AT_SELECTOR:
6681           gcc_assert (c_dialect_objc ());
6682           c_parser_consume_token (parser);
6683           if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
6684             {
6685               expr.value = error_mark_node;
6686               break;
6687             }
6688           {
6689             tree sel = c_parser_objc_selector_arg (parser);
6690             c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
6691                                        "expected %<)%>");
6692             expr.value = objc_build_selector_expr (loc, sel);
6693           }
6694           break;
6695         case RID_AT_PROTOCOL:
6696           gcc_assert (c_dialect_objc ());
6697           c_parser_consume_token (parser);
6698           if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
6699             {
6700               expr.value = error_mark_node;
6701               break;
6702             }
6703           if (c_parser_next_token_is_not (parser, CPP_NAME))
6704             {
6705               c_parser_error (parser, "expected identifier");
6706               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
6707               expr.value = error_mark_node;
6708               break;
6709             }
6710           {
6711             tree id = c_parser_peek_token (parser)->value;
6712             c_parser_consume_token (parser);
6713             c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
6714                                        "expected %<)%>");
6715             expr.value = objc_build_protocol_expr (id);
6716           }
6717           break;
6718         case RID_AT_ENCODE:
6719           /* Extension to support C-structures in the archiver.  */
6720           gcc_assert (c_dialect_objc ());
6721           c_parser_consume_token (parser);
6722           if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
6723             {
6724               expr.value = error_mark_node;
6725               break;
6726             }
6727           t1 = c_parser_type_name (parser);
6728           if (t1 == NULL)
6729             {
6730               expr.value = error_mark_node;
6731               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
6732               break;
6733             }
6734           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
6735                                      "expected %<)%>");
6736           {
6737             tree type = groktypename (t1, NULL, NULL);
6738             expr.value = objc_build_encode_expr (type);
6739           }
6740           break;
6741         default:
6742           c_parser_error (parser, "expected expression");
6743           expr.value = error_mark_node;
6744           break;
6745         }
6746       break;
6747     case CPP_OPEN_SQUARE:
6748       if (c_dialect_objc ())
6749         {
6750           tree receiver, args;
6751           c_parser_consume_token (parser);
6752           receiver = c_parser_objc_receiver (parser);
6753           args = c_parser_objc_message_args (parser);
6754           c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
6755                                      "expected %<]%>");
6756           expr.value = objc_build_message_expr (receiver, args);
6757           break;
6758         }
6759       /* Else fall through to report error.  */
6760     default:
6761       c_parser_error (parser, "expected expression");
6762       expr.value = error_mark_node;
6763       break;
6764     }
6765   return c_parser_postfix_expression_after_primary (parser, loc, expr);
6766 }
6767
6768 /* Parse a postfix expression after a parenthesized type name: the
6769    brace-enclosed initializer of a compound literal, possibly followed
6770    by some postfix operators.  This is separate because it is not
6771    possible to tell until after the type name whether a cast
6772    expression has a cast or a compound literal, or whether the operand
6773    of sizeof is a parenthesized type name or starts with a compound
6774    literal.  TYPE_LOC is the location where TYPE_NAME starts--the
6775    location of the first token after the parentheses around the type
6776    name.  */
6777
6778 static struct c_expr
6779 c_parser_postfix_expression_after_paren_type (c_parser *parser,
6780                                               struct c_type_name *type_name,
6781                                               location_t type_loc)
6782 {
6783   tree type;
6784   struct c_expr init;
6785   bool non_const;
6786   struct c_expr expr;
6787   location_t start_loc;
6788   tree type_expr = NULL_TREE;
6789   bool type_expr_const = true;
6790   check_compound_literal_type (type_loc, type_name);
6791   start_init (NULL_TREE, NULL, 0);
6792   type = groktypename (type_name, &type_expr, &type_expr_const);
6793   start_loc = c_parser_peek_token (parser)->location;
6794   if (type != error_mark_node && C_TYPE_VARIABLE_SIZE (type))
6795     {
6796       error_at (type_loc, "compound literal has variable size");
6797       type = error_mark_node;
6798     }
6799   init = c_parser_braced_init (parser, type, false);
6800   finish_init ();
6801   maybe_warn_string_init (type, init);
6802
6803   if (type != error_mark_node
6804       && !ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (type))
6805       && current_function_decl)
6806     {
6807       error ("compound literal qualified by address-space qualifier");
6808       type = error_mark_node;
6809     }
6810
6811   if (!flag_isoc99)
6812     pedwarn (start_loc, OPT_pedantic, "ISO C90 forbids compound literals");
6813   non_const = ((init.value && TREE_CODE (init.value) == CONSTRUCTOR)
6814                ? CONSTRUCTOR_NON_CONST (init.value)
6815                : init.original_code == C_MAYBE_CONST_EXPR);
6816   non_const |= !type_expr_const;
6817   expr.value = build_compound_literal (start_loc, type, init.value, non_const);
6818   expr.original_code = ERROR_MARK;
6819   expr.original_type = NULL;
6820   if (type_expr)
6821     {
6822       if (TREE_CODE (expr.value) == C_MAYBE_CONST_EXPR)
6823         {
6824           gcc_assert (C_MAYBE_CONST_EXPR_PRE (expr.value) == NULL_TREE);
6825           C_MAYBE_CONST_EXPR_PRE (expr.value) = type_expr;
6826         }
6827       else
6828         {
6829           gcc_assert (!non_const);
6830           expr.value = build2 (C_MAYBE_CONST_EXPR, type,
6831                                type_expr, expr.value);
6832         }
6833     }
6834   return c_parser_postfix_expression_after_primary (parser, start_loc, expr);
6835 }
6836
6837 /* Parse a postfix expression after the initial primary or compound
6838    literal; that is, parse a series of postfix operators.
6839
6840    EXPR_LOC is the location of the primary expression.  */
6841
6842 static struct c_expr
6843 c_parser_postfix_expression_after_primary (c_parser *parser,
6844                                            location_t expr_loc,
6845                                            struct c_expr expr)
6846 {
6847   struct c_expr orig_expr;
6848   tree ident, idx;
6849   VEC(tree,gc) *exprlist;
6850   VEC(tree,gc) *origtypes;
6851   while (true)
6852     {
6853       location_t op_loc = c_parser_peek_token (parser)->location;
6854       switch (c_parser_peek_token (parser)->type)
6855         {
6856         case CPP_OPEN_SQUARE:
6857           /* Array reference.  */
6858           c_parser_consume_token (parser);
6859           idx = c_parser_expression (parser).value;
6860           c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
6861                                      "expected %<]%>");
6862           expr.value = build_array_ref (op_loc, expr.value, idx);
6863           expr.original_code = ERROR_MARK;
6864           expr.original_type = NULL;
6865           break;
6866         case CPP_OPEN_PAREN:
6867           /* Function call.  */
6868           c_parser_consume_token (parser);
6869           if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
6870             exprlist = NULL;
6871           else
6872             exprlist = c_parser_expr_list (parser, true, false, &origtypes);
6873           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
6874                                      "expected %<)%>");
6875           orig_expr = expr;
6876           mark_exp_read (expr.value);
6877           /* FIXME diagnostics: Ideally we want the FUNCNAME, not the
6878              "(" after the FUNCNAME, which is what we have now.    */
6879           expr.value = build_function_call_vec (op_loc, expr.value, exprlist,
6880                                                 origtypes);
6881           expr.original_code = ERROR_MARK;
6882           if (TREE_CODE (expr.value) == INTEGER_CST
6883               && TREE_CODE (orig_expr.value) == FUNCTION_DECL
6884               && DECL_BUILT_IN_CLASS (orig_expr.value) == BUILT_IN_NORMAL
6885               && DECL_FUNCTION_CODE (orig_expr.value) == BUILT_IN_CONSTANT_P)
6886             expr.original_code = C_MAYBE_CONST_EXPR;
6887           expr.original_type = NULL;
6888           if (exprlist != NULL)
6889             {
6890               release_tree_vector (exprlist);
6891               release_tree_vector (origtypes);
6892             }
6893           break;
6894         case CPP_DOT:
6895           /* Structure element reference.  */
6896           c_parser_consume_token (parser);
6897           expr = default_function_array_conversion (expr_loc, expr);
6898           if (c_parser_next_token_is (parser, CPP_NAME))
6899             ident = c_parser_peek_token (parser)->value;
6900           else
6901             {
6902               c_parser_error (parser, "expected identifier");
6903               expr.value = error_mark_node;
6904               expr.original_code = ERROR_MARK;
6905               expr.original_type = NULL;
6906               return expr;
6907             }
6908           c_parser_consume_token (parser);
6909           expr.value = build_component_ref (op_loc, expr.value, ident);
6910           expr.original_code = ERROR_MARK;
6911           if (TREE_CODE (expr.value) != COMPONENT_REF)
6912             expr.original_type = NULL;
6913           else
6914             {
6915               /* Remember the original type of a bitfield.  */
6916               tree field = TREE_OPERAND (expr.value, 1);
6917               if (TREE_CODE (field) != FIELD_DECL)
6918                 expr.original_type = NULL;
6919               else
6920                 expr.original_type = DECL_BIT_FIELD_TYPE (field);
6921             }
6922           break;
6923         case CPP_DEREF:
6924           /* Structure element reference.  */
6925           c_parser_consume_token (parser);
6926           expr = default_function_array_conversion (expr_loc, expr);
6927           if (c_parser_next_token_is (parser, CPP_NAME))
6928             ident = c_parser_peek_token (parser)->value;
6929           else
6930             {
6931               c_parser_error (parser, "expected identifier");
6932               expr.value = error_mark_node;
6933               expr.original_code = ERROR_MARK;
6934               expr.original_type = NULL;
6935               return expr;
6936             }
6937           c_parser_consume_token (parser);
6938           expr.value = build_component_ref (op_loc,
6939                                             build_indirect_ref (op_loc,
6940                                                                 expr.value,
6941                                                                 RO_ARROW),
6942                                             ident);
6943           expr.original_code = ERROR_MARK;
6944           if (TREE_CODE (expr.value) != COMPONENT_REF)
6945             expr.original_type = NULL;
6946           else
6947             {
6948               /* Remember the original type of a bitfield.  */
6949               tree field = TREE_OPERAND (expr.value, 1);
6950               if (TREE_CODE (field) != FIELD_DECL)
6951                 expr.original_type = NULL;
6952               else
6953                 expr.original_type = DECL_BIT_FIELD_TYPE (field);
6954             }
6955           break;
6956         case CPP_PLUS_PLUS:
6957           /* Postincrement.  */
6958           c_parser_consume_token (parser);
6959           expr = default_function_array_read_conversion (expr_loc, expr);
6960           expr.value = build_unary_op (op_loc,
6961                                        POSTINCREMENT_EXPR, expr.value, 0);
6962           expr.original_code = ERROR_MARK;
6963           expr.original_type = NULL;
6964           break;
6965         case CPP_MINUS_MINUS:
6966           /* Postdecrement.  */
6967           c_parser_consume_token (parser);
6968           expr = default_function_array_read_conversion (expr_loc, expr);
6969           expr.value = build_unary_op (op_loc,
6970                                        POSTDECREMENT_EXPR, expr.value, 0);
6971           expr.original_code = ERROR_MARK;
6972           expr.original_type = NULL;
6973           break;
6974         default:
6975           return expr;
6976         }
6977     }
6978 }
6979
6980 /* Parse an expression (C90 6.3.17, C99 6.5.17).
6981
6982    expression:
6983      assignment-expression
6984      expression , assignment-expression
6985 */
6986
6987 static struct c_expr
6988 c_parser_expression (c_parser *parser)
6989 {
6990   struct c_expr expr;
6991   expr = c_parser_expr_no_commas (parser, NULL);
6992   while (c_parser_next_token_is (parser, CPP_COMMA))
6993     {
6994       struct c_expr next;
6995       tree lhsval;
6996       location_t loc = c_parser_peek_token (parser)->location;
6997       location_t expr_loc;
6998       c_parser_consume_token (parser);
6999       expr_loc = c_parser_peek_token (parser)->location;
7000       lhsval = expr.value;
7001       while (TREE_CODE (lhsval) == COMPOUND_EXPR)
7002         lhsval = TREE_OPERAND (lhsval, 1);
7003       if (DECL_P (lhsval) || handled_component_p (lhsval))
7004         mark_exp_read (lhsval);
7005       next = c_parser_expr_no_commas (parser, NULL);
7006       next = default_function_array_conversion (expr_loc, next);
7007       expr.value = build_compound_expr (loc, expr.value, next.value);
7008       expr.original_code = COMPOUND_EXPR;
7009       expr.original_type = next.original_type;
7010     }
7011   return expr;
7012 }
7013
7014 /* Parse an expression and convert functions or arrays to
7015    pointers.  */
7016
7017 static struct c_expr
7018 c_parser_expression_conv (c_parser *parser)
7019 {
7020   struct c_expr expr;
7021   location_t loc = c_parser_peek_token (parser)->location;
7022   expr = c_parser_expression (parser);
7023   expr = default_function_array_conversion (loc, expr);
7024   return expr;
7025 }
7026
7027 /* Parse a non-empty list of expressions.  If CONVERT_P, convert
7028    functions and arrays to pointers.  If FOLD_P, fold the expressions.
7029
7030    nonempty-expr-list:
7031      assignment-expression
7032      nonempty-expr-list , assignment-expression
7033 */
7034
7035 static VEC(tree,gc) *
7036 c_parser_expr_list (c_parser *parser, bool convert_p, bool fold_p,
7037                     VEC(tree,gc) **p_orig_types)
7038 {
7039   VEC(tree,gc) *ret;
7040   VEC(tree,gc) *orig_types;
7041   struct c_expr expr;
7042   location_t loc = c_parser_peek_token (parser)->location;
7043
7044   ret = make_tree_vector ();
7045   if (p_orig_types == NULL)
7046     orig_types = NULL;
7047   else
7048     orig_types = make_tree_vector ();
7049
7050   expr = c_parser_expr_no_commas (parser, NULL);
7051   if (convert_p)
7052     expr = default_function_array_read_conversion (loc, expr);
7053   if (fold_p)
7054     expr.value = c_fully_fold (expr.value, false, NULL);
7055   VEC_quick_push (tree, ret, expr.value);
7056   if (orig_types != NULL)
7057     VEC_quick_push (tree, orig_types, expr.original_type);
7058   while (c_parser_next_token_is (parser, CPP_COMMA))
7059     {
7060       c_parser_consume_token (parser);
7061       loc = c_parser_peek_token (parser)->location;
7062       expr = c_parser_expr_no_commas (parser, NULL);
7063       if (convert_p)
7064         expr = default_function_array_read_conversion (loc, expr);
7065       if (fold_p)
7066         expr.value = c_fully_fold (expr.value, false, NULL);
7067       VEC_safe_push (tree, gc, ret, expr.value);
7068       if (orig_types != NULL)
7069         VEC_safe_push (tree, gc, orig_types, expr.original_type);
7070     }
7071   if (orig_types != NULL)
7072     *p_orig_types = orig_types;
7073   return ret;
7074 }
7075 \f
7076 /* Parse Objective-C-specific constructs.  */
7077
7078 /* Parse an objc-class-definition.
7079
7080    objc-class-definition:
7081      @interface identifier objc-superclass[opt] objc-protocol-refs[opt]
7082        objc-class-instance-variables[opt] objc-methodprotolist @end
7083      @implementation identifier objc-superclass[opt]
7084        objc-class-instance-variables[opt]
7085      @interface identifier ( identifier ) objc-protocol-refs[opt]
7086        objc-methodprotolist @end
7087      @interface identifier ( ) objc-protocol-refs[opt]
7088        objc-methodprotolist @end
7089      @implementation identifier ( identifier )
7090
7091    objc-superclass:
7092      : identifier
7093
7094    "@interface identifier (" must start "@interface identifier (
7095    identifier ) ...": objc-methodprotolist in the first production may
7096    not start with a parenthesized identifier as a declarator of a data
7097    definition with no declaration specifiers if the objc-superclass,
7098    objc-protocol-refs and objc-class-instance-variables are omitted.  */
7099
7100 static void
7101 c_parser_objc_class_definition (c_parser *parser, tree attributes)
7102 {
7103   bool iface_p;
7104   tree id1;
7105   tree superclass;
7106   if (c_parser_next_token_is_keyword (parser, RID_AT_INTERFACE))
7107     iface_p = true;
7108   else if (c_parser_next_token_is_keyword (parser, RID_AT_IMPLEMENTATION))
7109     iface_p = false;
7110   else
7111     gcc_unreachable ();
7112
7113   c_parser_consume_token (parser);
7114   if (c_parser_next_token_is_not (parser, CPP_NAME))
7115     {
7116       c_parser_error (parser, "expected identifier");
7117       return;
7118     }
7119   id1 = c_parser_peek_token (parser)->value;
7120   c_parser_consume_token (parser);
7121   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
7122     {
7123       /* We have a category or class extension.  */
7124       tree id2;
7125       tree proto = NULL_TREE;
7126       c_parser_consume_token (parser);
7127       if (c_parser_next_token_is_not (parser, CPP_NAME))
7128         {
7129           if (iface_p && c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
7130             {
7131               /* We have a class extension.  */
7132               id2 = NULL_TREE;
7133             }
7134           else
7135             {
7136               c_parser_error (parser, "expected identifier or %<)%>");
7137               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
7138               return;
7139             }
7140         }
7141       else
7142         {
7143           id2 = c_parser_peek_token (parser)->value;
7144           c_parser_consume_token (parser);
7145         }
7146       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
7147       if (!iface_p)
7148         {
7149           objc_start_category_implementation (id1, id2);
7150           return;
7151         }
7152       if (c_parser_next_token_is (parser, CPP_LESS))
7153         proto = c_parser_objc_protocol_refs (parser);
7154       objc_start_category_interface (id1, id2, proto, attributes);
7155       c_parser_objc_methodprotolist (parser);
7156       c_parser_require_keyword (parser, RID_AT_END, "expected %<@end%>");
7157       objc_finish_interface ();
7158       return;
7159     }
7160   if (c_parser_next_token_is (parser, CPP_COLON))
7161     {
7162       c_parser_consume_token (parser);
7163       if (c_parser_next_token_is_not (parser, CPP_NAME))
7164         {
7165           c_parser_error (parser, "expected identifier");
7166           return;
7167         }
7168       superclass = c_parser_peek_token (parser)->value;
7169       c_parser_consume_token (parser);
7170     }
7171   else
7172     superclass = NULL_TREE;
7173   if (iface_p)
7174     {
7175       tree proto = NULL_TREE;
7176       if (c_parser_next_token_is (parser, CPP_LESS))
7177         proto = c_parser_objc_protocol_refs (parser);
7178       objc_start_class_interface (id1, superclass, proto, attributes);
7179     }
7180   else
7181     objc_start_class_implementation (id1, superclass);
7182   if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
7183     c_parser_objc_class_instance_variables (parser);
7184   if (iface_p)
7185     {
7186       objc_continue_interface ();
7187       c_parser_objc_methodprotolist (parser);
7188       c_parser_require_keyword (parser, RID_AT_END, "expected %<@end%>");
7189       objc_finish_interface ();
7190     }
7191   else
7192     {
7193       objc_continue_implementation ();
7194       return;
7195     }
7196 }
7197
7198 /* Parse objc-class-instance-variables.
7199
7200    objc-class-instance-variables:
7201      { objc-instance-variable-decl-list[opt] }
7202
7203    objc-instance-variable-decl-list:
7204      objc-visibility-spec
7205      objc-instance-variable-decl ;
7206      ;
7207      objc-instance-variable-decl-list objc-visibility-spec
7208      objc-instance-variable-decl-list objc-instance-variable-decl ;
7209      objc-instance-variable-decl-list ;
7210
7211    objc-visibility-spec:
7212      @private
7213      @protected
7214      @public
7215
7216    objc-instance-variable-decl:
7217      struct-declaration
7218 */
7219
7220 static void
7221 c_parser_objc_class_instance_variables (c_parser *parser)
7222 {
7223   gcc_assert (c_parser_next_token_is (parser, CPP_OPEN_BRACE));
7224   c_parser_consume_token (parser);
7225   while (c_parser_next_token_is_not (parser, CPP_EOF))
7226     {
7227       tree decls;
7228       /* Parse any stray semicolon.  */
7229       if (c_parser_next_token_is (parser, CPP_SEMICOLON))
7230         {
7231           pedwarn (c_parser_peek_token (parser)->location, OPT_pedantic,
7232                    "extra semicolon");
7233           c_parser_consume_token (parser);
7234           continue;
7235         }
7236       /* Stop if at the end of the instance variables.  */
7237       if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
7238         {
7239           c_parser_consume_token (parser);
7240           break;
7241         }
7242       /* Parse any objc-visibility-spec.  */
7243       if (c_parser_next_token_is_keyword (parser, RID_AT_PRIVATE))
7244         {
7245           c_parser_consume_token (parser);
7246           objc_set_visibility (OBJC_IVAR_VIS_PRIVATE);
7247           continue;
7248         }
7249       else if (c_parser_next_token_is_keyword (parser, RID_AT_PROTECTED))
7250         {
7251           c_parser_consume_token (parser);
7252           objc_set_visibility (OBJC_IVAR_VIS_PROTECTED);
7253           continue;
7254         }
7255       else if (c_parser_next_token_is_keyword (parser, RID_AT_PUBLIC))
7256         {
7257           c_parser_consume_token (parser);
7258           objc_set_visibility (OBJC_IVAR_VIS_PUBLIC);
7259           continue;
7260         }
7261       else if (c_parser_next_token_is_keyword (parser, RID_AT_PACKAGE))
7262         {
7263           c_parser_consume_token (parser);
7264           objc_set_visibility (OBJC_IVAR_VIS_PACKAGE);
7265           continue;
7266         }
7267       else if (c_parser_next_token_is (parser, CPP_PRAGMA))
7268         {
7269           c_parser_pragma (parser, pragma_external);
7270           continue;
7271         }
7272
7273       /* Parse some comma-separated declarations.  */
7274       decls = c_parser_struct_declaration (parser);
7275       if (decls == NULL)
7276         {
7277           /* There is a syntax error.  We want to skip the offending
7278              tokens up to the next ';' (included) or '}'
7279              (excluded).  */
7280           
7281           /* First, skip manually a ')' or ']'.  This is because they
7282              reduce the nesting level, so c_parser_skip_until_found()
7283              wouldn't be able to skip past them.  */
7284           c_token *token = c_parser_peek_token (parser);
7285           if (token->type == CPP_CLOSE_PAREN || token->type == CPP_CLOSE_SQUARE)
7286             c_parser_consume_token (parser);
7287
7288           /* Then, do the standard skipping.  */
7289           c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
7290
7291           /* We hopefully recovered.  Start normal parsing again.  */
7292           parser->error = false;
7293           continue;
7294         }
7295       else
7296         {
7297           /* Comma-separated instance variables are chained together
7298              in reverse order; add them one by one.  */
7299           tree ivar = nreverse (decls);
7300           for (; ivar; ivar = DECL_CHAIN (ivar))
7301             objc_add_instance_variable (copy_node (ivar));
7302         }
7303       c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
7304     }
7305 }
7306
7307 /* Parse an objc-class-declaration.
7308
7309    objc-class-declaration:
7310      @class identifier-list ;
7311 */
7312
7313 static void
7314 c_parser_objc_class_declaration (c_parser *parser)
7315 {
7316   gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_CLASS));
7317   c_parser_consume_token (parser);
7318   /* Any identifiers, including those declared as type names, are OK
7319      here.  */
7320   while (true)
7321     {
7322       tree id;
7323       if (c_parser_next_token_is_not (parser, CPP_NAME))
7324         {
7325           c_parser_error (parser, "expected identifier");
7326           c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
7327           parser->error = false;
7328           return;
7329         }
7330       id = c_parser_peek_token (parser)->value;
7331       objc_declare_class (id);
7332       c_parser_consume_token (parser);
7333       if (c_parser_next_token_is (parser, CPP_COMMA))
7334         c_parser_consume_token (parser);
7335       else
7336         break;
7337     }
7338   c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
7339 }
7340
7341 /* Parse an objc-alias-declaration.
7342
7343    objc-alias-declaration:
7344      @compatibility_alias identifier identifier ;
7345 */
7346
7347 static void
7348 c_parser_objc_alias_declaration (c_parser *parser)
7349 {
7350   tree id1, id2;
7351   gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_ALIAS));
7352   c_parser_consume_token (parser);
7353   if (c_parser_next_token_is_not (parser, CPP_NAME))
7354     {
7355       c_parser_error (parser, "expected identifier");
7356       c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
7357       return;
7358     }
7359   id1 = c_parser_peek_token (parser)->value;
7360   c_parser_consume_token (parser);
7361   if (c_parser_next_token_is_not (parser, CPP_NAME))
7362     {
7363       c_parser_error (parser, "expected identifier");
7364       c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
7365       return;
7366     }
7367   id2 = c_parser_peek_token (parser)->value;
7368   c_parser_consume_token (parser);
7369   c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
7370   objc_declare_alias (id1, id2);
7371 }
7372
7373 /* Parse an objc-protocol-definition.
7374
7375    objc-protocol-definition:
7376      @protocol identifier objc-protocol-refs[opt] objc-methodprotolist @end
7377      @protocol identifier-list ;
7378
7379    "@protocol identifier ;" should be resolved as "@protocol
7380    identifier-list ;": objc-methodprotolist may not start with a
7381    semicolon in the first alternative if objc-protocol-refs are
7382    omitted.  */
7383
7384 static void
7385 c_parser_objc_protocol_definition (c_parser *parser, tree attributes)
7386 {
7387   gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_PROTOCOL));
7388
7389   c_parser_consume_token (parser);
7390   if (c_parser_next_token_is_not (parser, CPP_NAME))
7391     {
7392       c_parser_error (parser, "expected identifier");
7393       return;
7394     }
7395   if (c_parser_peek_2nd_token (parser)->type == CPP_COMMA
7396       || c_parser_peek_2nd_token (parser)->type == CPP_SEMICOLON)
7397     {
7398       /* Any identifiers, including those declared as type names, are
7399          OK here.  */
7400       while (true)
7401         {
7402           tree id;
7403           if (c_parser_next_token_is_not (parser, CPP_NAME))
7404             {
7405               c_parser_error (parser, "expected identifier");
7406               break;
7407             }
7408           id = c_parser_peek_token (parser)->value;
7409           objc_declare_protocol (id, attributes);
7410           c_parser_consume_token (parser);
7411           if (c_parser_next_token_is (parser, CPP_COMMA))
7412             c_parser_consume_token (parser);
7413           else
7414             break;
7415         }
7416       c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
7417     }
7418   else
7419     {
7420       tree id = c_parser_peek_token (parser)->value;
7421       tree proto = NULL_TREE;
7422       c_parser_consume_token (parser);
7423       if (c_parser_next_token_is (parser, CPP_LESS))
7424         proto = c_parser_objc_protocol_refs (parser);
7425       parser->objc_pq_context = true;
7426       objc_start_protocol (id, proto, attributes);
7427       c_parser_objc_methodprotolist (parser);
7428       c_parser_require_keyword (parser, RID_AT_END, "expected %<@end%>");
7429       parser->objc_pq_context = false;
7430       objc_finish_interface ();
7431     }
7432 }
7433
7434 /* Parse an objc-method-type.
7435
7436    objc-method-type:
7437      +
7438      -
7439
7440    Return true if it is a class method (+) and false if it is
7441    an instance method (-).
7442 */
7443 static inline bool
7444 c_parser_objc_method_type (c_parser *parser)
7445 {
7446   switch (c_parser_peek_token (parser)->type)
7447     {
7448     case CPP_PLUS:
7449       c_parser_consume_token (parser);
7450       return true;
7451     case CPP_MINUS:
7452       c_parser_consume_token (parser);
7453       return false;
7454     default:
7455       gcc_unreachable ();
7456     }
7457 }
7458
7459 /* Parse an objc-method-definition.
7460
7461    objc-method-definition:
7462      objc-method-type objc-method-decl ;[opt] compound-statement
7463 */
7464
7465 static void
7466 c_parser_objc_method_definition (c_parser *parser)
7467 {
7468   bool is_class_method = c_parser_objc_method_type (parser);
7469   tree decl, attributes = NULL_TREE, expr = NULL_TREE;
7470   parser->objc_pq_context = true;
7471   decl = c_parser_objc_method_decl (parser, is_class_method, &attributes,
7472                                     &expr);
7473   if (decl == error_mark_node)
7474     return;  /* Bail here. */
7475
7476   if (c_parser_next_token_is (parser, CPP_SEMICOLON))
7477     {
7478       c_parser_consume_token (parser);
7479       pedwarn (c_parser_peek_token (parser)->location, OPT_pedantic,
7480                "extra semicolon in method definition specified");
7481     }
7482
7483   if (!c_parser_next_token_is (parser, CPP_OPEN_BRACE))
7484     {
7485       c_parser_error (parser, "expected %<{%>");
7486       return;
7487     }
7488
7489   parser->objc_pq_context = false;
7490   if (objc_start_method_definition (is_class_method, decl, attributes, expr))
7491     {
7492       add_stmt (c_parser_compound_statement (parser));
7493       objc_finish_method_definition (current_function_decl);
7494     }
7495   else
7496     {
7497       /* This code is executed when we find a method definition
7498          outside of an @implementation context (or invalid for other
7499          reasons).  Parse the method (to keep going) but do not emit
7500          any code.
7501       */
7502       c_parser_compound_statement (parser);
7503     }
7504 }
7505
7506 /* Parse an objc-methodprotolist.
7507
7508    objc-methodprotolist:
7509      empty
7510      objc-methodprotolist objc-methodproto
7511      objc-methodprotolist declaration
7512      objc-methodprotolist ;
7513      @optional
7514      @required
7515
7516    The declaration is a data definition, which may be missing
7517    declaration specifiers under the same rules and diagnostics as
7518    other data definitions outside functions, and the stray semicolon
7519    is diagnosed the same way as a stray semicolon outside a
7520    function.  */
7521
7522 static void
7523 c_parser_objc_methodprotolist (c_parser *parser)
7524 {
7525   while (true)
7526     {
7527       /* The list is terminated by @end.  */
7528       switch (c_parser_peek_token (parser)->type)
7529         {
7530         case CPP_SEMICOLON:
7531           pedwarn (c_parser_peek_token (parser)->location, OPT_pedantic,
7532                    "ISO C does not allow extra %<;%> outside of a function");
7533           c_parser_consume_token (parser);
7534           break;
7535         case CPP_PLUS:
7536         case CPP_MINUS:
7537           c_parser_objc_methodproto (parser);
7538           break;
7539         case CPP_PRAGMA:
7540           c_parser_pragma (parser, pragma_external);
7541           break;
7542         case CPP_EOF:
7543           return;
7544         default:
7545           if (c_parser_next_token_is_keyword (parser, RID_AT_END))
7546             return;
7547           else if (c_parser_next_token_is_keyword (parser, RID_AT_PROPERTY))
7548             c_parser_objc_at_property_declaration (parser);
7549           else if (c_parser_next_token_is_keyword (parser, RID_AT_OPTIONAL))
7550             {
7551               objc_set_method_opt (true);
7552               c_parser_consume_token (parser);
7553             }
7554           else if (c_parser_next_token_is_keyword (parser, RID_AT_REQUIRED))
7555             {
7556               objc_set_method_opt (false);
7557               c_parser_consume_token (parser);
7558             }
7559           else
7560             c_parser_declaration_or_fndef (parser, false, false, true,
7561                                            false, true, NULL);
7562           break;
7563         }
7564     }
7565 }
7566
7567 /* Parse an objc-methodproto.
7568
7569    objc-methodproto:
7570      objc-method-type objc-method-decl ;
7571 */
7572
7573 static void
7574 c_parser_objc_methodproto (c_parser *parser)
7575 {
7576   bool is_class_method = c_parser_objc_method_type (parser);
7577   tree decl, attributes = NULL_TREE;
7578
7579   /* Remember protocol qualifiers in prototypes.  */
7580   parser->objc_pq_context = true;
7581   decl = c_parser_objc_method_decl (parser, is_class_method, &attributes,
7582                                     NULL);
7583   /* Forget protocol qualifiers now.  */
7584   parser->objc_pq_context = false;
7585
7586   /* Do not allow the presence of attributes to hide an erroneous 
7587      method implementation in the interface section.  */
7588   if (!c_parser_next_token_is (parser, CPP_SEMICOLON))
7589     {
7590       c_parser_error (parser, "expected %<;%>");
7591       return;
7592     }
7593   
7594   if (decl != error_mark_node)
7595     objc_add_method_declaration (is_class_method, decl, attributes);
7596
7597   c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
7598 }
7599
7600 /* If we are at a position that method attributes may be present, check that 
7601    there are not any parsed already (a syntax error) and then collect any 
7602    specified at the current location.  Finally, if new attributes were present,
7603    check that the next token is legal ( ';' for decls and '{' for defs).  */
7604    
7605 static bool 
7606 c_parser_objc_maybe_method_attributes (c_parser* parser, tree* attributes)
7607 {
7608   bool bad = false;
7609   if (*attributes)
7610     {
7611       c_parser_error (parser, 
7612                     "method attributes must be specified at the end only");
7613       *attributes = NULL_TREE;
7614       bad = true;
7615     }
7616
7617   if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
7618     *attributes = c_parser_attributes (parser);
7619
7620   /* If there were no attributes here, just report any earlier error.  */
7621   if (*attributes == NULL_TREE || bad)
7622     return bad;
7623
7624   /* If the attributes are followed by a ; or {, then just report any earlier
7625      error.  */
7626   if (c_parser_next_token_is (parser, CPP_SEMICOLON)
7627       || c_parser_next_token_is (parser, CPP_OPEN_BRACE))
7628     return bad;
7629
7630   /* We've got attributes, but not at the end.  */
7631   c_parser_error (parser, 
7632                   "expected %<;%> or %<{%> after method attribute definition");
7633   return true;
7634 }
7635
7636 /* Parse an objc-method-decl.
7637
7638    objc-method-decl:
7639      ( objc-type-name ) objc-selector
7640      objc-selector
7641      ( objc-type-name ) objc-keyword-selector objc-optparmlist
7642      objc-keyword-selector objc-optparmlist
7643      attributes
7644
7645    objc-keyword-selector:
7646      objc-keyword-decl
7647      objc-keyword-selector objc-keyword-decl
7648
7649    objc-keyword-decl:
7650      objc-selector : ( objc-type-name ) identifier
7651      objc-selector : identifier
7652      : ( objc-type-name ) identifier
7653      : identifier
7654
7655    objc-optparmlist:
7656      objc-optparms objc-optellipsis
7657
7658    objc-optparms:
7659      empty
7660      objc-opt-parms , parameter-declaration
7661
7662    objc-optellipsis:
7663      empty
7664      , ...
7665 */
7666
7667 static tree
7668 c_parser_objc_method_decl (c_parser *parser, bool is_class_method,
7669                            tree *attributes, tree *expr)
7670 {
7671   tree type = NULL_TREE;
7672   tree sel;
7673   tree parms = NULL_TREE;
7674   bool ellipsis = false;
7675   bool attr_err = false;
7676
7677   *attributes = NULL_TREE;
7678   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
7679     {
7680       c_parser_consume_token (parser);
7681       type = c_parser_objc_type_name (parser);
7682       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
7683     }
7684   sel = c_parser_objc_selector (parser);
7685   /* If there is no selector, or a colon follows, we have an
7686      objc-keyword-selector.  If there is a selector, and a colon does
7687      not follow, that selector ends the objc-method-decl.  */
7688   if (!sel || c_parser_next_token_is (parser, CPP_COLON))
7689     {
7690       tree tsel = sel;
7691       tree list = NULL_TREE;
7692       while (true)
7693         {
7694           tree atype = NULL_TREE, id, keyworddecl;
7695           tree param_attr = NULL_TREE;
7696           if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
7697             break;
7698           if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
7699             {
7700               c_parser_consume_token (parser);
7701               atype = c_parser_objc_type_name (parser);
7702               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
7703                                          "expected %<)%>");
7704             }
7705           /* New ObjC allows attributes on method parameters.  */
7706           if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
7707             param_attr = c_parser_attributes (parser);
7708           if (c_parser_next_token_is_not (parser, CPP_NAME))
7709             {
7710               c_parser_error (parser, "expected identifier");
7711               return error_mark_node;
7712             }
7713           id = c_parser_peek_token (parser)->value;
7714           c_parser_consume_token (parser);
7715           keyworddecl = objc_build_keyword_decl (tsel, atype, id, param_attr);
7716           list = chainon (list, keyworddecl);
7717           tsel = c_parser_objc_selector (parser);
7718           if (!tsel && c_parser_next_token_is_not (parser, CPP_COLON))
7719             break;
7720         }
7721
7722       attr_err |= c_parser_objc_maybe_method_attributes (parser, attributes) ;
7723
7724       /* Parse the optional parameter list.  Optional Objective-C
7725          method parameters follow the C syntax, and may include '...'
7726          to denote a variable number of arguments.  */
7727       parms = make_node (TREE_LIST);
7728       while (c_parser_next_token_is (parser, CPP_COMMA))
7729         {
7730           struct c_parm *parm;
7731           c_parser_consume_token (parser);
7732           if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
7733             {
7734               ellipsis = true;
7735               c_parser_consume_token (parser);
7736               attr_err |= c_parser_objc_maybe_method_attributes 
7737                                                 (parser, attributes) ;
7738               break;
7739             }
7740           parm = c_parser_parameter_declaration (parser, NULL_TREE);
7741           if (parm == NULL)
7742             break;
7743           parms = chainon (parms,
7744                            build_tree_list (NULL_TREE, grokparm (parm, expr)));
7745         }
7746       sel = list;
7747     }
7748   else
7749     attr_err |= c_parser_objc_maybe_method_attributes (parser, attributes) ;
7750
7751   if (sel == NULL)
7752     {
7753       c_parser_error (parser, "objective-c method declaration is expected");
7754       return error_mark_node;
7755     }
7756
7757   if (attr_err)
7758     return error_mark_node;
7759
7760   return objc_build_method_signature (is_class_method, type, sel, parms, ellipsis);
7761 }
7762
7763 /* Parse an objc-type-name.
7764
7765    objc-type-name:
7766      objc-type-qualifiers[opt] type-name
7767      objc-type-qualifiers[opt]
7768
7769    objc-type-qualifiers:
7770      objc-type-qualifier
7771      objc-type-qualifiers objc-type-qualifier
7772
7773    objc-type-qualifier: one of
7774      in out inout bycopy byref oneway
7775 */
7776
7777 static tree
7778 c_parser_objc_type_name (c_parser *parser)
7779 {
7780   tree quals = NULL_TREE;
7781   struct c_type_name *type_name = NULL;
7782   tree type = NULL_TREE;
7783   while (true)
7784     {
7785       c_token *token = c_parser_peek_token (parser);
7786       if (token->type == CPP_KEYWORD
7787           && (token->keyword == RID_IN
7788               || token->keyword == RID_OUT
7789               || token->keyword == RID_INOUT
7790               || token->keyword == RID_BYCOPY
7791               || token->keyword == RID_BYREF
7792               || token->keyword == RID_ONEWAY))
7793         {
7794           quals = chainon (build_tree_list (NULL_TREE, token->value), quals);
7795           c_parser_consume_token (parser);
7796         }
7797       else
7798         break;
7799     }
7800   if (c_parser_next_tokens_start_typename (parser, cla_prefer_type))
7801     type_name = c_parser_type_name (parser);
7802   if (type_name)
7803     type = groktypename (type_name, NULL, NULL);
7804
7805   /* If the type is unknown, and error has already been produced and
7806      we need to recover from the error.  In that case, use NULL_TREE
7807      for the type, as if no type had been specified; this will use the
7808      default type ('id') which is good for error recovery.  */
7809   if (type == error_mark_node)
7810     type = NULL_TREE;
7811
7812   return build_tree_list (quals, type);
7813 }
7814
7815 /* Parse objc-protocol-refs.
7816
7817    objc-protocol-refs:
7818      < identifier-list >
7819 */
7820
7821 static tree
7822 c_parser_objc_protocol_refs (c_parser *parser)
7823 {
7824   tree list = NULL_TREE;
7825   gcc_assert (c_parser_next_token_is (parser, CPP_LESS));
7826   c_parser_consume_token (parser);
7827   /* Any identifiers, including those declared as type names, are OK
7828      here.  */
7829   while (true)
7830     {
7831       tree id;
7832       if (c_parser_next_token_is_not (parser, CPP_NAME))
7833         {
7834           c_parser_error (parser, "expected identifier");
7835           break;
7836         }
7837       id = c_parser_peek_token (parser)->value;
7838       list = chainon (list, build_tree_list (NULL_TREE, id));
7839       c_parser_consume_token (parser);
7840       if (c_parser_next_token_is (parser, CPP_COMMA))
7841         c_parser_consume_token (parser);
7842       else
7843         break;
7844     }
7845   c_parser_require (parser, CPP_GREATER, "expected %<>%>");
7846   return list;
7847 }
7848
7849 /* Parse an objc-try-catch-finally-statement.
7850
7851    objc-try-catch-finally-statement:
7852      @try compound-statement objc-catch-list[opt]
7853      @try compound-statement objc-catch-list[opt] @finally compound-statement
7854
7855    objc-catch-list:
7856      @catch ( objc-catch-parameter-declaration ) compound-statement
7857      objc-catch-list @catch ( objc-catch-parameter-declaration ) compound-statement
7858
7859    objc-catch-parameter-declaration:
7860      parameter-declaration
7861      '...'
7862
7863    where '...' is to be interpreted literally, that is, it means CPP_ELLIPSIS.
7864
7865    PS: This function is identical to cp_parser_objc_try_catch_finally_statement
7866    for C++.  Keep them in sync.  */   
7867
7868 static void
7869 c_parser_objc_try_catch_finally_statement (c_parser *parser)
7870 {
7871   location_t location;
7872   tree stmt;
7873
7874   gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_TRY));
7875   c_parser_consume_token (parser);
7876   location = c_parser_peek_token (parser)->location;
7877   objc_maybe_warn_exceptions (location);
7878   stmt = c_parser_compound_statement (parser);
7879   objc_begin_try_stmt (location, stmt);
7880
7881   while (c_parser_next_token_is_keyword (parser, RID_AT_CATCH))
7882     {
7883       struct c_parm *parm;
7884       tree parameter_declaration = error_mark_node;
7885       bool seen_open_paren = false;
7886
7887       c_parser_consume_token (parser);
7888       if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
7889         seen_open_paren = true;
7890       if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
7891         {
7892           /* We have "@catch (...)" (where the '...' are literally
7893              what is in the code).  Skip the '...'.
7894              parameter_declaration is set to NULL_TREE, and
7895              objc_being_catch_clauses() knows that that means
7896              '...'.  */
7897           c_parser_consume_token (parser);
7898           parameter_declaration = NULL_TREE;
7899         }
7900       else
7901         {
7902           /* We have "@catch (NSException *exception)" or something
7903              like that.  Parse the parameter declaration.  */
7904           parm = c_parser_parameter_declaration (parser, NULL_TREE);
7905           if (parm == NULL)
7906             parameter_declaration = error_mark_node;
7907           else
7908             parameter_declaration = grokparm (parm, NULL);
7909         }
7910       if (seen_open_paren)
7911         c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>");
7912       else
7913         {
7914           /* If there was no open parenthesis, we are recovering from
7915              an error, and we are trying to figure out what mistake
7916              the user has made.  */
7917
7918           /* If there is an immediate closing parenthesis, the user
7919              probably forgot the opening one (ie, they typed "@catch
7920              NSException *e)".  Parse the closing parenthesis and keep
7921              going.  */
7922           if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
7923             c_parser_consume_token (parser);
7924           
7925           /* If these is no immediate closing parenthesis, the user
7926              probably doesn't know that parenthesis are required at
7927              all (ie, they typed "@catch NSException *e").  So, just
7928              forget about the closing parenthesis and keep going.  */
7929         }
7930       objc_begin_catch_clause (parameter_declaration);
7931       if (c_parser_require (parser, CPP_OPEN_BRACE, "expected %<{%>"))
7932         c_parser_compound_statement_nostart (parser);
7933       objc_finish_catch_clause ();
7934     }
7935   if (c_parser_next_token_is_keyword (parser, RID_AT_FINALLY))
7936     {
7937       c_parser_consume_token (parser);
7938       location = c_parser_peek_token (parser)->location;
7939       stmt = c_parser_compound_statement (parser);
7940       objc_build_finally_clause (location, stmt);
7941     }
7942   objc_finish_try_stmt ();
7943 }
7944
7945 /* Parse an objc-synchronized-statement.
7946
7947    objc-synchronized-statement:
7948      @synchronized ( expression ) compound-statement
7949 */
7950
7951 static void
7952 c_parser_objc_synchronized_statement (c_parser *parser)
7953 {
7954   location_t loc;
7955   tree expr, stmt;
7956   gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_SYNCHRONIZED));
7957   c_parser_consume_token (parser);
7958   loc = c_parser_peek_token (parser)->location;
7959   objc_maybe_warn_exceptions (loc);
7960   if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
7961     {
7962       expr = c_parser_expression (parser).value;
7963       expr = c_fully_fold (expr, false, NULL);
7964       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
7965     }
7966   else
7967     expr = error_mark_node;
7968   stmt = c_parser_compound_statement (parser);
7969   objc_build_synchronized (loc, expr, stmt);
7970 }
7971
7972 /* Parse an objc-selector; return NULL_TREE without an error if the
7973    next token is not an objc-selector.
7974
7975    objc-selector:
7976      identifier
7977      one of
7978        enum struct union if else while do for switch case default
7979        break continue return goto asm sizeof typeof __alignof
7980        unsigned long const short volatile signed restrict _Complex
7981        in out inout bycopy byref oneway int char float double void _Bool
7982
7983    ??? Why this selection of keywords but not, for example, storage
7984    class specifiers?  */
7985
7986 static tree
7987 c_parser_objc_selector (c_parser *parser)
7988 {
7989   c_token *token = c_parser_peek_token (parser);
7990   tree value = token->value;
7991   if (token->type == CPP_NAME)
7992     {
7993       c_parser_consume_token (parser);
7994       return value;
7995     }
7996   if (token->type != CPP_KEYWORD)
7997     return NULL_TREE;
7998   switch (token->keyword)
7999     {
8000     case RID_ENUM:
8001     case RID_STRUCT:
8002     case RID_UNION:
8003     case RID_IF:
8004     case RID_ELSE:
8005     case RID_WHILE:
8006     case RID_DO:
8007     case RID_FOR:
8008     case RID_SWITCH:
8009     case RID_CASE:
8010     case RID_DEFAULT:
8011     case RID_BREAK:
8012     case RID_CONTINUE:
8013     case RID_RETURN:
8014     case RID_GOTO:
8015     case RID_ASM:
8016     case RID_SIZEOF:
8017     case RID_TYPEOF:
8018     case RID_ALIGNOF:
8019     case RID_UNSIGNED:
8020     case RID_LONG:
8021     case RID_INT128:
8022     case RID_CONST:
8023     case RID_SHORT:
8024     case RID_VOLATILE:
8025     case RID_SIGNED:
8026     case RID_RESTRICT:
8027     case RID_COMPLEX:
8028     case RID_IN:
8029     case RID_OUT:
8030     case RID_INOUT:
8031     case RID_BYCOPY:
8032     case RID_BYREF:
8033     case RID_ONEWAY:
8034     case RID_INT:
8035     case RID_CHAR:
8036     case RID_FLOAT:
8037     case RID_DOUBLE:
8038     case RID_VOID:
8039     case RID_BOOL:
8040       c_parser_consume_token (parser);
8041       return value;
8042     default:
8043       return NULL_TREE;
8044     }
8045 }
8046
8047 /* Parse an objc-selector-arg.
8048
8049    objc-selector-arg:
8050      objc-selector
8051      objc-keywordname-list
8052
8053    objc-keywordname-list:
8054      objc-keywordname
8055      objc-keywordname-list objc-keywordname
8056
8057    objc-keywordname:
8058      objc-selector :
8059      :
8060 */
8061
8062 static tree
8063 c_parser_objc_selector_arg (c_parser *parser)
8064 {
8065   tree sel = c_parser_objc_selector (parser);
8066   tree list = NULL_TREE;
8067   if (sel && c_parser_next_token_is_not (parser, CPP_COLON))
8068     return sel;
8069   while (true)
8070     {
8071       if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
8072         return list;
8073       list = chainon (list, build_tree_list (sel, NULL_TREE));
8074       sel = c_parser_objc_selector (parser);
8075       if (!sel && c_parser_next_token_is_not (parser, CPP_COLON))
8076         break;
8077     }
8078   return list;
8079 }
8080
8081 /* Parse an objc-receiver.
8082
8083    objc-receiver:
8084      expression
8085      class-name
8086      type-name
8087 */
8088
8089 static tree
8090 c_parser_objc_receiver (c_parser *parser)
8091 {
8092   if (c_parser_peek_token (parser)->type == CPP_NAME
8093       && (c_parser_peek_token (parser)->id_kind == C_ID_TYPENAME
8094           || c_parser_peek_token (parser)->id_kind == C_ID_CLASSNAME))
8095     {
8096       tree id = c_parser_peek_token (parser)->value;
8097       c_parser_consume_token (parser);
8098       return objc_get_class_reference (id);
8099     }
8100   return c_fully_fold (c_parser_expression (parser).value, false, NULL);
8101 }
8102
8103 /* Parse objc-message-args.
8104
8105    objc-message-args:
8106      objc-selector
8107      objc-keywordarg-list
8108
8109    objc-keywordarg-list:
8110      objc-keywordarg
8111      objc-keywordarg-list objc-keywordarg
8112
8113    objc-keywordarg:
8114      objc-selector : objc-keywordexpr
8115      : objc-keywordexpr
8116 */
8117
8118 static tree
8119 c_parser_objc_message_args (c_parser *parser)
8120 {
8121   tree sel = c_parser_objc_selector (parser);
8122   tree list = NULL_TREE;
8123   if (sel && c_parser_next_token_is_not (parser, CPP_COLON))
8124     return sel;
8125   while (true)
8126     {
8127       tree keywordexpr;
8128       if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
8129         return error_mark_node;
8130       keywordexpr = c_parser_objc_keywordexpr (parser);
8131       list = chainon (list, build_tree_list (sel, keywordexpr));
8132       sel = c_parser_objc_selector (parser);
8133       if (!sel && c_parser_next_token_is_not (parser, CPP_COLON))
8134         break;
8135     }
8136   return list;
8137 }
8138
8139 /* Parse an objc-keywordexpr.
8140
8141    objc-keywordexpr:
8142      nonempty-expr-list
8143 */
8144
8145 static tree
8146 c_parser_objc_keywordexpr (c_parser *parser)
8147 {
8148   tree ret;
8149   VEC(tree,gc) *expr_list = c_parser_expr_list (parser, true, true, NULL);
8150   if (VEC_length (tree, expr_list) == 1)
8151     {
8152       /* Just return the expression, remove a level of
8153          indirection.  */
8154       ret = VEC_index (tree, expr_list, 0);
8155     }
8156   else
8157     {
8158       /* We have a comma expression, we will collapse later.  */
8159       ret = build_tree_list_vec (expr_list);
8160     }
8161   release_tree_vector (expr_list);
8162   return ret;
8163 }
8164
8165 /* A check, needed in several places, that ObjC interface, implementation or
8166    method definitions are not prefixed by incorrect items.  */
8167 static bool
8168 c_parser_objc_diagnose_bad_element_prefix (c_parser *parser, 
8169                                            struct c_declspecs *specs)
8170 {
8171   if (!specs->declspecs_seen_p || specs->non_sc_seen_p
8172       || specs->typespec_kind != ctsk_none)
8173     {
8174       c_parser_error (parser, 
8175                       "no type or storage class may be specified here,");
8176       c_parser_skip_to_end_of_block_or_statement (parser);
8177       return true;
8178     }
8179   return false;
8180 }
8181
8182 /* Parse an Objective-C @property declaration.  The syntax is:
8183
8184    objc-property-declaration:
8185      '@property' objc-property-attributes[opt] struct-declaration ;
8186
8187    objc-property-attributes:
8188     '(' objc-property-attribute-list ')'
8189
8190    objc-property-attribute-list:
8191      objc-property-attribute
8192      objc-property-attribute-list, objc-property-attribute
8193
8194    objc-property-attribute
8195      'getter' = identifier
8196      'setter' = identifier
8197      'readonly'
8198      'readwrite'
8199      'assign'
8200      'retain'
8201      'copy'
8202      'nonatomic'
8203
8204   For example:
8205     @property NSString *name;
8206     @property (readonly) id object;
8207     @property (retain, nonatomic, getter=getTheName) id name;
8208     @property int a, b, c;
8209
8210   PS: This function is identical to cp_parser_objc_at_propery_declaration
8211   for C++.  Keep them in sync.  */
8212 static void
8213 c_parser_objc_at_property_declaration (c_parser *parser)
8214 {
8215   /* The following variables hold the attributes of the properties as
8216      parsed.  They are 'false' or 'NULL_TREE' if the attribute was not
8217      seen.  When we see an attribute, we set them to 'true' (if they
8218      are boolean properties) or to the identifier (if they have an
8219      argument, ie, for getter and setter).  Note that here we only
8220      parse the list of attributes, check the syntax and accumulate the
8221      attributes that we find.  objc_add_property_declaration() will
8222      then process the information.  */
8223   bool property_assign = false;
8224   bool property_copy = false;
8225   tree property_getter_ident = NULL_TREE;
8226   bool property_nonatomic = false;
8227   bool property_readonly = false;
8228   bool property_readwrite = false;
8229   bool property_retain = false;
8230   tree property_setter_ident = NULL_TREE;
8231
8232   /* 'properties' is the list of properties that we read.  Usually a
8233      single one, but maybe more (eg, in "@property int a, b, c;" there
8234      are three).  */
8235   tree properties;
8236   location_t loc;
8237
8238   loc = c_parser_peek_token (parser)->location;
8239   gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_PROPERTY));
8240
8241   c_parser_consume_token (parser);  /* Eat '@property'.  */
8242
8243   /* Parse the optional attribute list...  */
8244   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
8245     {
8246       /* Eat the '(' */
8247       c_parser_consume_token (parser);
8248       
8249       /* Property attribute keywords are valid now.  */
8250       parser->objc_property_attr_context = true;
8251
8252       while (true)
8253         {
8254           bool syntax_error = false;
8255           c_token *token = c_parser_peek_token (parser);
8256           enum rid keyword;
8257
8258           if (token->type != CPP_KEYWORD)
8259             {
8260               if (token->type == CPP_CLOSE_PAREN)
8261                 c_parser_error (parser, "expected identifier");
8262               else
8263                 {
8264                   c_parser_consume_token (parser);
8265                   c_parser_error (parser, "unknown property attribute");
8266                 }
8267               break;
8268             }
8269           keyword = token->keyword;
8270           c_parser_consume_token (parser);
8271           switch (keyword)
8272             {
8273             case RID_ASSIGN:    property_assign = true;    break;
8274             case RID_COPY:      property_copy = true;      break;
8275             case RID_NONATOMIC: property_nonatomic = true; break;
8276             case RID_READONLY:  property_readonly = true;  break;
8277             case RID_READWRITE: property_readwrite = true; break;
8278             case RID_RETAIN:    property_retain = true;    break;
8279
8280             case RID_GETTER:
8281             case RID_SETTER:
8282               if (c_parser_next_token_is_not (parser, CPP_EQ))
8283                 {
8284                   if (keyword == RID_GETTER)
8285                     c_parser_error (parser,
8286                                     "missing %<=%> (after %<getter%> attribute)");
8287                   else
8288                     c_parser_error (parser,
8289                                     "missing %<=%> (after %<setter%> attribute)");
8290                   syntax_error = true;
8291                   break;
8292                 }
8293               c_parser_consume_token (parser); /* eat the = */
8294               if (c_parser_next_token_is_not (parser, CPP_NAME))
8295                 {
8296                   c_parser_error (parser, "expected identifier");
8297                   syntax_error = true;
8298                   break;
8299                 }
8300               if (keyword == RID_SETTER)
8301                 {
8302                   if (property_setter_ident != NULL_TREE)
8303                     c_parser_error (parser, "the %<setter%> attribute may only be specified once");
8304                   else
8305                     property_setter_ident = c_parser_peek_token (parser)->value;
8306                   c_parser_consume_token (parser);
8307                   if (c_parser_next_token_is_not (parser, CPP_COLON))
8308                     c_parser_error (parser, "setter name must terminate with %<:%>");
8309                   else
8310                     c_parser_consume_token (parser);
8311                 }
8312               else
8313                 {
8314                   if (property_getter_ident != NULL_TREE)
8315                     c_parser_error (parser, "the %<getter%> attribute may only be specified once");
8316                   else
8317                     property_getter_ident = c_parser_peek_token (parser)->value;
8318                   c_parser_consume_token (parser);
8319                 }
8320               break;
8321             default:
8322               c_parser_error (parser, "unknown property attribute");
8323               syntax_error = true;
8324               break;
8325             }
8326
8327           if (syntax_error)
8328             break;
8329           
8330           if (c_parser_next_token_is (parser, CPP_COMMA))
8331             c_parser_consume_token (parser);
8332           else
8333             break;
8334         }
8335       parser->objc_property_attr_context = false;
8336       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
8337     }
8338   /* ... and the property declaration(s).  */
8339   properties = c_parser_struct_declaration (parser);
8340
8341   if (properties == error_mark_node)
8342     {
8343       c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
8344       parser->error = false;
8345       return;
8346     }
8347
8348   if (properties == NULL_TREE)
8349     c_parser_error (parser, "expected identifier");
8350   else
8351     {
8352       /* Comma-separated properties are chained together in
8353          reverse order; add them one by one.  */
8354       properties = nreverse (properties);
8355       
8356       for (; properties; properties = TREE_CHAIN (properties))
8357         objc_add_property_declaration (loc, copy_node (properties),
8358                                        property_readonly, property_readwrite,
8359                                        property_assign, property_retain,
8360                                        property_copy, property_nonatomic,
8361                                        property_getter_ident, property_setter_ident);
8362     }
8363
8364   c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
8365   parser->error = false;
8366 }
8367
8368 /* Parse an Objective-C @synthesize declaration.  The syntax is:
8369
8370    objc-synthesize-declaration:
8371      @synthesize objc-synthesize-identifier-list ;
8372
8373    objc-synthesize-identifier-list:
8374      objc-synthesize-identifier
8375      objc-synthesize-identifier-list, objc-synthesize-identifier
8376
8377    objc-synthesize-identifier
8378      identifier
8379      identifier = identifier
8380
8381   For example:
8382     @synthesize MyProperty;
8383     @synthesize OneProperty, AnotherProperty=MyIvar, YetAnotherProperty;
8384
8385   PS: This function is identical to cp_parser_objc_at_synthesize_declaration
8386   for C++.  Keep them in sync.
8387 */
8388 static void
8389 c_parser_objc_at_synthesize_declaration (c_parser *parser)
8390 {
8391   tree list = NULL_TREE;
8392   location_t loc;
8393   gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_SYNTHESIZE));
8394   loc = c_parser_peek_token (parser)->location;
8395
8396   c_parser_consume_token (parser);
8397   while (true)
8398     {
8399       tree property, ivar;
8400       if (c_parser_next_token_is_not (parser, CPP_NAME))
8401         {
8402           c_parser_error (parser, "expected identifier");
8403           c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
8404           /* Once we find the semicolon, we can resume normal parsing.
8405              We have to reset parser->error manually because
8406              c_parser_skip_until_found() won't reset it for us if the
8407              next token is precisely a semicolon.  */
8408           parser->error = false;
8409           return;
8410         }
8411       property = c_parser_peek_token (parser)->value;
8412       c_parser_consume_token (parser);
8413       if (c_parser_next_token_is (parser, CPP_EQ))
8414         {
8415           c_parser_consume_token (parser);
8416           if (c_parser_next_token_is_not (parser, CPP_NAME))
8417             {
8418               c_parser_error (parser, "expected identifier");
8419               c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
8420               parser->error = false;
8421               return;
8422             }
8423           ivar = c_parser_peek_token (parser)->value;
8424           c_parser_consume_token (parser);
8425         }
8426       else
8427         ivar = NULL_TREE;
8428       list = chainon (list, build_tree_list (ivar, property));
8429       if (c_parser_next_token_is (parser, CPP_COMMA))
8430         c_parser_consume_token (parser);
8431       else
8432         break;
8433     }
8434   c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
8435   objc_add_synthesize_declaration (loc, list);
8436 }
8437
8438 /* Parse an Objective-C @dynamic declaration.  The syntax is:
8439
8440    objc-dynamic-declaration:
8441      @dynamic identifier-list ;
8442
8443    For example:
8444      @dynamic MyProperty;
8445      @dynamic MyProperty, AnotherProperty;
8446
8447   PS: This function is identical to cp_parser_objc_at_dynamic_declaration
8448   for C++.  Keep them in sync.
8449 */
8450 static void
8451 c_parser_objc_at_dynamic_declaration (c_parser *parser)
8452 {
8453   tree list = NULL_TREE;
8454   location_t loc;
8455   gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_DYNAMIC));
8456   loc = c_parser_peek_token (parser)->location;
8457
8458   c_parser_consume_token (parser);
8459   while (true)
8460     {
8461       tree property;
8462       if (c_parser_next_token_is_not (parser, CPP_NAME))
8463         {
8464           c_parser_error (parser, "expected identifier");
8465           c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
8466           parser->error = false;
8467           return;
8468         }
8469       property = c_parser_peek_token (parser)->value;
8470       list = chainon (list, build_tree_list (NULL_TREE, property));
8471       c_parser_consume_token (parser);
8472       if (c_parser_next_token_is (parser, CPP_COMMA))
8473         c_parser_consume_token (parser);
8474       else
8475         break;
8476     }
8477   c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
8478   objc_add_dynamic_declaration (loc, list);
8479 }
8480
8481 \f
8482 /* Handle pragmas.  Some OpenMP pragmas are associated with, and therefore
8483    should be considered, statements.  ALLOW_STMT is true if we're within
8484    the context of a function and such pragmas are to be allowed.  Returns
8485    true if we actually parsed such a pragma.  */
8486
8487 static bool
8488 c_parser_pragma (c_parser *parser, enum pragma_context context)
8489 {
8490   unsigned int id;
8491
8492   id = c_parser_peek_token (parser)->pragma_kind;
8493   gcc_assert (id != PRAGMA_NONE);
8494
8495   switch (id)
8496     {
8497     case PRAGMA_OMP_BARRIER:
8498       if (context != pragma_compound)
8499         {
8500           if (context == pragma_stmt)
8501             c_parser_error (parser, "%<#pragma omp barrier%> may only be "
8502                             "used in compound statements");
8503           goto bad_stmt;
8504         }
8505       c_parser_omp_barrier (parser);
8506       return false;
8507
8508     case PRAGMA_OMP_FLUSH:
8509       if (context != pragma_compound)
8510         {
8511           if (context == pragma_stmt)
8512             c_parser_error (parser, "%<#pragma omp flush%> may only be "
8513                             "used in compound statements");
8514           goto bad_stmt;
8515         }
8516       c_parser_omp_flush (parser);
8517       return false;
8518
8519     case PRAGMA_OMP_TASKWAIT:
8520       if (context != pragma_compound)
8521         {
8522           if (context == pragma_stmt)
8523             c_parser_error (parser, "%<#pragma omp taskwait%> may only be "
8524                             "used in compound statements");
8525           goto bad_stmt;
8526         }
8527       c_parser_omp_taskwait (parser);
8528       return false;
8529
8530     case PRAGMA_OMP_TASKYIELD:
8531       if (context != pragma_compound)
8532         {
8533           if (context == pragma_stmt)
8534             c_parser_error (parser, "%<#pragma omp taskyield%> may only be "
8535                             "used in compound statements");
8536           goto bad_stmt;
8537         }
8538       c_parser_omp_taskyield (parser);
8539       return false;
8540
8541     case PRAGMA_OMP_THREADPRIVATE:
8542       c_parser_omp_threadprivate (parser);
8543       return false;
8544
8545     case PRAGMA_OMP_SECTION:
8546       error_at (c_parser_peek_token (parser)->location,
8547                 "%<#pragma omp section%> may only be used in "
8548                 "%<#pragma omp sections%> construct");
8549       c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL);
8550       return false;
8551
8552     case PRAGMA_GCC_PCH_PREPROCESS:
8553       c_parser_error (parser, "%<#pragma GCC pch_preprocess%> must be first");
8554       c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL);
8555       return false;
8556
8557     default:
8558       if (id < PRAGMA_FIRST_EXTERNAL)
8559         {
8560           if (context == pragma_external)
8561             {
8562             bad_stmt:
8563               c_parser_error (parser, "expected declaration specifiers");
8564               c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL);
8565               return false;
8566             }
8567           c_parser_omp_construct (parser);
8568           return true;
8569         }
8570       break;
8571     }
8572
8573   c_parser_consume_pragma (parser);
8574   c_invoke_pragma_handler (id);
8575
8576   /* Skip to EOL, but suppress any error message.  Those will have been
8577      generated by the handler routine through calling error, as opposed
8578      to calling c_parser_error.  */
8579   parser->error = true;
8580   c_parser_skip_to_pragma_eol (parser);
8581
8582   return false;
8583 }
8584
8585 /* The interface the pragma parsers have to the lexer.  */
8586
8587 enum cpp_ttype
8588 pragma_lex (tree *value)
8589 {
8590   c_token *tok = c_parser_peek_token (the_parser);
8591   enum cpp_ttype ret = tok->type;
8592
8593   *value = tok->value;
8594   if (ret == CPP_PRAGMA_EOL || ret == CPP_EOF)
8595     ret = CPP_EOF;
8596   else
8597     {
8598       if (ret == CPP_KEYWORD)
8599         ret = CPP_NAME;
8600       c_parser_consume_token (the_parser);
8601     }
8602
8603   return ret;
8604 }
8605
8606 static void
8607 c_parser_pragma_pch_preprocess (c_parser *parser)
8608 {
8609   tree name = NULL;
8610
8611   c_parser_consume_pragma (parser);
8612   if (c_parser_next_token_is (parser, CPP_STRING))
8613     {
8614       name = c_parser_peek_token (parser)->value;
8615       c_parser_consume_token (parser);
8616     }
8617   else
8618     c_parser_error (parser, "expected string literal");
8619   c_parser_skip_to_pragma_eol (parser);
8620
8621   if (name)
8622     c_common_pch_pragma (parse_in, TREE_STRING_POINTER (name));
8623 }
8624 \f
8625 /* OpenMP 2.5 parsing routines.  */
8626
8627 /* Returns name of the next clause.
8628    If the clause is not recognized PRAGMA_OMP_CLAUSE_NONE is returned and
8629    the token is not consumed.  Otherwise appropriate pragma_omp_clause is
8630    returned and the token is consumed.  */
8631
8632 static pragma_omp_clause
8633 c_parser_omp_clause_name (c_parser *parser)
8634 {
8635   pragma_omp_clause result = PRAGMA_OMP_CLAUSE_NONE;
8636
8637   if (c_parser_next_token_is_keyword (parser, RID_IF))
8638     result = PRAGMA_OMP_CLAUSE_IF;
8639   else if (c_parser_next_token_is_keyword (parser, RID_DEFAULT))
8640     result = PRAGMA_OMP_CLAUSE_DEFAULT;
8641   else if (c_parser_next_token_is (parser, CPP_NAME))
8642     {
8643       const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
8644
8645       switch (p[0])
8646         {
8647         case 'c':
8648           if (!strcmp ("collapse", p))
8649             result = PRAGMA_OMP_CLAUSE_COLLAPSE;
8650           else if (!strcmp ("copyin", p))
8651             result = PRAGMA_OMP_CLAUSE_COPYIN;
8652           else if (!strcmp ("copyprivate", p))
8653             result = PRAGMA_OMP_CLAUSE_COPYPRIVATE;
8654           break;
8655         case 'f':
8656           if (!strcmp ("final", p))
8657             result = PRAGMA_OMP_CLAUSE_FINAL;
8658           else if (!strcmp ("firstprivate", p))
8659             result = PRAGMA_OMP_CLAUSE_FIRSTPRIVATE;
8660           break;
8661         case 'l':
8662           if (!strcmp ("lastprivate", p))
8663             result = PRAGMA_OMP_CLAUSE_LASTPRIVATE;
8664           break;
8665         case 'm':
8666           if (!strcmp ("mergeable", p))
8667             result = PRAGMA_OMP_CLAUSE_MERGEABLE;
8668           break;
8669         case 'n':
8670           if (!strcmp ("nowait", p))
8671             result = PRAGMA_OMP_CLAUSE_NOWAIT;
8672           else if (!strcmp ("num_threads", p))
8673             result = PRAGMA_OMP_CLAUSE_NUM_THREADS;
8674           break;
8675         case 'o':
8676           if (!strcmp ("ordered", p))
8677             result = PRAGMA_OMP_CLAUSE_ORDERED;
8678           break;
8679         case 'p':
8680           if (!strcmp ("private", p))
8681             result = PRAGMA_OMP_CLAUSE_PRIVATE;
8682           break;
8683         case 'r':
8684           if (!strcmp ("reduction", p))
8685             result = PRAGMA_OMP_CLAUSE_REDUCTION;
8686           break;
8687         case 's':
8688           if (!strcmp ("schedule", p))
8689             result = PRAGMA_OMP_CLAUSE_SCHEDULE;
8690           else if (!strcmp ("shared", p))
8691             result = PRAGMA_OMP_CLAUSE_SHARED;
8692           break;
8693         case 'u':
8694           if (!strcmp ("untied", p))
8695             result = PRAGMA_OMP_CLAUSE_UNTIED;
8696           break;
8697         }
8698     }
8699
8700   if (result != PRAGMA_OMP_CLAUSE_NONE)
8701     c_parser_consume_token (parser);
8702
8703   return result;
8704 }
8705
8706 /* Validate that a clause of the given type does not already exist.  */
8707
8708 static void
8709 check_no_duplicate_clause (tree clauses, enum omp_clause_code code,
8710                            const char *name)
8711 {
8712   tree c;
8713
8714   for (c = clauses; c ; c = OMP_CLAUSE_CHAIN (c))
8715     if (OMP_CLAUSE_CODE (c) == code)
8716       {
8717         location_t loc = OMP_CLAUSE_LOCATION (c);
8718         error_at (loc, "too many %qs clauses", name);
8719         break;
8720       }
8721 }
8722
8723 /* OpenMP 2.5:
8724    variable-list:
8725      identifier
8726      variable-list , identifier
8727
8728    If KIND is nonzero, create the appropriate node and install the
8729    decl in OMP_CLAUSE_DECL and add the node to the head of the list.
8730    If KIND is nonzero, CLAUSE_LOC is the location of the clause.
8731
8732    If KIND is zero, create a TREE_LIST with the decl in TREE_PURPOSE;
8733    return the list created.  */
8734
8735 static tree
8736 c_parser_omp_variable_list (c_parser *parser,
8737                             location_t clause_loc,
8738                             enum omp_clause_code kind,
8739                             tree list)
8740 {
8741   if (c_parser_next_token_is_not (parser, CPP_NAME)
8742       || c_parser_peek_token (parser)->id_kind != C_ID_ID)
8743     c_parser_error (parser, "expected identifier");
8744
8745   while (c_parser_next_token_is (parser, CPP_NAME)
8746          && c_parser_peek_token (parser)->id_kind == C_ID_ID)
8747     {
8748       tree t = lookup_name (c_parser_peek_token (parser)->value);
8749
8750       if (t == NULL_TREE)
8751         undeclared_variable (c_parser_peek_token (parser)->location,
8752                              c_parser_peek_token (parser)->value);
8753       else if (t == error_mark_node)
8754         ;
8755       else if (kind != 0)
8756         {
8757           tree u = build_omp_clause (clause_loc, kind);
8758           OMP_CLAUSE_DECL (u) = t;
8759           OMP_CLAUSE_CHAIN (u) = list;
8760           list = u;
8761         }
8762       else
8763         list = tree_cons (t, NULL_TREE, list);
8764
8765       c_parser_consume_token (parser);
8766
8767       if (c_parser_next_token_is_not (parser, CPP_COMMA))
8768         break;
8769
8770       c_parser_consume_token (parser);
8771     }
8772
8773   return list;
8774 }
8775
8776 /* Similarly, but expect leading and trailing parenthesis.  This is a very
8777    common case for omp clauses.  */
8778
8779 static tree
8780 c_parser_omp_var_list_parens (c_parser *parser, enum omp_clause_code kind,
8781                               tree list)
8782 {
8783   /* The clauses location.  */
8784   location_t loc = c_parser_peek_token (parser)->location;
8785
8786   if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
8787     {
8788       list = c_parser_omp_variable_list (parser, loc, kind, list);
8789       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
8790     }
8791   return list;
8792 }
8793
8794 /* OpenMP 3.0:
8795    collapse ( constant-expression ) */
8796
8797 static tree
8798 c_parser_omp_clause_collapse (c_parser *parser, tree list)
8799 {
8800   tree c, num = error_mark_node;
8801   HOST_WIDE_INT n;
8802   location_t loc;
8803
8804   check_no_duplicate_clause (list, OMP_CLAUSE_COLLAPSE, "collapse");
8805
8806   loc = c_parser_peek_token (parser)->location;
8807   if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
8808     {
8809       num = c_parser_expr_no_commas (parser, NULL).value;
8810       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
8811     }
8812   if (num == error_mark_node)
8813     return list;
8814   if (!INTEGRAL_TYPE_P (TREE_TYPE (num))
8815       || !host_integerp (num, 0)
8816       || (n = tree_low_cst (num, 0)) <= 0
8817       || (int) n != n)
8818     {
8819       error_at (loc,
8820                 "collapse argument needs positive constant integer expression");
8821       return list;
8822     }
8823   c = build_omp_clause (loc, OMP_CLAUSE_COLLAPSE);
8824   OMP_CLAUSE_COLLAPSE_EXPR (c) = num;
8825   OMP_CLAUSE_CHAIN (c) = list;
8826   return c;
8827 }
8828
8829 /* OpenMP 2.5:
8830    copyin ( variable-list ) */
8831
8832 static tree
8833 c_parser_omp_clause_copyin (c_parser *parser, tree list)
8834 {
8835   return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_COPYIN, list);
8836 }
8837
8838 /* OpenMP 2.5:
8839    copyprivate ( variable-list ) */
8840
8841 static tree
8842 c_parser_omp_clause_copyprivate (c_parser *parser, tree list)
8843 {
8844   return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_COPYPRIVATE, list);
8845 }
8846
8847 /* OpenMP 2.5:
8848    default ( shared | none ) */
8849
8850 static tree
8851 c_parser_omp_clause_default (c_parser *parser, tree list)
8852 {
8853   enum omp_clause_default_kind kind = OMP_CLAUSE_DEFAULT_UNSPECIFIED;
8854   location_t loc = c_parser_peek_token (parser)->location;
8855   tree c;
8856
8857   if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
8858     return list;
8859   if (c_parser_next_token_is (parser, CPP_NAME))
8860     {
8861       const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
8862
8863       switch (p[0])
8864         {
8865         case 'n':
8866           if (strcmp ("none", p) != 0)
8867             goto invalid_kind;
8868           kind = OMP_CLAUSE_DEFAULT_NONE;
8869           break;
8870
8871         case 's':
8872           if (strcmp ("shared", p) != 0)
8873             goto invalid_kind;
8874           kind = OMP_CLAUSE_DEFAULT_SHARED;
8875           break;
8876
8877         default:
8878           goto invalid_kind;
8879         }
8880
8881       c_parser_consume_token (parser);
8882     }
8883   else
8884     {
8885     invalid_kind:
8886       c_parser_error (parser, "expected %<none%> or %<shared%>");
8887     }
8888   c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
8889
8890   if (kind == OMP_CLAUSE_DEFAULT_UNSPECIFIED)
8891     return list;
8892
8893   check_no_duplicate_clause (list, OMP_CLAUSE_DEFAULT, "default");
8894   c = build_omp_clause (loc, OMP_CLAUSE_DEFAULT);
8895   OMP_CLAUSE_CHAIN (c) = list;
8896   OMP_CLAUSE_DEFAULT_KIND (c) = kind;
8897
8898   return c;
8899 }
8900
8901 /* OpenMP 2.5:
8902    firstprivate ( variable-list ) */
8903
8904 static tree
8905 c_parser_omp_clause_firstprivate (c_parser *parser, tree list)
8906 {
8907   return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_FIRSTPRIVATE, list);
8908 }
8909
8910 /* OpenMP 3.1:
8911    final ( expression ) */
8912
8913 static tree
8914 c_parser_omp_clause_final (c_parser *parser, tree list)
8915 {
8916   location_t loc = c_parser_peek_token (parser)->location;
8917   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
8918     {
8919       tree t = c_parser_paren_condition (parser);
8920       tree c;
8921
8922       check_no_duplicate_clause (list, OMP_CLAUSE_FINAL, "final");
8923
8924       c = build_omp_clause (loc, OMP_CLAUSE_FINAL);
8925       OMP_CLAUSE_FINAL_EXPR (c) = t;
8926       OMP_CLAUSE_CHAIN (c) = list;
8927       list = c;
8928     }
8929   else
8930     c_parser_error (parser, "expected %<(%>");
8931
8932   return list;
8933 }
8934
8935 /* OpenMP 2.5:
8936    if ( expression ) */
8937
8938 static tree
8939 c_parser_omp_clause_if (c_parser *parser, tree list)
8940 {
8941   location_t loc = c_parser_peek_token (parser)->location;
8942   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
8943     {
8944       tree t = c_parser_paren_condition (parser);
8945       tree c;
8946
8947       check_no_duplicate_clause (list, OMP_CLAUSE_IF, "if");
8948
8949       c = build_omp_clause (loc, OMP_CLAUSE_IF);
8950       OMP_CLAUSE_IF_EXPR (c) = t;
8951       OMP_CLAUSE_CHAIN (c) = list;
8952       list = c;
8953     }
8954   else
8955     c_parser_error (parser, "expected %<(%>");
8956
8957   return list;
8958 }
8959
8960 /* OpenMP 2.5:
8961    lastprivate ( variable-list ) */
8962
8963 static tree
8964 c_parser_omp_clause_lastprivate (c_parser *parser, tree list)
8965 {
8966   return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_LASTPRIVATE, list);
8967 }
8968
8969 /* OpenMP 3.1:
8970    mergeable */
8971
8972 static tree
8973 c_parser_omp_clause_mergeable (c_parser *parser ATTRIBUTE_UNUSED, tree list)
8974 {
8975   tree c;
8976
8977   /* FIXME: Should we allow duplicates?  */
8978   check_no_duplicate_clause (list, OMP_CLAUSE_MERGEABLE, "mergeable");
8979
8980   c = build_omp_clause (c_parser_peek_token (parser)->location,
8981                         OMP_CLAUSE_MERGEABLE);
8982   OMP_CLAUSE_CHAIN (c) = list;
8983
8984   return c;
8985 }
8986
8987 /* OpenMP 2.5:
8988    nowait */
8989
8990 static tree
8991 c_parser_omp_clause_nowait (c_parser *parser ATTRIBUTE_UNUSED, tree list)
8992 {
8993   tree c;
8994   location_t loc = c_parser_peek_token (parser)->location;
8995
8996   check_no_duplicate_clause (list, OMP_CLAUSE_NOWAIT, "nowait");
8997
8998   c = build_omp_clause (loc, OMP_CLAUSE_NOWAIT);
8999   OMP_CLAUSE_CHAIN (c) = list;
9000   return c;
9001 }
9002
9003 /* OpenMP 2.5:
9004    num_threads ( expression ) */
9005
9006 static tree
9007 c_parser_omp_clause_num_threads (c_parser *parser, tree list)
9008 {
9009   location_t num_threads_loc = c_parser_peek_token (parser)->location;
9010   if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
9011     {
9012       location_t expr_loc = c_parser_peek_token (parser)->location;
9013       tree c, t = c_parser_expression (parser).value;
9014       mark_exp_read (t);
9015       t = c_fully_fold (t, false, NULL);
9016
9017       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
9018
9019       if (!INTEGRAL_TYPE_P (TREE_TYPE (t)))
9020         {
9021           c_parser_error (parser, "expected integer expression");
9022           return list;
9023         }
9024
9025       /* Attempt to statically determine when the number isn't positive.  */
9026       c = fold_build2_loc (expr_loc, LE_EXPR, boolean_type_node, t,
9027                        build_int_cst (TREE_TYPE (t), 0));
9028       if (CAN_HAVE_LOCATION_P (c))
9029         SET_EXPR_LOCATION (c, expr_loc);
9030       if (c == boolean_true_node)
9031         {
9032           warning_at (expr_loc, 0,
9033                       "%<num_threads%> value must be positive");
9034           t = integer_one_node;
9035         }
9036
9037       check_no_duplicate_clause (list, OMP_CLAUSE_NUM_THREADS, "num_threads");
9038
9039       c = build_omp_clause (num_threads_loc, OMP_CLAUSE_NUM_THREADS);
9040       OMP_CLAUSE_NUM_THREADS_EXPR (c) = t;
9041       OMP_CLAUSE_CHAIN (c) = list;
9042       list = c;
9043     }
9044
9045   return list;
9046 }
9047
9048 /* OpenMP 2.5:
9049    ordered */
9050
9051 static tree
9052 c_parser_omp_clause_ordered (c_parser *parser, tree list)
9053 {
9054   tree c;
9055
9056   check_no_duplicate_clause (list, OMP_CLAUSE_ORDERED, "ordered");
9057
9058   c = build_omp_clause (c_parser_peek_token (parser)->location,
9059                         OMP_CLAUSE_ORDERED);
9060   OMP_CLAUSE_CHAIN (c) = list;
9061
9062   return c;
9063 }
9064
9065 /* OpenMP 2.5:
9066    private ( variable-list ) */
9067
9068 static tree
9069 c_parser_omp_clause_private (c_parser *parser, tree list)
9070 {
9071   return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_PRIVATE, list);
9072 }
9073
9074 /* OpenMP 2.5:
9075    reduction ( reduction-operator : variable-list )
9076
9077    reduction-operator:
9078      One of: + * - & ^ | && ||
9079      
9080    OpenMP 3.1:
9081    
9082    reduction-operator:
9083      One of: + * - & ^ | && || max min  */
9084
9085 static tree
9086 c_parser_omp_clause_reduction (c_parser *parser, tree list)
9087 {
9088   location_t clause_loc = c_parser_peek_token (parser)->location;
9089   if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
9090     {
9091       enum tree_code code;
9092
9093       switch (c_parser_peek_token (parser)->type)
9094         {
9095         case CPP_PLUS:
9096           code = PLUS_EXPR;
9097           break;
9098         case CPP_MULT:
9099           code = MULT_EXPR;
9100           break;
9101         case CPP_MINUS:
9102           code = MINUS_EXPR;
9103           break;
9104         case CPP_AND:
9105           code = BIT_AND_EXPR;
9106           break;
9107         case CPP_XOR:
9108           code = BIT_XOR_EXPR;
9109           break;
9110         case CPP_OR:
9111           code = BIT_IOR_EXPR;
9112           break;
9113         case CPP_AND_AND:
9114           code = TRUTH_ANDIF_EXPR;
9115           break;
9116         case CPP_OR_OR:
9117           code = TRUTH_ORIF_EXPR;
9118           break;
9119         case CPP_NAME:
9120           {
9121             const char *p
9122               = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
9123             if (strcmp (p, "min") == 0)
9124               {
9125                 code = MIN_EXPR;
9126                 break;
9127               }
9128             if (strcmp (p, "max") == 0)
9129               {
9130                 code = MAX_EXPR;
9131                 break;
9132               }
9133           }
9134           /* FALLTHRU */
9135         default:
9136           c_parser_error (parser,
9137                           "expected %<+%>, %<*%>, %<-%>, %<&%>, "
9138                           "%<^%>, %<|%>, %<&&%>, %<||%>, %<min%> or %<max%>");
9139           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 0);
9140           return list;
9141         }
9142       c_parser_consume_token (parser);
9143       if (c_parser_require (parser, CPP_COLON, "expected %<:%>"))
9144         {
9145           tree nl, c;
9146
9147           nl = c_parser_omp_variable_list (parser, clause_loc,
9148                                            OMP_CLAUSE_REDUCTION, list);
9149           for (c = nl; c != list; c = OMP_CLAUSE_CHAIN (c))
9150             OMP_CLAUSE_REDUCTION_CODE (c) = code;
9151
9152           list = nl;
9153         }
9154       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
9155     }
9156   return list;
9157 }
9158
9159 /* OpenMP 2.5:
9160    schedule ( schedule-kind )
9161    schedule ( schedule-kind , expression )
9162
9163    schedule-kind:
9164      static | dynamic | guided | runtime | auto
9165 */
9166
9167 static tree
9168 c_parser_omp_clause_schedule (c_parser *parser, tree list)
9169 {
9170   tree c, t;
9171   location_t loc = c_parser_peek_token (parser)->location;
9172
9173   if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
9174     return list;
9175
9176   c = build_omp_clause (loc, OMP_CLAUSE_SCHEDULE);
9177
9178   if (c_parser_next_token_is (parser, CPP_NAME))
9179     {
9180       tree kind = c_parser_peek_token (parser)->value;
9181       const char *p = IDENTIFIER_POINTER (kind);
9182
9183       switch (p[0])
9184         {
9185         case 'd':
9186           if (strcmp ("dynamic", p) != 0)
9187             goto invalid_kind;
9188           OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_DYNAMIC;
9189           break;
9190
9191         case 'g':
9192           if (strcmp ("guided", p) != 0)
9193             goto invalid_kind;
9194           OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_GUIDED;
9195           break;
9196
9197         case 'r':
9198           if (strcmp ("runtime", p) != 0)
9199             goto invalid_kind;
9200           OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_RUNTIME;
9201           break;
9202
9203         default:
9204           goto invalid_kind;
9205         }
9206     }
9207   else if (c_parser_next_token_is_keyword (parser, RID_STATIC))
9208     OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_STATIC;
9209   else if (c_parser_next_token_is_keyword (parser, RID_AUTO))
9210     OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_AUTO;
9211   else
9212     goto invalid_kind;
9213
9214   c_parser_consume_token (parser);
9215   if (c_parser_next_token_is (parser, CPP_COMMA))
9216     {
9217       location_t here;
9218       c_parser_consume_token (parser);
9219
9220       here = c_parser_peek_token (parser)->location;
9221       t = c_parser_expr_no_commas (parser, NULL).value;
9222       mark_exp_read (t);
9223       t = c_fully_fold (t, false, NULL);
9224
9225       if (OMP_CLAUSE_SCHEDULE_KIND (c) == OMP_CLAUSE_SCHEDULE_RUNTIME)
9226         error_at (here, "schedule %<runtime%> does not take "
9227                   "a %<chunk_size%> parameter");
9228       else if (OMP_CLAUSE_SCHEDULE_KIND (c) == OMP_CLAUSE_SCHEDULE_AUTO)
9229         error_at (here,
9230                   "schedule %<auto%> does not take "
9231                   "a %<chunk_size%> parameter");
9232       else if (TREE_CODE (TREE_TYPE (t)) == INTEGER_TYPE)
9233         OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (c) = t;
9234       else
9235         c_parser_error (parser, "expected integer expression");
9236
9237       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
9238     }
9239   else
9240     c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
9241                                "expected %<,%> or %<)%>");
9242
9243   check_no_duplicate_clause (list, OMP_CLAUSE_SCHEDULE, "schedule");
9244   OMP_CLAUSE_CHAIN (c) = list;
9245   return c;
9246
9247  invalid_kind:
9248   c_parser_error (parser, "invalid schedule kind");
9249   c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 0);
9250   return list;
9251 }
9252
9253 /* OpenMP 2.5:
9254    shared ( variable-list ) */
9255
9256 static tree
9257 c_parser_omp_clause_shared (c_parser *parser, tree list)
9258 {
9259   return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_SHARED, list);
9260 }
9261
9262 /* OpenMP 3.0:
9263    untied */
9264
9265 static tree
9266 c_parser_omp_clause_untied (c_parser *parser ATTRIBUTE_UNUSED, tree list)
9267 {
9268   tree c;
9269
9270   /* FIXME: Should we allow duplicates?  */
9271   check_no_duplicate_clause (list, OMP_CLAUSE_UNTIED, "untied");
9272
9273   c = build_omp_clause (c_parser_peek_token (parser)->location,
9274                         OMP_CLAUSE_UNTIED);
9275   OMP_CLAUSE_CHAIN (c) = list;
9276
9277   return c;
9278 }
9279
9280 /* Parse all OpenMP clauses.  The set clauses allowed by the directive
9281    is a bitmask in MASK.  Return the list of clauses found; the result
9282    of clause default goes in *pdefault.  */
9283
9284 static tree
9285 c_parser_omp_all_clauses (c_parser *parser, unsigned int mask,
9286                           const char *where)
9287 {
9288   tree clauses = NULL;
9289   bool first = true;
9290
9291   while (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL))
9292     {
9293       location_t here;
9294       pragma_omp_clause c_kind;
9295       const char *c_name;
9296       tree prev = clauses;
9297
9298       if (!first && c_parser_next_token_is (parser, CPP_COMMA))
9299         c_parser_consume_token (parser);
9300
9301       first = false;
9302       here = c_parser_peek_token (parser)->location;
9303       c_kind = c_parser_omp_clause_name (parser);
9304
9305       switch (c_kind)
9306         {
9307         case PRAGMA_OMP_CLAUSE_COLLAPSE:
9308           clauses = c_parser_omp_clause_collapse (parser, clauses);
9309           c_name = "collapse";
9310           break;
9311         case PRAGMA_OMP_CLAUSE_COPYIN:
9312           clauses = c_parser_omp_clause_copyin (parser, clauses);
9313           c_name = "copyin";
9314           break;
9315         case PRAGMA_OMP_CLAUSE_COPYPRIVATE:
9316           clauses = c_parser_omp_clause_copyprivate (parser, clauses);
9317           c_name = "copyprivate";
9318           break;
9319         case PRAGMA_OMP_CLAUSE_DEFAULT:
9320           clauses = c_parser_omp_clause_default (parser, clauses);
9321           c_name = "default";
9322           break;
9323         case PRAGMA_OMP_CLAUSE_FIRSTPRIVATE:
9324           clauses = c_parser_omp_clause_firstprivate (parser, clauses);
9325           c_name = "firstprivate";
9326           break;
9327         case PRAGMA_OMP_CLAUSE_FINAL:
9328           clauses = c_parser_omp_clause_final (parser, clauses);
9329           c_name = "final";
9330           break;
9331         case PRAGMA_OMP_CLAUSE_IF:
9332           clauses = c_parser_omp_clause_if (parser, clauses);
9333           c_name = "if";
9334           break;
9335         case PRAGMA_OMP_CLAUSE_LASTPRIVATE:
9336           clauses = c_parser_omp_clause_lastprivate (parser, clauses);
9337           c_name = "lastprivate";
9338           break;
9339         case PRAGMA_OMP_CLAUSE_MERGEABLE:
9340           clauses = c_parser_omp_clause_mergeable (parser, clauses);
9341           c_name = "mergeable";
9342           break;
9343         case PRAGMA_OMP_CLAUSE_NOWAIT:
9344           clauses = c_parser_omp_clause_nowait (parser, clauses);
9345           c_name = "nowait";
9346           break;
9347         case PRAGMA_OMP_CLAUSE_NUM_THREADS:
9348           clauses = c_parser_omp_clause_num_threads (parser, clauses);
9349           c_name = "num_threads";
9350           break;
9351         case PRAGMA_OMP_CLAUSE_ORDERED:
9352           clauses = c_parser_omp_clause_ordered (parser, clauses);
9353           c_name = "ordered";
9354           break;
9355         case PRAGMA_OMP_CLAUSE_PRIVATE:
9356           clauses = c_parser_omp_clause_private (parser, clauses);
9357           c_name = "private";
9358           break;
9359         case PRAGMA_OMP_CLAUSE_REDUCTION:
9360           clauses = c_parser_omp_clause_reduction (parser, clauses);
9361           c_name = "reduction";
9362           break;
9363         case PRAGMA_OMP_CLAUSE_SCHEDULE:
9364           clauses = c_parser_omp_clause_schedule (parser, clauses);
9365           c_name = "schedule";
9366           break;
9367         case PRAGMA_OMP_CLAUSE_SHARED:
9368           clauses = c_parser_omp_clause_shared (parser, clauses);
9369           c_name = "shared";
9370           break;
9371         case PRAGMA_OMP_CLAUSE_UNTIED:
9372           clauses = c_parser_omp_clause_untied (parser, clauses);
9373           c_name = "untied";
9374           break;
9375         default:
9376           c_parser_error (parser, "expected %<#pragma omp%> clause");
9377           goto saw_error;
9378         }
9379
9380       if (((mask >> c_kind) & 1) == 0 && !parser->error)
9381         {
9382           /* Remove the invalid clause(s) from the list to avoid
9383              confusing the rest of the compiler.  */
9384           clauses = prev;
9385           error_at (here, "%qs is not valid for %qs", c_name, where);
9386         }
9387     }
9388
9389  saw_error:
9390   c_parser_skip_to_pragma_eol (parser);
9391
9392   return c_finish_omp_clauses (clauses);
9393 }
9394
9395 /* OpenMP 2.5:
9396    structured-block:
9397      statement
9398
9399    In practice, we're also interested in adding the statement to an
9400    outer node.  So it is convenient if we work around the fact that
9401    c_parser_statement calls add_stmt.  */
9402
9403 static tree
9404 c_parser_omp_structured_block (c_parser *parser)
9405 {
9406   tree stmt = push_stmt_list ();
9407   c_parser_statement (parser);
9408   return pop_stmt_list (stmt);
9409 }
9410
9411 /* OpenMP 2.5:
9412    # pragma omp atomic new-line
9413      expression-stmt
9414
9415    expression-stmt:
9416      x binop= expr | x++ | ++x | x-- | --x
9417    binop:
9418      +, *, -, /, &, ^, |, <<, >>
9419
9420   where x is an lvalue expression with scalar type.
9421
9422    OpenMP 3.1:
9423    # pragma omp atomic new-line
9424      update-stmt
9425
9426    # pragma omp atomic read new-line
9427      read-stmt
9428
9429    # pragma omp atomic write new-line
9430      write-stmt
9431
9432    # pragma omp atomic update new-line
9433      update-stmt
9434
9435    # pragma omp atomic capture new-line
9436      capture-stmt
9437
9438    # pragma omp atomic capture new-line
9439      capture-block
9440
9441    read-stmt:
9442      v = x
9443    write-stmt:
9444      x = expr
9445    update-stmt:
9446      expression-stmt | x = x binop expr
9447    capture-stmt:
9448      v = x binop= expr | v = x++ | v = ++x | v = x-- | v = --x
9449    capture-block:
9450      { v = x; update-stmt; } | { update-stmt; v = x; }
9451
9452   where x and v are lvalue expressions with scalar type.
9453
9454   LOC is the location of the #pragma token.  */
9455
9456 static void
9457 c_parser_omp_atomic (location_t loc, c_parser *parser)
9458 {
9459   tree lhs = NULL_TREE, rhs = NULL_TREE, v = NULL_TREE;
9460   tree lhs1 = NULL_TREE, rhs1 = NULL_TREE;
9461   tree stmt, orig_lhs;
9462   enum tree_code code = OMP_ATOMIC, opcode = NOP_EXPR;
9463   struct c_expr rhs_expr;
9464   bool structured_block = false;
9465
9466   if (c_parser_next_token_is (parser, CPP_NAME))
9467     {
9468       const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
9469
9470       if (!strcmp (p, "read"))
9471         code = OMP_ATOMIC_READ;
9472       else if (!strcmp (p, "write"))
9473         code = NOP_EXPR;
9474       else if (!strcmp (p, "update"))
9475         code = OMP_ATOMIC;
9476       else if (!strcmp (p, "capture"))
9477         code = OMP_ATOMIC_CAPTURE_NEW;
9478       else
9479         p = NULL;
9480       if (p)
9481         c_parser_consume_token (parser);
9482     }
9483   c_parser_skip_to_pragma_eol (parser);
9484
9485   switch (code)
9486     {
9487     case OMP_ATOMIC_READ:
9488     case NOP_EXPR: /* atomic write */
9489       v = c_parser_unary_expression (parser).value;
9490       v = c_fully_fold (v, false, NULL);
9491       if (v == error_mark_node)
9492         goto saw_error;
9493       loc = c_parser_peek_token (parser)->location;
9494       if (!c_parser_require (parser, CPP_EQ, "expected %<=%>"))
9495         goto saw_error;
9496       if (code == NOP_EXPR)
9497         lhs = c_parser_expression (parser).value;
9498       else
9499         lhs = c_parser_unary_expression (parser).value;
9500       lhs = c_fully_fold (lhs, false, NULL);
9501       if (lhs == error_mark_node)
9502         goto saw_error;
9503       if (code == NOP_EXPR)
9504         {
9505           /* atomic write is represented by OMP_ATOMIC with NOP_EXPR
9506              opcode.  */
9507           code = OMP_ATOMIC;
9508           rhs = lhs;
9509           lhs = v;
9510           v = NULL_TREE;
9511         }
9512       goto done;
9513     case OMP_ATOMIC_CAPTURE_NEW:
9514       if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
9515         {
9516           c_parser_consume_token (parser);
9517           structured_block = true;
9518         }
9519       else
9520         {
9521           v = c_parser_unary_expression (parser).value;
9522           v = c_fully_fold (v, false, NULL);
9523           if (v == error_mark_node)
9524             goto saw_error;
9525           if (!c_parser_require (parser, CPP_EQ, "expected %<=%>"))
9526             goto saw_error;
9527         }
9528       break;
9529     default:
9530       break;
9531     }
9532
9533   /* For structured_block case we don't know yet whether
9534      old or new x should be captured.  */
9535 restart:
9536   lhs = c_parser_unary_expression (parser).value;
9537   lhs = c_fully_fold (lhs, false, NULL);
9538   orig_lhs = lhs;
9539   switch (TREE_CODE (lhs))
9540     {
9541     case ERROR_MARK:
9542     saw_error:
9543       c_parser_skip_to_end_of_block_or_statement (parser);
9544       if (structured_block)
9545         {
9546           if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
9547             c_parser_consume_token (parser);
9548           else if (code == OMP_ATOMIC_CAPTURE_NEW)
9549             {
9550               c_parser_skip_to_end_of_block_or_statement (parser);
9551               if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
9552                 c_parser_consume_token (parser);
9553             }
9554         }
9555       return;
9556
9557     case POSTINCREMENT_EXPR:
9558       if (code == OMP_ATOMIC_CAPTURE_NEW && !structured_block)
9559         code = OMP_ATOMIC_CAPTURE_OLD;
9560       /* FALLTHROUGH */
9561     case PREINCREMENT_EXPR:
9562       lhs = TREE_OPERAND (lhs, 0);
9563       opcode = PLUS_EXPR;
9564       rhs = integer_one_node;
9565       break;
9566
9567     case POSTDECREMENT_EXPR:
9568       if (code == OMP_ATOMIC_CAPTURE_NEW && !structured_block)
9569         code = OMP_ATOMIC_CAPTURE_OLD;
9570       /* FALLTHROUGH */
9571     case PREDECREMENT_EXPR:
9572       lhs = TREE_OPERAND (lhs, 0);
9573       opcode = MINUS_EXPR;
9574       rhs = integer_one_node;
9575       break;
9576
9577     case COMPOUND_EXPR:
9578       if (TREE_CODE (TREE_OPERAND (lhs, 0)) == SAVE_EXPR
9579           && TREE_CODE (TREE_OPERAND (lhs, 1)) == COMPOUND_EXPR
9580           && TREE_CODE (TREE_OPERAND (TREE_OPERAND (lhs, 1), 0)) == MODIFY_EXPR
9581           && TREE_OPERAND (TREE_OPERAND (lhs, 1), 1) == TREE_OPERAND (lhs, 0)
9582           && TREE_CODE (TREE_TYPE (TREE_OPERAND (TREE_OPERAND
9583                                               (TREE_OPERAND (lhs, 1), 0), 0)))
9584              == BOOLEAN_TYPE)
9585         /* Undo effects of boolean_increment for post {in,de}crement.  */
9586         lhs = TREE_OPERAND (TREE_OPERAND (lhs, 1), 0);
9587       /* FALLTHRU */
9588     case MODIFY_EXPR:
9589       if (TREE_CODE (lhs) == MODIFY_EXPR
9590           && TREE_CODE (TREE_TYPE (TREE_OPERAND (lhs, 0))) == BOOLEAN_TYPE)
9591         {
9592           /* Undo effects of boolean_increment.  */
9593           if (integer_onep (TREE_OPERAND (lhs, 1)))
9594             {
9595               /* This is pre or post increment.  */
9596               rhs = TREE_OPERAND (lhs, 1);
9597               lhs = TREE_OPERAND (lhs, 0);
9598               opcode = NOP_EXPR;
9599               if (code == OMP_ATOMIC_CAPTURE_NEW
9600                   && !structured_block
9601                   && TREE_CODE (orig_lhs) == COMPOUND_EXPR)
9602                 code = OMP_ATOMIC_CAPTURE_OLD;
9603               break;
9604             }
9605           if (TREE_CODE (TREE_OPERAND (lhs, 1)) == TRUTH_NOT_EXPR
9606               && TREE_OPERAND (lhs, 0)
9607                  == TREE_OPERAND (TREE_OPERAND (lhs, 1), 0))
9608             {
9609               /* This is pre or post decrement.  */
9610               rhs = TREE_OPERAND (lhs, 1);
9611               lhs = TREE_OPERAND (lhs, 0);
9612               opcode = NOP_EXPR;
9613               if (code == OMP_ATOMIC_CAPTURE_NEW
9614                   && !structured_block
9615                   && TREE_CODE (orig_lhs) == COMPOUND_EXPR)
9616                 code = OMP_ATOMIC_CAPTURE_OLD;
9617               break;
9618             }
9619         }
9620       /* FALLTHRU */
9621     default:
9622       switch (c_parser_peek_token (parser)->type)
9623         {
9624         case CPP_MULT_EQ:
9625           opcode = MULT_EXPR;
9626           break;
9627         case CPP_DIV_EQ:
9628           opcode = TRUNC_DIV_EXPR;
9629           break;
9630         case CPP_PLUS_EQ:
9631           opcode = PLUS_EXPR;
9632           break;
9633         case CPP_MINUS_EQ:
9634           opcode = MINUS_EXPR;
9635           break;
9636         case CPP_LSHIFT_EQ:
9637           opcode = LSHIFT_EXPR;
9638           break;
9639         case CPP_RSHIFT_EQ:
9640           opcode = RSHIFT_EXPR;
9641           break;
9642         case CPP_AND_EQ:
9643           opcode = BIT_AND_EXPR;
9644           break;
9645         case CPP_OR_EQ:
9646           opcode = BIT_IOR_EXPR;
9647           break;
9648         case CPP_XOR_EQ:
9649           opcode = BIT_XOR_EXPR;
9650           break;
9651         case CPP_EQ:
9652           if (structured_block || code == OMP_ATOMIC)
9653             {
9654               location_t aloc = c_parser_peek_token (parser)->location;
9655               location_t rhs_loc;
9656               enum c_parser_prec oprec = PREC_NONE;
9657
9658               c_parser_consume_token (parser);
9659               rhs1 = c_parser_unary_expression (parser).value;
9660               rhs1 = c_fully_fold (rhs1, false, NULL);
9661               if (rhs1 == error_mark_node)
9662                 goto saw_error;
9663               switch (c_parser_peek_token (parser)->type)
9664                 {
9665                 case CPP_SEMICOLON:
9666                   if (code == OMP_ATOMIC_CAPTURE_NEW)
9667                     {
9668                       code = OMP_ATOMIC_CAPTURE_OLD;
9669                       v = lhs;
9670                       lhs = NULL_TREE;
9671                       lhs1 = rhs1;
9672                       rhs1 = NULL_TREE;
9673                       c_parser_consume_token (parser);
9674                       goto restart;
9675                     }
9676                   c_parser_error (parser,
9677                                   "invalid form of %<#pragma omp atomic%>");
9678                   goto saw_error;
9679                 case CPP_MULT:
9680                   opcode = MULT_EXPR;
9681                   oprec = PREC_MULT;
9682                   break;
9683                 case CPP_DIV:
9684                   opcode = TRUNC_DIV_EXPR;
9685                   oprec = PREC_MULT;
9686                   break;
9687                 case CPP_PLUS:
9688                   opcode = PLUS_EXPR;
9689                   oprec = PREC_ADD;
9690                   break;
9691                 case CPP_MINUS:
9692                   opcode = MINUS_EXPR;
9693                   oprec = PREC_ADD;
9694                   break;
9695                 case CPP_LSHIFT:
9696                   opcode = LSHIFT_EXPR;
9697                   oprec = PREC_SHIFT;
9698                   break;
9699                 case CPP_RSHIFT:
9700                   opcode = RSHIFT_EXPR;
9701                   oprec = PREC_SHIFT;
9702                   break;
9703                 case CPP_AND:
9704                   opcode = BIT_AND_EXPR;
9705                   oprec = PREC_BITAND;
9706                   break;
9707                 case CPP_OR:
9708                   opcode = BIT_IOR_EXPR;
9709                   oprec = PREC_BITOR;
9710                   break;
9711                 case CPP_XOR:
9712                   opcode = BIT_XOR_EXPR;
9713                   oprec = PREC_BITXOR;
9714                   break;
9715                 default:
9716                   c_parser_error (parser,
9717                                   "invalid operator for %<#pragma omp atomic%>");
9718                   goto saw_error;
9719                 }
9720               loc = aloc;
9721               c_parser_consume_token (parser);
9722               rhs_loc = c_parser_peek_token (parser)->location;
9723               if (commutative_tree_code (opcode))
9724                 oprec = (enum c_parser_prec) (oprec - 1);
9725               rhs_expr = c_parser_binary_expression (parser, NULL, oprec);
9726               rhs_expr = default_function_array_read_conversion (rhs_loc,
9727                                                                  rhs_expr);
9728               rhs = rhs_expr.value;
9729               rhs = c_fully_fold (rhs, false, NULL);
9730               goto stmt_done; 
9731             }
9732           /* FALLTHROUGH */
9733         default:
9734           c_parser_error (parser,
9735                           "invalid operator for %<#pragma omp atomic%>");
9736           goto saw_error;
9737         }
9738
9739       /* Arrange to pass the location of the assignment operator to
9740          c_finish_omp_atomic.  */
9741       loc = c_parser_peek_token (parser)->location;
9742       c_parser_consume_token (parser);
9743       {
9744         location_t rhs_loc = c_parser_peek_token (parser)->location;
9745         rhs_expr = c_parser_expression (parser);
9746         rhs_expr = default_function_array_read_conversion (rhs_loc, rhs_expr);
9747       }
9748       rhs = rhs_expr.value;
9749       rhs = c_fully_fold (rhs, false, NULL);
9750       break;
9751     }
9752 stmt_done:
9753   if (structured_block && code == OMP_ATOMIC_CAPTURE_NEW)
9754     {
9755       if (!c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>"))
9756         goto saw_error;
9757       v = c_parser_unary_expression (parser).value;
9758       v = c_fully_fold (v, false, NULL);
9759       if (v == error_mark_node)
9760         goto saw_error;
9761       if (!c_parser_require (parser, CPP_EQ, "expected %<=%>"))
9762         goto saw_error;
9763       lhs1 = c_parser_unary_expression (parser).value;
9764       lhs1 = c_fully_fold (lhs1, false, NULL);
9765       if (lhs1 == error_mark_node)
9766         goto saw_error;
9767     }
9768   if (structured_block)
9769     {
9770       c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
9771       c_parser_require (parser, CPP_CLOSE_BRACE, "expected %<}%>");
9772     }
9773 done:
9774   stmt = c_finish_omp_atomic (loc, code, opcode, lhs, rhs, v, lhs1, rhs1);
9775   if (stmt != error_mark_node)
9776     add_stmt (stmt);
9777
9778   if (!structured_block)
9779     c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
9780 }
9781
9782
9783 /* OpenMP 2.5:
9784    # pragma omp barrier new-line
9785 */
9786
9787 static void
9788 c_parser_omp_barrier (c_parser *parser)
9789 {
9790   location_t loc = c_parser_peek_token (parser)->location;
9791   c_parser_consume_pragma (parser);
9792   c_parser_skip_to_pragma_eol (parser);
9793
9794   c_finish_omp_barrier (loc);
9795 }
9796
9797 /* OpenMP 2.5:
9798    # pragma omp critical [(name)] new-line
9799      structured-block
9800
9801   LOC is the location of the #pragma itself.  */
9802
9803 static tree
9804 c_parser_omp_critical (location_t loc, c_parser *parser)
9805 {
9806   tree stmt, name = NULL;
9807
9808   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
9809     {
9810       c_parser_consume_token (parser);
9811       if (c_parser_next_token_is (parser, CPP_NAME))
9812         {
9813           name = c_parser_peek_token (parser)->value;
9814           c_parser_consume_token (parser);
9815           c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>");
9816         }
9817       else
9818         c_parser_error (parser, "expected identifier");
9819     }
9820   else if (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL))
9821     c_parser_error (parser, "expected %<(%> or end of line");
9822   c_parser_skip_to_pragma_eol (parser);
9823
9824   stmt = c_parser_omp_structured_block (parser);
9825   return c_finish_omp_critical (loc, stmt, name);
9826 }
9827
9828 /* OpenMP 2.5:
9829    # pragma omp flush flush-vars[opt] new-line
9830
9831    flush-vars:
9832      ( variable-list ) */
9833
9834 static void
9835 c_parser_omp_flush (c_parser *parser)
9836 {
9837   location_t loc = c_parser_peek_token (parser)->location;
9838   c_parser_consume_pragma (parser);
9839   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
9840     c_parser_omp_var_list_parens (parser, OMP_CLAUSE_ERROR, NULL);
9841   else if (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL))
9842     c_parser_error (parser, "expected %<(%> or end of line");
9843   c_parser_skip_to_pragma_eol (parser);
9844
9845   c_finish_omp_flush (loc);
9846 }
9847
9848 /* Parse the restricted form of the for statement allowed by OpenMP.
9849    The real trick here is to determine the loop control variable early
9850    so that we can push a new decl if necessary to make it private.
9851    LOC is the location of the OMP in "#pragma omp".  */
9852
9853 static tree
9854 c_parser_omp_for_loop (location_t loc,
9855                        c_parser *parser, tree clauses, tree *par_clauses)
9856 {
9857   tree decl, cond, incr, save_break, save_cont, body, init, stmt, cl;
9858   tree declv, condv, incrv, initv, ret = NULL;
9859   bool fail = false, open_brace_parsed = false;
9860   int i, collapse = 1, nbraces = 0;
9861   location_t for_loc;
9862   VEC(tree,gc) *for_block = make_tree_vector ();
9863
9864   for (cl = clauses; cl; cl = OMP_CLAUSE_CHAIN (cl))
9865     if (OMP_CLAUSE_CODE (cl) == OMP_CLAUSE_COLLAPSE)
9866       collapse = tree_low_cst (OMP_CLAUSE_COLLAPSE_EXPR (cl), 0);
9867
9868   gcc_assert (collapse >= 1);
9869
9870   declv = make_tree_vec (collapse);
9871   initv = make_tree_vec (collapse);
9872   condv = make_tree_vec (collapse);
9873   incrv = make_tree_vec (collapse);
9874
9875   if (!c_parser_next_token_is_keyword (parser, RID_FOR))
9876     {
9877       c_parser_error (parser, "for statement expected");
9878       return NULL;
9879     }
9880   for_loc = c_parser_peek_token (parser)->location;
9881   c_parser_consume_token (parser);
9882
9883   for (i = 0; i < collapse; i++)
9884     {
9885       int bracecount = 0;
9886
9887       if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
9888         goto pop_scopes;
9889
9890       /* Parse the initialization declaration or expression.  */
9891       if (c_parser_next_tokens_start_declaration (parser))
9892         {
9893           if (i > 0)
9894             VEC_safe_push (tree, gc, for_block, c_begin_compound_stmt (true));
9895           c_parser_declaration_or_fndef (parser, true, true, true, true, true, NULL);
9896           decl = check_for_loop_decls (for_loc, flag_isoc99);
9897           if (decl == NULL)
9898             goto error_init;
9899           if (DECL_INITIAL (decl) == error_mark_node)
9900             decl = error_mark_node;
9901           init = decl;
9902         }
9903       else if (c_parser_next_token_is (parser, CPP_NAME)
9904                && c_parser_peek_2nd_token (parser)->type == CPP_EQ)
9905         {
9906           struct c_expr decl_exp;
9907           struct c_expr init_exp;
9908           location_t init_loc;
9909
9910           decl_exp = c_parser_postfix_expression (parser);
9911           decl = decl_exp.value;
9912
9913           c_parser_require (parser, CPP_EQ, "expected %<=%>");
9914
9915           init_loc = c_parser_peek_token (parser)->location;
9916           init_exp = c_parser_expr_no_commas (parser, NULL);
9917           init_exp = default_function_array_read_conversion (init_loc,
9918                                                              init_exp);
9919           init = build_modify_expr (init_loc, decl, decl_exp.original_type,
9920                                     NOP_EXPR, init_loc, init_exp.value,
9921                                     init_exp.original_type);
9922           init = c_process_expr_stmt (init_loc, init);
9923
9924           c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
9925         }
9926       else
9927         {
9928         error_init:
9929           c_parser_error (parser,
9930                           "expected iteration declaration or initialization");
9931           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
9932                                      "expected %<)%>");
9933           fail = true;
9934           goto parse_next;
9935         }
9936
9937       /* Parse the loop condition.  */
9938       cond = NULL_TREE;
9939       if (c_parser_next_token_is_not (parser, CPP_SEMICOLON))
9940         {
9941           location_t cond_loc = c_parser_peek_token (parser)->location;
9942           struct c_expr cond_expr = c_parser_binary_expression (parser, NULL,
9943                                                                 PREC_NONE);
9944
9945           cond = cond_expr.value;
9946           cond = c_objc_common_truthvalue_conversion (cond_loc, cond);
9947           cond = c_fully_fold (cond, false, NULL);
9948           switch (cond_expr.original_code)
9949             {
9950             case GT_EXPR:
9951             case GE_EXPR:
9952             case LT_EXPR:
9953             case LE_EXPR:
9954               break;
9955             default:
9956               /* Can't be cond = error_mark_node, because we want to preserve
9957                  the location until c_finish_omp_for.  */
9958               cond = build1 (NOP_EXPR, boolean_type_node, error_mark_node);
9959               break;
9960             }
9961           protected_set_expr_location (cond, cond_loc);
9962         }
9963       c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
9964
9965       /* Parse the increment expression.  */
9966       incr = NULL_TREE;
9967       if (c_parser_next_token_is_not (parser, CPP_CLOSE_PAREN))
9968         {
9969           location_t incr_loc = c_parser_peek_token (parser)->location;
9970
9971           incr = c_process_expr_stmt (incr_loc,
9972                                       c_parser_expression (parser).value);
9973         }
9974       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
9975
9976       if (decl == NULL || decl == error_mark_node || init == error_mark_node)
9977         fail = true;
9978       else
9979         {
9980           TREE_VEC_ELT (declv, i) = decl;
9981           TREE_VEC_ELT (initv, i) = init;
9982           TREE_VEC_ELT (condv, i) = cond;
9983           TREE_VEC_ELT (incrv, i) = incr;
9984         }
9985
9986     parse_next:
9987       if (i == collapse - 1)
9988         break;
9989
9990       /* FIXME: OpenMP 3.0 draft isn't very clear on what exactly is allowed
9991          in between the collapsed for loops to be still considered perfectly
9992          nested.  Hopefully the final version clarifies this.
9993          For now handle (multiple) {'s and empty statements.  */
9994       do
9995         {
9996           if (c_parser_next_token_is_keyword (parser, RID_FOR))
9997             {
9998               c_parser_consume_token (parser);
9999               break;
10000             }
10001           else if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
10002             {
10003               c_parser_consume_token (parser);
10004               bracecount++;
10005             }
10006           else if (bracecount
10007                    && c_parser_next_token_is (parser, CPP_SEMICOLON))
10008             c_parser_consume_token (parser);
10009           else
10010             {
10011               c_parser_error (parser, "not enough perfectly nested loops");
10012               if (bracecount)
10013                 {
10014                   open_brace_parsed = true;
10015                   bracecount--;
10016                 }
10017               fail = true;
10018               collapse = 0;
10019               break;
10020             }
10021         }
10022       while (1);
10023
10024       nbraces += bracecount;
10025     }
10026
10027   save_break = c_break_label;
10028   c_break_label = size_one_node;
10029   save_cont = c_cont_label;
10030   c_cont_label = NULL_TREE;
10031   body = push_stmt_list ();
10032
10033   if (open_brace_parsed)
10034     {
10035       location_t here = c_parser_peek_token (parser)->location;
10036       stmt = c_begin_compound_stmt (true);
10037       c_parser_compound_statement_nostart (parser);
10038       add_stmt (c_end_compound_stmt (here, stmt, true));
10039     }
10040   else
10041     add_stmt (c_parser_c99_block_statement (parser));
10042   if (c_cont_label)
10043     {
10044       tree t = build1 (LABEL_EXPR, void_type_node, c_cont_label);
10045       SET_EXPR_LOCATION (t, loc);
10046       add_stmt (t);
10047     }
10048
10049   body = pop_stmt_list (body);
10050   c_break_label = save_break;
10051   c_cont_label = save_cont;
10052
10053   while (nbraces)
10054     {
10055       if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
10056         {
10057           c_parser_consume_token (parser);
10058           nbraces--;
10059         }
10060       else if (c_parser_next_token_is (parser, CPP_SEMICOLON))
10061         c_parser_consume_token (parser);
10062       else
10063         {
10064           c_parser_error (parser, "collapsed loops not perfectly nested");
10065           while (nbraces)
10066             {
10067               location_t here = c_parser_peek_token (parser)->location;
10068               stmt = c_begin_compound_stmt (true);
10069               add_stmt (body);
10070               c_parser_compound_statement_nostart (parser);
10071               body = c_end_compound_stmt (here, stmt, true);
10072               nbraces--;
10073             }
10074           goto pop_scopes;
10075         }
10076     }
10077
10078   /* Only bother calling c_finish_omp_for if we haven't already generated
10079      an error from the initialization parsing.  */
10080   if (!fail)
10081     {
10082       stmt = c_finish_omp_for (loc, declv, initv, condv, incrv, body, NULL);
10083       if (stmt)
10084         {
10085           if (par_clauses != NULL)
10086             {
10087               tree *c;
10088               for (c = par_clauses; *c ; )
10089                 if (OMP_CLAUSE_CODE (*c) != OMP_CLAUSE_FIRSTPRIVATE
10090                     && OMP_CLAUSE_CODE (*c) != OMP_CLAUSE_LASTPRIVATE)
10091                   c = &OMP_CLAUSE_CHAIN (*c);
10092                 else
10093                   {
10094                     for (i = 0; i < collapse; i++)
10095                       if (TREE_VEC_ELT (declv, i) == OMP_CLAUSE_DECL (*c))
10096                         break;
10097                     if (i == collapse)
10098                       c = &OMP_CLAUSE_CHAIN (*c);
10099                     else if (OMP_CLAUSE_CODE (*c) == OMP_CLAUSE_FIRSTPRIVATE)
10100                       {
10101                         error_at (loc,
10102                                   "iteration variable %qD should not be firstprivate",
10103                                   OMP_CLAUSE_DECL (*c));
10104                         *c = OMP_CLAUSE_CHAIN (*c);
10105                       }
10106                     else
10107                       {
10108                         /* Copy lastprivate (decl) clause to OMP_FOR_CLAUSES,
10109                            change it to shared (decl) in
10110                            OMP_PARALLEL_CLAUSES.  */
10111                         tree l = build_omp_clause (OMP_CLAUSE_LOCATION (*c),
10112                                                    OMP_CLAUSE_LASTPRIVATE);
10113                         OMP_CLAUSE_DECL (l) = OMP_CLAUSE_DECL (*c);
10114                         OMP_CLAUSE_CHAIN (l) = clauses;
10115                         clauses = l;
10116                         OMP_CLAUSE_SET_CODE (*c, OMP_CLAUSE_SHARED);
10117                       }
10118                   }
10119             }
10120           OMP_FOR_CLAUSES (stmt) = clauses;
10121         }
10122       ret = stmt;
10123     }
10124 pop_scopes:
10125   while (!VEC_empty (tree, for_block))
10126     {
10127       /* FIXME diagnostics: LOC below should be the actual location of
10128          this particular for block.  We need to build a list of
10129          locations to go along with FOR_BLOCK.  */
10130       stmt = c_end_compound_stmt (loc, VEC_pop (tree, for_block), true);
10131       add_stmt (stmt);
10132     }
10133   release_tree_vector (for_block);
10134   return ret;
10135 }
10136
10137 /* OpenMP 2.5:
10138    #pragma omp for for-clause[optseq] new-line
10139      for-loop
10140
10141    LOC is the location of the #pragma token.
10142 */
10143
10144 #define OMP_FOR_CLAUSE_MASK                             \
10145         ( (1u << PRAGMA_OMP_CLAUSE_PRIVATE)             \
10146         | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)        \
10147         | (1u << PRAGMA_OMP_CLAUSE_LASTPRIVATE)         \
10148         | (1u << PRAGMA_OMP_CLAUSE_REDUCTION)           \
10149         | (1u << PRAGMA_OMP_CLAUSE_ORDERED)             \
10150         | (1u << PRAGMA_OMP_CLAUSE_SCHEDULE)            \
10151         | (1u << PRAGMA_OMP_CLAUSE_COLLAPSE)            \
10152         | (1u << PRAGMA_OMP_CLAUSE_NOWAIT))
10153
10154 static tree
10155 c_parser_omp_for (location_t loc, c_parser *parser)
10156 {
10157   tree block, clauses, ret;
10158
10159   clauses = c_parser_omp_all_clauses (parser, OMP_FOR_CLAUSE_MASK,
10160                                       "#pragma omp for");
10161
10162   block = c_begin_compound_stmt (true);
10163   ret = c_parser_omp_for_loop (loc, parser, clauses, NULL);
10164   block = c_end_compound_stmt (loc, block, true);
10165   add_stmt (block);
10166
10167   return ret;
10168 }
10169
10170 /* OpenMP 2.5:
10171    # pragma omp master new-line
10172      structured-block
10173
10174    LOC is the location of the #pragma token.
10175 */
10176
10177 static tree
10178 c_parser_omp_master (location_t loc, c_parser *parser)
10179 {
10180   c_parser_skip_to_pragma_eol (parser);
10181   return c_finish_omp_master (loc, c_parser_omp_structured_block (parser));
10182 }
10183
10184 /* OpenMP 2.5:
10185    # pragma omp ordered new-line
10186      structured-block
10187
10188    LOC is the location of the #pragma itself.
10189 */
10190
10191 static tree
10192 c_parser_omp_ordered (location_t loc, c_parser *parser)
10193 {
10194   c_parser_skip_to_pragma_eol (parser);
10195   return c_finish_omp_ordered (loc, c_parser_omp_structured_block (parser));
10196 }
10197
10198 /* OpenMP 2.5:
10199
10200    section-scope:
10201      { section-sequence }
10202
10203    section-sequence:
10204      section-directive[opt] structured-block
10205      section-sequence section-directive structured-block
10206
10207     SECTIONS_LOC is the location of the #pragma omp sections.  */
10208
10209 static tree
10210 c_parser_omp_sections_scope (location_t sections_loc, c_parser *parser)
10211 {
10212   tree stmt, substmt;
10213   bool error_suppress = false;
10214   location_t loc;
10215
10216   loc = c_parser_peek_token (parser)->location;
10217   if (!c_parser_require (parser, CPP_OPEN_BRACE, "expected %<{%>"))
10218     {
10219       /* Avoid skipping until the end of the block.  */
10220       parser->error = false;
10221       return NULL_TREE;
10222     }
10223
10224   stmt = push_stmt_list ();
10225
10226   if (c_parser_peek_token (parser)->pragma_kind != PRAGMA_OMP_SECTION)
10227     {
10228       substmt = push_stmt_list ();
10229
10230       while (1)
10231         {
10232           c_parser_statement (parser);
10233
10234           if (c_parser_peek_token (parser)->pragma_kind == PRAGMA_OMP_SECTION)
10235             break;
10236           if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
10237             break;
10238           if (c_parser_next_token_is (parser, CPP_EOF))
10239             break;
10240         }
10241
10242       substmt = pop_stmt_list (substmt);
10243       substmt = build1 (OMP_SECTION, void_type_node, substmt);
10244       SET_EXPR_LOCATION (substmt, loc);
10245       add_stmt (substmt);
10246     }
10247
10248   while (1)
10249     {
10250       if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
10251         break;
10252       if (c_parser_next_token_is (parser, CPP_EOF))
10253         break;
10254
10255       loc = c_parser_peek_token (parser)->location;
10256       if (c_parser_peek_token (parser)->pragma_kind == PRAGMA_OMP_SECTION)
10257         {
10258           c_parser_consume_pragma (parser);
10259           c_parser_skip_to_pragma_eol (parser);
10260           error_suppress = false;
10261         }
10262       else if (!error_suppress)
10263         {
10264           error_at (loc, "expected %<#pragma omp section%> or %<}%>");
10265           error_suppress = true;
10266         }
10267
10268       substmt = c_parser_omp_structured_block (parser);
10269       substmt = build1 (OMP_SECTION, void_type_node, substmt);
10270       SET_EXPR_LOCATION (substmt, loc);
10271       add_stmt (substmt);
10272     }
10273   c_parser_skip_until_found (parser, CPP_CLOSE_BRACE,
10274                              "expected %<#pragma omp section%> or %<}%>");
10275
10276   substmt = pop_stmt_list (stmt);
10277
10278   stmt = make_node (OMP_SECTIONS);
10279   SET_EXPR_LOCATION (stmt, sections_loc);
10280   TREE_TYPE (stmt) = void_type_node;
10281   OMP_SECTIONS_BODY (stmt) = substmt;
10282
10283   return add_stmt (stmt);
10284 }
10285
10286 /* OpenMP 2.5:
10287    # pragma omp sections sections-clause[optseq] newline
10288      sections-scope
10289
10290    LOC is the location of the #pragma token.
10291 */
10292
10293 #define OMP_SECTIONS_CLAUSE_MASK                        \
10294         ( (1u << PRAGMA_OMP_CLAUSE_PRIVATE)             \
10295         | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)        \
10296         | (1u << PRAGMA_OMP_CLAUSE_LASTPRIVATE)         \
10297         | (1u << PRAGMA_OMP_CLAUSE_REDUCTION)           \
10298         | (1u << PRAGMA_OMP_CLAUSE_NOWAIT))
10299
10300 static tree
10301 c_parser_omp_sections (location_t loc, c_parser *parser)
10302 {
10303   tree block, clauses, ret;
10304
10305   clauses = c_parser_omp_all_clauses (parser, OMP_SECTIONS_CLAUSE_MASK,
10306                                       "#pragma omp sections");
10307
10308   block = c_begin_compound_stmt (true);
10309   ret = c_parser_omp_sections_scope (loc, parser);
10310   if (ret)
10311     OMP_SECTIONS_CLAUSES (ret) = clauses;
10312   block = c_end_compound_stmt (loc, block, true);
10313   add_stmt (block);
10314
10315   return ret;
10316 }
10317
10318 /* OpenMP 2.5:
10319    # pragma parallel parallel-clause new-line
10320    # pragma parallel for parallel-for-clause new-line
10321    # pragma parallel sections parallel-sections-clause new-line
10322
10323    LOC is the location of the #pragma token.
10324 */
10325
10326 #define OMP_PARALLEL_CLAUSE_MASK                        \
10327         ( (1u << PRAGMA_OMP_CLAUSE_IF)                  \
10328         | (1u << PRAGMA_OMP_CLAUSE_PRIVATE)             \
10329         | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)        \
10330         | (1u << PRAGMA_OMP_CLAUSE_DEFAULT)             \
10331         | (1u << PRAGMA_OMP_CLAUSE_SHARED)              \
10332         | (1u << PRAGMA_OMP_CLAUSE_COPYIN)              \
10333         | (1u << PRAGMA_OMP_CLAUSE_REDUCTION)           \
10334         | (1u << PRAGMA_OMP_CLAUSE_NUM_THREADS))
10335
10336 static tree
10337 c_parser_omp_parallel (location_t loc, c_parser *parser)
10338 {
10339   enum pragma_kind p_kind = PRAGMA_OMP_PARALLEL;
10340   const char *p_name = "#pragma omp parallel";
10341   tree stmt, clauses, par_clause, ws_clause, block;
10342   unsigned int mask = OMP_PARALLEL_CLAUSE_MASK;
10343
10344   if (c_parser_next_token_is_keyword (parser, RID_FOR))
10345     {
10346       c_parser_consume_token (parser);
10347       p_kind = PRAGMA_OMP_PARALLEL_FOR;
10348       p_name = "#pragma omp parallel for";
10349       mask |= OMP_FOR_CLAUSE_MASK;
10350       mask &= ~(1u << PRAGMA_OMP_CLAUSE_NOWAIT);
10351     }
10352   else if (c_parser_next_token_is (parser, CPP_NAME))
10353     {
10354       const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
10355       if (strcmp (p, "sections") == 0)
10356         {
10357           c_parser_consume_token (parser);
10358           p_kind = PRAGMA_OMP_PARALLEL_SECTIONS;
10359           p_name = "#pragma omp parallel sections";
10360           mask |= OMP_SECTIONS_CLAUSE_MASK;
10361           mask &= ~(1u << PRAGMA_OMP_CLAUSE_NOWAIT);
10362         }
10363     }
10364
10365   clauses = c_parser_omp_all_clauses (parser, mask, p_name);
10366
10367   switch (p_kind)
10368     {
10369     case PRAGMA_OMP_PARALLEL:
10370       block = c_begin_omp_parallel ();
10371       c_parser_statement (parser);
10372       stmt = c_finish_omp_parallel (loc, clauses, block);
10373       break;
10374
10375     case PRAGMA_OMP_PARALLEL_FOR:
10376       block = c_begin_omp_parallel ();
10377       c_split_parallel_clauses (loc, clauses, &par_clause, &ws_clause);
10378       c_parser_omp_for_loop (loc, parser, ws_clause, &par_clause);
10379       stmt = c_finish_omp_parallel (loc, par_clause, block);
10380       OMP_PARALLEL_COMBINED (stmt) = 1;
10381       break;
10382
10383     case PRAGMA_OMP_PARALLEL_SECTIONS:
10384       block = c_begin_omp_parallel ();
10385       c_split_parallel_clauses (loc, clauses, &par_clause, &ws_clause);
10386       stmt = c_parser_omp_sections_scope (loc, parser);
10387       if (stmt)
10388         OMP_SECTIONS_CLAUSES (stmt) = ws_clause;
10389       stmt = c_finish_omp_parallel (loc, par_clause, block);
10390       OMP_PARALLEL_COMBINED (stmt) = 1;
10391       break;
10392
10393     default:
10394       gcc_unreachable ();
10395     }
10396
10397   return stmt;
10398 }
10399
10400 /* OpenMP 2.5:
10401    # pragma omp single single-clause[optseq] new-line
10402      structured-block
10403
10404    LOC is the location of the #pragma.
10405 */
10406
10407 #define OMP_SINGLE_CLAUSE_MASK                          \
10408         ( (1u << PRAGMA_OMP_CLAUSE_PRIVATE)             \
10409         | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)        \
10410         | (1u << PRAGMA_OMP_CLAUSE_COPYPRIVATE)         \
10411         | (1u << PRAGMA_OMP_CLAUSE_NOWAIT))
10412
10413 static tree
10414 c_parser_omp_single (location_t loc, c_parser *parser)
10415 {
10416   tree stmt = make_node (OMP_SINGLE);
10417   SET_EXPR_LOCATION (stmt, loc);
10418   TREE_TYPE (stmt) = void_type_node;
10419
10420   OMP_SINGLE_CLAUSES (stmt)
10421     = c_parser_omp_all_clauses (parser, OMP_SINGLE_CLAUSE_MASK,
10422                                 "#pragma omp single");
10423   OMP_SINGLE_BODY (stmt) = c_parser_omp_structured_block (parser);
10424
10425   return add_stmt (stmt);
10426 }
10427
10428 /* OpenMP 3.0:
10429    # pragma omp task task-clause[optseq] new-line
10430
10431    LOC is the location of the #pragma.
10432 */
10433
10434 #define OMP_TASK_CLAUSE_MASK                            \
10435         ( (1u << PRAGMA_OMP_CLAUSE_IF)                  \
10436         | (1u << PRAGMA_OMP_CLAUSE_UNTIED)              \
10437         | (1u << PRAGMA_OMP_CLAUSE_DEFAULT)             \
10438         | (1u << PRAGMA_OMP_CLAUSE_PRIVATE)             \
10439         | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)        \
10440         | (1u << PRAGMA_OMP_CLAUSE_SHARED)              \
10441         | (1u << PRAGMA_OMP_CLAUSE_FINAL)               \
10442         | (1u << PRAGMA_OMP_CLAUSE_MERGEABLE))
10443
10444 static tree
10445 c_parser_omp_task (location_t loc, c_parser *parser)
10446 {
10447   tree clauses, block;
10448
10449   clauses = c_parser_omp_all_clauses (parser, OMP_TASK_CLAUSE_MASK,
10450                                       "#pragma omp task");
10451
10452   block = c_begin_omp_task ();
10453   c_parser_statement (parser);
10454   return c_finish_omp_task (loc, clauses, block);
10455 }
10456
10457 /* OpenMP 3.0:
10458    # pragma omp taskwait new-line
10459 */
10460
10461 static void
10462 c_parser_omp_taskwait (c_parser *parser)
10463 {
10464   location_t loc = c_parser_peek_token (parser)->location;
10465   c_parser_consume_pragma (parser);
10466   c_parser_skip_to_pragma_eol (parser);
10467
10468   c_finish_omp_taskwait (loc);
10469 }
10470
10471 /* OpenMP 3.1:
10472    # pragma omp taskyield new-line
10473 */
10474
10475 static void
10476 c_parser_omp_taskyield (c_parser *parser)
10477 {
10478   location_t loc = c_parser_peek_token (parser)->location;
10479   c_parser_consume_pragma (parser);
10480   c_parser_skip_to_pragma_eol (parser);
10481
10482   c_finish_omp_taskyield (loc);
10483 }
10484
10485 /* Main entry point to parsing most OpenMP pragmas.  */
10486
10487 static void
10488 c_parser_omp_construct (c_parser *parser)
10489 {
10490   enum pragma_kind p_kind;
10491   location_t loc;
10492   tree stmt;
10493
10494   loc = c_parser_peek_token (parser)->location;
10495   p_kind = c_parser_peek_token (parser)->pragma_kind;
10496   c_parser_consume_pragma (parser);
10497
10498   switch (p_kind)
10499     {
10500     case PRAGMA_OMP_ATOMIC:
10501       c_parser_omp_atomic (loc, parser);
10502       return;
10503     case PRAGMA_OMP_CRITICAL:
10504       stmt = c_parser_omp_critical (loc, parser);
10505       break;
10506     case PRAGMA_OMP_FOR:
10507       stmt = c_parser_omp_for (loc, parser);
10508       break;
10509     case PRAGMA_OMP_MASTER:
10510       stmt = c_parser_omp_master (loc, parser);
10511       break;
10512     case PRAGMA_OMP_ORDERED:
10513       stmt = c_parser_omp_ordered (loc, parser);
10514       break;
10515     case PRAGMA_OMP_PARALLEL:
10516       stmt = c_parser_omp_parallel (loc, parser);
10517       break;
10518     case PRAGMA_OMP_SECTIONS:
10519       stmt = c_parser_omp_sections (loc, parser);
10520       break;
10521     case PRAGMA_OMP_SINGLE:
10522       stmt = c_parser_omp_single (loc, parser);
10523       break;
10524     case PRAGMA_OMP_TASK:
10525       stmt = c_parser_omp_task (loc, parser);
10526       break;
10527     default:
10528       gcc_unreachable ();
10529     }
10530
10531   if (stmt)
10532     gcc_assert (EXPR_LOCATION (stmt) != UNKNOWN_LOCATION);
10533 }
10534
10535
10536 /* OpenMP 2.5:
10537    # pragma omp threadprivate (variable-list) */
10538
10539 static void
10540 c_parser_omp_threadprivate (c_parser *parser)
10541 {
10542   tree vars, t;
10543   location_t loc;
10544
10545   c_parser_consume_pragma (parser);
10546   loc = c_parser_peek_token (parser)->location;
10547   vars = c_parser_omp_var_list_parens (parser, OMP_CLAUSE_ERROR, NULL);
10548
10549   /* Mark every variable in VARS to be assigned thread local storage.  */
10550   for (t = vars; t; t = TREE_CHAIN (t))
10551     {
10552       tree v = TREE_PURPOSE (t);
10553
10554       /* FIXME diagnostics: Ideally we should keep individual
10555          locations for all the variables in the var list to make the
10556          following errors more precise.  Perhaps
10557          c_parser_omp_var_list_parens() should construct a list of
10558          locations to go along with the var list.  */
10559
10560       /* If V had already been marked threadprivate, it doesn't matter
10561          whether it had been used prior to this point.  */
10562       if (TREE_CODE (v) != VAR_DECL)
10563         error_at (loc, "%qD is not a variable", v);
10564       else if (TREE_USED (v) && !C_DECL_THREADPRIVATE_P (v))
10565         error_at (loc, "%qE declared %<threadprivate%> after first use", v);
10566       else if (! TREE_STATIC (v) && ! DECL_EXTERNAL (v))
10567         error_at (loc, "automatic variable %qE cannot be %<threadprivate%>", v);
10568       else if (TREE_TYPE (v) == error_mark_node)
10569         ;
10570       else if (! COMPLETE_TYPE_P (TREE_TYPE (v)))
10571         error_at (loc, "%<threadprivate%> %qE has incomplete type", v);
10572       else
10573         {
10574           if (! DECL_THREAD_LOCAL_P (v))
10575             {
10576               DECL_TLS_MODEL (v) = decl_default_tls_model (v);
10577               /* If rtl has been already set for this var, call
10578                  make_decl_rtl once again, so that encode_section_info
10579                  has a chance to look at the new decl flags.  */
10580               if (DECL_RTL_SET_P (v))
10581                 make_decl_rtl (v);
10582             }
10583           C_DECL_THREADPRIVATE_P (v) = 1;
10584         }
10585     }
10586
10587   c_parser_skip_to_pragma_eol (parser);
10588 }
10589
10590 /* Parse a transaction attribute (GCC Extension).
10591
10592    transaction-attribute:
10593      attributes
10594      [ [ any-word ] ]
10595
10596    The transactional memory language description is written for C++,
10597    and uses the C++0x attribute syntax.  For compatibility, allow the
10598    bracket style for transactions in C as well.  */
10599
10600 static tree
10601 c_parser_transaction_attributes (c_parser *parser)
10602 {
10603   tree attr_name, attr = NULL;
10604
10605   if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
10606     return c_parser_attributes (parser);
10607
10608   if (!c_parser_next_token_is (parser, CPP_OPEN_SQUARE))
10609     return NULL_TREE;
10610   c_parser_consume_token (parser);
10611   if (!c_parser_require (parser, CPP_OPEN_SQUARE, "expected %<[%>"))
10612     goto error1;
10613
10614   attr_name = c_parser_attribute_any_word (parser);
10615   if (attr_name)
10616     {
10617       c_parser_consume_token (parser);
10618       attr = build_tree_list (attr_name, NULL_TREE);
10619     }
10620   else
10621     c_parser_error (parser, "expected identifier");
10622
10623   c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, "expected %<]%>");
10624  error1:
10625   c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, "expected %<]%>");
10626   return attr;
10627 }
10628
10629 /* Parse a __transaction_atomic or __transaction_relaxed statement
10630    (GCC Extension).
10631
10632    transaction-statement:
10633      __transaction_atomic transaction-attribute[opt] compound-statement
10634      __transaction_relaxed compound-statement
10635
10636    Note that the only valid attribute is: "outer".
10637 */
10638
10639 static tree
10640 c_parser_transaction (c_parser *parser, enum rid keyword)
10641 {
10642   unsigned int old_in = parser->in_transaction;
10643   unsigned int this_in = 1, new_in;
10644   location_t loc = c_parser_peek_token (parser)->location;
10645   tree stmt, attrs;
10646
10647   gcc_assert ((keyword == RID_TRANSACTION_ATOMIC
10648       || keyword == RID_TRANSACTION_RELAXED)
10649       && c_parser_next_token_is_keyword (parser, keyword));
10650   c_parser_consume_token (parser);
10651
10652   if (keyword == RID_TRANSACTION_RELAXED)
10653     this_in |= TM_STMT_ATTR_RELAXED;
10654   else
10655     {
10656       attrs = c_parser_transaction_attributes (parser);
10657       if (attrs)
10658         this_in |= parse_tm_stmt_attr (attrs, TM_STMT_ATTR_OUTER);
10659     }
10660
10661   /* Keep track if we're in the lexical scope of an outer transaction.  */
10662   new_in = this_in | (old_in & TM_STMT_ATTR_OUTER);
10663
10664   parser->in_transaction = new_in;
10665   stmt = c_parser_compound_statement (parser);
10666   parser->in_transaction = old_in;
10667
10668   if (flag_tm)
10669     stmt = c_finish_transaction (loc, stmt, this_in);
10670   else
10671     error_at (loc, (keyword == RID_TRANSACTION_ATOMIC ?
10672         "%<__transaction_atomic%> without transactional memory support enabled"
10673         : "%<__transaction_relaxed %> "
10674         "without transactional memory support enabled"));
10675
10676   return stmt;
10677 }
10678
10679 /* Parse a __transaction_atomic or __transaction_relaxed expression
10680    (GCC Extension).
10681
10682    transaction-expression:
10683      __transaction_atomic ( expression )
10684      __transaction_relaxed ( expression )
10685 */
10686
10687 static struct c_expr
10688 c_parser_transaction_expression (c_parser *parser, enum rid keyword)
10689 {
10690   struct c_expr ret;
10691   unsigned int old_in = parser->in_transaction;
10692   unsigned int this_in = 1;
10693   location_t loc = c_parser_peek_token (parser)->location;
10694   tree attrs;
10695
10696   gcc_assert ((keyword == RID_TRANSACTION_ATOMIC
10697       || keyword == RID_TRANSACTION_RELAXED)
10698       && c_parser_next_token_is_keyword (parser, keyword));
10699   c_parser_consume_token (parser);
10700
10701   if (keyword == RID_TRANSACTION_RELAXED)
10702     this_in |= TM_STMT_ATTR_RELAXED;
10703   else
10704     {
10705       attrs = c_parser_transaction_attributes (parser);
10706       if (attrs)
10707         this_in |= parse_tm_stmt_attr (attrs, 0);
10708     }
10709
10710   parser->in_transaction = this_in;
10711   if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
10712     {
10713       tree expr = c_parser_expression (parser).value;
10714       ret.original_type = TREE_TYPE (expr);
10715       ret.value = build1 (TRANSACTION_EXPR, ret.original_type, expr);
10716       if (this_in & TM_STMT_ATTR_RELAXED)
10717         TRANSACTION_EXPR_RELAXED (ret.value) = 1;
10718       SET_EXPR_LOCATION (ret.value, loc);
10719       ret.original_code = TRANSACTION_EXPR;
10720       if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
10721         {
10722           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
10723           goto error;
10724         }
10725     }
10726   else
10727     {
10728      error:
10729       ret.value = error_mark_node;
10730       ret.original_code = ERROR_MARK;
10731       ret.original_type = NULL;
10732     }
10733   parser->in_transaction = old_in;
10734
10735   if (!flag_tm)
10736     error_at (loc, (keyword == RID_TRANSACTION_ATOMIC ?
10737         "%<__transaction_atomic%> without transactional memory support enabled"
10738         : "%<__transaction_relaxed %> "
10739         "without transactional memory support enabled"));
10740
10741   return ret;
10742 }
10743
10744 /* Parse a __transaction_cancel statement (GCC Extension).
10745
10746    transaction-cancel-statement:
10747      __transaction_cancel transaction-attribute[opt] ;
10748
10749    Note that the only valid attribute is "outer".
10750 */
10751
10752 static tree
10753 c_parser_transaction_cancel(c_parser *parser)
10754 {
10755   location_t loc = c_parser_peek_token (parser)->location;
10756   tree attrs;
10757   bool is_outer = false;
10758
10759   gcc_assert (c_parser_next_token_is_keyword (parser, RID_TRANSACTION_CANCEL));
10760   c_parser_consume_token (parser);
10761
10762   attrs = c_parser_transaction_attributes (parser);
10763   if (attrs)
10764     is_outer = (parse_tm_stmt_attr (attrs, TM_STMT_ATTR_OUTER) != 0);
10765
10766   if (!flag_tm)
10767     {
10768       error_at (loc, "%<__transaction_cancel%> without "
10769                 "transactional memory support enabled");
10770       goto ret_error;
10771     }
10772   else if (parser->in_transaction & TM_STMT_ATTR_RELAXED)
10773     {
10774       error_at (loc, "%<__transaction_cancel%> within a "
10775                 "%<__transaction_relaxed%>");
10776       goto ret_error;
10777     }
10778   else if (is_outer)
10779     {
10780       if ((parser->in_transaction & TM_STMT_ATTR_OUTER) == 0
10781           && !is_tm_may_cancel_outer (current_function_decl))
10782         {
10783           error_at (loc, "outer %<__transaction_cancel%> not "
10784                     "within outer %<__transaction_atomic%>");
10785           error_at (loc, "  or a %<transaction_may_cancel_outer%> function");
10786           goto ret_error;
10787         }
10788     }
10789   else if (parser->in_transaction == 0)
10790     {
10791       error_at (loc, "%<__transaction_cancel%> not within "
10792                 "%<__transaction_atomic%>");
10793       goto ret_error;
10794     }
10795
10796   return add_stmt (build_tm_abort_call (loc, is_outer));
10797
10798  ret_error:
10799   return build1 (NOP_EXPR, void_type_node, error_mark_node);
10800 }
10801 \f
10802 /* Parse a single source file.  */
10803
10804 void
10805 c_parse_file (void)
10806 {
10807   /* Use local storage to begin.  If the first token is a pragma, parse it.
10808      If it is #pragma GCC pch_preprocess, then this will load a PCH file
10809      which will cause garbage collection.  */
10810   c_parser tparser;
10811
10812   memset (&tparser, 0, sizeof tparser);
10813   the_parser = &tparser;
10814
10815   if (c_parser_peek_token (&tparser)->pragma_kind == PRAGMA_GCC_PCH_PREPROCESS)
10816     c_parser_pragma_pch_preprocess (&tparser);
10817
10818   the_parser = ggc_alloc_c_parser ();
10819   *the_parser = tparser;
10820
10821   /* Initialize EH, if we've been told to do so.  */
10822   if (flag_exceptions)
10823     using_eh_for_cleanups ();
10824
10825   c_parser_translation_unit (the_parser);
10826   the_parser = NULL;
10827 }
10828
10829 #include "gt-c-parser.h"