OSDN Git Service

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