OSDN Git Service

* gcc.dg/20020201-1.c: Use cleanup-coverage_files.
[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 Free Software Foundation, Inc.
4
5    Parser actions based on the old Bison parser; structure somewhat
6    influenced by and fragments based on the C++ parser.
7
8 This file is part of GCC.
9
10 GCC is free software; you can redistribute it and/or modify it under
11 the terms of the GNU General Public License as published by the Free
12 Software Foundation; either version 2, or (at your option) any later
13 version.
14
15 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
16 WARRANTY; without even the implied warranty of MERCHANTABILITY or
17 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
18 for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with GCC; see the file COPYING.  If not, write to the Free
22 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
23 02111-1307, USA.  */
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"
44 #include "tree.h"
45 #include "langhooks.h"
46 #include "input.h"
47 #include "cpplib.h"
48 #include "timevar.h"
49 #include "c-pragma.h"
50 #include "c-tree.h"
51 #include "flags.h"
52 #include "output.h"
53 #include "toplev.h"
54 #include "ggc.h"
55 #include "c-common.h"
56
57 \f
58 /* Miscellaneous data and functions needed for the parser.  */
59
60 int yydebug;
61
62 /* Objective-C specific parser/lexer information.  */
63
64 static int objc_pq_context = 0;
65
66 /* The following flag is needed to contextualize Objective-C lexical
67    analysis.  In some cases (e.g., 'int NSObject;'), it is undesirable
68    to bind an identifier to an Objective-C class, even if a class with
69    that name exists.  */
70 static int objc_need_raw_identifier = 0;
71 #define OBJC_NEED_RAW_IDENTIFIER(VAL)           \
72   do {                                          \
73     if (c_dialect_objc ())                      \
74       objc_need_raw_identifier = VAL;           \
75   } while (0)
76
77 /* The reserved keyword table.  */
78 struct resword
79 {
80   const char *word;
81   ENUM_BITFIELD(rid) rid : 16;
82   unsigned int disable   : 16;
83 };
84
85 /* Disable mask.  Keywords are disabled if (reswords[i].disable &
86    mask) is _true_.  */
87 #define D_C89   0x01    /* not in C89 */
88 #define D_EXT   0x02    /* GCC extension */
89 #define D_EXT89 0x04    /* GCC extension incorporated in C99 */
90 #define D_OBJC  0x08    /* Objective C only */
91
92 static const struct resword reswords[] =
93 {
94   { "_Bool",            RID_BOOL,       0 },
95   { "_Complex",         RID_COMPLEX,    0 },
96   { "__FUNCTION__",     RID_FUNCTION_NAME, 0 },
97   { "__PRETTY_FUNCTION__", RID_PRETTY_FUNCTION_NAME, 0 },
98   { "__alignof",        RID_ALIGNOF,    0 },
99   { "__alignof__",      RID_ALIGNOF,    0 },
100   { "__asm",            RID_ASM,        0 },
101   { "__asm__",          RID_ASM,        0 },
102   { "__attribute",      RID_ATTRIBUTE,  0 },
103   { "__attribute__",    RID_ATTRIBUTE,  0 },
104   { "__builtin_choose_expr", RID_CHOOSE_EXPR, 0 },
105   { "__builtin_offsetof", RID_OFFSETOF, 0 },
106   { "__builtin_types_compatible_p", RID_TYPES_COMPATIBLE_P, 0 },
107   { "__builtin_va_arg", RID_VA_ARG,     0 },
108   { "__complex",        RID_COMPLEX,    0 },
109   { "__complex__",      RID_COMPLEX,    0 },
110   { "__const",          RID_CONST,      0 },
111   { "__const__",        RID_CONST,      0 },
112   { "__extension__",    RID_EXTENSION,  0 },
113   { "__func__",         RID_C99_FUNCTION_NAME, 0 },
114   { "__imag",           RID_IMAGPART,   0 },
115   { "__imag__",         RID_IMAGPART,   0 },
116   { "__inline",         RID_INLINE,     0 },
117   { "__inline__",       RID_INLINE,     0 },
118   { "__label__",        RID_LABEL,      0 },
119   { "__real",           RID_REALPART,   0 },
120   { "__real__",         RID_REALPART,   0 },
121   { "__restrict",       RID_RESTRICT,   0 },
122   { "__restrict__",     RID_RESTRICT,   0 },
123   { "__signed",         RID_SIGNED,     0 },
124   { "__signed__",       RID_SIGNED,     0 },
125   { "__thread",         RID_THREAD,     0 },
126   { "__typeof",         RID_TYPEOF,     0 },
127   { "__typeof__",       RID_TYPEOF,     0 },
128   { "__volatile",       RID_VOLATILE,   0 },
129   { "__volatile__",     RID_VOLATILE,   0 },
130   { "asm",              RID_ASM,        D_EXT },
131   { "auto",             RID_AUTO,       0 },
132   { "break",            RID_BREAK,      0 },
133   { "case",             RID_CASE,       0 },
134   { "char",             RID_CHAR,       0 },
135   { "const",            RID_CONST,      0 },
136   { "continue",         RID_CONTINUE,   0 },
137   { "default",          RID_DEFAULT,    0 },
138   { "do",               RID_DO,         0 },
139   { "double",           RID_DOUBLE,     0 },
140   { "else",             RID_ELSE,       0 },
141   { "enum",             RID_ENUM,       0 },
142   { "extern",           RID_EXTERN,     0 },
143   { "float",            RID_FLOAT,      0 },
144   { "for",              RID_FOR,        0 },
145   { "goto",             RID_GOTO,       0 },
146   { "if",               RID_IF,         0 },
147   { "inline",           RID_INLINE,     D_EXT89 },
148   { "int",              RID_INT,        0 },
149   { "long",             RID_LONG,       0 },
150   { "register",         RID_REGISTER,   0 },
151   { "restrict",         RID_RESTRICT,   D_C89 },
152   { "return",           RID_RETURN,     0 },
153   { "short",            RID_SHORT,      0 },
154   { "signed",           RID_SIGNED,     0 },
155   { "sizeof",           RID_SIZEOF,     0 },
156   { "static",           RID_STATIC,     0 },
157   { "struct",           RID_STRUCT,     0 },
158   { "switch",           RID_SWITCH,     0 },
159   { "typedef",          RID_TYPEDEF,    0 },
160   { "typeof",           RID_TYPEOF,     D_EXT },
161   { "union",            RID_UNION,      0 },
162   { "unsigned",         RID_UNSIGNED,   0 },
163   { "void",             RID_VOID,       0 },
164   { "volatile",         RID_VOLATILE,   0 },
165   { "while",            RID_WHILE,      0 },
166   /* These Objective-C keywords are recognized only immediately after
167      an '@'.  */
168   { "class",            RID_AT_CLASS,           D_OBJC },
169   { "compatibility_alias", RID_AT_ALIAS,        D_OBJC },
170   { "defs",             RID_AT_DEFS,            D_OBJC },
171   { "encode",           RID_AT_ENCODE,          D_OBJC },
172   { "end",              RID_AT_END,             D_OBJC },
173   { "implementation",   RID_AT_IMPLEMENTATION,  D_OBJC },
174   { "interface",        RID_AT_INTERFACE,       D_OBJC },
175   { "private",          RID_AT_PRIVATE,         D_OBJC },
176   { "protected",        RID_AT_PROTECTED,       D_OBJC },
177   { "protocol",         RID_AT_PROTOCOL,        D_OBJC },
178   { "public",           RID_AT_PUBLIC,          D_OBJC },
179   { "selector",         RID_AT_SELECTOR,        D_OBJC },
180   { "throw",            RID_AT_THROW,           D_OBJC },
181   { "try",              RID_AT_TRY,             D_OBJC },
182   { "catch",            RID_AT_CATCH,           D_OBJC },
183   { "finally",          RID_AT_FINALLY,         D_OBJC },
184   { "synchronized",     RID_AT_SYNCHRONIZED,    D_OBJC },
185   /* These are recognized only in protocol-qualifier context
186      (see above) */
187   { "bycopy",           RID_BYCOPY,             D_OBJC },
188   { "byref",            RID_BYREF,              D_OBJC },
189   { "in",               RID_IN,                 D_OBJC },
190   { "inout",            RID_INOUT,              D_OBJC },
191   { "oneway",           RID_ONEWAY,             D_OBJC },
192   { "out",              RID_OUT,                D_OBJC },
193 };
194 #define N_reswords (sizeof reswords / sizeof (struct resword))
195
196 /* Initialization routine for this file.  */
197
198 void
199 c_parse_init (void)
200 {
201   /* The only initialization required is of the reserved word
202      identifiers.  */
203   unsigned int i;
204   tree id;
205   int mask = (flag_isoc99 ? 0 : D_C89)
206               | (flag_no_asm ? (flag_isoc99 ? D_EXT : D_EXT|D_EXT89) : 0);
207
208   if (!c_dialect_objc ())
209      mask |= D_OBJC;
210
211   ridpointers = GGC_CNEWVEC (tree, (int) RID_MAX);
212   for (i = 0; i < N_reswords; i++)
213     {
214       /* If a keyword is disabled, do not enter it into the table
215          and so create a canonical spelling that isn't a keyword.  */
216       if (reswords[i].disable & mask)
217         continue;
218
219       id = get_identifier (reswords[i].word);
220       C_RID_CODE (id) = reswords[i].rid;
221       C_IS_RESERVED_WORD (id) = 1;
222       ridpointers [(int) reswords[i].rid] = id;
223     }
224 }
225 \f
226 /* The C lexer intermediates between the lexer in cpplib and c-lex.c
227    and the C parser.  Unlike the C++ lexer, the parser structure
228    stores the lexer information instead of using a separate structure.
229    Identifiers are separated into ordinary identifiers, type names,
230    keywords and some other Objective-C types of identifiers, and some
231    look-ahead is maintained.
232
233    ??? It might be a good idea to lex the whole file up front (as for
234    C++).  It would then be possible to share more of the C and C++
235    lexer code, if desired.  */
236
237 /* The following local token type is used.  */
238
239 /* A keyword.  */
240 #define CPP_KEYWORD ((enum cpp_ttype) (N_TTYPES + 1))
241
242 /* The number of token types, including C-specific ones.  */
243 #define N_C_TTYPES ((int) (CPP_KEYWORD + 1))
244
245 /* More information about the type of a CPP_NAME token.  */
246 typedef enum c_id_kind {
247   /* An ordinary identifier.  */
248   C_ID_ID,
249   /* An identifier declared as a typedef name.  */
250   C_ID_TYPENAME,
251   /* An identifier declared as an Objective-C class name.  */
252   C_ID_CLASSNAME,
253   /* Not an identifier.  */
254   C_ID_NONE
255 } c_id_kind;
256
257 /* A single C token after string literal concatenation and conversion
258    of preprocessing tokens to tokens.  */
259 typedef struct c_token GTY (())
260 {
261   /* The kind of token.  */
262   ENUM_BITFIELD (cpp_ttype) type : 8;
263   /* If this token is a CPP_NAME, this value indicates whether also
264      declared as some kind of type.  Otherwise, it is C_ID_NONE.  */
265   ENUM_BITFIELD (c_id_kind) id_kind : 8;
266   /* If this token is a keyword, this value indicates which keyword.
267      Otherwise, this value is RID_MAX.  */
268   ENUM_BITFIELD (rid) keyword : 8;
269   /* True if this token is from a system header.  */
270   BOOL_BITFIELD in_system_header : 1;
271   /* The value associated with this token, if any.  */
272   tree value;
273   /* The location at which this token was found.  */
274   location_t location;
275 } c_token;
276
277 /* A parser structure recording information about the state and
278    context of parsing.  Includes lexer information with up to two
279    tokens of look-ahead; more are not needed for C.  */
280 typedef struct c_parser GTY(())
281 {
282   /* The look-ahead tokens.  */
283   c_token tokens[2];
284   /* How many look-ahead tokens are available (0, 1 or 2).  */
285   short tokens_avail;
286   /* True if a syntax error is being recovered from; false otherwise.
287      c_parser_error sets this flag.  It should clear this flag when
288      enough tokens have been consumed to recover from the error.  */
289   BOOL_BITFIELD error : 1;
290 } c_parser;
291
292 /* Read in and lex a single token, storing it in *TOKEN.  */
293
294 static void
295 c_lex_one_token (c_token *token)
296 {
297   timevar_push (TV_LEX);
298   token->type = c_lex_with_flags (&token->value, &token->location, NULL);
299   token->in_system_header = in_system_header;
300   switch (token->type)
301     {
302     case CPP_NAME:
303       token->id_kind = C_ID_NONE;
304       token->keyword = RID_MAX;
305       {
306         tree decl;
307
308         int objc_force_identifier = objc_need_raw_identifier;
309         OBJC_NEED_RAW_IDENTIFIER (0);
310
311         if (C_IS_RESERVED_WORD (token->value))
312           {
313             enum rid rid_code = C_RID_CODE (token->value);
314
315             if (c_dialect_objc ())
316               {
317                 if (!OBJC_IS_AT_KEYWORD (rid_code)
318                     && (!OBJC_IS_PQ_KEYWORD (rid_code) || objc_pq_context))
319                   {
320                     /* Return the canonical spelling for this keyword.  */
321                     token->value = ridpointers[(int) rid_code];
322                     token->type = CPP_KEYWORD;
323                     token->keyword = rid_code;
324                     break;
325                   }
326               }
327             else
328               {
329                 /* Return the canonical spelling for this keyword.  */
330                 token->value = ridpointers[(int) rid_code];
331                 token->type = CPP_KEYWORD;
332                 token->keyword = rid_code;
333                 break;
334               }
335           }
336
337         decl = lookup_name (token->value);
338         if (decl)
339           {
340             if (TREE_CODE (decl) == TYPE_DECL)
341               {
342                 token->id_kind = C_ID_TYPENAME;
343                 break;
344               }
345           }
346         else if (c_dialect_objc ())
347           {
348             tree objc_interface_decl = objc_is_class_name (token->value);
349             /* Objective-C class names are in the same namespace as
350                variables and typedefs, and hence are shadowed by local
351                declarations.  */
352             if (objc_interface_decl
353                 && (global_bindings_p ()
354                     || (!objc_force_identifier && !decl)))
355               {
356                 token->value = objc_interface_decl;
357                 token->id_kind = C_ID_CLASSNAME;
358                 break;
359               }
360           }
361       }
362       token->id_kind = C_ID_ID;
363       break;
364     case CPP_AT_NAME:
365       /* This only happens in Objective-C; it must be a keyword.  */
366       token->type = CPP_KEYWORD;
367       token->id_kind = C_ID_NONE;
368       token->keyword = C_RID_CODE (token->value);
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       OBJC_NEED_RAW_IDENTIFIER (0);
377       token->id_kind = C_ID_NONE;
378       token->keyword = RID_MAX;
379       break;
380     default:
381       token->id_kind = C_ID_NONE;
382       token->keyword = RID_MAX;
383       break;
384     }
385   timevar_pop (TV_LEX);
386 }
387
388 /* Return a pointer to the next token from PARSER, reading it in if
389    necessary.  */
390
391 static inline c_token *
392 c_parser_peek_token (c_parser *parser)
393 {
394   if (parser->tokens_avail == 0)
395     {
396       c_lex_one_token (&parser->tokens[0]);
397       parser->tokens_avail = 1;
398     }
399   return &parser->tokens[0];
400 }
401
402 /* Return true if the next token from PARSER has the indicated
403    TYPE.  */
404
405 static inline bool
406 c_parser_next_token_is (c_parser *parser, enum cpp_ttype type)
407 {
408   return c_parser_peek_token (parser)->type == type;
409 }
410
411 /* Return true if the next token from PARSER does not have the
412    indicated TYPE.  */
413
414 static inline bool
415 c_parser_next_token_is_not (c_parser *parser, enum cpp_ttype type)
416 {
417   return !c_parser_next_token_is (parser, type);
418 }
419
420 /* Return true if the next token from PARSER is the indicated
421    KEYWORD.  */
422
423 static inline bool
424 c_parser_next_token_is_keyword (c_parser *parser, enum rid keyword)
425 {
426   c_token *token;
427
428   /* Peek at the next token.  */
429   token = c_parser_peek_token (parser);
430   /* Check to see if it is the indicated keyword.  */
431   return token->keyword == keyword;
432 }
433
434 /* Return true if TOKEN can start a type name,
435    false otherwise.  */
436 static bool
437 c_token_starts_typename (c_token *token)
438 {
439   switch (token->type)
440     {
441     case CPP_NAME:
442       switch (token->id_kind)
443         {
444         case C_ID_ID:
445           return false;
446         case C_ID_TYPENAME:
447           return true;
448         case C_ID_CLASSNAME:
449           gcc_assert (c_dialect_objc ());
450           return true;
451         default:
452           gcc_unreachable ();
453         }
454     case CPP_KEYWORD:
455       switch (token->keyword)
456         {
457         case RID_UNSIGNED:
458         case RID_LONG:
459         case RID_SHORT:
460         case RID_SIGNED:
461         case RID_COMPLEX:
462         case RID_INT:
463         case RID_CHAR:
464         case RID_FLOAT:
465         case RID_DOUBLE:
466         case RID_VOID:
467         case RID_BOOL:
468         case RID_ENUM:
469         case RID_STRUCT:
470         case RID_UNION:
471         case RID_TYPEOF:
472         case RID_CONST:
473         case RID_VOLATILE:
474         case RID_RESTRICT:
475         case RID_ATTRIBUTE:
476           return true;
477         default:
478           return false;
479         }
480     case CPP_LESS:
481       if (c_dialect_objc ())
482         return true;
483       return false;
484     default:
485       return false;
486     }
487 }
488
489 /* Return true if the next token from PARSER can start a type name,
490    false otherwise.  */
491 static inline bool
492 c_parser_next_token_starts_typename (c_parser *parser)
493 {
494   c_token *token = c_parser_peek_token (parser);
495   return c_token_starts_typename (token);
496 }
497
498 /* Return true if TOKEN can start declaration specifiers, false
499    otherwise.  */
500 static bool
501 c_token_starts_declspecs (c_token *token)
502 {
503   switch (token->type)
504     {
505     case CPP_NAME:
506       switch (token->id_kind)
507         {
508         case C_ID_ID:
509           return false;
510         case C_ID_TYPENAME:
511           return true;
512         case C_ID_CLASSNAME:
513           gcc_assert (c_dialect_objc ());
514           return true;
515         default:
516           gcc_unreachable ();
517         }
518     case CPP_KEYWORD:
519       switch (token->keyword)
520         {
521         case RID_STATIC:
522         case RID_EXTERN:
523         case RID_REGISTER:
524         case RID_TYPEDEF:
525         case RID_INLINE:
526         case RID_AUTO:
527         case RID_THREAD:
528         case RID_UNSIGNED:
529         case RID_LONG:
530         case RID_SHORT:
531         case RID_SIGNED:
532         case RID_COMPLEX:
533         case RID_INT:
534         case RID_CHAR:
535         case RID_FLOAT:
536         case RID_DOUBLE:
537         case RID_VOID:
538         case RID_BOOL:
539         case RID_ENUM:
540         case RID_STRUCT:
541         case RID_UNION:
542         case RID_TYPEOF:
543         case RID_CONST:
544         case RID_VOLATILE:
545         case RID_RESTRICT:
546         case RID_ATTRIBUTE:
547           return true;
548         default:
549           return false;
550         }
551     case CPP_LESS:
552       if (c_dialect_objc ())
553         return true;
554       return false;
555     default:
556       return false;
557     }
558 }
559
560 /* Return true if the next token from PARSER can start declaration
561    specifiers, false otherwise.  */
562 static inline bool
563 c_parser_next_token_starts_declspecs (c_parser *parser)
564 {
565   c_token *token = c_parser_peek_token (parser);
566   return c_token_starts_declspecs (token);
567 }
568
569 /* Return a pointer to the next-but-one token from PARSER, reading it
570    in if necessary.  The next token is already read in.  */
571
572 static c_token *
573 c_parser_peek_2nd_token (c_parser *parser)
574 {
575   if (parser->tokens_avail >= 2)
576     return &parser->tokens[1];
577   gcc_assert (parser->tokens_avail == 1);
578   gcc_assert (parser->tokens[0].type != CPP_EOF);
579   c_lex_one_token (&parser->tokens[1]);
580   parser->tokens_avail = 2;
581   return &parser->tokens[1];
582 }
583
584 /* Consume the next token from PARSER.  */
585
586 static void
587 c_parser_consume_token (c_parser *parser)
588 {
589   if (parser->tokens_avail == 2)
590     parser->tokens[0] = parser->tokens[1];
591   else
592     {
593       gcc_assert (parser->tokens_avail == 1);
594       gcc_assert (parser->tokens[0].type != CPP_EOF);
595     }
596   parser->tokens_avail--;
597 }
598
599 /* Update the globals input_location and in_system_header from
600    TOKEN.  */
601 static inline void
602 c_parser_set_source_position_from_token (c_token *token)
603 {
604   if (token->type != CPP_EOF)
605     {
606       input_location = token->location;
607       in_system_header = token->in_system_header;
608     }
609 }
610
611 /* Allocate a new parser.  */
612
613 static c_parser *
614 c_parser_new (void)
615 {
616   /* Use local storage to lex the first token because loading a PCH
617      file may cause garbage collection.  */
618   c_parser tparser;
619   c_parser *ret;
620   memset (&tparser, 0, sizeof tparser);
621   c_lex_one_token (&tparser.tokens[0]);
622   tparser.tokens_avail = 1;
623   ret = GGC_NEW (c_parser);
624   memcpy (ret, &tparser, sizeof tparser);
625   return ret;
626 }
627
628 /* Issue a diagnostic of the form
629       FILE:LINE: MESSAGE before TOKEN
630    where TOKEN is the next token in the input stream of PARSER.
631    MESSAGE (specified by the caller) is usually of the form "expected
632    OTHER-TOKEN".
633
634    Do not issue a diagnostic if still recovering from an error.
635
636    ??? This is taken from the C++ parser, but building up messages in
637    this way is not i18n-friendly and some other approach should be
638    used.  */
639
640 static void
641 c_parser_error (c_parser *parser, const char *msgid)
642 {
643   c_token *token = c_parser_peek_token (parser);
644   if (parser->error)
645     return;
646   parser->error = true;
647   if (!msgid)
648     return;
649   /* This diagnostic makes more sense if it is tagged to the line of
650      the token we just peeked at.  */
651   c_parser_set_source_position_from_token (token);
652   c_parse_error (msgid,
653                  /* Because c_parse_error does not understand
654                     CPP_KEYWORD, keywords are treated like
655                     identifiers.  */
656                  (token->type == CPP_KEYWORD ? CPP_NAME : token->type),
657                  token->value);
658 }
659
660 /* If the next token is of the indicated TYPE, consume it.  Otherwise,
661    issue the error MSGID.  If MSGID is NULL then a message has already
662    been produced and no message will be produced this time.  Returns
663    true if found, false otherwise.  */
664
665 static bool
666 c_parser_require (c_parser *parser,
667                   enum cpp_ttype type,
668                   const char *msgid)
669 {
670   if (c_parser_next_token_is (parser, type))
671     {
672       c_parser_consume_token (parser);
673       return true;
674     }
675   else
676     {
677       c_parser_error (parser, msgid);
678       return false;
679     }
680 }
681
682 /* If the next token is the indicated keyword, consume it.  Otherwise,
683    issue the error MSGID.  Returns true if found, false otherwise.  */
684
685 static bool
686 c_parser_require_keyword (c_parser *parser,
687                           enum rid keyword,
688                           const char *msgid)
689 {
690   if (c_parser_next_token_is_keyword (parser, keyword))
691     {
692       c_parser_consume_token (parser);
693       return true;
694     }
695   else
696     {
697       c_parser_error (parser, msgid);
698       return false;
699     }
700 }
701
702 /* Like c_parser_require, except that tokens will be skipped until the
703    desired token is found.  An error message is still produced if the
704    next token is not as expected.  If MSGID is NULL then a message has
705    already been produced and no message will be produced this
706    time.  */
707
708 static void
709 c_parser_skip_until_found (c_parser *parser,
710                            enum cpp_ttype type,
711                            const char *msgid)
712 {
713   unsigned nesting_depth = 0;
714
715   if (c_parser_require (parser, type, msgid))
716     return;
717
718   /* Skip tokens until the desired token is found.  */
719   while (true)
720     {
721       /* Peek at the next token.  */
722       c_token *token = c_parser_peek_token (parser);
723       /* If we've reached the token we want, consume it and stop.  */
724       if (token->type == type && !nesting_depth)
725         {
726           c_parser_consume_token (parser);
727           break;
728         }
729       /* If we've run out of tokens, stop.  */
730       if (token->type == CPP_EOF)
731         return;
732       if (token->type == CPP_OPEN_BRACE
733           || token->type == CPP_OPEN_PAREN
734           || token->type == CPP_OPEN_SQUARE)
735         ++nesting_depth;
736       else if (token->type == CPP_CLOSE_BRACE
737                || token->type == CPP_CLOSE_PAREN
738                || token->type == CPP_CLOSE_SQUARE)
739         {
740           if (nesting_depth-- == 0)
741             break;
742         }
743       /* Consume this token.  */
744       c_parser_consume_token (parser);
745     }
746   parser->error = false;
747 }
748
749 /* Skip tokens until the end of a parameter is found, but do not
750    consume the comma, semicolon or closing delimiter.  */
751
752 static void
753 c_parser_skip_to_end_of_parameter (c_parser *parser)
754 {
755   unsigned nesting_depth = 0;
756
757   while (true)
758     {
759       c_token *token = c_parser_peek_token (parser);
760       if ((token->type == CPP_COMMA || token->type == CPP_SEMICOLON)
761           && !nesting_depth)
762         break;
763       /* If we've run out of tokens, stop.  */
764       if (token->type == CPP_EOF)
765         return;
766       if (token->type == CPP_OPEN_BRACE
767           || token->type == CPP_OPEN_PAREN
768           || token->type == CPP_OPEN_SQUARE)
769         ++nesting_depth;
770       else if (token->type == CPP_CLOSE_BRACE
771                || token->type == CPP_CLOSE_PAREN
772                || token->type == CPP_CLOSE_SQUARE)
773         {
774           if (nesting_depth-- == 0)
775             break;
776         }
777       /* Consume this token.  */
778       c_parser_consume_token (parser);
779     }
780   parser->error = false;
781 }
782
783 /* Skip tokens until we have consumed an entire block, or until we
784    have consumed a non-nested ';'.  */
785
786 static void
787 c_parser_skip_to_end_of_block_or_statement (c_parser *parser)
788 {
789   unsigned nesting_depth = 0;
790
791   while (true)
792     {
793       c_token *token;
794
795       /* Peek at the next token.  */
796       token = c_parser_peek_token (parser);
797       /* If we've run out of tokens, stop.  */
798       if (token->type == CPP_EOF)
799         return;
800       /* If the next token is a ';', we have reached the end of the
801          statement.  */
802       if (token->type == CPP_SEMICOLON && !nesting_depth)
803         {
804           /* Consume the ';'.  */
805           c_parser_consume_token (parser);
806           break;
807         }
808       /* If the next token is a non-nested '}', then we have reached
809          the end of the current block.  */
810       if (token->type == CPP_CLOSE_BRACE
811           && (nesting_depth == 0 || --nesting_depth == 0))
812         {
813           c_parser_consume_token (parser);
814           break;
815         }
816       /* If it the next token is a '{', then we are entering a new
817          block.  Consume the entire block.  */
818       if (token->type == CPP_OPEN_BRACE)
819         ++nesting_depth;
820       c_parser_consume_token (parser);
821     }
822   parser->error = false;
823 }
824
825
826 /* Save the warning flags which are controlled by __extension__.  */
827
828 static inline int
829 disable_extension_diagnostics (void)
830 {
831   int ret = (pedantic
832              | (warn_pointer_arith << 1)
833              | (warn_traditional << 2)
834              | (flag_iso << 3));
835   pedantic = 0;
836   warn_pointer_arith = 0;
837   warn_traditional = 0;
838   flag_iso = 0;
839   return ret;
840 }
841
842 /* Restore the warning flags which are controlled by __extension__.
843    FLAGS is the return value from disable_extension_diagnostics.  */
844
845 static inline void
846 restore_extension_diagnostics (int flags)
847 {
848   pedantic = flags & 1;
849   warn_pointer_arith = (flags >> 1) & 1;
850   warn_traditional = (flags >> 2) & 1;
851   flag_iso = (flags >> 3) & 1;
852 }
853
854 /* Possibly kinds of declarator to parse.  */
855 typedef enum c_dtr_syn {
856   /* A normal declarator with an identifier.  */
857   C_DTR_NORMAL,
858   /* An abstract declarator (maybe empty).  */
859   C_DTR_ABSTRACT,
860   /* A parameter declarator: may be either, but after a type name does
861      not redeclare a typedef name as an identifier if it can
862      alternatively be interpreted as a typedef name; see DR#009,
863      applied in C90 TC1, omitted from C99 and reapplied in C99 TC2
864      following DR#249.  For example, given a typedef T, "int T" and
865      "int *T" are valid parameter declarations redeclaring T, while
866      "int (T)" and "int * (T)" and "int (T[])" and "int (T (int))" are
867      abstract declarators rather than involving redundant parentheses;
868      the same applies with attributes inside the parentheses before
869      "T".  */
870   C_DTR_PARM
871 } c_dtr_syn;
872
873 static void c_parser_external_declaration (c_parser *);
874 static void c_parser_asm_definition (c_parser *);
875 static void c_parser_declaration_or_fndef (c_parser *, bool, bool, bool, bool);
876 static void c_parser_declspecs (c_parser *, struct c_declspecs *, bool, bool,
877                                 bool);
878 static struct c_typespec c_parser_enum_specifier (c_parser *);
879 static struct c_typespec c_parser_struct_or_union_specifier (c_parser *);
880 static tree c_parser_struct_declaration (c_parser *);
881 static struct c_typespec c_parser_typeof_specifier (c_parser *);
882 static struct c_declarator *c_parser_declarator (c_parser *, bool, c_dtr_syn,
883                                                  bool *);
884 static struct c_declarator *c_parser_direct_declarator (c_parser *, bool,
885                                                         c_dtr_syn, bool *);
886 static struct c_declarator *c_parser_direct_declarator_inner (c_parser *,
887                                                               bool,
888                                                               struct c_declarator *);
889 static struct c_arg_info *c_parser_parms_declarator (c_parser *, bool, tree);
890 static struct c_arg_info *c_parser_parms_list_declarator (c_parser *, tree);
891 static struct c_parm *c_parser_parameter_declaration (c_parser *, tree);
892 static tree c_parser_simple_asm_expr (c_parser *);
893 static tree c_parser_attributes (c_parser *);
894 static struct c_type_name *c_parser_type_name (c_parser *);
895 static struct c_expr c_parser_initializer (c_parser *);
896 static struct c_expr c_parser_braced_init (c_parser *, tree, bool);
897 static void c_parser_initelt (c_parser *);
898 static void c_parser_initval (c_parser *, struct c_expr *);
899 static tree c_parser_compound_statement (c_parser *);
900 static void c_parser_compound_statement_nostart (c_parser *);
901 static void c_parser_label (c_parser *);
902 static void c_parser_statement (c_parser *);
903 static void c_parser_statement_after_labels (c_parser *);
904 static void c_parser_if_statement (c_parser *);
905 static void c_parser_switch_statement (c_parser *);
906 static void c_parser_while_statement (c_parser *);
907 static void c_parser_do_statement (c_parser *);
908 static void c_parser_for_statement (c_parser *);
909 static tree c_parser_asm_statement (c_parser *);
910 static tree c_parser_asm_operands (c_parser *);
911 static tree c_parser_asm_clobbers (c_parser *);
912 static struct c_expr c_parser_expr_no_commas (c_parser *, struct c_expr *);
913 static struct c_expr c_parser_conditional_expression (c_parser *,
914                                                       struct c_expr *);
915 static struct c_expr c_parser_binary_expression (c_parser *, struct c_expr *);
916 static struct c_expr c_parser_cast_expression (c_parser *, struct c_expr *);
917 static struct c_expr c_parser_unary_expression (c_parser *);
918 static struct c_expr c_parser_sizeof_expression (c_parser *);
919 static struct c_expr c_parser_alignof_expression (c_parser *);
920 static struct c_expr c_parser_postfix_expression (c_parser *);
921 static struct c_expr c_parser_postfix_expression_after_paren_type (c_parser *,
922                                                                    struct c_type_name *);
923 static struct c_expr c_parser_postfix_expression_after_primary (c_parser *,
924                                                                 struct c_expr);
925 static struct c_expr c_parser_expression (c_parser *);
926 static tree c_parser_expr_list (c_parser *);
927
928 /* These Objective-C parser functions are only ever called when
929    compiling Objective-C.  */
930 static void c_parser_objc_class_definition (c_parser *);
931 static void c_parser_objc_class_instance_variables (c_parser *);
932 static void c_parser_objc_class_declaration (c_parser *);
933 static void c_parser_objc_alias_declaration (c_parser *);
934 static void c_parser_objc_protocol_definition (c_parser *);
935 static enum tree_code c_parser_objc_method_type (c_parser *);
936 static void c_parser_objc_method_definition (c_parser *);
937 static void c_parser_objc_methodprotolist (c_parser *);
938 static void c_parser_objc_methodproto (c_parser *);
939 static tree c_parser_objc_method_decl (c_parser *);
940 static tree c_parser_objc_type_name (c_parser *);
941 static tree c_parser_objc_protocol_refs (c_parser *);
942 static void c_parser_objc_try_catch_statement (c_parser *);
943 static void c_parser_objc_synchronized_statement (c_parser *);
944 static tree c_parser_objc_selector (c_parser *);
945 static tree c_parser_objc_selector_arg (c_parser *);
946 static tree c_parser_objc_receiver (c_parser *);
947 static tree c_parser_objc_message_args (c_parser *);
948 static tree c_parser_objc_keywordexpr (c_parser *);
949
950 /* Parse a translation unit (C90 6.7, C99 6.9).
951
952    translation-unit:
953      external-declarations
954
955    external-declarations:
956      external-declaration
957      external-declarations external-declaration
958
959    GNU extensions:
960
961    translation-unit:
962      empty
963 */
964
965 static void
966 c_parser_translation_unit (c_parser *parser)
967 {
968   if (c_parser_next_token_is (parser, CPP_EOF))
969     {
970       if (pedantic)
971         pedwarn ("ISO C forbids an empty source file");
972     }
973   else
974     {
975       void *obstack_position = obstack_alloc (&parser_obstack, 0);
976       do
977         {
978           ggc_collect ();
979           c_parser_external_declaration (parser);
980           obstack_free (&parser_obstack, obstack_position);
981         }
982       while (c_parser_next_token_is_not (parser, CPP_EOF));
983     }
984 }
985
986 /* Parse an external declaration (C90 6.7, C99 6.9).
987
988    external-declaration:
989      function-definition
990      declaration
991
992    GNU extensions:
993
994    external-declaration:
995      asm-definition
996      ;
997      __extension__ external-declaration
998
999    Objective-C:
1000
1001    external-declaration:
1002      objc-class-definition
1003      objc-class-declaration
1004      objc-alias-declaration
1005      objc-protocol-definition
1006      objc-method-definition
1007      @end
1008 */
1009
1010 static void
1011 c_parser_external_declaration (c_parser *parser)
1012 {
1013   int ext;
1014   switch (c_parser_peek_token (parser)->type)
1015     {
1016     case CPP_KEYWORD:
1017       switch (c_parser_peek_token (parser)->keyword)
1018         {
1019         case RID_EXTENSION:
1020           ext = disable_extension_diagnostics ();
1021           c_parser_consume_token (parser);
1022           c_parser_external_declaration (parser);
1023           restore_extension_diagnostics (ext);
1024           break;
1025         case RID_ASM:
1026           c_parser_asm_definition (parser);
1027           break;
1028         case RID_AT_INTERFACE:
1029         case RID_AT_IMPLEMENTATION:
1030           gcc_assert (c_dialect_objc ());
1031           c_parser_objc_class_definition (parser);
1032           break;
1033         case RID_AT_CLASS:
1034           gcc_assert (c_dialect_objc ());
1035           c_parser_objc_class_declaration (parser);
1036           break;
1037         case RID_AT_ALIAS:
1038           gcc_assert (c_dialect_objc ());
1039           c_parser_objc_alias_declaration (parser);
1040           break;
1041         case RID_AT_PROTOCOL:
1042           gcc_assert (c_dialect_objc ());
1043           c_parser_objc_protocol_definition (parser);
1044           break;
1045         case RID_AT_END:
1046           gcc_assert (c_dialect_objc ());
1047           c_parser_consume_token (parser);
1048           objc_finish_implementation ();
1049           break;
1050         default:
1051           goto decl_or_fndef;
1052         }
1053       break;
1054     case CPP_SEMICOLON:
1055       if (pedantic)
1056         pedwarn ("ISO C does not allow extra %<;%> outside of a function");
1057       c_parser_consume_token (parser);
1058       break;
1059     case CPP_PLUS:
1060     case CPP_MINUS:
1061       if (c_dialect_objc ())
1062         {
1063           c_parser_objc_method_definition (parser);
1064           break;
1065         }
1066       /* Else fall through, and yield a syntax error trying to parse
1067          as a declaration or function definition.  */
1068     default:
1069     decl_or_fndef:
1070       /* A declaration or a function definition.  We can only tell
1071          which after parsing the declaration specifiers, if any, and
1072          the first declarator.  */
1073       c_parser_declaration_or_fndef (parser, true, true, false, true);
1074       break;
1075     }
1076 }
1077
1078 /* Parse a declaration or function definition (C90 6.5, 6.7.1, C99
1079    6.7, 6.9.1).  If FNDEF_OK is true, a function definition is
1080    accepted; otherwise (old-style parameter declarations) only other
1081    declarations are accepted.  If NESTED is true, we are inside a
1082    function or parsing old-style parameter declarations; any functions
1083    encountered are nested functions and declaration specifiers are
1084    required; otherwise we are at top level and functions are normal
1085    functions and declaration specifiers may be optional.  If EMPTY_OK
1086    is true, empty declarations are OK (subject to all other
1087    constraints); otherwise (old-style parameter declarations) they are
1088    diagnosed.  If START_ATTR_OK is true, the declaration specifiers
1089    may start with attributes; otherwise they may not.
1090
1091    declaration:
1092      declaration-specifiers init-declarator-list[opt] ;
1093
1094    function-definition:
1095      declaration-specifiers[opt] declarator declaration-list[opt]
1096        compound-statement
1097
1098    declaration-list:
1099      declaration
1100      declaration-list declaration
1101
1102    init-declarator-list:
1103      init-declarator
1104      init-declarator-list , init-declarator
1105
1106    init-declarator:
1107      declarator simple-asm-expr[opt] attributes[opt]
1108      declarator simple-asm-expr[opt] attributes[opt] = initializer
1109
1110    GNU extensions:
1111
1112    nested-function-definition:
1113      declaration-specifiers declarator declaration-list[opt]
1114        compound-statement
1115
1116    The simple-asm-expr and attributes are GNU extensions.
1117
1118    This function does not handle __extension__; that is handled in its
1119    callers.  ??? Following the old parser, __extension__ may start
1120    external declarations, declarations in functions and declarations
1121    at the start of "for" loops, but not old-style parameter
1122    declarations.
1123
1124    C99 requires declaration specifiers in a function definition; the
1125    absence is diagnosed through the diagnosis of implicit int.  In GNU
1126    C we also allow but diagnose declarations without declaration
1127    specifiers, but only at top level (elsewhere they conflict with
1128    other syntax).  */
1129
1130 static void
1131 c_parser_declaration_or_fndef (c_parser *parser, bool fndef_ok, bool empty_ok,
1132                                bool nested, bool start_attr_ok)
1133 {
1134   struct c_declspecs *specs;
1135   tree prefix_attrs;
1136   tree all_prefix_attrs;
1137   bool diagnosed_no_specs = false;
1138   specs = build_null_declspecs ();
1139   c_parser_declspecs (parser, specs, true, true, start_attr_ok);
1140   if (parser->error)
1141     {
1142       c_parser_skip_to_end_of_block_or_statement (parser);
1143       return;
1144     }
1145   if (nested && !specs->declspecs_seen_p)
1146     {
1147       c_parser_error (parser, "expected declaration specifiers");
1148       c_parser_skip_to_end_of_block_or_statement (parser);
1149       return;
1150     }
1151   finish_declspecs (specs);
1152   if (c_parser_next_token_is (parser, CPP_SEMICOLON))
1153     {
1154       if (empty_ok)
1155         shadow_tag (specs);
1156       else
1157         {
1158           shadow_tag_warned (specs, 1);
1159           pedwarn ("empty declaration");
1160         }
1161       c_parser_consume_token (parser);
1162       return;
1163     }
1164   pending_xref_error ();
1165   prefix_attrs = specs->attrs;
1166   all_prefix_attrs = prefix_attrs;
1167   specs->attrs = NULL_TREE;
1168   while (true)
1169     {
1170       struct c_declarator *declarator;
1171       bool dummy = false;
1172       tree fnbody;
1173       /* Declaring either one or more declarators (in which case we
1174          should diagnose if there were no declaration specifiers) or a
1175          function definition (in which case the diagnostic for
1176          implicit int suffices).  */
1177       declarator = c_parser_declarator (parser, specs->type_seen_p,
1178                                         C_DTR_NORMAL, &dummy);
1179       if (declarator == NULL)
1180         {
1181           c_parser_skip_to_end_of_block_or_statement (parser);
1182           return;
1183         }
1184       if (c_parser_next_token_is (parser, CPP_EQ)
1185           || c_parser_next_token_is (parser, CPP_COMMA)
1186           || c_parser_next_token_is (parser, CPP_SEMICOLON)
1187           || c_parser_next_token_is_keyword (parser, RID_ASM)
1188           || c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
1189         {
1190           tree asm_name = NULL_TREE;
1191           tree postfix_attrs = NULL_TREE;
1192           if (!diagnosed_no_specs && !specs->declspecs_seen_p)
1193             {
1194               diagnosed_no_specs = true;
1195               pedwarn ("data definition has no type or storage class");
1196             }
1197           /* Having seen a data definition, there cannot now be a
1198              function definition.  */
1199           fndef_ok = false;
1200           if (c_parser_next_token_is_keyword (parser, RID_ASM))
1201             asm_name = c_parser_simple_asm_expr (parser);
1202           if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
1203             postfix_attrs = c_parser_attributes (parser);
1204           if (c_parser_next_token_is (parser, CPP_EQ))
1205             {
1206               tree d;
1207               struct c_expr init;
1208               c_parser_consume_token (parser);
1209               /* The declaration of the variable is in effect while
1210                  its initializer is parsed.  */
1211               d = start_decl (declarator, specs, true,
1212                               chainon (postfix_attrs, all_prefix_attrs));
1213               if (!d)
1214                 d = error_mark_node;
1215               start_init (d, asm_name, global_bindings_p ());
1216               init = c_parser_initializer (parser);
1217               finish_init ();
1218               if (d != error_mark_node)
1219                 {
1220                   maybe_warn_string_init (TREE_TYPE (d), init);
1221                   finish_decl (d, init.value, asm_name);
1222                 }
1223             }
1224           else
1225             {
1226               tree d = start_decl (declarator, specs, false,
1227                                    chainon (postfix_attrs,
1228                                             all_prefix_attrs));
1229               if (d)
1230                 finish_decl (d, NULL_TREE, asm_name);
1231             }
1232           if (c_parser_next_token_is (parser, CPP_COMMA))
1233             {
1234               c_parser_consume_token (parser);
1235               if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
1236                 all_prefix_attrs = chainon (c_parser_attributes (parser),
1237                                             prefix_attrs);
1238               else
1239                 all_prefix_attrs = prefix_attrs;
1240               continue;
1241             }
1242           else if (c_parser_next_token_is (parser, CPP_SEMICOLON))
1243             {
1244               c_parser_consume_token (parser);
1245               return;
1246             }
1247           else
1248             {
1249               c_parser_error (parser, "expected %<,%> or %<;%>");
1250               c_parser_skip_to_end_of_block_or_statement (parser);
1251               return;
1252             }
1253         }
1254       else if (!fndef_ok)
1255         {
1256           c_parser_error (parser, "expected %<=%>, %<,%>, %<;%>, "
1257                           "%<asm%> or %<__attribute__%>");
1258           c_parser_skip_to_end_of_block_or_statement (parser);
1259           return;
1260         }
1261       /* Function definition (nested or otherwise).  */
1262       if (nested)
1263         {
1264           if (pedantic)
1265             pedwarn ("ISO C forbids nested functions");
1266           push_function_context ();
1267         }
1268       if (!start_function (specs, declarator, all_prefix_attrs))
1269         {
1270           /* This can appear in many cases looking nothing like a
1271              function definition, so we don't give a more specific
1272              error suggesting there was one.  */
1273           c_parser_error (parser, "expected %<=%>, %<,%>, %<;%>, %<asm%> "
1274                           "or %<__attribute__%>");
1275           if (nested)
1276             pop_function_context ();
1277           break;
1278         }
1279       /* Parse old-style parameter declarations.  ??? Attributes are
1280          not allowed to start declaration specifiers here because of a
1281          syntax conflict between a function declaration with attribute
1282          suffix and a function definition with an attribute prefix on
1283          first old-style parameter declaration.  Following the old
1284          parser, they are not accepted on subsequent old-style
1285          parameter declarations either.  However, there is no
1286          ambiguity after the first declaration, nor indeed on the
1287          first as long as we don't allow postfix attributes after a
1288          declarator with a nonempty identifier list in a definition;
1289          and postfix attributes have never been accepted here in
1290          function definitions either.  */
1291       while (c_parser_next_token_is_not (parser, CPP_EOF)
1292              && c_parser_next_token_is_not (parser, CPP_OPEN_BRACE))
1293         c_parser_declaration_or_fndef (parser, false, false, true, false);
1294       DECL_SOURCE_LOCATION (current_function_decl)
1295         = c_parser_peek_token (parser)->location;
1296       store_parm_decls ();
1297       fnbody = c_parser_compound_statement (parser);
1298       if (nested)
1299         {
1300           tree decl = current_function_decl;
1301           add_stmt (fnbody);
1302           finish_function ();
1303           pop_function_context ();
1304           add_stmt (build_stmt (DECL_EXPR, decl));
1305         }
1306       else
1307         {
1308           add_stmt (fnbody);
1309           finish_function ();
1310         }
1311       break;
1312     }
1313 }
1314
1315 /* Parse an asm-definition (asm() outside a function body).  This is a
1316    GNU extension.
1317
1318    asm-definition:
1319      simple-asm-expr ;
1320 */
1321
1322 static void
1323 c_parser_asm_definition (c_parser *parser)
1324 {
1325   tree asm_str = c_parser_simple_asm_expr (parser);
1326   /* ??? This only works sensibly in the presence of
1327      -fno-unit-at-a-time; file-scope asms really need to be passed to
1328      cgraph which needs to preserve the order of functions and
1329      file-scope asms.  */
1330   if (asm_str)
1331     assemble_asm (asm_str);
1332   c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
1333 }
1334
1335 /* Parse some declaration specifiers (possibly none) (C90 6.5, C99
1336    6.7), adding them to SPECS (which may already include some).
1337    Storage class specifiers are accepted iff SCSPEC_OK; type
1338    specifiers are accepted iff TYPESPEC_OK; attributes are accepted at
1339    the start iff START_ATTR_OK.
1340
1341    declaration-specifiers:
1342      storage-class-specifier declaration-specifiers[opt]
1343      type-specifier declaration-specifiers[opt]
1344      type-qualifier declaration-specifiers[opt]
1345      function-specifier declaration-specifiers[opt]
1346
1347    Function specifiers (inline) are from C99, and are currently
1348    handled as storage class specifiers, as is __thread.
1349
1350    C90 6.5.1, C99 6.7.1:
1351    storage-class-specifier:
1352      typedef
1353      extern
1354      static
1355      auto
1356      register
1357
1358    C99 6.7.4:
1359    function-specifier:
1360      inline
1361
1362    C90 6.5.2, C99 6.7.2:
1363    type-specifier:
1364      void
1365      char
1366      short
1367      int
1368      long
1369      float
1370      double
1371      signed
1372      unsigned
1373      _Bool
1374      _Complex
1375      [_Imaginary removed in C99 TC2]
1376      struct-or-union-specifier
1377      enum-specifier
1378      typedef-name
1379
1380    (_Bool and _Complex are new in C99.)
1381
1382    C90 6.5.3, C99 6.7.3:
1383
1384    type-qualifier:
1385      const
1386      restrict
1387      volatile
1388
1389    (restrict is new in C99.)
1390
1391    GNU extensions:
1392
1393    declaration-specifiers:
1394      attributes declaration-specifiers[opt]
1395
1396    storage-class-specifier:
1397      __thread
1398
1399    type-specifier:
1400      typeof-specifier
1401
1402    Objective-C:
1403
1404    type-specifier:
1405      class-name objc-protocol-refs[opt]
1406      typedef-name objc-protocol-refs
1407      objc-protocol-refs
1408 */
1409
1410 static void
1411 c_parser_declspecs (c_parser *parser, struct c_declspecs *specs,
1412                     bool scspec_ok, bool typespec_ok, bool start_attr_ok)
1413 {
1414   bool attrs_ok = start_attr_ok;
1415   bool seen_type = specs->type_seen_p;
1416   while (c_parser_next_token_is (parser, CPP_NAME)
1417          || c_parser_next_token_is (parser, CPP_KEYWORD)
1418          || (c_dialect_objc () && c_parser_next_token_is (parser, CPP_LESS)))
1419     {
1420       struct c_typespec t;
1421       tree attrs;
1422       if (c_parser_next_token_is (parser, CPP_NAME))
1423         {
1424           tree value = c_parser_peek_token (parser)->value;
1425           c_id_kind kind = c_parser_peek_token (parser)->id_kind;
1426           /* This finishes the specifiers unless a type name is OK, it
1427              is declared as a type name and a type name hasn't yet
1428              been seen.  */
1429           if (!typespec_ok || seen_type
1430               || (kind != C_ID_TYPENAME && kind != C_ID_CLASSNAME))
1431             break;
1432           c_parser_consume_token (parser);
1433           seen_type = true;
1434           attrs_ok = true;
1435           if (kind == C_ID_TYPENAME
1436               && (!c_dialect_objc ()
1437                   || c_parser_next_token_is_not (parser, CPP_LESS)))
1438             {
1439               t.kind = ctsk_typedef;
1440               /* For a typedef name, record the meaning, not the name.
1441                  In case of 'foo foo, bar;'.  */
1442               t.spec = lookup_name (value);
1443             }
1444           else
1445             {
1446               tree proto = NULL_TREE;
1447               gcc_assert (c_dialect_objc ());
1448               t.kind = ctsk_objc;
1449               if (c_parser_next_token_is (parser, CPP_LESS))
1450                 proto = c_parser_objc_protocol_refs (parser);
1451               t.spec = objc_get_protocol_qualified_type (value, proto);
1452             }
1453           declspecs_add_type (specs, t);
1454           continue;
1455         }
1456       if (c_parser_next_token_is (parser, CPP_LESS))
1457         {
1458           /* Make "<SomeProtocol>" equivalent to "id <SomeProtocol>" -
1459              nisse@lysator.liu.se.  */
1460           tree proto;
1461           gcc_assert (c_dialect_objc ());
1462           if (!typespec_ok || seen_type)
1463             break;
1464           proto = c_parser_objc_protocol_refs (parser);
1465           t.kind = ctsk_objc;
1466           t.spec = objc_get_protocol_qualified_type (NULL_TREE, proto);
1467           declspecs_add_type (specs, t);
1468           continue;
1469         }
1470       gcc_assert (c_parser_next_token_is (parser, CPP_KEYWORD));
1471       switch (c_parser_peek_token (parser)->keyword)
1472         {
1473         case RID_STATIC:
1474         case RID_EXTERN:
1475         case RID_REGISTER:
1476         case RID_TYPEDEF:
1477         case RID_INLINE:
1478         case RID_AUTO:
1479         case RID_THREAD:
1480           if (!scspec_ok)
1481             goto out;
1482           attrs_ok = true;
1483           /* TODO: Distinguish between function specifiers (inline)
1484              and storage class specifiers, either here or in
1485              declspecs_add_scspec.  */
1486           declspecs_add_scspec (specs, c_parser_peek_token (parser)->value);
1487           c_parser_consume_token (parser);
1488           break;
1489         case RID_UNSIGNED:
1490         case RID_LONG:
1491         case RID_SHORT:
1492         case RID_SIGNED:
1493         case RID_COMPLEX:
1494         case RID_INT:
1495         case RID_CHAR:
1496         case RID_FLOAT:
1497         case RID_DOUBLE:
1498         case RID_VOID:
1499         case RID_BOOL:
1500           if (!typespec_ok)
1501             goto out;
1502           attrs_ok = true;
1503           seen_type = true;
1504           OBJC_NEED_RAW_IDENTIFIER (1);
1505           t.kind = ctsk_resword;
1506           t.spec = c_parser_peek_token (parser)->value;
1507           declspecs_add_type (specs, t);
1508           c_parser_consume_token (parser);
1509           break;
1510         case RID_ENUM:
1511           if (!typespec_ok)
1512             goto out;
1513           attrs_ok = true;
1514           seen_type = true;
1515           t = c_parser_enum_specifier (parser);
1516           declspecs_add_type (specs, t);
1517           break;
1518         case RID_STRUCT:
1519         case RID_UNION:
1520           if (!typespec_ok)
1521             goto out;
1522           attrs_ok = true;
1523           seen_type = true;
1524           t = c_parser_struct_or_union_specifier (parser);
1525           declspecs_add_type (specs, t);
1526           break;
1527         case RID_TYPEOF:
1528           /* ??? The old parser rejected typeof after other type
1529              specifiers, but is a syntax error the best way of
1530              handling this?  */
1531           if (!typespec_ok || seen_type)
1532             goto out;
1533           attrs_ok = true;
1534           seen_type = true;
1535           t = c_parser_typeof_specifier (parser);
1536           declspecs_add_type (specs, t);
1537           break;
1538         case RID_CONST:
1539         case RID_VOLATILE:
1540         case RID_RESTRICT:
1541           attrs_ok = true;
1542           declspecs_add_qual (specs, c_parser_peek_token (parser)->value);
1543           c_parser_consume_token (parser);
1544           break;
1545         case RID_ATTRIBUTE:
1546           if (!attrs_ok)
1547             goto out;
1548           attrs = c_parser_attributes (parser);
1549           declspecs_add_attrs (specs, attrs);
1550           break;
1551         default:
1552           goto out;
1553         }
1554     }
1555  out: ;
1556 }
1557
1558 /* Parse an enum specifier (C90 6.5.2.2, C99 6.7.2.2).
1559
1560    enum-specifier:
1561      enum attributes[opt] identifier[opt] { enumerator-list } attributes[opt]
1562      enum attributes[opt] identifier[opt] { enumerator-list , } attributes[opt]
1563      enum attributes[opt] identifier
1564
1565    The form with trailing comma is new in C99.  The forms with
1566    attributes are GNU extensions.  In GNU C, we accept any expression
1567    without commas in the syntax (assignment expressions, not just
1568    conditional expressions); assignment expressions will be diagnosed
1569    as non-constant.
1570
1571    enumerator-list:
1572      enumerator
1573      enumerator-list , enumerator
1574
1575    enumerator:
1576      enumeration-constant
1577      enumeration-constant = constant-expression
1578 */
1579
1580 static struct c_typespec
1581 c_parser_enum_specifier (c_parser *parser)
1582 {
1583   struct c_typespec ret;
1584   tree attrs;
1585   tree ident = NULL_TREE;
1586   gcc_assert (c_parser_next_token_is_keyword (parser, RID_ENUM));
1587   c_parser_consume_token (parser);
1588   attrs = c_parser_attributes (parser);
1589   if (c_parser_next_token_is (parser, CPP_NAME))
1590     {
1591       ident = c_parser_peek_token (parser)->value;
1592       c_parser_consume_token (parser);
1593     }
1594   if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
1595     {
1596       /* Parse an enum definition.  */
1597       tree type = start_enum (ident);
1598       tree postfix_attrs;
1599       /* We chain the enumerators in reverse order, then put them in
1600          forward order at the end.  */
1601       tree values = NULL_TREE;
1602       c_parser_consume_token (parser);
1603       while (true)
1604         {
1605           tree enum_id;
1606           tree enum_value;
1607           tree enum_decl;
1608           bool seen_comma;
1609           if (c_parser_next_token_is_not (parser, CPP_NAME))
1610             {
1611               c_parser_error (parser, "expected identifier");
1612               c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL);
1613               values = error_mark_node;
1614               break;
1615             }
1616           enum_id = c_parser_peek_token (parser)->value;
1617           c_parser_consume_token (parser);
1618           if (c_parser_next_token_is (parser, CPP_EQ))
1619             {
1620               c_parser_consume_token (parser);
1621               enum_value = c_parser_expr_no_commas (parser, NULL).value;
1622             }
1623           else
1624             enum_value = NULL_TREE;
1625           enum_decl = build_enumerator (enum_id, enum_value);
1626           TREE_CHAIN (enum_decl) = values;
1627           values = enum_decl;
1628           seen_comma = false;
1629           if (c_parser_next_token_is (parser, CPP_COMMA))
1630             {
1631               seen_comma = true;
1632               c_parser_consume_token (parser);
1633             }
1634           if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
1635             {
1636               if (seen_comma && pedantic && !flag_isoc99)
1637                 pedwarn ("comma at end of enumerator list");
1638               c_parser_consume_token (parser);
1639               break;
1640             }
1641           if (!seen_comma)
1642             {
1643               c_parser_error (parser, "expected %<,%> or %<}%>");
1644               c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL);
1645               values = error_mark_node;
1646               break;
1647             }
1648         }
1649       postfix_attrs = c_parser_attributes (parser);
1650       ret.spec = finish_enum (type, nreverse (values),
1651                               chainon (attrs, postfix_attrs));
1652       ret.kind = ctsk_tagdef;
1653       return ret;
1654     }
1655   else if (!ident)
1656     {
1657       c_parser_error (parser, "expected %<{%>");
1658       ret.spec = error_mark_node;
1659       ret.kind = ctsk_tagref;
1660       return ret;
1661     }
1662   ret = parser_xref_tag (ENUMERAL_TYPE, ident);
1663   /* In ISO C, enumerated types can be referred to only if already
1664      defined.  */
1665   if (pedantic && !COMPLETE_TYPE_P (ret.spec))
1666     pedwarn ("ISO C forbids forward references to %<enum%> types");
1667   return ret;
1668 }
1669
1670 /* Parse a struct or union specifier (C90 6.5.2.1, C99 6.7.2.1).
1671
1672    struct-or-union-specifier:
1673      struct-or-union attributes[opt] identifier[opt]
1674        { struct-contents } attributes[opt]
1675      struct-or-union attributes[opt] identifier
1676
1677    struct-contents:
1678      struct-declaration-list
1679
1680    struct-declaration-list:
1681      struct-declaration ;
1682      struct-declaration-list struct-declaration ;
1683
1684    GNU extensions:
1685
1686    struct-contents:
1687      empty
1688      struct-declaration
1689      struct-declaration-list struct-declaration
1690
1691    struct-declaration-list:
1692      struct-declaration-list ;
1693      ;
1694
1695    (Note that in the syntax here, unlike that in ISO C, the semicolons
1696    are included here rather than in struct-declaration, in order to
1697    describe the syntax with extra semicolons and missing semicolon at
1698    end.)
1699
1700    Objective-C:
1701
1702    struct-declaration-list:
1703      @defs ( class-name )
1704
1705    (Note this does not include a trailing semicolon, but can be
1706    followed by further declarations, and gets a pedwarn-if-pedantic
1707    when followed by a semicolon.)  */
1708
1709 static struct c_typespec
1710 c_parser_struct_or_union_specifier (c_parser *parser)
1711 {
1712   struct c_typespec ret;
1713   tree attrs;
1714   tree ident = NULL_TREE;
1715   enum tree_code code;
1716   switch (c_parser_peek_token (parser)->keyword)
1717     {
1718     case RID_STRUCT:
1719       code = RECORD_TYPE;
1720       break;
1721     case RID_UNION:
1722       code = UNION_TYPE;
1723       break;
1724     default:
1725       gcc_unreachable ();
1726     }
1727   c_parser_consume_token (parser);
1728   attrs = c_parser_attributes (parser);
1729   if (c_parser_next_token_is (parser, CPP_NAME))
1730     {
1731       ident = c_parser_peek_token (parser)->value;
1732       c_parser_consume_token (parser);
1733     }
1734   if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
1735     {
1736       /* Parse a struct or union definition.  Start the scope of the
1737          tag before parsing components.  */
1738       tree type = start_struct (code, ident);
1739       tree postfix_attrs;
1740       /* We chain the components in reverse order, then put them in
1741          forward order at the end.  Each struct-declaration may
1742          declare multiple components (comma-separated), so we must use
1743          chainon to join them, although when parsing each
1744          struct-declaration we can use TREE_CHAIN directly.
1745
1746          The theory behind all this is that there will be more
1747          semicolon separated fields than comma separated fields, and
1748          so we'll be minimizing the number of node traversals required
1749          by chainon.  */
1750       tree contents = NULL_TREE;
1751       c_parser_consume_token (parser);
1752       /* Handle the Objective-C @defs construct,
1753          e.g. foo(sizeof(struct{ @defs(ClassName) }));.  */
1754       if (c_parser_next_token_is_keyword (parser, RID_AT_DEFS))
1755         {
1756           tree name;
1757           gcc_assert (c_dialect_objc ());
1758           c_parser_consume_token (parser);
1759           if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
1760             goto end_at_defs;
1761           if (c_parser_next_token_is (parser, CPP_NAME)
1762               && c_parser_peek_token (parser)->id_kind == C_ID_CLASSNAME)
1763             {
1764               name = c_parser_peek_token (parser)->value;
1765               c_parser_consume_token (parser);
1766             }
1767           else
1768             {
1769               c_parser_error (parser, "expected class name");
1770               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
1771               goto end_at_defs;
1772             }
1773           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
1774                                      "expected %<)%>");
1775           contents = nreverse (objc_get_class_ivars (name));
1776         }
1777     end_at_defs:
1778       /* Parse the struct-declarations and semicolons.  Problems with
1779          semicolons are diagnosed here; empty structures are diagnosed
1780          elsewhere.  */
1781       while (true)
1782         {
1783           tree decls;
1784           /* Parse any stray semicolon.  */
1785           if (c_parser_next_token_is (parser, CPP_SEMICOLON))
1786             {
1787               if (pedantic)
1788                 pedwarn ("extra semicolon in struct or union specified");
1789               c_parser_consume_token (parser);
1790               continue;
1791             }
1792           /* Stop if at the end of the struct or union contents.  */
1793           if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
1794             {
1795               c_parser_consume_token (parser);
1796               break;
1797             }
1798           /* Parse some comma-separated declarations, but not the
1799              trailing semicolon if any.  */
1800           decls = c_parser_struct_declaration (parser);
1801           contents = chainon (decls, contents);
1802           /* If no semicolon follows, either we have a parse error or
1803              are at the end of the struct or union and should
1804              pedwarn.  */
1805           if (c_parser_next_token_is (parser, CPP_SEMICOLON))
1806             c_parser_consume_token (parser);
1807           else
1808             {
1809               if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
1810                 pedwarn ("no semicolon at end of struct or union");
1811               else
1812                 {
1813                   c_parser_error (parser, "expected %<;%>");
1814                   c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL);
1815                   break;
1816                 }
1817             }
1818         }
1819       postfix_attrs = c_parser_attributes (parser);
1820       ret.spec = finish_struct (type, nreverse (contents),
1821                                 chainon (attrs, postfix_attrs));
1822       ret.kind = ctsk_tagdef;
1823       return ret;
1824     }
1825   else if (!ident)
1826     {
1827       c_parser_error (parser, "expected %<{%>");
1828       ret.spec = error_mark_node;
1829       ret.kind = ctsk_tagref;
1830       return ret;
1831     }
1832   ret = parser_xref_tag (code, ident);
1833   return ret;
1834 }
1835
1836 /* Parse a struct-declaration (C90 6.5.2.1, C99 6.7.2.1), *without*
1837    the trailing semicolon.
1838
1839    struct-declaration:
1840      specifier-qualifier-list struct-declarator-list
1841
1842    specifier-qualifier-list:
1843      type-specifier specifier-qualifier-list[opt]
1844      type-qualifier specifier-qualifier-list[opt]
1845      attributes specifier-qualifier-list[opt]
1846
1847    struct-declarator-list:
1848      struct-declarator
1849      struct-declarator-list , attributes[opt] struct-declarator
1850
1851    struct-declarator:
1852      declarator attributes[opt]
1853      declarator[opt] : constant-expression attributes[opt]
1854
1855    GNU extensions:
1856
1857    struct-declaration:
1858      __extension__ struct-declaration
1859      specifier-qualifier-list
1860
1861    Unlike the ISO C syntax, semicolons are handled elsewhere.  The use
1862    of attributes where shown is a GNU extension.  In GNU C, we accept
1863    any expression without commas in the syntax (assignment
1864    expressions, not just conditional expressions); assignment
1865    expressions will be diagnosed as non-constant.  */
1866
1867 static tree
1868 c_parser_struct_declaration (c_parser *parser)
1869 {
1870   struct c_declspecs *specs;
1871   tree prefix_attrs;
1872   tree all_prefix_attrs;
1873   tree decls;
1874   if (c_parser_next_token_is_keyword (parser, RID_EXTENSION))
1875     {
1876       int ext;
1877       tree decl;
1878       ext = disable_extension_diagnostics ();
1879       c_parser_consume_token (parser);
1880       decl = c_parser_struct_declaration (parser);
1881       restore_extension_diagnostics (ext);
1882       return decl;
1883     }
1884   specs = build_null_declspecs ();
1885   c_parser_declspecs (parser, specs, false, true, true);
1886   if (parser->error)
1887     return NULL_TREE;
1888   if (!specs->declspecs_seen_p)
1889     {
1890       c_parser_error (parser, "expected specifier-qualifier-list");
1891       return NULL_TREE;
1892     }
1893   finish_declspecs (specs);
1894   if (c_parser_next_token_is (parser, CPP_SEMICOLON))
1895     {
1896       tree ret;
1897       if (!specs->type_seen_p)
1898         {
1899           if (pedantic)
1900             pedwarn ("ISO C forbids member declarations with no members");
1901           shadow_tag_warned (specs, pedantic);
1902           ret = NULL_TREE;
1903         }
1904       else
1905         {
1906           /* Support for unnamed structs or unions as members of
1907              structs or unions (which is [a] useful and [b] supports
1908              MS P-SDK).  */
1909           ret = grokfield (build_id_declarator (NULL_TREE), specs, NULL_TREE);
1910         }
1911       return ret;
1912     }
1913   pending_xref_error ();
1914   prefix_attrs = specs->attrs;
1915   all_prefix_attrs = prefix_attrs;
1916   specs->attrs = NULL_TREE;
1917   decls = NULL_TREE;
1918   while (true)
1919     {
1920       /* Declaring one or more declarators or un-named bit-fields.  */
1921       struct c_declarator *declarator;
1922       bool dummy = false;
1923       if (c_parser_next_token_is (parser, CPP_COLON))
1924         declarator = build_id_declarator (NULL_TREE);
1925       else
1926         declarator = c_parser_declarator (parser, specs->type_seen_p,
1927                                           C_DTR_NORMAL, &dummy);
1928       if (declarator == NULL)
1929         {
1930           c_parser_skip_to_end_of_block_or_statement (parser);
1931           break;
1932         }
1933       if (c_parser_next_token_is (parser, CPP_COLON)
1934           || c_parser_next_token_is (parser, CPP_COMMA)
1935           || c_parser_next_token_is (parser, CPP_SEMICOLON)
1936           || c_parser_next_token_is (parser, CPP_CLOSE_BRACE)
1937           || c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
1938         {
1939           tree postfix_attrs = NULL_TREE;
1940           tree width = NULL_TREE;
1941           tree d;
1942           if (c_parser_next_token_is (parser, CPP_COLON))
1943             {
1944               c_parser_consume_token (parser);
1945               width = c_parser_expr_no_commas (parser, NULL).value;
1946             }
1947           if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
1948             postfix_attrs = c_parser_attributes (parser);
1949           d = grokfield (declarator, specs, width);
1950           decl_attributes (&d, chainon (postfix_attrs,
1951                                         all_prefix_attrs), 0);
1952           TREE_CHAIN (d) = decls;
1953           decls = d;
1954           if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
1955             all_prefix_attrs = chainon (c_parser_attributes (parser),
1956                                         prefix_attrs);
1957           else
1958             all_prefix_attrs = prefix_attrs;
1959           if (c_parser_next_token_is (parser, CPP_COMMA))
1960             c_parser_consume_token (parser);
1961           else if (c_parser_next_token_is (parser, CPP_SEMICOLON)
1962                    || c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
1963             {
1964               /* Semicolon consumed in caller.  */
1965               break;
1966             }
1967           else
1968             {
1969               c_parser_error (parser, "expected %<,%>, %<;%> or %<}%>");
1970               break;
1971             }
1972         }
1973       else
1974         {
1975           c_parser_error (parser,
1976                           "expected %<:%>, %<,%>, %<;%>, %<}%> or "
1977                           "%<__attribute__%>");
1978           break;
1979         }
1980     }
1981   return decls;
1982 }
1983
1984 /* Parse a typeof specifier (a GNU extension).
1985
1986    typeof-specifier:
1987      typeof ( expression )
1988      typeof ( type-name )
1989 */
1990
1991 static struct c_typespec
1992 c_parser_typeof_specifier (c_parser *parser)
1993 {
1994   struct c_typespec ret;
1995   ret.kind = ctsk_typeof;
1996   ret.spec = error_mark_node;
1997   gcc_assert (c_parser_next_token_is_keyword (parser, RID_TYPEOF));
1998   c_parser_consume_token (parser);
1999   skip_evaluation++;
2000   in_typeof++;
2001   if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
2002     {
2003       skip_evaluation--;
2004       in_typeof--;
2005       return ret;
2006     }
2007   if (c_parser_next_token_starts_typename (parser))
2008     {
2009       struct c_type_name *type = c_parser_type_name (parser);
2010       skip_evaluation--;
2011       in_typeof--;
2012       if (type != NULL)
2013         {
2014           ret.spec = groktypename (type);
2015           pop_maybe_used (variably_modified_type_p (ret.spec, NULL_TREE));
2016         }
2017     }
2018   else
2019     {
2020       struct c_expr expr = c_parser_expression (parser);
2021       skip_evaluation--;
2022       in_typeof--;
2023       if (TREE_CODE (expr.value) == COMPONENT_REF
2024           && DECL_C_BIT_FIELD (TREE_OPERAND (expr.value, 1)))
2025         error ("%<typeof%> applied to a bit-field");
2026       ret.spec = TREE_TYPE (expr.value);
2027       pop_maybe_used (variably_modified_type_p (ret.spec, NULL_TREE));
2028     }
2029   c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
2030   return ret;
2031 }
2032
2033 /* Parse a declarator, possibly an abstract declarator (C90 6.5.4,
2034    6.5.5, C99 6.7.5, 6.7.6).  If TYPE_SEEN_P then a typedef name may
2035    be redeclared; otherwise it may not.  KIND indicates which kind of
2036    declarator is wanted.  Returns a valid declarator except in the
2037    case of a syntax error in which case NULL is returned.  *SEEN_ID is
2038    set to true if an identifier being declared is seen; this is used
2039    to diagnose bad forms of abstract array declarators and to
2040    determine whether an identifier list is syntactically permitted.
2041
2042    declarator:
2043      pointer[opt] direct-declarator
2044
2045    direct-declarator:
2046      identifier
2047      ( attributes[opt] declarator )
2048      direct-declarator array-declarator
2049      direct-declarator ( parameter-type-list )
2050      direct-declarator ( identifier-list[opt] )
2051
2052    pointer:
2053      * type-qualifier-list[opt]
2054      * type-qualifier-list[opt] pointer
2055
2056    type-qualifier-list:
2057      type-qualifier
2058      attributes
2059      type-qualifier-list type-qualifier
2060      type-qualifier-list attributes
2061
2062    parameter-type-list:
2063      parameter-list
2064      parameter-list , ...
2065
2066    parameter-list:
2067      parameter-declaration
2068      parameter-list , parameter-declaration
2069
2070    parameter-declaration:
2071      declaration-specifiers declarator attributes[opt]
2072      declaration-specifiers abstract-declarator[opt] attributes[opt]
2073
2074    identifier-list:
2075      identifier
2076      identifier-list , identifier
2077
2078    abstract-declarator:
2079      pointer
2080      pointer[opt] direct-abstract-declarator
2081
2082    direct-abstract-declarator:
2083      ( attributes[opt] abstract-declarator )
2084      direct-abstract-declarator[opt] array-declarator
2085      direct-abstract-declarator[opt] ( parameter-type-list[opt] )
2086
2087    GNU extensions:
2088
2089    direct-declarator:
2090      direct-declarator ( parameter-forward-declarations
2091                          parameter-type-list[opt] )
2092
2093    direct-abstract-declarator:
2094      direct-abstract-declarator[opt] ( parameter-forward-declarations 
2095                                        parameter-type-list[opt] )
2096
2097    parameter-forward-declarations:
2098      parameter-list ;
2099      parameter-forward-declarations parameter-list ;
2100
2101    The uses of attributes shown above are GNU extensions.
2102
2103    Some forms of array declarator are not included in C99 in the
2104    syntax for abstract declarators; these are disallowed elsewhere.
2105    This may be a defect (DR#289).
2106
2107    This function also accepts an omitted abstract declarator as being
2108    an abstract declarator, although not part of the formal syntax.  */
2109
2110 static struct c_declarator *
2111 c_parser_declarator (c_parser *parser, bool type_seen_p, c_dtr_syn kind,
2112                      bool *seen_id)
2113 {
2114   /* Parse any initial pointer part.  */
2115   if (c_parser_next_token_is (parser, CPP_MULT))
2116     {
2117       struct c_declspecs *quals_attrs = build_null_declspecs ();
2118       struct c_declarator *inner;
2119       c_parser_consume_token (parser);
2120       c_parser_declspecs (parser, quals_attrs, false, false, true);
2121       inner = c_parser_declarator (parser, type_seen_p, kind, seen_id);
2122       if (inner == NULL)
2123         return NULL;
2124       else
2125         return make_pointer_declarator (quals_attrs, inner);
2126     }
2127   /* Now we have a direct declarator, direct abstract declarator or
2128      nothing (which counts as a direct abstract declarator here).  */
2129   return c_parser_direct_declarator (parser, type_seen_p, kind, seen_id);
2130 }
2131
2132 /* Parse a direct declarator or direct abstract declarator; arguments
2133    as c_parser_declarator.  */
2134
2135 static struct c_declarator *
2136 c_parser_direct_declarator (c_parser *parser, bool type_seen_p, c_dtr_syn kind,
2137                             bool *seen_id)
2138 {
2139   /* The direct declarator must start with an identifier (possibly
2140      omitted) or a parenthesized declarator (possibly abstract).  In
2141      an ordinary declarator, initial parentheses must start a
2142      parenthesized declarator.  In an abstract declarator or parameter
2143      declarator, they could start a parenthesized declarator or a
2144      parameter list.  To tell which, the open parenthesis and any
2145      following attributes must be read.  If a declaration specifier
2146      follows, then it is a parameter list; if the specifier is a
2147      typedef name, there might be an ambiguity about redeclaring it,
2148      which is resolved in the direction of treating it as a typedef
2149      name.  If a close parenthesis follows, it is also an empty
2150      parameter list, as the syntax does not permit empty abstract
2151      declarators.  Otherwise, it is a parenthesised declarator (in
2152      which case the analysis may be repeated inside it, recursively).
2153
2154      ??? There is an ambiguity in a parameter declaration "int
2155      (__attribute__((foo)) x)", where x is not a typedef name: it
2156      could be an abstract declarator for a function, or declare x with
2157      parentheses.  The proper resolution of this ambiguity needs
2158      documenting.  At present we follow an accident of the old
2159      parser's implementation, whereby the first parameter must have
2160      some declaration specifiers other than just attributes.  Thus as
2161      a parameter declaration it is treated as a parenthesised
2162      parameter named x, and as an abstract declarator it is
2163      rejected.
2164
2165      ??? Also following the old parser, attributes inside an empty
2166      parameter list are ignored, making it a list not yielding a
2167      prototype, rather than giving an error or making it have one
2168      parameter with implicit type int.
2169
2170      ??? Also following the old parser, typedef names may be
2171      redeclared in declarators, but not Objective-C class names.  */
2172
2173   if (kind != C_DTR_ABSTRACT
2174       && c_parser_next_token_is (parser, CPP_NAME)
2175       && ((type_seen_p
2176            && c_parser_peek_token (parser)->id_kind == C_ID_TYPENAME)
2177           || c_parser_peek_token (parser)->id_kind == C_ID_ID))
2178     {
2179       struct c_declarator *inner
2180         = build_id_declarator (c_parser_peek_token (parser)->value);
2181       *seen_id = true;
2182       inner->id_loc = c_parser_peek_token (parser)->location;
2183       c_parser_consume_token (parser);
2184       return c_parser_direct_declarator_inner (parser, *seen_id, inner);
2185     }
2186
2187   if (kind != C_DTR_NORMAL
2188       && c_parser_next_token_is (parser, CPP_OPEN_SQUARE))
2189     {
2190       struct c_declarator *inner = build_id_declarator (NULL_TREE);
2191       return c_parser_direct_declarator_inner (parser, *seen_id, inner);
2192     }
2193
2194   /* Either we are at the end of an abstract declarator, or we have
2195      parentheses.  */
2196
2197   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
2198     {
2199       tree attrs;
2200       struct c_declarator *inner;
2201       c_parser_consume_token (parser);
2202       attrs = c_parser_attributes (parser);
2203       if (kind != C_DTR_NORMAL
2204           && (c_parser_next_token_starts_declspecs (parser)
2205               || c_parser_next_token_is (parser, CPP_CLOSE_PAREN)))
2206         {
2207           struct c_arg_info *args
2208             = c_parser_parms_declarator (parser, kind == C_DTR_NORMAL,
2209                                          attrs);
2210           if (args == NULL)
2211             return NULL;
2212           else
2213             {
2214               inner
2215                 = build_function_declarator (args,
2216                                              build_id_declarator (NULL_TREE));
2217               return c_parser_direct_declarator_inner (parser, *seen_id,
2218                                                        inner);
2219             }
2220         }
2221       /* A parenthesized declarator.  */
2222       inner = c_parser_declarator (parser, type_seen_p, kind, seen_id);
2223       if (inner != NULL && attrs != NULL)
2224         inner = build_attrs_declarator (attrs, inner);
2225       if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2226         {
2227           c_parser_consume_token (parser);
2228           if (inner == NULL)
2229             return NULL;
2230           else
2231             return c_parser_direct_declarator_inner (parser, *seen_id, inner);
2232         }
2233       else
2234         {
2235           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2236                                      "expected %<)%>");
2237           return NULL;
2238         }
2239     }
2240   else
2241     {
2242       if (kind == C_DTR_NORMAL)
2243         {
2244           c_parser_error (parser, "expected identifier or %<(%>");
2245           return NULL;
2246         }
2247       else
2248         return build_id_declarator (NULL_TREE);
2249     }
2250 }
2251
2252 /* Parse part of a direct declarator or direct abstract declarator,
2253    given that some (in INNER) has already been parsed; ID_PRESENT is
2254    true if an identifier is present, false for an abstract
2255    declarator.  */
2256
2257 static struct c_declarator *
2258 c_parser_direct_declarator_inner (c_parser *parser, bool id_present,
2259                                   struct c_declarator *inner)
2260 {
2261   /* Parse a sequence of array declarators and parameter lists.  */
2262   if (c_parser_next_token_is (parser, CPP_OPEN_SQUARE))
2263     {
2264       struct c_declarator *declarator;
2265       struct c_declspecs *quals_attrs = build_null_declspecs ();
2266       bool static_seen;
2267       bool star_seen;
2268       tree dimen;
2269       c_parser_consume_token (parser);
2270       c_parser_declspecs (parser, quals_attrs, false, false, true);
2271       static_seen = c_parser_next_token_is_keyword (parser, RID_STATIC);
2272       if (static_seen)
2273         c_parser_consume_token (parser);
2274       if (static_seen && !quals_attrs->declspecs_seen_p)
2275         c_parser_declspecs (parser, quals_attrs, false, false, true);
2276       if (!quals_attrs->declspecs_seen_p)
2277         quals_attrs = NULL;
2278       /* If "static" is present, there must be an array dimension.
2279          Otherwise, there may be a dimension, "*", or no
2280          dimension.  */
2281       if (static_seen)
2282         {
2283           star_seen = false;
2284           dimen = c_parser_expr_no_commas (parser, NULL).value;
2285         }
2286       else
2287         {
2288           if (c_parser_next_token_is (parser, CPP_CLOSE_SQUARE))
2289             {
2290               dimen = NULL_TREE;
2291               star_seen = false;
2292             }
2293           else if (c_parser_next_token_is (parser, CPP_MULT))
2294             {
2295               if (c_parser_peek_2nd_token (parser)->type == CPP_CLOSE_SQUARE)
2296                 {
2297                   dimen = NULL_TREE;
2298                   star_seen = true;
2299                   c_parser_consume_token (parser);
2300                 }
2301               else
2302                 {
2303                   star_seen = false;
2304                   dimen = c_parser_expr_no_commas (parser, NULL).value;
2305                 }
2306             }
2307           else
2308             {
2309               star_seen = false;
2310               dimen = c_parser_expr_no_commas (parser, NULL).value;
2311             }
2312         }
2313       if (c_parser_next_token_is (parser, CPP_CLOSE_SQUARE))
2314         c_parser_consume_token (parser);
2315       else
2316         {
2317           c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
2318                                      "expected %<]%>");
2319           return NULL;
2320         }
2321       declarator = build_array_declarator (dimen, quals_attrs, static_seen,
2322                                            star_seen);
2323       inner = set_array_declarator_inner (declarator, inner, !id_present);
2324       return c_parser_direct_declarator_inner (parser, id_present, inner);
2325     }
2326   else if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
2327     {
2328       tree attrs;
2329       struct c_arg_info *args;
2330       c_parser_consume_token (parser);
2331       attrs = c_parser_attributes (parser);
2332       args = c_parser_parms_declarator (parser, id_present, attrs);
2333       if (args == NULL)
2334         return NULL;
2335       else
2336         {
2337           inner = build_function_declarator (args, inner);
2338           return c_parser_direct_declarator_inner (parser, id_present, inner);
2339         }
2340     }
2341   return inner;
2342 }
2343
2344 /* Parse a parameter list or identifier list, including the closing
2345    parenthesis but not the opening one.  ATTRS are the attributes at
2346    the start of the list.  ID_LIST_OK is true if an identifier list is
2347    acceptable; such a list must not have attributes at the start.  */
2348
2349 static struct c_arg_info *
2350 c_parser_parms_declarator (c_parser *parser, bool id_list_ok, tree attrs)
2351 {
2352   push_scope ();
2353   declare_parm_level ();
2354   /* If the list starts with an identifier, it is an identifier list.
2355      Otherwise, it is either a prototype list or an empty list.  */
2356   if (id_list_ok
2357       && !attrs
2358       && c_parser_next_token_is (parser, CPP_NAME)
2359       && c_parser_peek_token (parser)->id_kind == C_ID_ID)
2360     {
2361       tree list = NULL_TREE;
2362       while (c_parser_next_token_is (parser, CPP_NAME)
2363              && c_parser_peek_token (parser)->id_kind == C_ID_ID)
2364         {
2365           list = chainon (list, build_tree_list (NULL_TREE,
2366                                                  c_parser_peek_token (parser)->value));
2367           c_parser_consume_token (parser);
2368           if (c_parser_next_token_is_not (parser, CPP_COMMA))
2369             break;
2370           c_parser_consume_token (parser);
2371           if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2372             {
2373               c_parser_error (parser, "expected identifier");
2374               break;
2375             }
2376         }
2377       if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2378         {
2379           struct c_arg_info *ret = XOBNEW (&parser_obstack, struct c_arg_info);
2380           ret->parms = 0;
2381           ret->tags = 0;
2382           ret->types = list;
2383           ret->others = 0;
2384           c_parser_consume_token (parser);
2385           pop_scope ();
2386           return ret;
2387         }
2388       else
2389         {
2390           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2391                                      "expected %<)%>");
2392           pop_scope ();
2393           return NULL;
2394         }
2395     }
2396   else
2397     {
2398       struct c_arg_info *ret = c_parser_parms_list_declarator (parser, attrs);
2399       pop_scope ();
2400       return ret;
2401     }
2402 }
2403
2404 /* Parse a parameter list (possibly empty), including the closing
2405    parenthesis but not the opening one.  ATTRS are the attributes at
2406    the start of the list.  */
2407
2408 static struct c_arg_info *
2409 c_parser_parms_list_declarator (c_parser *parser, tree attrs)
2410 {
2411   bool good_parm = false;
2412   /* ??? Following the old parser, forward parameter declarations may
2413      use abstract declarators, and if no real parameter declarations
2414      follow the forward declarations then this is not diagnosed.  Also
2415      note as above that attributes are ignored as the only contents of
2416      the parentheses, or as the only contents after forward
2417      declarations.  */
2418   if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2419     {
2420       struct c_arg_info *ret = XOBNEW (&parser_obstack, struct c_arg_info);
2421       ret->parms = 0;
2422       ret->tags = 0;
2423       ret->types = 0;
2424       ret->others = 0;
2425       c_parser_consume_token (parser);
2426       return ret;
2427     }
2428   if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
2429     {
2430       struct c_arg_info *ret = XOBNEW (&parser_obstack, struct c_arg_info);
2431       ret->parms = 0;
2432       ret->tags = 0;
2433       ret->others = 0;
2434       /* Suppress -Wold-style-definition for this case.  */
2435       ret->types = error_mark_node;
2436       error ("ISO C requires a named argument before %<...%>");
2437       c_parser_consume_token (parser);
2438       if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2439         {
2440           c_parser_consume_token (parser);
2441           return ret;
2442         }
2443       else
2444         {
2445           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2446                                      "expected %<)%>");
2447           return NULL;
2448         }
2449     }
2450   /* Nonempty list of parameters, either terminated with semicolon
2451      (forward declarations; recurse) or with close parenthesis (normal
2452      function) or with ", ... )" (variadic function).  */
2453   while (true)
2454     {
2455       /* Parse a parameter.  */
2456       struct c_parm *parm = c_parser_parameter_declaration (parser, attrs);
2457       attrs = NULL_TREE;
2458       if (parm != NULL)
2459         {
2460           good_parm = true;
2461           push_parm_decl (parm);
2462         }
2463       if (c_parser_next_token_is (parser, CPP_SEMICOLON))
2464         {
2465           tree new_attrs;
2466           c_parser_consume_token (parser);
2467           new_attrs = c_parser_attributes (parser);
2468           return c_parser_parms_list_declarator (parser, new_attrs);
2469         }
2470       if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2471         {
2472           c_parser_consume_token (parser);
2473           if (good_parm)
2474             return get_parm_info (false);
2475           else
2476             {
2477               struct c_arg_info *ret
2478                 = XOBNEW (&parser_obstack, struct c_arg_info);
2479               ret->parms = 0;
2480               ret->tags = 0;
2481               ret->types = 0;
2482               ret->others = 0;
2483               return ret;
2484             }
2485         }
2486       if (!c_parser_require (parser, CPP_COMMA,
2487                              "expected %<;%>, %<,%> or %<)%>"))
2488         {
2489           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
2490           return NULL;
2491         }
2492       if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
2493         {
2494           c_parser_consume_token (parser);
2495           if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2496             {
2497               c_parser_consume_token (parser);
2498               if (good_parm)
2499                 return get_parm_info (true);
2500               else
2501                 {
2502                   struct c_arg_info *ret
2503                     = XOBNEW (&parser_obstack, struct c_arg_info);
2504                   ret->parms = 0;
2505                   ret->tags = 0;
2506                   ret->types = 0;
2507                   ret->others = 0;
2508                   return ret;
2509                 }
2510             }
2511           else
2512             {
2513               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2514                                          "expected %<)%>");
2515               return NULL;
2516             }
2517         }
2518     }
2519 }
2520
2521 /* Parse a parameter declaration.  ATTRS are the attributes at the
2522    start of the declaration if it is the first parameter.  */
2523
2524 static struct c_parm *
2525 c_parser_parameter_declaration (c_parser *parser, tree attrs)
2526 {
2527   struct c_declspecs *specs;
2528   struct c_declarator *declarator;
2529   tree prefix_attrs;
2530   tree postfix_attrs = NULL_TREE;
2531   bool dummy = false;
2532   if (!c_parser_next_token_starts_declspecs (parser))
2533     {
2534       /* ??? In some Objective-C cases '...' isn't applicable so there
2535          should be a different message.  */
2536       c_parser_error (parser,
2537                       "expected declaration specifiers or %<...%>");
2538       c_parser_skip_to_end_of_parameter (parser);
2539       return NULL;
2540     }
2541   specs = build_null_declspecs ();
2542   if (attrs)
2543     {
2544       declspecs_add_attrs (specs, attrs);
2545       attrs = NULL_TREE;
2546     }
2547   c_parser_declspecs (parser, specs, true, true, true);
2548   finish_declspecs (specs);
2549   pending_xref_error ();
2550   prefix_attrs = specs->attrs;
2551   specs->attrs = NULL_TREE;
2552   declarator = c_parser_declarator (parser, specs->type_seen_p,
2553                                     C_DTR_PARM, &dummy);
2554   if (declarator == NULL)
2555     {
2556       c_parser_skip_until_found (parser, CPP_COMMA, NULL);
2557       return NULL;
2558     }
2559   if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
2560     postfix_attrs = c_parser_attributes (parser);
2561   return build_c_parm (specs, chainon (postfix_attrs, prefix_attrs),
2562                        declarator);
2563 }
2564
2565 /* Parse a string literal in an asm expression.  It should not be
2566    translated, and wide string literals are an error although
2567    permitted by the syntax.  This is a GNU extension.
2568
2569    asm-string-literal:
2570      string-literal
2571
2572    ??? At present, following the old parser, the caller needs to have
2573    set c_lex_string_translate to 0.  It would be better to follow the
2574    C++ parser rather than using the c_lex_string_translate kludge.  */
2575
2576 static tree
2577 c_parser_asm_string_literal (c_parser *parser)
2578 {
2579   tree str;
2580   if (c_parser_next_token_is (parser, CPP_STRING))
2581     {
2582       str = c_parser_peek_token (parser)->value;
2583       c_parser_consume_token (parser);
2584     }
2585   else if (c_parser_next_token_is (parser, CPP_WSTRING))
2586     {
2587       error ("wide string literal in %<asm%>");
2588       str = build_string (1, "");
2589       c_parser_consume_token (parser);
2590     }
2591   else
2592     {
2593       c_parser_error (parser, "expected string literal");
2594       str = NULL_TREE;
2595     }
2596   return str;
2597 }
2598
2599 /* Parse a simple asm expression.  This is used in restricted
2600    contexts, where a full expression with inputs and outputs does not
2601    make sense.  This is a GNU extension.
2602
2603    simple-asm-expr:
2604      asm ( asm-string-literal )
2605 */
2606
2607 static tree
2608 c_parser_simple_asm_expr (c_parser *parser)
2609 {
2610   tree str;
2611   gcc_assert (c_parser_next_token_is_keyword (parser, RID_ASM));
2612   /* ??? Follow the C++ parser rather than using the
2613      c_lex_string_translate kludge.  */
2614   c_lex_string_translate = 0;
2615   c_parser_consume_token (parser);
2616   if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
2617     {
2618       c_lex_string_translate = 1;
2619       return NULL_TREE;
2620     }
2621   str = c_parser_asm_string_literal (parser);
2622   c_lex_string_translate = 1;
2623   if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
2624     {
2625       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
2626       return NULL_TREE;
2627     }
2628   return str;
2629 }
2630
2631 /* Parse (possibly empty) attributes.  This is a GNU extension.
2632
2633    attributes:
2634      empty
2635      attributes attribute
2636
2637    attribute:
2638      __attribute__ ( ( attribute-list ) )
2639
2640    attribute-list:
2641      attrib
2642      attribute_list , attrib
2643
2644    attrib:
2645      empty
2646      any-word
2647      any-word ( identifier )
2648      any-word ( identifier , nonempty-expr-list )
2649      any-word ( expr-list )
2650
2651    where the "identifier" must not be declared as a type, and
2652    "any-word" may be any identifier (including one declared as a
2653    type), a reserved word storage class specifier, type specifier or
2654    type qualifier.  ??? This still leaves out most reserved keywords
2655    (following the old parser), shouldn't we include them, and why not
2656    allow identifiers declared as types to start the arguments?  */
2657
2658 static tree
2659 c_parser_attributes (c_parser *parser)
2660 {
2661   tree attrs = NULL_TREE;
2662   while (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
2663     {
2664       /* ??? Follow the C++ parser rather than using the
2665          c_lex_string_translate kludge.  */
2666       c_lex_string_translate = 0;
2667       c_parser_consume_token (parser);
2668       if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
2669         {
2670           c_lex_string_translate = 1;
2671           return attrs;
2672         }
2673       if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
2674         {
2675           c_lex_string_translate = 1;
2676           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
2677           return attrs;
2678         }
2679       /* Parse the attribute list.  */
2680       while (c_parser_next_token_is (parser, CPP_COMMA)
2681              || c_parser_next_token_is (parser, CPP_NAME)
2682              || c_parser_next_token_is (parser, CPP_KEYWORD))
2683         {
2684           tree attr, attr_name, attr_args;
2685           if (c_parser_next_token_is (parser, CPP_COMMA))
2686             {
2687               c_parser_consume_token (parser);
2688               continue;
2689             }
2690           if (c_parser_next_token_is (parser, CPP_KEYWORD))
2691             {
2692               /* ??? See comment above about what keywords are
2693                  accepted here.  */
2694               bool ok;
2695               switch (c_parser_peek_token (parser)->keyword)
2696                 {
2697                 case RID_STATIC:
2698                 case RID_UNSIGNED:
2699                 case RID_LONG:
2700                 case RID_CONST:
2701                 case RID_EXTERN:
2702                 case RID_REGISTER:
2703                 case RID_TYPEDEF:
2704                 case RID_SHORT:
2705                 case RID_INLINE:
2706                 case RID_VOLATILE:
2707                 case RID_SIGNED:
2708                 case RID_AUTO:
2709                 case RID_RESTRICT:
2710                 case RID_COMPLEX:
2711                 case RID_THREAD:
2712                 case RID_INT:
2713                 case RID_CHAR:
2714                 case RID_FLOAT:
2715                 case RID_DOUBLE:
2716                 case RID_VOID:
2717                 case RID_BOOL:
2718                   ok = true;
2719                   break;
2720                 default:
2721                   ok = false;
2722                   break;
2723                 }
2724               if (!ok)
2725                 break;
2726             }
2727           attr_name = c_parser_peek_token (parser)->value;
2728           c_parser_consume_token (parser);
2729           if (c_parser_next_token_is_not (parser, CPP_OPEN_PAREN))
2730             {
2731               attr = build_tree_list (attr_name, NULL_TREE);
2732               attrs = chainon (attrs, attr);
2733               continue;
2734             }
2735           c_parser_consume_token (parser);
2736           /* Parse the attribute contents.  If they start with an
2737              identifier which is followed by a comma or close
2738              parenthesis, then the arguments start with that
2739              identifier; otherwise they are an expression list.  */
2740           if (c_parser_next_token_is (parser, CPP_NAME)
2741               && c_parser_peek_token (parser)->id_kind == C_ID_ID
2742               && ((c_parser_peek_2nd_token (parser)->type == CPP_COMMA)
2743                   || (c_parser_peek_2nd_token (parser)->type
2744                       == CPP_CLOSE_PAREN)))
2745             {
2746               tree arg1 = c_parser_peek_token (parser)->value;
2747               c_parser_consume_token (parser);
2748               if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2749                 attr_args = build_tree_list (NULL_TREE, arg1);
2750               else
2751                 {
2752                   c_parser_consume_token (parser);
2753                   attr_args = tree_cons (NULL_TREE, arg1,
2754                                          c_parser_expr_list (parser));
2755                 }
2756             }
2757           else
2758             {
2759               if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2760                 attr_args = NULL_TREE;
2761               else
2762                 attr_args = c_parser_expr_list (parser);
2763             }
2764           attr = build_tree_list (attr_name, attr_args);
2765           if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2766             c_parser_consume_token (parser);
2767           else
2768             {
2769               c_lex_string_translate = 1;
2770               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2771                                          "expected %<)%>");
2772               return attrs;
2773             }
2774           attrs = chainon (attrs, attr);
2775         }
2776       if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2777         c_parser_consume_token (parser);
2778       else
2779         {
2780           c_lex_string_translate = 1;
2781           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2782                                      "expected %<)%>");
2783           return attrs;
2784         }
2785       if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2786         c_parser_consume_token (parser);
2787       else
2788         {
2789           c_lex_string_translate = 1;
2790           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2791                                      "expected %<)%>");
2792           return attrs;
2793         }
2794       c_lex_string_translate = 1;
2795     }
2796   return attrs;
2797 }
2798
2799 /* Parse a type name (C90 6.5.5, C99 6.7.6).
2800
2801    type-name:
2802      specifier-qualifier-list abstract-declarator[opt]
2803 */
2804
2805 static struct c_type_name *
2806 c_parser_type_name (c_parser *parser)
2807 {
2808   struct c_declspecs *specs = build_null_declspecs ();
2809   struct c_declarator *declarator;
2810   struct c_type_name *ret;
2811   bool dummy = false;
2812   c_parser_declspecs (parser, specs, false, true, true);
2813   if (!specs->declspecs_seen_p)
2814     {
2815       c_parser_error (parser, "expected specifier-qualifier-list");
2816       return NULL;
2817     }
2818   pending_xref_error ();
2819   finish_declspecs (specs);
2820   declarator = c_parser_declarator (parser, specs->type_seen_p,
2821                                     C_DTR_ABSTRACT, &dummy);
2822   if (declarator == NULL)
2823     return NULL;
2824   ret = XOBNEW (&parser_obstack, struct c_type_name);
2825   ret->specs = specs;
2826   ret->declarator = declarator;
2827   return ret;
2828 }
2829
2830 /* Parse an initializer (C90 6.5.7, C99 6.7.8).
2831
2832    initializer:
2833      assignment-expression
2834      { initializer-list }
2835      { initializer-list , }
2836
2837    initializer-list:
2838      designation[opt] initializer
2839      initializer-list , designation[opt] initializer
2840
2841    designation:
2842      designator-list =
2843
2844    designator-list:
2845      designator
2846      designator-list designator
2847
2848    designator:
2849      array-designator
2850      . identifier
2851
2852    array-designator:
2853      [ constant-expression ]
2854
2855    GNU extensions:
2856
2857    initializer:
2858      { }
2859
2860    designation:
2861      array-designator
2862      identifier :
2863
2864    array-designator:
2865      [ constant-expression ... constant-expression ]
2866
2867    Any expression without commas is accepted in the syntax for the
2868    constant-expressions, with non-constant expressions rejected later.
2869
2870    This function is only used for top-level initializers; for nested
2871    ones, see c_parser_initval.  */
2872
2873 static struct c_expr
2874 c_parser_initializer (c_parser *parser)
2875 {
2876   if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
2877     return c_parser_braced_init (parser, NULL_TREE, false);
2878   else
2879     return c_parser_expr_no_commas (parser, NULL);
2880 }
2881
2882 /* Parse a braced initializer list.  TYPE is the type specified for a
2883    compound literal, and NULL_TREE for other initializers and for
2884    nested braced lists.  NESTED_P is true for nested braced lists,
2885    false for the list of a compound literal or the list that is the
2886    top-level initializer in a declaration.  */
2887
2888 static struct c_expr
2889 c_parser_braced_init (c_parser *parser, tree type, bool nested_p)
2890 {
2891   gcc_assert (c_parser_next_token_is (parser, CPP_OPEN_BRACE));
2892   c_parser_consume_token (parser);
2893   if (nested_p)
2894     push_init_level (0);
2895   else
2896     really_start_incremental_init (type);
2897   if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
2898     {
2899       if (pedantic)
2900         pedwarn ("ISO C forbids empty initializer braces");
2901     }
2902   else
2903     {
2904       /* Parse a non-empty initializer list, possibly with a trailing
2905          comma.  */
2906       while (true)
2907         {
2908           c_parser_initelt (parser);
2909           if (parser->error)
2910             break;
2911           if (c_parser_next_token_is (parser, CPP_COMMA))
2912             c_parser_consume_token (parser);
2913           else
2914             break;
2915           if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
2916             break;
2917         }
2918     }
2919   if (c_parser_next_token_is_not (parser, CPP_CLOSE_BRACE))
2920     {
2921       struct c_expr ret;
2922       ret.value = error_mark_node;
2923       ret.original_code = ERROR_MARK;
2924       c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, "expected %<}%>");
2925       return ret;
2926     }
2927   c_parser_consume_token (parser);
2928   return pop_init_level (0);
2929 }
2930
2931 /* Parse a nested initializer, including designators.  */
2932
2933 static void
2934 c_parser_initelt (c_parser *parser)
2935 {
2936   /* Parse any designator or designator list.  A single array
2937      designator may have the subsequent "=" omitted in GNU C, but a
2938      longer list or a structure member designator may not.  */
2939   if (c_parser_next_token_is (parser, CPP_NAME)
2940       && c_parser_peek_2nd_token (parser)->type == CPP_COLON)
2941     {
2942       /* Old-style structure member designator.  */
2943       set_init_label (c_parser_peek_token (parser)->value);
2944       if (pedantic)
2945         pedwarn ("obsolete use of designated initializer with %<:%>");
2946       c_parser_consume_token (parser);
2947       c_parser_consume_token (parser);
2948     }
2949   else
2950     {
2951       /* des_seen is 0 if there have been no designators, 1 if there
2952          has been a single array designator and 2 otherwise.  */
2953       int des_seen = 0;
2954       while (c_parser_next_token_is (parser, CPP_OPEN_SQUARE)
2955              || c_parser_next_token_is (parser, CPP_DOT))
2956         {
2957           int des_prev = des_seen;
2958           if (des_seen < 2)
2959             des_seen++;
2960           if (c_parser_next_token_is (parser, CPP_DOT))
2961             {
2962               des_seen = 2;
2963               c_parser_consume_token (parser);
2964               if (c_parser_next_token_is (parser, CPP_NAME))
2965                 {
2966                   set_init_label (c_parser_peek_token (parser)->value);
2967                   c_parser_consume_token (parser);
2968                 }
2969               else
2970                 {
2971                   struct c_expr init;
2972                   init.value = error_mark_node;
2973                   init.original_code = ERROR_MARK;
2974                   c_parser_error (parser, "expected identifier");
2975                   c_parser_skip_until_found (parser, CPP_COMMA, NULL);
2976                   process_init_element (init);
2977                   return;
2978                 }
2979             }
2980           else
2981             {
2982               tree first, second;
2983               /* ??? Following the old parser, [ objc-receiver
2984                  objc-message-args ] is accepted as an initializer,
2985                  being distinguished from a designator by what follows
2986                  the first assignment expression inside the square
2987                  brackets, but after a first array designator a
2988                  subsequent square bracket is for Objective-C taken to
2989                  start an expression, using the obsolete form of
2990                  designated initializer without '=', rather than
2991                  possibly being a second level of designation: in LALR
2992                  terms, the '[' is shifted rather than reducing
2993                  designator to designator-list.  */
2994               if (des_prev == 1 && c_dialect_objc ())
2995                 {
2996                   des_seen = des_prev;
2997                   break;
2998                 }
2999               if (des_prev == 0 && c_dialect_objc ())
3000                 {
3001                   /* This might be an array designator or an
3002                      Objective-C message expression.  If the former,
3003                      continue parsing here; if the latter, parse the
3004                      remainder of the initializer given the starting
3005                      primary-expression.  ??? It might make sense to
3006                      distinguish when des_prev == 1 as well; see
3007                      previous comment.  */
3008                   tree rec, args;
3009                   struct c_expr mexpr;
3010                   c_parser_consume_token (parser);
3011                   if (c_parser_peek_token (parser)->type == CPP_NAME
3012                       && ((c_parser_peek_token (parser)->id_kind
3013                            == C_ID_TYPENAME)
3014                           || (c_parser_peek_token (parser)->id_kind
3015                               == C_ID_CLASSNAME)))
3016                     {
3017                       /* Type name receiver.  */
3018                       tree id = c_parser_peek_token (parser)->value;
3019                       c_parser_consume_token (parser);
3020                       rec = objc_get_class_reference (id);
3021                       goto parse_message_args;
3022                     }
3023                   first = c_parser_expr_no_commas (parser, NULL).value;
3024                   if (c_parser_next_token_is (parser, CPP_ELLIPSIS)
3025                       || c_parser_next_token_is (parser, CPP_CLOSE_SQUARE))
3026                     goto array_desig_after_first;
3027                   /* Expression receiver.  So far only one part
3028                      without commas has been parsed; there might be
3029                      more of the expression.  */
3030                   rec = first;
3031                   while (c_parser_next_token_is (parser, CPP_COMMA))
3032                     {
3033                       tree next;
3034                       c_parser_consume_token (parser);
3035                       next = c_parser_expr_no_commas (parser, NULL).value;
3036                       rec = build_compound_expr (rec, next);
3037                     }
3038                 parse_message_args:
3039                   /* Now parse the objc-message-args.  */
3040                   args = c_parser_objc_message_args (parser);
3041                   c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
3042                                              "expected %<]%>");
3043                   mexpr.value
3044                     = objc_build_message_expr (build_tree_list (rec, args));
3045                   mexpr.original_code = ERROR_MARK;
3046                   /* Now parse and process the remainder of the
3047                      initializer, starting with this message
3048                      expression as a primary-expression.  */
3049                   c_parser_initval (parser, &mexpr);
3050                   return;
3051                 }
3052               c_parser_consume_token (parser);
3053               first = c_parser_expr_no_commas (parser, NULL).value;
3054             array_desig_after_first:
3055               if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
3056                 {
3057                   c_parser_consume_token (parser);
3058                   second = c_parser_expr_no_commas (parser, NULL).value;
3059                 }
3060               else
3061                 second = NULL_TREE;
3062               if (c_parser_next_token_is (parser, CPP_CLOSE_SQUARE))
3063                 {
3064                   c_parser_consume_token (parser);
3065                   set_init_index (first, second);
3066                   if (pedantic && second)
3067                     pedwarn ("ISO C forbids specifying range of "
3068                              "elements to initialize");
3069                 }
3070               else
3071                 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
3072                                            "expected %<]%>");
3073             }
3074         }
3075       if (des_seen >= 1)
3076         {
3077           if (c_parser_next_token_is (parser, CPP_EQ))
3078             {
3079               if (pedantic && !flag_isoc99)
3080                 pedwarn ("ISO C90 forbids specifying subobject to initialize");
3081               c_parser_consume_token (parser);
3082             }
3083           else
3084             {
3085               if (des_seen == 1)
3086                 {
3087                   if (pedantic)
3088                     pedwarn ("obsolete use of designated initializer "
3089                              "without %<=%>");
3090                 }
3091               else
3092                 {
3093                   struct c_expr init;
3094                   init.value = error_mark_node;
3095                   init.original_code = ERROR_MARK;
3096                   c_parser_error (parser, "expected %<=%>");
3097                   c_parser_skip_until_found (parser, CPP_COMMA, NULL);
3098                   process_init_element (init);
3099                   return;
3100                 }
3101             }
3102         }
3103     }
3104   c_parser_initval (parser, NULL);
3105 }
3106
3107 /* Parse a nested initializer; as c_parser_initializer but parses
3108    initializers within braced lists, after any designators have been
3109    applied.  If AFTER is not NULL then it is an Objective-C message
3110    expression which is the primary-expression starting the
3111    initializer.  */
3112
3113 static void
3114 c_parser_initval (c_parser *parser, struct c_expr *after)
3115 {
3116   struct c_expr init;
3117   gcc_assert (!after || c_dialect_objc ());
3118   if (c_parser_next_token_is (parser, CPP_OPEN_BRACE) && !after)
3119     init = c_parser_braced_init (parser, NULL_TREE, true);
3120   else
3121     init = c_parser_expr_no_commas (parser, after);
3122   process_init_element (init);
3123 }
3124
3125 /* Parse a compound statement (possibly a function body) (C90 6.6.2,
3126    C99 6.8.2).
3127
3128    compound-statement:
3129      { block-item-list[opt] }
3130      { label-declarations block-item-list }
3131
3132    block-item-list:
3133      block-item
3134      block-item-list block-item
3135
3136    block-item:
3137      nested-declaration
3138      statement
3139
3140    nested-declaration:
3141      declaration
3142
3143    GNU extensions:
3144
3145    compound-statement:
3146      { label-declarations block-item-list }
3147
3148    nested-declaration:
3149      __extension__ nested-declaration
3150      nested-function-definition
3151
3152    label-declarations:
3153      label-declaration
3154      label-declarations label-declaration
3155
3156    label-declaration:
3157      __label__ identifier-list ;
3158
3159    Allowing the mixing of declarations and code is new in C99.  The
3160    GNU syntax also permits (not shown above) labels at the end of
3161    compound statements, which yield an error.  We don't allow labels
3162    on declarations; this might seem like a natural extension, but
3163    there would be a conflict between attributes on the label and
3164    prefix attributes on the declaration.  ??? The syntax follows the
3165    old parser in requiring something after label declarations.
3166    Although they are erroneous if the labels declared aren't defined,
3167    is it useful for the syntax to be this way?  */
3168
3169 static tree
3170 c_parser_compound_statement (c_parser *parser)
3171 {
3172   tree stmt;
3173   if (!c_parser_require (parser, CPP_OPEN_BRACE, "expected %<{%>"))
3174     return error_mark_node;
3175   stmt = c_begin_compound_stmt (true);
3176   c_parser_compound_statement_nostart (parser);
3177   return c_end_compound_stmt (stmt, true);
3178 }
3179
3180 /* Parse a compound statement except for the opening brace.  This is
3181    used for parsing both compound statements and statement expressions
3182    (which follow different paths to handling the opening).  */
3183
3184 static void
3185 c_parser_compound_statement_nostart (c_parser *parser)
3186 {
3187   bool last_stmt = false;
3188   bool last_label = false;
3189   if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
3190     {
3191       c_parser_consume_token (parser);
3192       return;
3193     }
3194   if (c_parser_next_token_is_keyword (parser, RID_LABEL))
3195     {
3196       /* Read zero or more forward-declarations for labels that nested
3197          functions can jump to.  */
3198       while (c_parser_next_token_is_keyword (parser, RID_LABEL))
3199         {
3200           c_parser_consume_token (parser);
3201           /* Any identifiers, including those declared as type names,
3202              are OK here.  */
3203           while (true)
3204             {
3205               tree label;
3206               if (c_parser_next_token_is_not (parser, CPP_NAME))
3207                 {
3208                   c_parser_error (parser, "expected identifier");
3209                   break;
3210                 }
3211               label
3212                 = declare_label (c_parser_peek_token (parser)->value);
3213               C_DECLARED_LABEL_FLAG (label) = 1;
3214               add_stmt (build_stmt (DECL_EXPR, label));
3215               c_parser_consume_token (parser);
3216               if (c_parser_next_token_is (parser, CPP_COMMA))
3217                 c_parser_consume_token (parser);
3218               else
3219                 break;
3220             }
3221           c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
3222         }
3223       /* ??? Locating this diagnostic on the token after the
3224          declarations end follows the old parser, but it might be
3225          better to locate it where the declarations start instead.  */
3226       if (pedantic)
3227         pedwarn ("ISO C forbids label declarations");
3228     }
3229   /* We must now have at least one statement, label or declaration.  */
3230   if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
3231     {
3232       c_parser_error (parser, "expected declaration or statement");
3233       c_parser_consume_token (parser);
3234       return;
3235     }
3236   while (c_parser_next_token_is_not (parser, CPP_CLOSE_BRACE))
3237     {
3238       location_t loc = c_parser_peek_token (parser)->location;
3239       if (c_parser_next_token_is (parser, CPP_EOF))
3240         {
3241           c_parser_error (parser, "expected declaration or statement");
3242           return;
3243         }
3244       if (c_parser_next_token_is_keyword (parser, RID_CASE)
3245           || c_parser_next_token_is_keyword (parser, RID_DEFAULT)
3246           || (c_parser_next_token_is (parser, CPP_NAME)
3247               && c_parser_peek_2nd_token (parser)->type == CPP_COLON))
3248         {
3249           last_label = true;
3250           last_stmt = false;
3251           c_parser_label (parser);
3252         }
3253       else if (!last_label
3254                && c_parser_next_token_starts_declspecs (parser))
3255         {
3256           last_label = false;
3257           c_parser_declaration_or_fndef (parser, true, true, true, true);
3258           if (last_stmt
3259               && ((pedantic && !flag_isoc99)
3260                   || warn_declaration_after_statement))
3261             pedwarn_c90 ("%HISO C90 forbids mixed declarations and code",
3262                          &loc);
3263           last_stmt = false;
3264         }
3265       else if (!last_label
3266                && c_parser_next_token_is_keyword (parser, RID_EXTENSION))
3267         {
3268           /* __extension__ can start a declaration, but is also an
3269              unary operator that can start an expression.  Consume all
3270              but the last of a possible series of __extension__ to
3271              determine which.  */
3272           while (c_parser_peek_2nd_token (parser)->type == CPP_KEYWORD
3273                  && (c_parser_peek_2nd_token (parser)->keyword
3274                      == RID_EXTENSION))
3275             c_parser_consume_token (parser);
3276           if (c_token_starts_declspecs (c_parser_peek_2nd_token (parser)))
3277             {
3278               int ext;
3279               ext = disable_extension_diagnostics ();
3280               c_parser_consume_token (parser);
3281               last_label = false;
3282               c_parser_declaration_or_fndef (parser, true, true, true, true);
3283               /* Following the old parser, __extension__ does not
3284                  disable this diagnostic.  */
3285               restore_extension_diagnostics (ext);
3286               if (last_stmt
3287                   && ((pedantic && !flag_isoc99)
3288                       || warn_declaration_after_statement))
3289                 pedwarn_c90 ("%HISO C90 forbids mixed declarations and code",
3290                              &loc);
3291               last_stmt = false;
3292             }
3293           else
3294             goto statement;
3295         }
3296       else
3297         {
3298         statement:
3299           last_label = false;
3300           last_stmt = true;
3301           c_parser_statement_after_labels (parser);
3302         }
3303     }
3304   if (last_label)
3305     error ("label at end of compound statement");
3306   c_parser_consume_token (parser);
3307 }
3308
3309 /* Parse a label (C90 6.6.1, C99 6.8.1).
3310
3311    label:
3312      identifier : attributes[opt]
3313      case constant-expression :
3314      default :
3315
3316    GNU extensions:
3317
3318    label:
3319      case constant-expression ... constant-expression :
3320
3321    The use of attributes on labels is a GNU extension.  The syntax in
3322    GNU C accepts any expressions without commas, non-constant
3323    expressions being rejected later.  */
3324
3325 static void
3326 c_parser_label (c_parser *parser)
3327 {
3328   location_t loc1 = c_parser_peek_token (parser)->location;
3329   tree label = NULL_TREE;
3330   if (c_parser_next_token_is_keyword (parser, RID_CASE))
3331     {
3332       tree exp1, exp2;
3333       c_parser_consume_token (parser);
3334       exp1 = c_parser_expr_no_commas (parser, NULL).value;
3335       if (c_parser_next_token_is (parser, CPP_COLON))
3336         {
3337           c_parser_consume_token (parser);
3338           label = do_case (exp1, NULL_TREE);
3339         }
3340       else if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
3341         {
3342           c_parser_consume_token (parser);
3343           exp2 = c_parser_expr_no_commas (parser, NULL).value;
3344           if (c_parser_require (parser, CPP_COLON, "expected %<:%>"))
3345             label = do_case (exp1, exp2);
3346         }
3347       else
3348         c_parser_error (parser, "expected %<:%> or %<...%>");
3349     }
3350   else if (c_parser_next_token_is_keyword (parser, RID_DEFAULT))
3351     {
3352       c_parser_consume_token (parser);
3353       if (c_parser_require (parser, CPP_COLON, "expected %<:%>"))
3354         label = do_case (NULL_TREE, NULL_TREE);
3355     }
3356   else
3357     {
3358       tree name = c_parser_peek_token (parser)->value;
3359       tree tlab;
3360       location_t loc2;
3361       tree attrs;
3362       gcc_assert (c_parser_next_token_is (parser, CPP_NAME));
3363       c_parser_consume_token (parser);
3364       gcc_assert (c_parser_next_token_is (parser, CPP_COLON));
3365       loc2 = c_parser_peek_token (parser)->location;
3366       c_parser_consume_token (parser);
3367       attrs = c_parser_attributes (parser);
3368       tlab = define_label (loc2, name);
3369       if (tlab)
3370         {
3371           decl_attributes (&tlab, attrs, 0);
3372           label = add_stmt (build_stmt (LABEL_EXPR, tlab));
3373         }
3374     }
3375   if (label)
3376     SET_EXPR_LOCATION (label, loc1);
3377 }
3378
3379 /* Parse a statement (C90 6.6, C99 6.8).
3380
3381    statement:
3382      labeled-statement
3383      compound-statement
3384      expression-statement
3385      selection-statement
3386      iteration-statement
3387      jump-statement
3388
3389    labeled-statement:
3390      label statement
3391
3392    expression-statement:
3393      expression[opt] ;
3394
3395    selection-statement:
3396      if-statement
3397      switch-statement
3398
3399    iteration-statement:
3400      while-statement
3401      do-statement
3402      for-statement
3403
3404    jump-statement:
3405      goto identifier ;
3406      continue ;
3407      break ;
3408      return expression[opt] ;
3409
3410    GNU extensions:
3411
3412    statement:
3413      asm-statement
3414
3415    jump-statement:
3416      goto * expression ;
3417
3418    Objective-C:
3419
3420    statement:
3421      objc-throw-statement
3422      objc-try-catch-statement
3423      objc-synchronized-statement
3424
3425    objc-throw-statement:
3426      @throw expression ;
3427      @throw ;
3428 */
3429
3430 static void
3431 c_parser_statement (c_parser *parser)
3432 {
3433   while (c_parser_next_token_is_keyword (parser, RID_CASE)
3434          || c_parser_next_token_is_keyword (parser, RID_DEFAULT)
3435          || (c_parser_next_token_is (parser, CPP_NAME)
3436              && c_parser_peek_2nd_token (parser)->type == CPP_COLON))
3437     c_parser_label (parser);
3438   c_parser_statement_after_labels (parser);
3439 }
3440
3441 /* Parse a statement, other than a labeled statement.  */
3442
3443 static void
3444 c_parser_statement_after_labels (c_parser *parser)
3445 {
3446   location_t loc = c_parser_peek_token (parser)->location;
3447   tree stmt = NULL_TREE;
3448   switch (c_parser_peek_token (parser)->type)
3449     {
3450     case CPP_OPEN_BRACE:
3451       add_stmt (c_parser_compound_statement (parser));
3452       break;
3453     case CPP_KEYWORD:
3454       switch (c_parser_peek_token (parser)->keyword)
3455         {
3456         case RID_IF:
3457           c_parser_if_statement (parser);
3458           break;
3459         case RID_SWITCH:
3460           c_parser_switch_statement (parser);
3461           break;
3462         case RID_WHILE:
3463           c_parser_while_statement (parser);
3464           break;
3465         case RID_DO:
3466           c_parser_do_statement (parser);
3467           break;
3468         case RID_FOR:
3469           c_parser_for_statement (parser);
3470           break;
3471         case RID_GOTO:
3472           c_parser_consume_token (parser);
3473           if (c_parser_next_token_is (parser, CPP_NAME))
3474             {
3475               stmt = c_finish_goto_label (c_parser_peek_token (parser)->value);
3476               c_parser_consume_token (parser);
3477             }
3478           else if (c_parser_next_token_is (parser, CPP_MULT))
3479             {
3480               c_parser_consume_token (parser);
3481               stmt = c_finish_goto_ptr (c_parser_expression (parser).value);
3482             }
3483           else
3484             c_parser_error (parser, "expected identifier or %<*%>");
3485           goto expect_semicolon;
3486         case RID_CONTINUE:
3487           c_parser_consume_token (parser);
3488           stmt = c_finish_bc_stmt (&c_cont_label, false);
3489           goto expect_semicolon;
3490         case RID_BREAK:
3491           c_parser_consume_token (parser);
3492           stmt = c_finish_bc_stmt (&c_break_label, true);
3493           goto expect_semicolon;
3494         case RID_RETURN:
3495           c_parser_consume_token (parser);
3496           if (c_parser_next_token_is (parser, CPP_SEMICOLON))
3497             {
3498               stmt = c_finish_return (NULL_TREE);
3499               c_parser_consume_token (parser);
3500             }
3501           else
3502             {
3503               stmt = c_finish_return (c_parser_expression (parser).value);
3504               goto expect_semicolon;
3505             }
3506           break;
3507         case RID_ASM:
3508           stmt = c_parser_asm_statement (parser);
3509           break;
3510         case RID_AT_THROW:
3511           gcc_assert (c_dialect_objc ());
3512           c_parser_consume_token (parser);
3513           if (c_parser_next_token_is (parser, CPP_SEMICOLON))
3514             {
3515               stmt = objc_build_throw_stmt (NULL_TREE);
3516               c_parser_consume_token (parser);
3517             }
3518           else
3519             {
3520               stmt
3521                 = objc_build_throw_stmt (c_parser_expression (parser).value);
3522               goto expect_semicolon;
3523             }
3524           break;
3525         case RID_AT_TRY:
3526           gcc_assert (c_dialect_objc ());
3527           c_parser_objc_try_catch_statement (parser);
3528           break;
3529         case RID_AT_SYNCHRONIZED:
3530           gcc_assert (c_dialect_objc ());
3531           c_parser_objc_synchronized_statement (parser);
3532           break;
3533         default:
3534           goto expr_stmt;
3535         }
3536       break;
3537     case CPP_SEMICOLON:
3538       c_parser_consume_token (parser);
3539       break;
3540     case CPP_CLOSE_PAREN:
3541     case CPP_CLOSE_SQUARE:
3542       /* Avoid infinite loop in error recovery:
3543          c_parser_skip_until_found stops at a closing nesting
3544          delimiter without consuming it, but here we need to consume
3545          it to proceed further.  */
3546       c_parser_error (parser, "expected statement");
3547       c_parser_consume_token (parser);
3548       break;
3549     default:
3550     expr_stmt:
3551       stmt = c_finish_expr_stmt (c_parser_expression (parser).value);
3552     expect_semicolon:
3553       c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
3554       break;
3555     }
3556   /* Two cases cannot and do not have line numbers associated: If stmt
3557      is degenerate, such as "2;", then stmt is an INTEGER_CST, which
3558      cannot hold line numbers.  But that's OK because the statement
3559      will either be changed to a MODIFY_EXPR during gimplification of
3560      the statement expr, or discarded.  If stmt was compound, but
3561      without new variables, we will have skipped the creation of a
3562      BIND and will have a bare STATEMENT_LIST.  But that's OK because
3563      (recursively) all of the component statements should already have
3564      line numbers assigned.  ??? Can we discard no-op statements
3565      earlier?  */
3566   if (stmt && EXPR_P (stmt))
3567     SET_EXPR_LOCATION (stmt, loc);
3568 }
3569
3570 /* Parse a parenthesized condition from an if, do or while statement.
3571
3572    condition:
3573      ( expression )
3574 */
3575 static tree
3576 c_parser_paren_condition (c_parser *parser)
3577 {
3578   location_t loc;
3579   tree cond;
3580   if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
3581     return error_mark_node;
3582   loc = c_parser_peek_token (parser)->location;
3583   cond = c_objc_common_truthvalue_conversion
3584     (c_parser_expression (parser).value);
3585   if (EXPR_P (cond))
3586     SET_EXPR_LOCATION (cond, loc);
3587   c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
3588   return cond;
3589 }
3590
3591 /* Parse a statement which is a block in C99.  */
3592
3593 static tree
3594 c_parser_c99_block_statement (c_parser *parser)
3595 {
3596   tree block = c_begin_compound_stmt (flag_isoc99);
3597   c_parser_statement (parser);
3598   return c_end_compound_stmt (block, flag_isoc99);
3599 }
3600
3601 /* Parse the body of an if statement or the else half thereof.  This
3602    is just parsing a statement but (a) it is a block in C99, (b) we
3603    track whether the body is an if statement for the sake of
3604    -Wparentheses warnings, (c) we handle an empty body specially for
3605    the sake of -Wextra warnings.  */
3606
3607 static tree
3608 c_parser_if_body (c_parser *parser, bool *if_p)
3609 {
3610   tree block = c_begin_compound_stmt (flag_isoc99);
3611   while (c_parser_next_token_is_keyword (parser, RID_CASE)
3612          || c_parser_next_token_is_keyword (parser, RID_DEFAULT)
3613          || (c_parser_next_token_is (parser, CPP_NAME)
3614              && c_parser_peek_2nd_token (parser)->type == CPP_COLON))
3615     c_parser_label (parser);
3616   *if_p = c_parser_next_token_is_keyword (parser, RID_IF);
3617   if (extra_warnings && c_parser_next_token_is (parser, CPP_SEMICOLON))
3618     add_stmt (build (NOP_EXPR, NULL_TREE, NULL_TREE));
3619   c_parser_statement_after_labels (parser);
3620   return c_end_compound_stmt (block, flag_isoc99);
3621 }
3622
3623 /* Parse an if statement (C90 6.6.4, C99 6.8.4).
3624
3625    if-statement:
3626      if ( expression ) statement
3627      if ( expression ) statement else statement
3628 */
3629
3630 static void
3631 c_parser_if_statement (c_parser *parser)
3632 {
3633   tree block;
3634   location_t loc;
3635   tree cond;
3636   bool first_if = false, second_if = false;
3637   tree first_body, second_body;
3638   gcc_assert (c_parser_next_token_is_keyword (parser, RID_IF));
3639   c_parser_consume_token (parser);
3640   block = c_begin_compound_stmt (flag_isoc99);
3641   loc = c_parser_peek_token (parser)->location;
3642   cond = c_parser_paren_condition (parser);
3643   first_body = c_parser_if_body (parser, &first_if);
3644   if (c_parser_next_token_is_keyword (parser, RID_ELSE))
3645     {
3646       c_parser_consume_token (parser);
3647       second_body = c_parser_if_body (parser, &second_if);
3648     }
3649   else
3650     second_body = NULL_TREE;
3651   c_finish_if_stmt (loc, cond, first_body, second_body, first_if);
3652   add_stmt (c_end_compound_stmt (block, flag_isoc99));
3653 }
3654
3655 /* Parse a switch statement (C90 6.6.4, C99 6.8.4).
3656
3657    switch-statement:
3658      switch (expression) statement
3659 */
3660
3661 static void
3662 c_parser_switch_statement (c_parser *parser)
3663 {
3664   tree block, expr, body, save_break;
3665   gcc_assert (c_parser_next_token_is_keyword (parser, RID_SWITCH));
3666   c_parser_consume_token (parser);
3667   block = c_begin_compound_stmt (flag_isoc99);
3668   if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
3669     {
3670       expr = c_parser_expression (parser).value;
3671       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
3672     }
3673   else
3674     expr = error_mark_node;
3675   c_start_case (expr);
3676   save_break = c_break_label;
3677   c_break_label = NULL_TREE;
3678   body = c_parser_c99_block_statement (parser);
3679   c_finish_case (body);
3680   if (c_break_label)
3681     add_stmt (build (LABEL_EXPR, void_type_node, c_break_label));
3682   c_break_label = save_break;
3683   add_stmt (c_end_compound_stmt (block, flag_isoc99));
3684 }
3685
3686 /* Parse a while statement (C90 6.6.5, C99 6.8.5).
3687
3688    while-statement:
3689       while (expression) statement
3690 */
3691
3692 static void
3693 c_parser_while_statement (c_parser *parser)
3694 {
3695   tree block, cond, body, save_break, save_cont;
3696   location_t loc;
3697   gcc_assert (c_parser_next_token_is_keyword (parser, RID_WHILE));
3698   c_parser_consume_token (parser);
3699   block = c_begin_compound_stmt (flag_isoc99);
3700   loc = c_parser_peek_token (parser)->location;
3701   cond = c_parser_paren_condition (parser);
3702   save_break = c_break_label;
3703   c_break_label = NULL_TREE;
3704   save_cont = c_cont_label;
3705   c_cont_label = NULL_TREE;
3706   body = c_parser_c99_block_statement (parser);
3707   c_finish_loop (loc, cond, NULL, body, c_break_label, c_cont_label, true);
3708   add_stmt (c_end_compound_stmt (block, flag_isoc99));
3709   c_break_label = save_break;
3710   c_cont_label = save_cont;
3711 }
3712
3713 /* Parse a do statement (C90 6.6.5, C99 6.8.5).
3714
3715    do-statement:
3716      do statement while ( expression ) ;
3717 */
3718
3719 static void
3720 c_parser_do_statement (c_parser *parser)
3721 {
3722   tree block, cond, body, save_break, save_cont, new_break, new_cont;
3723   location_t loc;
3724   gcc_assert (c_parser_next_token_is_keyword (parser, RID_DO));
3725   c_parser_consume_token (parser);
3726   block = c_begin_compound_stmt (flag_isoc99);
3727   loc = c_parser_peek_token (parser)->location;
3728   save_break = c_break_label;
3729   c_break_label = NULL_TREE;
3730   save_cont = c_cont_label;
3731   c_cont_label = NULL_TREE;
3732   body = c_parser_c99_block_statement (parser);
3733   c_parser_require_keyword (parser, RID_WHILE, "expected %<while%>");
3734   new_break = c_break_label;
3735   c_break_label = save_break;
3736   new_cont = c_cont_label;
3737   c_cont_label = save_cont;
3738   cond = c_parser_paren_condition (parser);
3739   if (!c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>"))
3740     c_parser_skip_to_end_of_block_or_statement (parser);
3741   c_finish_loop (loc, cond, NULL, body, new_break, new_cont, false);
3742   add_stmt (c_end_compound_stmt (block, flag_isoc99));
3743 }
3744
3745 /* Parse a for statement (C90 6.6.5, C99 6.8.5).
3746
3747    for-statement:
3748      for ( expression[opt] ; expression[opt] ; expression[opt] ) statement
3749      for ( nested-declaration expression[opt] ; expression[opt] ) statement
3750
3751    The form with a declaration is new in C99.
3752
3753    ??? In accordance with the old parser, the declaration may be a
3754    nested function, which is then rejected in check_for_loop_decls,
3755    but does it make any sense for this to be included in the grammar?
3756    Note in particular that the nested function does not include a
3757    trailing ';', whereas the "declaration" production includes one.
3758    Also, can we reject bad declarations earlier and cheaper than
3759    check_for_loop_decls?  */
3760
3761 static void
3762 c_parser_for_statement (c_parser *parser)
3763 {
3764   tree block, cond, incr, save_break, save_cont, body;
3765   location_t loc = UNKNOWN_LOCATION;
3766   gcc_assert (c_parser_next_token_is_keyword (parser, RID_FOR));
3767   c_parser_consume_token (parser);
3768   block = c_begin_compound_stmt (flag_isoc99);
3769   if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
3770     {
3771       /* Parse the initialization declaration or expression.  */
3772       if (c_parser_next_token_is (parser, CPP_SEMICOLON))
3773         {
3774           c_parser_consume_token (parser);
3775           c_finish_expr_stmt (NULL_TREE);
3776         }
3777       else if (c_parser_next_token_starts_declspecs (parser))
3778         {
3779           c_parser_declaration_or_fndef (parser, true, true, true, true);
3780           check_for_loop_decls ();
3781         }
3782       else if (c_parser_next_token_is_keyword (parser, RID_EXTENSION))
3783         {
3784           /* __extension__ can start a declaration, but is also an
3785              unary operator that can start an expression.  Consume all
3786              but the last of a possible series of __extension__ to
3787              determine which.  */
3788           while (c_parser_peek_2nd_token (parser)->type == CPP_KEYWORD
3789                  && (c_parser_peek_2nd_token (parser)->keyword
3790                      == RID_EXTENSION))
3791             c_parser_consume_token (parser);
3792           if (c_token_starts_declspecs (c_parser_peek_2nd_token (parser)))
3793             {
3794               int ext;
3795               ext = disable_extension_diagnostics ();
3796               c_parser_consume_token (parser);
3797               c_parser_declaration_or_fndef (parser, true, true, true, true);
3798               restore_extension_diagnostics (ext);
3799               check_for_loop_decls ();
3800             }
3801           else
3802             goto init_expr;
3803         }
3804       else
3805         {
3806         init_expr:
3807           c_finish_expr_stmt (c_parser_expression (parser).value);
3808           c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
3809         }
3810       /* Parse the loop condition.  */
3811       loc = c_parser_peek_token (parser)->location;
3812       if (c_parser_next_token_is (parser, CPP_SEMICOLON))
3813         {
3814           c_parser_consume_token (parser);
3815           cond = NULL_TREE;
3816         }
3817       else
3818         {
3819           tree ocond = c_parser_expression (parser).value;
3820           cond = c_objc_common_truthvalue_conversion (ocond);
3821           if (EXPR_P (cond))
3822             SET_EXPR_LOCATION (cond, loc);
3823           c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
3824         }
3825       /* Parse the increment expression.  */
3826       if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3827         incr = c_process_expr_stmt (NULL_TREE);
3828       else
3829         incr = c_process_expr_stmt (c_parser_expression (parser).value);
3830       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
3831     }
3832   else
3833     {
3834       cond = error_mark_node;
3835       incr = error_mark_node;
3836     }
3837   save_break = c_break_label;
3838   c_break_label = NULL_TREE;
3839   save_cont = c_cont_label;
3840   c_cont_label = NULL_TREE;
3841   body = c_parser_c99_block_statement (parser);
3842   c_finish_loop (loc, cond, incr, body, c_break_label, c_cont_label, true);
3843   add_stmt (c_end_compound_stmt (block, flag_isoc99));
3844   c_break_label = save_break;
3845   c_cont_label = save_cont;
3846 }
3847
3848 /* Parse an asm statement, a GNU extension.  This is a full-blown asm
3849    statement with inputs, outputs, clobbers, and volatile tag
3850    allowed.
3851
3852    asm-statement:
3853      asm type-qualifier[opt] ( asm-argument ) ;
3854
3855    asm-argument:
3856      asm-string-literal
3857      asm-string-literal : asm-operands[opt]
3858      asm-string-literal : asm-operands[opt] : asm-operands[opt]
3859      asm-string-literal : asm-operands[opt] : asm-operands[opt] : asm-clobbers
3860
3861    Qualifiers other than volatile are accepted in the syntax but
3862    warned for.  */
3863
3864 static tree
3865 c_parser_asm_statement (c_parser *parser)
3866 {
3867   tree quals, str, outputs, inputs, clobbers, ret;
3868   bool simple;
3869   gcc_assert (c_parser_next_token_is_keyword (parser, RID_ASM));
3870   c_parser_consume_token (parser);
3871   if (c_parser_next_token_is_keyword (parser, RID_VOLATILE))
3872     {
3873       quals = c_parser_peek_token (parser)->value;
3874       c_parser_consume_token (parser);
3875     }
3876   else if (c_parser_next_token_is_keyword (parser, RID_CONST)
3877            || c_parser_next_token_is_keyword (parser, RID_RESTRICT))
3878     {
3879       warning ("%E qualifier ignored on asm",
3880                c_parser_peek_token (parser)->value);
3881       quals = NULL_TREE;
3882       c_parser_consume_token (parser);
3883     }
3884   else
3885     quals = NULL_TREE;
3886   /* ??? Follow the C++ parser rather than using the
3887      c_lex_string_translate kludge.  */
3888   c_lex_string_translate = 0;
3889   if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
3890     {
3891       c_lex_string_translate = 1;
3892       return NULL_TREE;
3893     }
3894   str = c_parser_asm_string_literal (parser);
3895   if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3896     {
3897       simple = true;
3898       outputs = NULL_TREE;
3899       inputs = NULL_TREE;
3900       clobbers = NULL_TREE;
3901       goto done_asm;
3902     }
3903   if (!c_parser_require (parser, CPP_COLON, "expected %<:%> or %<)%>"))
3904     {
3905       c_lex_string_translate = 1;
3906       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
3907       return NULL_TREE;
3908     }
3909   simple = false;
3910   /* Parse outputs.  */
3911   if (c_parser_next_token_is (parser, CPP_COLON)
3912       || c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3913     outputs = NULL_TREE;
3914   else
3915     outputs = c_parser_asm_operands (parser);
3916   if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3917     {
3918       inputs = NULL_TREE;
3919       clobbers = NULL_TREE;
3920       goto done_asm;
3921     }
3922   if (!c_parser_require (parser, CPP_COLON, "expected %<:%> or %<)%>"))
3923     {
3924       c_lex_string_translate = 1;
3925       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
3926       return NULL_TREE;
3927     }
3928   /* Parse inputs.  */
3929   if (c_parser_next_token_is (parser, CPP_COLON)
3930       || c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3931     inputs = NULL_TREE;
3932   else
3933     inputs = c_parser_asm_operands (parser);
3934   if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3935     {
3936       clobbers = NULL_TREE;
3937       goto done_asm;
3938     }
3939   if (!c_parser_require (parser, CPP_COLON, "expected %<:%> or %<)%>"))
3940     {
3941       c_lex_string_translate = 1;
3942       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
3943       return NULL_TREE;
3944     }
3945   /* Parse clobbers.  */
3946   clobbers = c_parser_asm_clobbers (parser);
3947  done_asm:
3948   c_lex_string_translate = 1;
3949   if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
3950     {
3951       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
3952       return NULL_TREE;
3953     }
3954   if (!c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>"))
3955     c_parser_skip_to_end_of_block_or_statement (parser);
3956   ret = build_asm_stmt (quals, build_asm_expr (str, outputs, inputs,
3957                                                clobbers, simple));
3958   return ret;
3959 }
3960
3961 /* Parse asm operands, a GNU extension.
3962
3963    asm-operands:
3964      asm-operand
3965      asm-operands , asm-operand
3966
3967    asm-operand:
3968      asm-string-literal ( expression )
3969      [ identifier ] asm-string-literal ( expression )
3970 */
3971
3972 static tree
3973 c_parser_asm_operands (c_parser *parser)
3974 {
3975   tree list = NULL_TREE;
3976   while (true)
3977     {
3978       tree name, str, expr;
3979       if (c_parser_next_token_is (parser, CPP_OPEN_SQUARE))
3980         {
3981           c_parser_consume_token (parser);
3982           if (c_parser_next_token_is (parser, CPP_NAME))
3983             {
3984               tree id = c_parser_peek_token (parser)->value;
3985               c_parser_consume_token (parser);
3986               name = build_string (IDENTIFIER_LENGTH (id),
3987                                    IDENTIFIER_POINTER (id));
3988             }
3989           else
3990             {
3991               c_parser_error (parser, "expected identifier");
3992               c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, NULL);
3993               return NULL_TREE;
3994             }
3995           c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
3996                                      "expected %<]%>");
3997         }
3998       else
3999         name = NULL_TREE;
4000       str = c_parser_asm_string_literal (parser);
4001       if (str == NULL_TREE)
4002         return NULL_TREE;
4003       c_lex_string_translate = 1;
4004       if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
4005         {
4006           c_lex_string_translate = 0;
4007           return NULL_TREE;
4008         }
4009       expr = c_parser_expression (parser).value;
4010       c_lex_string_translate = 0;
4011       if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
4012         {
4013           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
4014           return NULL_TREE;
4015         }
4016       list = chainon (list, build_tree_list (build_tree_list (name, str),
4017                                              expr));
4018       if (c_parser_next_token_is (parser, CPP_COMMA))
4019         c_parser_consume_token (parser);
4020       else
4021         break;
4022     }
4023   return list;
4024 }
4025
4026 /* Parse asm clobbers, a GNU extension.
4027
4028    asm-clobbers:
4029      asm-string-literal
4030      asm-clobbers , asm-string-literal
4031 */
4032
4033 static tree
4034 c_parser_asm_clobbers (c_parser *parser)
4035 {
4036   tree list = NULL_TREE;
4037   while (true)
4038     {
4039       tree str = c_parser_asm_string_literal (parser);
4040       if (str)
4041         list = tree_cons (NULL_TREE, str, list);
4042       else
4043         return NULL_TREE;
4044       if (c_parser_next_token_is (parser, CPP_COMMA))
4045         c_parser_consume_token (parser);
4046       else
4047         break;
4048     }
4049   return list;
4050 }
4051
4052 /* Parse an expression other than a compound expression; that is, an
4053    assignment expression (C90 6.3.16, C99 6.5.16).  If AFTER is not
4054    NULL then it is an Objective-C message expression which is the
4055    primary-expression starting the expression as an initializer.
4056
4057    assignment-expression:
4058      conditional-expression
4059      unary-expression assignment-operator assignment-expression
4060
4061    assignment-operator: one of
4062      = *= /= %= += -= <<= >>= &= ^= |=
4063
4064    In GNU C we accept any conditional expression on the LHS and
4065    diagnose the invalid lvalue rather than producing a syntax
4066    error.  */
4067
4068 static struct c_expr
4069 c_parser_expr_no_commas (c_parser *parser, struct c_expr *after)
4070 {
4071   struct c_expr lhs, rhs, ret;
4072   enum tree_code code;
4073   gcc_assert (!after || c_dialect_objc ());
4074   lhs = c_parser_conditional_expression (parser, after);
4075   switch (c_parser_peek_token (parser)->type)
4076     {
4077     case CPP_EQ:
4078       code = NOP_EXPR;
4079       break;
4080     case CPP_MULT_EQ:
4081       code = MULT_EXPR;
4082       break;
4083     case CPP_DIV_EQ:
4084       code = TRUNC_DIV_EXPR;
4085       break;
4086     case CPP_MOD_EQ:
4087       code = TRUNC_MOD_EXPR;
4088       break;
4089     case CPP_PLUS_EQ:
4090       code = PLUS_EXPR;
4091       break;
4092     case CPP_MINUS_EQ:
4093       code = MINUS_EXPR;
4094       break;
4095     case CPP_LSHIFT_EQ:
4096       code = LSHIFT_EXPR;
4097       break;
4098     case CPP_RSHIFT_EQ:
4099       code = RSHIFT_EXPR;
4100       break;
4101     case CPP_AND_EQ:
4102       code = BIT_AND_EXPR;
4103       break;
4104     case CPP_XOR_EQ:
4105       code = BIT_XOR_EXPR;
4106       break;
4107     case CPP_OR_EQ:
4108       code = BIT_IOR_EXPR;
4109       break;
4110     default:
4111       return lhs;
4112     }
4113   c_parser_consume_token (parser);
4114   rhs = c_parser_expr_no_commas (parser, NULL);
4115   ret.value = build_modify_expr (lhs.value, code, rhs.value);
4116   if (code == NOP_EXPR)
4117     ret.original_code = MODIFY_EXPR;
4118   else
4119     {
4120       TREE_NO_WARNING (ret.value) = 1;
4121       ret.original_code = ERROR_MARK;
4122     }
4123   return ret;
4124 }
4125
4126 /* Parse a conditional expression (C90 6.3.15, C99 6.5.15).  If AFTER
4127    is not NULL then it is an Objective-C message expression which is
4128    the primary-expression starting the expression as an initializer.
4129
4130    conditional-expression:
4131      logical-OR-expression
4132      logical-OR-expression ? expression : conditional-expression
4133
4134    GNU extensions:
4135
4136    conditional-expression:
4137      logical-OR-expression ? : conditional-expression
4138 */
4139
4140 static struct c_expr
4141 c_parser_conditional_expression (c_parser *parser, struct c_expr *after)
4142 {
4143   struct c_expr cond, exp1, exp2, ret;
4144   gcc_assert (!after || c_dialect_objc ());
4145   cond = c_parser_binary_expression (parser, after);
4146   if (c_parser_next_token_is_not (parser, CPP_QUERY))
4147     return cond;
4148   c_parser_consume_token (parser);
4149   if (c_parser_next_token_is (parser, CPP_COLON))
4150     {
4151       if (pedantic)
4152         pedwarn ("ISO C forbids omitting the middle term of a ?: expression");
4153       /* Make sure first operand is calculated only once.  */
4154       exp1.value = save_expr (default_conversion (cond.value));
4155       cond.value = c_objc_common_truthvalue_conversion (exp1.value);
4156       skip_evaluation += cond.value == truthvalue_true_node;
4157     }
4158   else
4159     {
4160       cond.value
4161         = c_objc_common_truthvalue_conversion
4162         (default_conversion (cond.value));
4163       skip_evaluation += cond.value == truthvalue_false_node;
4164       exp1 = c_parser_expression (parser);
4165       skip_evaluation += ((cond.value == truthvalue_true_node)
4166                           - (cond.value == truthvalue_false_node));
4167     }
4168   if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
4169     {
4170       skip_evaluation -= cond.value == truthvalue_true_node;
4171       ret.value = error_mark_node;
4172       ret.original_code = ERROR_MARK;
4173       return ret;
4174     }
4175   exp2 = c_parser_conditional_expression (parser, NULL);
4176   skip_evaluation -= cond.value == truthvalue_true_node;
4177   ret.value = build_conditional_expr (cond.value, exp1.value, exp2.value);
4178   ret.original_code = ERROR_MARK;
4179   return ret;
4180 }
4181
4182 /* Parse a binary expression; that is, a logical-OR-expression (C90
4183    6.3.5-6.3.14, C99 6.5.5-6.5.14).  If AFTER is not NULL then it is
4184    an Objective-C message expression which is the primary-expression
4185    starting the expression as an initializer.
4186
4187    multiplicative-expression:
4188      cast-expression
4189      multiplicative-expression * cast-expression
4190      multiplicative-expression / cast-expression
4191      multiplicative-expression % cast-expression
4192
4193    additive-expression:
4194      multiplicative-expression
4195      additive-expression + multiplicative-expression
4196      additive-expression - multiplicative-expression
4197
4198    shift-expression:
4199      additive-expression
4200      shift-expression << additive-expression
4201      shift-expression >> additive-expression
4202
4203    relational-expression:
4204      shift-expression
4205      relational-expression < shift-expression
4206      relational-expression > shift-expression
4207      relational-expression <= shift-expression
4208      relational-expression >= shift-expression
4209
4210    equality-expression:
4211      relational-expression
4212      equality-expression == relational-expression
4213      equality-expression != relational-expression
4214
4215    AND-expression:
4216      equality-expression
4217      AND-expression & equality-expression
4218
4219    exclusive-OR-expression:
4220      AND-expression
4221      exclusive-OR-expression ^ AND-expression
4222
4223    inclusive-OR-expression:
4224      exclusive-OR-expression
4225      inclusive-OR-expression | exclusive-OR-expression
4226
4227    logical-AND-expression:
4228      inclusive-OR-expression
4229      logical-AND-expression && inclusive-OR-expression
4230
4231    logical-OR-expression:
4232      logical-AND-expression
4233      logical-OR-expression || logical-AND-expression
4234 */
4235
4236 static struct c_expr
4237 c_parser_binary_expression (c_parser *parser, struct c_expr *after)
4238 {
4239   /* A binary expression is parsed using operator-precedence parsing,
4240      with the operands being cast expressions.  All the binary
4241      operators are left-associative.  Thus a binary expression is of
4242      form:
4243
4244      E0 op1 E1 op2 E2 ...
4245
4246      which we represent on a stack.  On the stack, the precedence
4247      levels are strictly increasing.  When a new operator is
4248      encountered of higher precedence than that at the top of the
4249      stack, it is pushed; its LHS is the top expression, and its RHS
4250      is everything parsed until it is popped.  When a new operator is
4251      encountered with precedence less than or equal to that at the top
4252      of the stack, triples E[i-1] op[i] E[i] are popped and replaced
4253      by the result of the operation until the operator at the top of
4254      the stack has lower precedence than the new operator or there is
4255      only one element on the stack; then the top expression is the LHS
4256      of the new operator.  In the case of logical AND and OR
4257      expressions, we also need to adjust skip_evaluation as
4258      appropriate when the operators are pushed and popped.  */
4259
4260   /* The precedence levels, where 0 is a dummy lowest level used for
4261      the bottom of the stack.  */
4262   enum prec {
4263     PREC_NONE,
4264     PREC_LOGOR,
4265     PREC_LOGAND,
4266     PREC_BITOR,
4267     PREC_BITXOR,
4268     PREC_BITAND,
4269     PREC_EQ,
4270     PREC_REL,
4271     PREC_SHIFT,
4272     PREC_ADD,
4273     PREC_MULT,
4274     NUM_PRECS
4275   };
4276   struct {
4277     /* The expression at this stack level.  */
4278     struct c_expr expr;
4279     /* The precedence of the operator on its left, PREC_NONE at the
4280        bottom of the stack.  */
4281     enum prec prec;
4282     /* The operation on its left.  */
4283     enum tree_code op;
4284   } stack[NUM_PRECS];
4285   int sp;
4286 #define POP                                                                   \
4287   do {                                                                        \
4288     switch (stack[sp].op)                                                     \
4289       {                                                                       \
4290       case TRUTH_ANDIF_EXPR:                                                  \
4291         skip_evaluation -= stack[sp - 1].expr.value == truthvalue_false_node; \
4292         break;                                                                \
4293       case TRUTH_ORIF_EXPR:                                                   \
4294         skip_evaluation -= stack[sp - 1].expr.value == truthvalue_true_node;  \
4295         break;                                                                \
4296       default:                                                                \
4297         break;                                                                \
4298       }                                                                       \
4299     stack[sp - 1].expr = parser_build_binary_op (stack[sp].op,                \
4300                                                  stack[sp - 1].expr,          \
4301                                                  stack[sp].expr);             \
4302     sp--;                                                                     \
4303   } while (0)
4304   gcc_assert (!after || c_dialect_objc ());
4305   stack[0].expr = c_parser_cast_expression (parser, after);
4306   stack[0].prec = PREC_NONE;
4307   sp = 0;
4308   while (true)
4309     {
4310       enum prec oprec;
4311       enum tree_code ocode;
4312       if (parser->error)
4313         goto out;
4314       switch (c_parser_peek_token (parser)->type)
4315         {
4316         case CPP_MULT:
4317           oprec = PREC_MULT;
4318           ocode = MULT_EXPR;
4319           break;
4320         case CPP_DIV:
4321           oprec = PREC_MULT;
4322           ocode = TRUNC_DIV_EXPR;
4323           break;
4324         case CPP_MOD:
4325           oprec = PREC_MULT;
4326           ocode = TRUNC_MOD_EXPR;
4327           break;
4328         case CPP_PLUS:
4329           oprec = PREC_ADD;
4330           ocode = PLUS_EXPR;
4331           break;
4332         case CPP_MINUS:
4333           oprec = PREC_ADD;
4334           ocode = MINUS_EXPR;
4335           break;
4336         case CPP_LSHIFT:
4337           oprec = PREC_SHIFT;
4338           ocode = LSHIFT_EXPR;
4339           break;
4340         case CPP_RSHIFT:
4341           oprec = PREC_SHIFT;
4342           ocode = RSHIFT_EXPR;
4343           break;
4344         case CPP_LESS:
4345           oprec = PREC_REL;
4346           ocode = LT_EXPR;
4347           break;
4348         case CPP_GREATER:
4349           oprec = PREC_REL;
4350           ocode = GT_EXPR;
4351           break;
4352         case CPP_LESS_EQ:
4353           oprec = PREC_REL;
4354           ocode = LE_EXPR;
4355           break;
4356         case CPP_GREATER_EQ:
4357           oprec = PREC_REL;
4358           ocode = GE_EXPR;
4359           break;
4360         case CPP_EQ_EQ:
4361           oprec = PREC_EQ;
4362           ocode = EQ_EXPR;
4363           break;
4364         case CPP_NOT_EQ:
4365           oprec = PREC_EQ;
4366           ocode = NE_EXPR;
4367           break;
4368         case CPP_AND:
4369           oprec = PREC_BITAND;
4370           ocode = BIT_AND_EXPR;
4371           break;
4372         case CPP_XOR:
4373           oprec = PREC_BITXOR;
4374           ocode = BIT_XOR_EXPR;
4375           break;
4376         case CPP_OR:
4377           oprec = PREC_BITOR;
4378           ocode = BIT_IOR_EXPR;
4379           break;
4380         case CPP_AND_AND:
4381           oprec = PREC_LOGAND;
4382           ocode = TRUTH_ANDIF_EXPR;
4383           break;
4384         case CPP_OR_OR:
4385           oprec = PREC_LOGOR;
4386           ocode = TRUTH_ORIF_EXPR;
4387           break;
4388         default:
4389           /* Not a binary operator, so end of the binary
4390              expression.  */
4391           goto out;
4392         }
4393       c_parser_consume_token (parser);
4394       while (oprec <= stack[sp].prec)
4395         POP;
4396       switch (ocode)
4397         {
4398         case TRUTH_ANDIF_EXPR:
4399           stack[sp].expr.value = c_objc_common_truthvalue_conversion
4400             (default_conversion (stack[sp].expr.value));
4401           skip_evaluation += stack[sp].expr.value == truthvalue_false_node;
4402           break;
4403         case TRUTH_ORIF_EXPR:
4404           stack[sp].expr.value = c_objc_common_truthvalue_conversion
4405             (default_conversion (stack[sp].expr.value));
4406           skip_evaluation += stack[sp].expr.value == truthvalue_true_node;
4407           break;
4408         default:
4409           break;
4410         }
4411       sp++;
4412       stack[sp].expr = c_parser_cast_expression (parser, NULL);
4413       stack[sp].prec = oprec;
4414       stack[sp].op = ocode;
4415     }
4416  out:
4417   while (sp > 0)
4418     POP;
4419   return stack[0].expr;
4420 #undef POP
4421 }
4422
4423 /* Parse a cast expression (C90 6.3.4, C99 6.5.4).  If AFTER is not
4424    NULL then it is an Objective-C message expression which is the
4425    primary-expression starting the expression as an initializer.
4426
4427    cast-expression:
4428      unary-expression
4429      ( type-name ) unary-expression
4430 */
4431
4432 static struct c_expr
4433 c_parser_cast_expression (c_parser *parser, struct c_expr *after)
4434 {
4435   gcc_assert (!after || c_dialect_objc ());
4436   if (after)
4437     return c_parser_postfix_expression_after_primary (parser, *after);
4438   /* If the expression begins with a parenthesized type name, it may
4439      be either a cast or a compound literal; we need to see whether
4440      the next character is '{' to tell the difference.  If not, it is
4441      an unary expression.  */
4442   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)
4443       && c_token_starts_typename (c_parser_peek_2nd_token (parser)))
4444     {
4445       struct c_type_name *type_name;
4446       struct c_expr ret;
4447       tree expr;
4448       c_parser_consume_token (parser);
4449       type_name = c_parser_type_name (parser);
4450       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
4451       if (type_name == NULL)
4452         {
4453           ret.value = error_mark_node;
4454           ret.original_code = ERROR_MARK;
4455           return ret;
4456         }
4457       if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
4458         return c_parser_postfix_expression_after_paren_type (parser,
4459                                                              type_name);
4460       expr = c_parser_cast_expression (parser, NULL).value;
4461       ret.value = c_cast_expr (type_name, expr);
4462       ret.original_code = ERROR_MARK;
4463       return ret;
4464     }
4465   else
4466     return c_parser_unary_expression (parser);
4467 }
4468
4469 /* Parse an unary expression (C90 6.3.3, C99 6.5.3).
4470
4471    unary-expression:
4472      postfix-expression
4473      ++ unary-expression
4474      -- unary-expression
4475      unary-operator cast-expression
4476      sizeof unary-expression
4477      sizeof ( type-name )
4478
4479    unary-operator: one of
4480      & * + - ~ !
4481
4482    GNU extensions:
4483
4484    unary-expression:
4485      __alignof__ unary-expression
4486      __alignof__ ( type-name )
4487      && identifier
4488
4489    unary-operator: one of
4490      __extension__ __real__ __imag__
4491
4492    In addition, the GNU syntax treats ++ and -- as unary operators, so
4493    they may be applied to cast expressions with errors for non-lvalues
4494    given later.  */
4495
4496 static struct c_expr
4497 c_parser_unary_expression (c_parser *parser)
4498 {
4499   int ext;
4500   struct c_expr ret;
4501   ret.original_code = ERROR_MARK;
4502   switch (c_parser_peek_token (parser)->type)
4503     {
4504     case CPP_PLUS_PLUS:
4505       c_parser_consume_token (parser);
4506       ret.value
4507         = build_unary_op (PREINCREMENT_EXPR,
4508                           c_parser_cast_expression (parser, NULL).value, 0);
4509       overflow_warning (ret.value);
4510       return ret;
4511     case CPP_MINUS_MINUS:
4512       c_parser_consume_token (parser);
4513       ret.value
4514         = build_unary_op (PREDECREMENT_EXPR,
4515                           c_parser_cast_expression (parser, NULL).value, 0);
4516       overflow_warning (ret.value);
4517       return ret;
4518     case CPP_AND:
4519       c_parser_consume_token (parser);
4520       ret.value
4521         = build_unary_op (ADDR_EXPR,
4522                           c_parser_cast_expression (parser, NULL).value, 0);
4523       overflow_warning (ret.value);
4524       return ret;
4525     case CPP_MULT:
4526       c_parser_consume_token (parser);
4527       ret.value
4528         = build_indirect_ref (c_parser_cast_expression (parser, NULL).value,
4529                               "unary *");
4530       return ret;
4531     case CPP_PLUS:
4532       c_parser_consume_token (parser);
4533       if (!c_dialect_objc () && warn_traditional && !in_system_header)
4534         warning ("traditional C rejects the unary plus operator");
4535       ret.value
4536         = build_unary_op (CONVERT_EXPR,
4537                           c_parser_cast_expression (parser, NULL).value, 0);
4538       overflow_warning (ret.value);
4539       return ret;
4540     case CPP_MINUS:
4541       c_parser_consume_token (parser);
4542       ret.value
4543         = build_unary_op (NEGATE_EXPR,
4544                           c_parser_cast_expression (parser, NULL).value, 0);
4545       overflow_warning (ret.value);
4546       return ret;
4547     case CPP_COMPL:
4548       c_parser_consume_token (parser);
4549       ret.value
4550         = build_unary_op (BIT_NOT_EXPR,
4551                           c_parser_cast_expression (parser, NULL).value, 0);
4552       overflow_warning (ret.value);
4553       return ret;
4554     case CPP_NOT:
4555       c_parser_consume_token (parser);
4556       ret.value
4557         = build_unary_op (TRUTH_NOT_EXPR,
4558                           c_parser_cast_expression (parser, NULL).value, 0);
4559       overflow_warning (ret.value);
4560       return ret;
4561     case CPP_AND_AND:
4562       /* Refer to the address of a label as a pointer.  */
4563       c_parser_consume_token (parser);
4564       if (c_parser_next_token_is (parser, CPP_NAME))
4565         {
4566           ret.value = finish_label_address_expr
4567             (c_parser_peek_token (parser)->value);
4568           c_parser_consume_token (parser);
4569           return ret;
4570         }
4571       else
4572         {
4573           c_parser_error (parser, "expected identifier");
4574           ret.value = error_mark_node;
4575           return ret;
4576         }
4577     case CPP_KEYWORD:
4578       switch (c_parser_peek_token (parser)->keyword)
4579         {
4580         case RID_SIZEOF:
4581           return c_parser_sizeof_expression (parser);
4582         case RID_ALIGNOF:
4583           return c_parser_alignof_expression (parser);
4584         case RID_EXTENSION:
4585           c_parser_consume_token (parser);
4586           ext = disable_extension_diagnostics ();
4587           ret = c_parser_cast_expression (parser, NULL);
4588           restore_extension_diagnostics (ext);
4589           return ret;
4590         case RID_REALPART:
4591           c_parser_consume_token (parser);
4592           ret.value
4593             = build_unary_op (REALPART_EXPR,
4594                               c_parser_cast_expression (parser, NULL).value,
4595                               0);
4596           return ret;
4597         case RID_IMAGPART:
4598           c_parser_consume_token (parser);
4599           ret.value
4600             = build_unary_op (IMAGPART_EXPR,
4601                               c_parser_cast_expression (parser, NULL).value,
4602                               0);
4603           return ret;
4604         default:
4605           return c_parser_postfix_expression (parser);
4606         }
4607     default:
4608       return c_parser_postfix_expression (parser);
4609     }
4610 }
4611
4612 /* Parse a sizeof expression.  */
4613
4614 static struct c_expr
4615 c_parser_sizeof_expression (c_parser *parser)
4616 {
4617   struct c_expr expr;
4618   gcc_assert (c_parser_next_token_is_keyword (parser, RID_SIZEOF));
4619   c_parser_consume_token (parser);
4620   skip_evaluation++;
4621   in_sizeof++;
4622   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)
4623       && c_token_starts_typename (c_parser_peek_2nd_token (parser)))
4624     {
4625       /* Either sizeof ( type-name ) or sizeof unary-expression
4626          starting with a compound literal.  */
4627       struct c_type_name *type_name;
4628       c_parser_consume_token (parser);
4629       type_name = c_parser_type_name (parser);
4630       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
4631       if (type_name == NULL)
4632         {
4633           struct c_expr ret;
4634           skip_evaluation--;
4635           in_sizeof--;
4636           ret.value = error_mark_node;
4637           ret.original_code = ERROR_MARK;
4638           return ret;
4639         }
4640       if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
4641         {
4642           expr = c_parser_postfix_expression_after_paren_type (parser,
4643                                                                type_name);
4644           goto sizeof_expr;
4645         }
4646       /* sizeof ( type-name ).  */
4647       skip_evaluation--;
4648       in_sizeof--;
4649       return c_expr_sizeof_type (type_name);
4650     }
4651   else
4652     {
4653       expr = c_parser_unary_expression (parser);
4654     sizeof_expr:
4655       skip_evaluation--;
4656       in_sizeof--;
4657       if (TREE_CODE (expr.value) == COMPONENT_REF
4658           && DECL_C_BIT_FIELD (TREE_OPERAND (expr.value, 1)))
4659         error ("%<sizeof%> applied to a bit-field");
4660       return c_expr_sizeof_expr (expr);
4661     }
4662 }
4663
4664 /* Parse an alignof expression.  */
4665
4666 static struct c_expr
4667 c_parser_alignof_expression (c_parser *parser)
4668 {
4669   struct c_expr expr;
4670   gcc_assert (c_parser_next_token_is_keyword (parser, RID_ALIGNOF));
4671   c_parser_consume_token (parser);
4672   skip_evaluation++;
4673   in_alignof++;
4674   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)
4675       && c_token_starts_typename (c_parser_peek_2nd_token (parser)))
4676     {
4677       /* Either __alignof__ ( type-name ) or __alignof__
4678          unary-expression starting with a compound literal.  */
4679       struct c_type_name *type_name;
4680       struct c_expr ret;
4681       c_parser_consume_token (parser);
4682       type_name = c_parser_type_name (parser);
4683       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
4684       if (type_name == NULL)
4685         {
4686           struct c_expr ret;
4687           skip_evaluation--;
4688           in_alignof--;
4689           ret.value = error_mark_node;
4690           ret.original_code = ERROR_MARK;
4691           return ret;
4692         }
4693       if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
4694         {
4695           expr = c_parser_postfix_expression_after_paren_type (parser,
4696                                                                type_name);
4697           goto alignof_expr;
4698         }
4699       /* alignof ( type-name ).  */
4700       skip_evaluation--;
4701       in_alignof--;
4702       ret.value = c_alignof (groktypename (type_name));
4703       ret.original_code = ERROR_MARK;
4704       return ret;
4705     }
4706   else
4707     {
4708       struct c_expr ret;
4709       expr = c_parser_unary_expression (parser);
4710     alignof_expr:
4711       skip_evaluation--;
4712       in_alignof--;
4713       ret.value = c_alignof_expr (expr.value);
4714       ret.original_code = ERROR_MARK;
4715       return ret;
4716     }
4717 }
4718
4719 /* Parse a postfix expression (C90 6.3.1-6.3.2, C99 6.5.1-6.5.2).
4720
4721    postfix-expression:
4722      primary-expression
4723      postfix-expression [ expression ]
4724      postfix-expression ( argument-expression-list[opt] )
4725      postfix-expression . identifier
4726      postfix-expression -> identifier
4727      postfix-expression ++
4728      postfix-expression --
4729      ( type-name ) { initializer-list }
4730      ( type-name ) { initializer-list , }
4731
4732    argument-expression-list:
4733      argument-expression
4734      argument-expression-list , argument-expression
4735
4736    primary-expression:
4737      identifier
4738      constant
4739      string-literal
4740      ( expression )
4741
4742    GNU extensions:
4743
4744    primary-expression:
4745      __func__
4746        (treated as a keyword in GNU C)
4747      __FUNCTION__
4748      __PRETTY_FUNCTION__
4749      ( compound-statement )
4750      __builtin_va_arg ( assignment-expression , type-name )
4751      __builtin_offsetof ( type-name , offsetof-member-designator )
4752      __builtin_choose_expr ( assignment-expression ,
4753                              assignment-expression ,
4754                              assignment-expression )
4755      __builtin_types_compatible_p ( type-name , type-name )
4756
4757    offsetof-member-designator:
4758      identifier
4759      offsetof-member-designator . identifier
4760      offsetof-member-designator [ expression ]
4761
4762    Objective-C:
4763
4764    primary-expression:
4765      [ objc-receiver objc-message-args ]
4766      @selector ( objc-selector-arg )
4767      @protocol ( identifier )
4768      @encode ( type-name )
4769      objc-string-literal
4770 */
4771
4772 static struct c_expr
4773 c_parser_postfix_expression (c_parser *parser)
4774 {
4775   struct c_expr expr, e1, e2, e3;
4776   struct c_type_name *t1, *t2;
4777   switch (c_parser_peek_token (parser)->type)
4778     {
4779     case CPP_NUMBER:
4780     case CPP_CHAR:
4781     case CPP_WCHAR:
4782       expr.value = c_parser_peek_token (parser)->value;
4783       expr.original_code = ERROR_MARK;
4784       c_parser_consume_token (parser);
4785       break;
4786     case CPP_STRING:
4787     case CPP_WSTRING:
4788       expr.value = c_parser_peek_token (parser)->value;
4789       expr.original_code = STRING_CST;
4790       c_parser_consume_token (parser);
4791       break;
4792     case CPP_OBJC_STRING:
4793       gcc_assert (c_dialect_objc ());
4794       expr.value
4795         = objc_build_string_object (c_parser_peek_token (parser)->value);
4796       expr.original_code = ERROR_MARK;
4797       c_parser_consume_token (parser);
4798       break;
4799     case CPP_NAME:
4800       if (c_parser_peek_token (parser)->id_kind != C_ID_ID)
4801         {
4802           c_parser_error (parser, "expected expression");
4803           expr.value = error_mark_node;
4804           expr.original_code = ERROR_MARK;
4805           break;
4806         }
4807       {
4808         tree id = c_parser_peek_token (parser)->value;
4809         location_t loc = c_parser_peek_token (parser)->location;
4810         c_parser_consume_token (parser);
4811         expr.value = build_external_ref (id,
4812                                          (c_parser_peek_token (parser)->type
4813                                           == CPP_OPEN_PAREN), loc);
4814         expr.original_code = ERROR_MARK;
4815       }
4816       break;
4817     case CPP_OPEN_PAREN:
4818       /* A parenthesized expression, statement expression or compound
4819          literal.  */
4820       if (c_parser_peek_2nd_token (parser)->type == CPP_OPEN_BRACE)
4821         {
4822           /* A statement expression.  */
4823           tree stmt;
4824           c_parser_consume_token (parser);
4825           c_parser_consume_token (parser);
4826           if (cur_stmt_list == NULL)
4827             {
4828               error ("braced-group within expression allowed "
4829                      "only inside a function");
4830               parser->error = true;
4831               c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL);
4832               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
4833               expr.value = error_mark_node;
4834               expr.original_code = ERROR_MARK;
4835               break;
4836             }
4837           stmt = c_begin_stmt_expr ();
4838           c_parser_compound_statement_nostart (parser);
4839           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
4840                                      "expected %<)%>");
4841           if (pedantic)
4842             pedwarn ("ISO C forbids braced-groups within expressions");
4843           expr.value = c_finish_stmt_expr (stmt);
4844           expr.original_code = ERROR_MARK;
4845         }
4846       else if (c_token_starts_typename (c_parser_peek_2nd_token (parser)))
4847         {
4848           /* A compound literal.  ??? Can we actually get here rather
4849              than going directly to
4850              c_parser_postfix_expression_after_paren_type from
4851              elsewhere?  */
4852           struct c_type_name *type_name;
4853           c_parser_consume_token (parser);
4854           type_name = c_parser_type_name (parser);
4855           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
4856                                      "expected %<)%>");
4857           if (type_name == NULL)
4858             {
4859               expr.value = error_mark_node;
4860               expr.original_code = ERROR_MARK;
4861             }
4862           else
4863             expr = c_parser_postfix_expression_after_paren_type (parser,
4864                                                                  type_name);
4865         }
4866       else
4867         {
4868           /* A parenthesized expression.  */
4869           c_parser_consume_token (parser);
4870           expr = c_parser_expression (parser);
4871           if (TREE_CODE (expr.value) == MODIFY_EXPR)
4872             TREE_NO_WARNING (expr.value) = 1;
4873           expr.original_code = ERROR_MARK;
4874           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
4875                                      "expected %<)%>");
4876         }
4877       break;
4878     case CPP_KEYWORD:
4879       switch (c_parser_peek_token (parser)->keyword)
4880         {
4881         case RID_FUNCTION_NAME:
4882         case RID_PRETTY_FUNCTION_NAME:
4883         case RID_C99_FUNCTION_NAME:
4884           expr.value = fname_decl (c_parser_peek_token (parser)->keyword,
4885                                    c_parser_peek_token (parser)->value);
4886           expr.original_code = ERROR_MARK;
4887           c_parser_consume_token (parser);
4888           break;
4889         case RID_VA_ARG:
4890           c_parser_consume_token (parser);
4891           if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
4892             {
4893               expr.value = error_mark_node;
4894               expr.original_code = ERROR_MARK;
4895               break;
4896             }
4897           e1 = c_parser_expr_no_commas (parser, NULL);
4898           if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
4899             {
4900               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
4901               expr.value = error_mark_node;
4902               expr.original_code = ERROR_MARK;
4903               break;
4904             }
4905           t1 = c_parser_type_name (parser);
4906           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
4907                                      "expected %<)%>");
4908           if (t1 == NULL)
4909             {
4910               expr.value = error_mark_node;
4911               expr.original_code = ERROR_MARK;
4912             }
4913           else
4914             {
4915               expr.value = build_va_arg (e1.value, groktypename (t1));
4916               expr.original_code = ERROR_MARK;
4917             }
4918           break;
4919         case RID_OFFSETOF:
4920           c_parser_consume_token (parser);
4921           if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
4922             {
4923               expr.value = error_mark_node;
4924               expr.original_code = ERROR_MARK;
4925               break;
4926             }
4927           t1 = c_parser_type_name (parser);
4928           if (t1 == NULL)
4929             {
4930               expr.value = error_mark_node;
4931               expr.original_code = ERROR_MARK;
4932               break;
4933             }
4934           if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
4935             {
4936               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
4937               expr.value = error_mark_node;
4938               expr.original_code = ERROR_MARK;
4939               break;
4940             }
4941           {
4942             tree type = groktypename (t1);
4943             tree offsetof_ref;
4944             if (type == error_mark_node)
4945               offsetof_ref = error_mark_node;
4946             else
4947               offsetof_ref = build1 (INDIRECT_REF, type, NULL);
4948             /* Parse the second argument to __builtin_offsetof.  We
4949                must have one identifier, and beyond that we want to
4950                accept sub structure and sub array references.  */
4951             if (c_parser_next_token_is (parser, CPP_NAME))
4952               {
4953                 offsetof_ref = build_component_ref
4954                   (offsetof_ref, c_parser_peek_token (parser)->value);
4955                 c_parser_consume_token (parser);
4956                 while (c_parser_next_token_is (parser, CPP_DOT)
4957                        || c_parser_next_token_is (parser,
4958                                                   CPP_OPEN_SQUARE))
4959                   {
4960                     if (c_parser_next_token_is (parser, CPP_DOT))
4961                       {
4962                         c_parser_consume_token (parser);
4963                         if (c_parser_next_token_is_not (parser,
4964                                                         CPP_NAME))
4965                           {
4966                             c_parser_error (parser, "expected identifier");
4967                             break;
4968                           }
4969                         offsetof_ref = build_component_ref
4970                           (offsetof_ref,
4971                            c_parser_peek_token (parser)->value);
4972                         c_parser_consume_token (parser);
4973                       }
4974                     else
4975                       {
4976                         tree idx;
4977                         c_parser_consume_token (parser);
4978                         idx = c_parser_expression (parser).value;
4979                         c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
4980                                                    "expected %<]%>");
4981                         offsetof_ref = build_array_ref (offsetof_ref, idx);
4982                       }
4983                   }
4984               }
4985             else
4986               c_parser_error (parser, "expected identifier");
4987             c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
4988                                        "expected %<)%>");
4989             expr.value = fold_offsetof (offsetof_ref);
4990             expr.original_code = ERROR_MARK;
4991           }
4992           break;
4993         case RID_CHOOSE_EXPR:
4994           c_parser_consume_token (parser);
4995           if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
4996             {
4997               expr.value = error_mark_node;
4998               expr.original_code = ERROR_MARK;
4999               break;
5000             }
5001           e1 = c_parser_expr_no_commas (parser, NULL);
5002           if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
5003             {
5004               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5005               expr.value = error_mark_node;
5006               expr.original_code = ERROR_MARK;
5007               break;
5008             }
5009           e2 = c_parser_expr_no_commas (parser, NULL);
5010           if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
5011             {
5012               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5013               expr.value = error_mark_node;
5014               expr.original_code = ERROR_MARK;
5015               break;
5016             }
5017           e3 = c_parser_expr_no_commas (parser, NULL);
5018           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5019                                      "expected %<)%>");
5020           {
5021             tree c;
5022
5023             c = fold (e1.value);
5024             if (TREE_CODE (c) != INTEGER_CST)
5025               error ("first argument to %<__builtin_choose_expr%> not"
5026                      " a constant");
5027             expr = integer_zerop (c) ? e3 : e2;
5028           }
5029           break;
5030         case RID_TYPES_COMPATIBLE_P:
5031           c_parser_consume_token (parser);
5032           if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5033             {
5034               expr.value = error_mark_node;
5035               expr.original_code = ERROR_MARK;
5036               break;
5037             }
5038           t1 = c_parser_type_name (parser);
5039           if (t1 == NULL)
5040             {
5041               expr.value = error_mark_node;
5042               expr.original_code = ERROR_MARK;
5043               break;
5044             }
5045           if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
5046             {
5047               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5048               expr.value = error_mark_node;
5049               expr.original_code = ERROR_MARK;
5050               break;
5051             }
5052           t2 = c_parser_type_name (parser);
5053           if (t2 == NULL)
5054             {
5055               expr.value = error_mark_node;
5056               expr.original_code = ERROR_MARK;
5057               break;
5058             }
5059           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5060                                      "expected %<)%>");
5061           {
5062             tree e1, e2;
5063
5064             e1 = TYPE_MAIN_VARIANT (groktypename (t1));
5065             e2 = TYPE_MAIN_VARIANT (groktypename (t2));
5066
5067             expr.value = comptypes (e1, e2)
5068               ? build_int_cst (NULL_TREE, 1)
5069               : build_int_cst (NULL_TREE, 0);
5070             expr.original_code = ERROR_MARK;
5071           }
5072           break;
5073         case RID_AT_SELECTOR:
5074           gcc_assert (c_dialect_objc ());
5075           c_parser_consume_token (parser);
5076           if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5077             {
5078               expr.value = error_mark_node;
5079               expr.original_code = ERROR_MARK;
5080               break;
5081             }
5082           {
5083             tree sel = c_parser_objc_selector_arg (parser);
5084             c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5085                                        "expected %<)%>");
5086             expr.value = objc_build_selector_expr (sel);
5087             expr.original_code = ERROR_MARK;
5088           }
5089           break;
5090         case RID_AT_PROTOCOL:
5091           gcc_assert (c_dialect_objc ());
5092           c_parser_consume_token (parser);
5093           if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5094             {
5095               expr.value = error_mark_node;
5096               expr.original_code = ERROR_MARK;
5097               break;
5098             }
5099           if (c_parser_next_token_is_not (parser, CPP_NAME))
5100             {
5101               c_parser_error (parser, "expected identifier");
5102               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5103               expr.value = error_mark_node;
5104               expr.original_code = ERROR_MARK;
5105               break;
5106             }
5107           {
5108             tree id = c_parser_peek_token (parser)->value;
5109             c_parser_consume_token (parser);
5110             c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5111                                        "expected %<)%>");
5112             expr.value = objc_build_protocol_expr (id);
5113             expr.original_code = ERROR_MARK;
5114           }
5115           break;
5116         case RID_AT_ENCODE:
5117           /* Extension to support C-structures in the archiver.  */
5118           gcc_assert (c_dialect_objc ());
5119           c_parser_consume_token (parser);
5120           if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5121             {
5122               expr.value = error_mark_node;
5123               expr.original_code = ERROR_MARK;
5124               break;
5125             }
5126           t1 = c_parser_type_name (parser);
5127           if (t1 == NULL)
5128             {
5129               expr.value = error_mark_node;
5130               expr.original_code = ERROR_MARK;
5131               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5132               break;
5133             }
5134           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5135                                      "expected %<)%>");
5136           {
5137             tree type = groktypename (t1);
5138             expr.value = objc_build_encode_expr (type);
5139             expr.original_code = ERROR_MARK;
5140           }
5141           break;
5142         default:
5143           c_parser_error (parser, "expected expression");
5144           expr.value = error_mark_node;
5145           expr.original_code = ERROR_MARK;
5146           break;
5147         }
5148       break;
5149     case CPP_OPEN_SQUARE:
5150       if (c_dialect_objc ())
5151         {
5152           tree receiver, args;
5153           c_parser_consume_token (parser);
5154           receiver = c_parser_objc_receiver (parser);
5155           args = c_parser_objc_message_args (parser);
5156           c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
5157                                      "expected %<]%>");
5158           expr.value = objc_build_message_expr (build_tree_list (receiver,
5159                                                                  args));
5160           expr.original_code = ERROR_MARK;
5161           break;
5162         }
5163       /* Else fall through to report error.  */
5164     default:
5165       c_parser_error (parser, "expected expression");
5166       expr.value = error_mark_node;
5167       expr.original_code = ERROR_MARK;
5168       break;
5169     }
5170   return c_parser_postfix_expression_after_primary (parser, expr);
5171 }
5172
5173 /* Parse a postfix expression after a parenthesized type name: the
5174    brace-enclosed initializer of a compound literal, possibly followed
5175    by some postfix operators.  This is separate because it is not
5176    possible to tell until after the type name whether a cast
5177    expression has a cast or a compound literal, or whether the operand
5178    of sizeof is a parenthesized type name or starts with a compound
5179    literal.  */
5180
5181 static struct c_expr
5182 c_parser_postfix_expression_after_paren_type (c_parser *parser,
5183                                               struct c_type_name *type_name)
5184 {
5185   tree type;
5186   struct c_expr init;
5187   struct c_expr expr;
5188   start_init (NULL_TREE, NULL, 0);
5189   type = groktypename (type_name);
5190   if (C_TYPE_VARIABLE_SIZE (type))
5191     {
5192       error ("compound literal has variable size");
5193       type = error_mark_node;
5194     }
5195   init = c_parser_braced_init (parser, type, false);
5196   finish_init ();
5197   maybe_warn_string_init (type, init);
5198
5199   if (pedantic && !flag_isoc99)
5200     pedwarn ("ISO C90 forbids compound literals");
5201   expr.value = build_compound_literal (type, init.value);
5202   expr.original_code = ERROR_MARK;
5203   return c_parser_postfix_expression_after_primary (parser, expr);
5204 }
5205
5206 /* Parse a postfix expression after the initial primary or compound
5207    literal; that is, parse a series of postfix operators.  */
5208
5209 static struct c_expr
5210 c_parser_postfix_expression_after_primary (c_parser *parser,
5211                                            struct c_expr expr)
5212 {
5213   tree ident, idx, exprlist;
5214   while (true)
5215     {
5216       switch (c_parser_peek_token (parser)->type)
5217         {
5218         case CPP_OPEN_SQUARE:
5219           /* Array reference.  */
5220           c_parser_consume_token (parser);
5221           idx = c_parser_expression (parser).value;
5222           c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
5223                                      "expected %<]%>");
5224           expr.value = build_array_ref (expr.value, idx);
5225           expr.original_code = ERROR_MARK;
5226           break;
5227         case CPP_OPEN_PAREN:
5228           /* Function call.  */
5229           c_parser_consume_token (parser);
5230           if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
5231             exprlist = NULL_TREE;
5232           else
5233             exprlist = c_parser_expr_list (parser);
5234           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5235                                      "expected %<)%>");
5236           expr.value = build_function_call (expr.value, exprlist);
5237           expr.original_code = ERROR_MARK;
5238           break;
5239         case CPP_DOT:
5240           /* Structure element reference.  */
5241           c_parser_consume_token (parser);
5242           if (c_parser_next_token_is (parser, CPP_NAME))
5243             ident = c_parser_peek_token (parser)->value;
5244           else
5245             {
5246               c_parser_error (parser, "expected identifier");
5247               expr.value = error_mark_node;
5248               expr.original_code = ERROR_MARK;
5249               return expr;
5250             }
5251           c_parser_consume_token (parser);
5252           expr.value = build_component_ref (expr.value, ident);
5253           expr.original_code = ERROR_MARK;
5254           break;
5255         case CPP_DEREF:
5256           /* Structure element reference.  */
5257           c_parser_consume_token (parser);
5258           if (c_parser_next_token_is (parser, CPP_NAME))
5259             ident = c_parser_peek_token (parser)->value;
5260           else
5261             {
5262               c_parser_error (parser, "expected identifier");
5263               expr.value = error_mark_node;
5264               expr.original_code = ERROR_MARK;
5265               return expr;
5266             }
5267           c_parser_consume_token (parser);
5268           expr.value = build_component_ref (build_indirect_ref (expr.value,
5269                                                                 "->"), ident);
5270           expr.original_code = ERROR_MARK;
5271           break;
5272         case CPP_PLUS_PLUS:
5273           /* Postincrement.  */
5274           c_parser_consume_token (parser);
5275           expr.value = build_unary_op (POSTINCREMENT_EXPR, expr.value, 0);
5276           expr.original_code = ERROR_MARK;
5277           break;
5278         case CPP_MINUS_MINUS:
5279           /* Postdecrement.  */
5280           c_parser_consume_token (parser);
5281           expr.value = build_unary_op (POSTDECREMENT_EXPR, expr.value, 0);
5282           expr.original_code = ERROR_MARK;
5283           break;
5284         default:
5285           return expr;
5286         }
5287     }
5288 }
5289
5290 /* Parse an expression (C90 6.3.17, C99 6.5.17).
5291
5292    expression:
5293      assignment-expression
5294      expression , assignment-expression
5295 */
5296
5297 static struct c_expr
5298 c_parser_expression (c_parser *parser)
5299 {
5300   struct c_expr expr;
5301   expr = c_parser_expr_no_commas (parser, NULL);
5302   while (c_parser_next_token_is (parser, CPP_COMMA))
5303     {
5304       struct c_expr next;
5305       c_parser_consume_token (parser);
5306       next = c_parser_expr_no_commas (parser, NULL);
5307       expr.value = build_compound_expr (expr.value, next.value);
5308       expr.original_code = COMPOUND_EXPR;
5309     }
5310   return expr;
5311 }
5312
5313 /* Parse a non-empty list of expressions.
5314
5315    nonempty-expr-list:
5316      assignment-expression
5317      nonempty-expr-list , assignment-expression
5318 */
5319
5320 static tree
5321 c_parser_expr_list (c_parser *parser)
5322 {
5323   struct c_expr expr;
5324   tree ret;
5325   expr = c_parser_expr_no_commas (parser, NULL);
5326   ret = build_tree_list (NULL_TREE, expr.value);
5327   while (c_parser_next_token_is (parser, CPP_COMMA))
5328     {
5329       c_parser_consume_token (parser);
5330       expr = c_parser_expr_no_commas (parser, NULL);
5331       ret = chainon (ret, build_tree_list (NULL_TREE, expr.value));
5332     }
5333   return ret;
5334 }
5335
5336 \f
5337 /* Parse Objective-C-specific constructs.  */
5338
5339 /* Parse an objc-class-definition.
5340
5341    objc-class-definition:
5342      @interface identifier objc-superclass[opt] objc-protocol-refs[opt]
5343        objc-class-instance-variables[opt] objc-methodprotolist @end
5344      @implementation identifier objc-superclass[opt]
5345        objc-class-instance-variables[opt]
5346      @interface identifier ( identifier ) objc-protocol-refs[opt]
5347        objc-methodprotolist @end
5348      @implementation identifier ( identifier )
5349
5350    objc-superclass:
5351      : identifier
5352
5353    "@interface identifier (" must start "@interface identifier (
5354    identifier ) ...": objc-methodprotolist in the first production may
5355    not start with a parenthesised identifier as a declarator of a data
5356    definition with no declaration specifiers if the objc-superclass,
5357    objc-protocol-refs and objc-class-instance-variables are omitted.  */
5358
5359 static void
5360 c_parser_objc_class_definition (c_parser *parser)
5361 {
5362   bool iface_p;
5363   tree id1;
5364   tree superclass;
5365   if (c_parser_next_token_is_keyword (parser, RID_AT_INTERFACE))
5366     iface_p = true;
5367   else if (c_parser_next_token_is_keyword (parser, RID_AT_IMPLEMENTATION))
5368     iface_p = false;
5369   else
5370     gcc_unreachable ();
5371   c_parser_consume_token (parser);
5372   if (c_parser_next_token_is_not (parser, CPP_NAME))
5373     {
5374       c_parser_error (parser, "expected identifier");
5375       return;
5376     }
5377   id1 = c_parser_peek_token (parser)->value;
5378   c_parser_consume_token (parser);
5379   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
5380     {
5381       tree id2;
5382       tree proto = NULL_TREE;
5383       c_parser_consume_token (parser);
5384       if (c_parser_next_token_is_not (parser, CPP_NAME))
5385         {
5386           c_parser_error (parser, "expected identifier");
5387           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5388           return;
5389         }
5390       id2 = c_parser_peek_token (parser)->value;
5391       c_parser_consume_token (parser);
5392       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
5393       if (!iface_p)
5394         {
5395           objc_start_category_implementation (id1, id2);
5396           return;
5397         }
5398       if (c_parser_next_token_is (parser, CPP_LESS))
5399         proto = c_parser_objc_protocol_refs (parser);
5400       objc_start_category_interface (id1, id2, proto);
5401       c_parser_objc_methodprotolist (parser);
5402       c_parser_require_keyword (parser, RID_AT_END, "expected %<@end%>");
5403       objc_finish_interface ();
5404       return;
5405     }
5406   if (c_parser_next_token_is (parser, CPP_COLON))
5407     {
5408       c_parser_consume_token (parser);
5409       if (c_parser_next_token_is_not (parser, CPP_NAME))
5410         {
5411           c_parser_error (parser, "expected identifier");
5412           return;
5413         }
5414       superclass = c_parser_peek_token (parser)->value;
5415       c_parser_consume_token (parser);
5416     }
5417   else
5418     superclass = NULL_TREE;
5419   if (iface_p)
5420     {
5421       tree proto = NULL_TREE;
5422       if (c_parser_next_token_is (parser, CPP_LESS))
5423         proto = c_parser_objc_protocol_refs (parser);
5424       objc_start_class_interface (id1, superclass, proto);
5425     }
5426   else
5427     objc_start_class_implementation (id1, superclass);
5428   if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
5429     c_parser_objc_class_instance_variables (parser);
5430   if (iface_p)
5431     {
5432       objc_continue_interface ();
5433       c_parser_objc_methodprotolist (parser);
5434       c_parser_require_keyword (parser, RID_AT_END, "expected %<@end%>");
5435       objc_finish_interface ();
5436     }
5437   else
5438     {
5439       objc_continue_implementation ();
5440       return;
5441     }
5442 }
5443
5444 /* Parse objc-class-instance-variables.
5445
5446    objc-class-instance-variables:
5447      { objc-instance-variable-decl-list[opt] }
5448
5449    objc-instance-variable-decl-list:
5450      objc-visibility-spec
5451      objc-instance-variable-decl ;
5452      ;
5453      objc-instance-variable-decl-list objc-visibility-spec
5454      objc-instance-variable-decl-list objc-instance-variable-decl ;
5455      objc-instance-variable-decl-list ;
5456
5457    objc-visibility-spec:
5458      @private
5459      @protected
5460      @public
5461
5462    objc-instance-variable-decl:
5463      struct-declaration
5464 */
5465
5466 static void
5467 c_parser_objc_class_instance_variables (c_parser *parser)
5468 {
5469   gcc_assert (c_parser_next_token_is (parser, CPP_OPEN_BRACE));
5470   c_parser_consume_token (parser);
5471   while (c_parser_next_token_is_not (parser, CPP_EOF))
5472     {
5473       tree decls;
5474       /* Parse any stray semicolon.  */
5475       if (c_parser_next_token_is (parser, CPP_SEMICOLON))
5476         {
5477           if (pedantic)
5478             pedwarn ("extra semicolon in struct or union specified");
5479           c_parser_consume_token (parser);
5480           continue;
5481         }
5482       /* Stop if at the end of the instance variables.  */
5483       if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
5484         {
5485           c_parser_consume_token (parser);
5486           break;
5487         }
5488       /* Parse any objc-visibility-spec.  */
5489       if (c_parser_next_token_is_keyword (parser, RID_AT_PRIVATE))
5490         {
5491           c_parser_consume_token (parser);
5492           objc_set_visibility (2);
5493           continue;
5494         }
5495       else if (c_parser_next_token_is_keyword (parser, RID_AT_PROTECTED))
5496         {
5497           c_parser_consume_token (parser);
5498           objc_set_visibility (0);
5499           continue;
5500         }
5501       else if (c_parser_next_token_is_keyword (parser, RID_AT_PUBLIC))
5502         {
5503           c_parser_consume_token (parser);
5504           objc_set_visibility (1);
5505           continue;
5506         }
5507       /* Parse some comma-separated declarations.  */
5508       decls = c_parser_struct_declaration (parser);
5509       {
5510         /* Comma-separated instance variables are chained together in
5511            reverse order; add them one by one.  */
5512         tree ivar = nreverse (decls);
5513         for (; ivar; ivar = TREE_CHAIN (ivar))
5514           objc_add_instance_variable (copy_node (ivar));
5515       }
5516       c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
5517     }
5518 }
5519
5520 /* Parse an objc-class-declaration.
5521
5522    objc-class-declaration:
5523      @class identifier-list ;
5524 */
5525
5526 static void
5527 c_parser_objc_class_declaration (c_parser *parser)
5528 {
5529   tree list = NULL_TREE;
5530   gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_CLASS));
5531   c_parser_consume_token (parser);
5532   /* Any identifiers, including those declared as type names, are OK
5533      here.  */
5534   while (true)
5535     {
5536       tree id;
5537       if (c_parser_next_token_is_not (parser, CPP_NAME))
5538         {
5539           c_parser_error (parser, "expected identifier");
5540           break;
5541         }
5542       id = c_parser_peek_token (parser)->value;
5543       list = chainon (list, build_tree_list (NULL_TREE, id));
5544       c_parser_consume_token (parser);
5545       if (c_parser_next_token_is (parser, CPP_COMMA))
5546         c_parser_consume_token (parser);
5547       else
5548         break;
5549     }
5550   c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
5551   objc_declare_class (list);
5552 }
5553
5554 /* Parse an objc-alias-declaration.
5555
5556    objc-alias-declaration:
5557      @compatibility_alias identifier identifier ;
5558 */
5559
5560 static void
5561 c_parser_objc_alias_declaration (c_parser *parser)
5562 {
5563   tree id1, id2;
5564   gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_ALIAS));
5565   c_parser_consume_token (parser);
5566   if (c_parser_next_token_is_not (parser, CPP_NAME))
5567     {
5568       c_parser_error (parser, "expected identifier");
5569       c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
5570       return;
5571     }
5572   id1 = c_parser_peek_token (parser)->value;
5573   c_parser_consume_token (parser);
5574   if (c_parser_next_token_is_not (parser, CPP_NAME))
5575     {
5576       c_parser_error (parser, "expected identifier");
5577       c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
5578       return;
5579     }
5580   id2 = c_parser_peek_token (parser)->value;
5581   c_parser_consume_token (parser);
5582   c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
5583   objc_declare_alias (id1, id2);
5584 }
5585
5586 /* Parse an objc-protocol-definition.
5587
5588    objc-protocol-definition:
5589      @protocol identifier objc-protocol-refs[opt] objc-methodprotolist @end
5590      @protocol identifier-list ;
5591
5592    "@protocol identifier ;" should be resolved as "@protocol
5593    identifier-list ;": objc-methodprotolist may not start with a
5594    semicolon in the first alternative if objc-protocol-refs are
5595    omitted.  */
5596
5597 static void
5598 c_parser_objc_protocol_definition (c_parser *parser)
5599 {
5600   gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_PROTOCOL));
5601   c_parser_consume_token (parser);
5602   if (c_parser_next_token_is_not (parser, CPP_NAME))
5603     {
5604       c_parser_error (parser, "expected identifier");
5605       return;
5606     }
5607   if (c_parser_peek_2nd_token (parser)->type == CPP_COMMA
5608       || c_parser_peek_2nd_token (parser)->type == CPP_SEMICOLON)
5609     {
5610       tree list = NULL_TREE;
5611       /* Any identifiers, including those declared as type names, are
5612          OK here.  */
5613       while (true)
5614         {
5615           tree id;
5616           if (c_parser_next_token_is_not (parser, CPP_NAME))
5617             {
5618               c_parser_error (parser, "expected identifier");
5619               break;
5620             }
5621           id = c_parser_peek_token (parser)->value;
5622           list = chainon (list, build_tree_list (NULL_TREE, id));
5623           c_parser_consume_token (parser);
5624           if (c_parser_next_token_is (parser, CPP_COMMA))
5625             c_parser_consume_token (parser);
5626           else
5627             break;
5628         }
5629       c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
5630       objc_declare_protocols (list);
5631     }
5632   else
5633     {
5634       tree id = c_parser_peek_token (parser)->value;
5635       tree proto = NULL_TREE;
5636       c_parser_consume_token (parser);
5637       if (c_parser_next_token_is (parser, CPP_LESS))
5638         proto = c_parser_objc_protocol_refs (parser);
5639       objc_pq_context = 1;
5640       objc_start_protocol (id, proto);
5641       c_parser_objc_methodprotolist (parser);
5642       c_parser_require_keyword (parser, RID_AT_END, "expected %<@end%>");
5643       objc_pq_context = 0;
5644       objc_finish_interface ();
5645     }
5646 }
5647
5648 /* Parse an objc-method-type.
5649
5650    objc-method-type:
5651      +
5652      -
5653 */
5654
5655 static enum tree_code
5656 c_parser_objc_method_type (c_parser *parser)
5657 {
5658   switch (c_parser_peek_token (parser)->type)
5659     {
5660     case CPP_PLUS:
5661       c_parser_consume_token (parser);
5662       return PLUS_EXPR;
5663     case CPP_MINUS:
5664       c_parser_consume_token (parser);
5665       return MINUS_EXPR;
5666     default:
5667       gcc_unreachable ();
5668     }
5669 }
5670
5671 /* Parse an objc-method-definition.
5672
5673    objc-method-definition:
5674      objc-method-type objc-method-decl ;[opt] compound-statement
5675 */
5676
5677 static void
5678 c_parser_objc_method_definition (c_parser *parser)
5679 {
5680   enum tree_code type = c_parser_objc_method_type (parser);
5681   tree decl;
5682   objc_set_method_type (type);
5683   objc_pq_context = 1;
5684   decl = c_parser_objc_method_decl (parser);
5685   if (c_parser_next_token_is (parser, CPP_SEMICOLON))
5686     {
5687       c_parser_consume_token (parser);
5688       if (pedantic)
5689         pedwarn ("extra semicolon in method definition specified");
5690     }
5691   objc_pq_context = 0;
5692   objc_start_method_definition (decl);
5693   add_stmt (c_parser_compound_statement (parser));
5694   objc_finish_method_definition (current_function_decl);
5695 }
5696
5697 /* Parse an objc-methodprotolist.
5698
5699    objc-methodprotolist:
5700      empty
5701      objc-methodprotolist objc-methodproto
5702      objc-methodprotolist declaration
5703      objc-methodprotolist ;
5704
5705    The declaration is a data definition, which may be missing
5706    declaration specifiers under the same rules and diagnostics as
5707    other data definitions outside functions, and the stray semicolon
5708    is diagnosed the same way as a stray semicolon outside a
5709    function.  */
5710
5711 static void
5712 c_parser_objc_methodprotolist (c_parser *parser)
5713 {
5714   while (true)
5715     {
5716       /* The list is terminated by @end.  */
5717       switch (c_parser_peek_token (parser)->type)
5718         {
5719         case CPP_SEMICOLON:
5720           if (pedantic)
5721             pedwarn ("ISO C does not allow extra %<;%> outside of a function");
5722           c_parser_consume_token (parser);
5723           break;
5724         case CPP_PLUS:
5725         case CPP_MINUS:
5726           c_parser_objc_methodproto (parser);
5727           break;
5728         case CPP_EOF:
5729           return;
5730         default:
5731           if (c_parser_next_token_is_keyword (parser, RID_AT_END))
5732             return;
5733           c_parser_declaration_or_fndef (parser, false, true, false, true);
5734           break;
5735         }
5736     }
5737 }
5738
5739 /* Parse an objc-methodproto.
5740
5741    objc-methodproto:
5742      objc-method-type objc-method-decl ;
5743 */
5744
5745 static void
5746 c_parser_objc_methodproto (c_parser *parser)
5747 {
5748   enum tree_code type = c_parser_objc_method_type (parser);
5749   tree decl;
5750   objc_set_method_type (type);
5751   /* Remember protocol qualifiers in prototypes.  */
5752   objc_pq_context = 1;
5753   decl = c_parser_objc_method_decl (parser);
5754   /* Forget protocol qualifiers here.  */
5755   objc_pq_context = 0;
5756   objc_add_method_declaration (decl);
5757   c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
5758 }
5759
5760 /* Parse an objc-method-decl.
5761
5762    objc-method-decl:
5763      ( objc-type-name ) objc-selector
5764      objc-selector
5765      ( objc-type-name ) objc-keyword-selector objc-optparmlist
5766      objc-keyword-selector objc-optparmlist
5767
5768    objc-keyword-selector:
5769      objc-keyword-decl
5770      objc-keyword-selector objc-keyword-decl
5771
5772    objc-keyword-decl:
5773      objc-selector : ( objc-type-name ) identifier
5774      objc-selector : identifier
5775      : ( objc-type-name ) identifier
5776      : identifier
5777
5778    objc-optparmlist:
5779      objc-optparms objc-optellipsis
5780
5781    objc-optparms:
5782      empty
5783      objc-opt-parms , parameter-declaration
5784
5785    objc-optellipsis:
5786      empty
5787      , ...
5788 */
5789
5790 static tree
5791 c_parser_objc_method_decl (c_parser *parser)
5792 {
5793   tree type = NULL_TREE;
5794   tree sel;
5795   tree parms = NULL_TREE;
5796   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
5797     {
5798       c_parser_consume_token (parser);
5799       type = c_parser_objc_type_name (parser);
5800       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
5801     }
5802   sel = c_parser_objc_selector (parser);
5803   /* If there is no selector, or a colon follows, we have an
5804      objc-keyword-selector.  If there is a selector, and a colon does
5805      not follow, that selector ends the objc-method-decl.  */
5806   if (!sel || c_parser_next_token_is (parser, CPP_COLON))
5807     {
5808       tree tsel = sel;
5809       tree list = NULL_TREE;
5810       bool ellipsis;
5811       while (true)
5812         {
5813           tree atype = NULL_TREE, id, keyworddecl;
5814           if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
5815             break;
5816           if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
5817             {
5818               c_parser_consume_token (parser);
5819               atype = c_parser_objc_type_name (parser);
5820               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5821                                          "expected %<)%>");
5822             }
5823           if (c_parser_next_token_is_not (parser, CPP_NAME))
5824             {
5825               c_parser_error (parser, "expected identifier");
5826               return error_mark_node;
5827             }
5828           id = c_parser_peek_token (parser)->value;
5829           c_parser_consume_token (parser);
5830           keyworddecl = objc_build_keyword_decl (tsel, atype, id);
5831           list = chainon (list, keyworddecl);
5832           tsel = c_parser_objc_selector (parser);
5833           if (!tsel && c_parser_next_token_is_not (parser, CPP_COLON))
5834             break;
5835         }
5836       /* Parse the optional parameter list.  Optional Objective-C
5837          method parameters follow the C syntax, and may include '...'
5838          to denote a variable number of arguments.  */
5839       parms = make_node (TREE_LIST);
5840       ellipsis = false;
5841       while (c_parser_next_token_is (parser, CPP_COMMA))
5842         {
5843           struct c_parm *parm;
5844           c_parser_consume_token (parser);
5845           if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
5846             {
5847               ellipsis = true;
5848               c_parser_consume_token (parser);
5849               break;
5850             }
5851           parm = c_parser_parameter_declaration (parser, NULL_TREE);
5852           if (parm == NULL)
5853             break;
5854           parms = chainon (parms,
5855                            build_tree_list (NULL_TREE, grokparm (parm)));
5856         }
5857       TREE_OVERFLOW (parms) = ellipsis;
5858       sel = list;
5859     }
5860   return objc_build_method_signature (type, sel, parms);
5861 }
5862
5863 /* Parse an objc-type-name.
5864
5865    objc-type-name:
5866      objc-type-qualifiers[opt] type-name
5867      objc-type-qualifiers[opt]
5868
5869    objc-type-qualifiers:
5870      objc-type-qualifier
5871      objc-type-qualifiers objc-type-qualifier
5872
5873    objc-type-qualifier: one of
5874      in out inout bycopy byref oneway
5875 */
5876
5877 static tree
5878 c_parser_objc_type_name (c_parser *parser)
5879 {
5880   tree quals = NULL_TREE;
5881   struct c_type_name *typename = NULL;
5882   tree type = NULL_TREE;
5883   while (true)
5884     {
5885       c_token *token = c_parser_peek_token (parser);
5886       if (token->type == CPP_KEYWORD
5887           && (token->keyword == RID_IN
5888               || token->keyword == RID_OUT
5889               || token->keyword == RID_INOUT
5890               || token->keyword == RID_BYCOPY
5891               || token->keyword == RID_BYREF
5892               || token->keyword == RID_ONEWAY))
5893         {
5894           quals = chainon (quals, build_tree_list (NULL_TREE, token->value));
5895           c_parser_consume_token (parser);
5896         }
5897       else
5898         break;
5899     }
5900   if (c_parser_next_token_starts_typename (parser))
5901     typename = c_parser_type_name (parser);
5902   if (typename)
5903     type = groktypename (typename);
5904   return build_tree_list (quals, type);
5905 }
5906
5907 /* Parse objc-protocol-refs.
5908
5909    objc-protocol-refs:
5910      < identifier-list >
5911 */
5912
5913 static tree
5914 c_parser_objc_protocol_refs (c_parser *parser)
5915 {
5916   tree list = NULL_TREE;
5917   gcc_assert (c_parser_next_token_is (parser, CPP_LESS));
5918   c_parser_consume_token (parser);
5919   /* Any identifiers, including those declared as type names, are OK
5920      here.  */
5921   while (true)
5922     {
5923       tree id;
5924       if (c_parser_next_token_is_not (parser, CPP_NAME))
5925         {
5926           c_parser_error (parser, "expected identifier");
5927           break;
5928         }
5929       id = c_parser_peek_token (parser)->value;
5930       list = chainon (list, build_tree_list (NULL_TREE, id));
5931       c_parser_consume_token (parser);
5932       if (c_parser_next_token_is (parser, CPP_COMMA))
5933         c_parser_consume_token (parser);
5934       else
5935         break;
5936     }
5937   c_parser_require (parser, CPP_GREATER, "expected %<>%>");
5938   return list;
5939 }
5940
5941 /* Parse an objc-try-catch-statement.
5942
5943    objc-try-catch-statement:
5944      @try compound-statement objc-catch-list[opt]
5945      @try compound-statement objc-catch-list[opt] @finally compound-statement
5946
5947    objc-catch-list:
5948      @catch ( parameter-declaration ) compound-statement
5949      objc-catch-list @catch ( parameter-declaration ) compound-statement
5950 */
5951
5952 static void
5953 c_parser_objc_try_catch_statement (c_parser *parser)
5954 {
5955   location_t loc;
5956   tree stmt;
5957   gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_TRY));
5958   c_parser_consume_token (parser);
5959   loc = c_parser_peek_token (parser)->location;
5960   stmt = c_parser_compound_statement (parser);
5961   objc_begin_try_stmt (loc, stmt);
5962   while (c_parser_next_token_is_keyword (parser, RID_AT_CATCH))
5963     {
5964       struct c_parm *parm;
5965       c_parser_consume_token (parser);
5966       if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5967         break;
5968       parm = c_parser_parameter_declaration (parser, NULL_TREE);
5969       if (parm == NULL)
5970         {
5971           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5972           break;
5973         }
5974       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
5975       objc_begin_catch_clause (grokparm (parm));
5976       if (c_parser_require (parser, CPP_OPEN_BRACE, "expected %<{%>"))
5977         c_parser_compound_statement_nostart (parser);
5978       objc_finish_catch_clause ();
5979     }
5980   if (c_parser_next_token_is_keyword (parser, RID_AT_FINALLY))
5981     {
5982       location_t finloc;
5983       tree finstmt;
5984       c_parser_consume_token (parser);
5985       finloc = c_parser_peek_token (parser)->location;
5986       finstmt = c_parser_compound_statement (parser);
5987       objc_build_finally_clause (finloc, finstmt);
5988     }
5989   objc_finish_try_stmt ();
5990 }
5991
5992 /* Parse an objc-synchronized-statement.
5993
5994    objc-synchronized-statement:
5995      @synchronized ( expression ) compound-statement
5996 */
5997
5998 static void
5999 c_parser_objc_synchronized_statement (c_parser *parser)
6000 {
6001   location_t loc;
6002   tree expr, stmt;
6003   gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_SYNCHRONIZED));
6004   c_parser_consume_token (parser);
6005   loc = c_parser_peek_token (parser)->location;
6006   if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
6007     {
6008       expr = c_parser_expression (parser).value;
6009       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
6010     }
6011   else
6012     expr = error_mark_node;
6013   stmt = c_parser_compound_statement (parser);
6014   objc_build_synchronized (loc, expr, stmt);
6015 }
6016
6017 /* Parse an objc-selector; return NULL_TREE without an error if the
6018    next token is not an objc-selector.
6019
6020    objc-selector:
6021      identifier
6022      one of
6023        enum struct union if else while do for switch case default
6024        break continue return goto asm sizeof typeof __alignof
6025        unsigned long const short volatile signed restrict _Complex
6026        in out inout bycopy byref oneway int char float double void _Bool
6027
6028    ??? Why this selection of keywords but not, for example, storage
6029    class specifiers?  */
6030
6031 static tree
6032 c_parser_objc_selector (c_parser *parser)
6033 {
6034   c_token *token = c_parser_peek_token (parser);
6035   tree value = token->value;
6036   if (token->type == CPP_NAME)
6037     {
6038       c_parser_consume_token (parser);
6039       return value;
6040     }
6041   if (token->type != CPP_KEYWORD)
6042     return NULL_TREE;
6043   switch (token->keyword)
6044     {
6045     case RID_ENUM:
6046     case RID_STRUCT:
6047     case RID_UNION:
6048     case RID_IF:
6049     case RID_ELSE:
6050     case RID_WHILE:
6051     case RID_DO:
6052     case RID_FOR:
6053     case RID_SWITCH:
6054     case RID_CASE:
6055     case RID_DEFAULT:
6056     case RID_BREAK:
6057     case RID_CONTINUE:
6058     case RID_RETURN:
6059     case RID_GOTO:
6060     case RID_ASM:
6061     case RID_SIZEOF:
6062     case RID_TYPEOF:
6063     case RID_ALIGNOF:
6064     case RID_UNSIGNED:
6065     case RID_LONG:
6066     case RID_CONST:
6067     case RID_SHORT:
6068     case RID_VOLATILE:
6069     case RID_SIGNED:
6070     case RID_RESTRICT:
6071     case RID_COMPLEX:
6072     case RID_IN:
6073     case RID_OUT:
6074     case RID_INOUT:
6075     case RID_BYCOPY:
6076     case RID_BYREF:
6077     case RID_ONEWAY:
6078     case RID_INT:
6079     case RID_CHAR:
6080     case RID_FLOAT:
6081     case RID_DOUBLE:
6082     case RID_VOID:
6083     case RID_BOOL:
6084       c_parser_consume_token (parser);
6085       return value;
6086     default:
6087       return NULL_TREE;
6088     }
6089 }
6090
6091 /* Parse an objc-selector-arg.
6092
6093    objc-selector-arg:
6094      objc-selector
6095      objc-keywordname-list
6096
6097    objc-keywordname-list:
6098      objc-keywordname
6099      objc-keywordname-list objc-keywordname
6100
6101    objc-keywordname:
6102      objc-selector :
6103      :
6104 */
6105
6106 static tree
6107 c_parser_objc_selector_arg (c_parser *parser)
6108 {
6109   tree sel = c_parser_objc_selector (parser);
6110   tree list = NULL_TREE;
6111   if (sel && c_parser_next_token_is_not (parser, CPP_COLON))
6112     return sel;
6113   while (true)
6114     {
6115       if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
6116         return list;
6117       list = chainon (list, build_tree_list (sel, NULL_TREE));
6118       sel = c_parser_objc_selector (parser);
6119       if (!sel && c_parser_next_token_is_not (parser, CPP_COLON))
6120         break;
6121     }
6122   return list;
6123 }
6124
6125 /* Parse an objc-receiver.
6126
6127    objc-receiver:
6128      expression
6129      class-name
6130      type-name
6131 */
6132
6133 static tree
6134 c_parser_objc_receiver (c_parser *parser)
6135 {
6136   if (c_parser_peek_token (parser)->type == CPP_NAME
6137       && (c_parser_peek_token (parser)->id_kind == C_ID_TYPENAME
6138           || c_parser_peek_token (parser)->id_kind == C_ID_CLASSNAME))
6139     {
6140       tree id = c_parser_peek_token (parser)->value;
6141       c_parser_consume_token (parser);
6142       return objc_get_class_reference (id);
6143     }
6144   return c_parser_expression (parser).value;
6145 }
6146
6147 /* Parse objc-message-args.
6148
6149    objc-message-args:
6150      objc-selector
6151      objc-keywordarg-list
6152
6153    objc-keywordarg-list:
6154      objc-keywordarg
6155      objc-keywordarg-list objc-keywordarg
6156
6157    objc-keywordarg:
6158      objc-selector : objc-keywordexpr
6159      : objc-keywordexpr
6160 */
6161
6162 static tree
6163 c_parser_objc_message_args (c_parser *parser)
6164 {
6165   tree sel = c_parser_objc_selector (parser);
6166   tree list = NULL_TREE;
6167   if (sel && c_parser_next_token_is_not (parser, CPP_COLON))
6168     return sel;
6169   while (true)
6170     {
6171       tree keywordexpr;
6172       if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
6173         return list;
6174       keywordexpr = c_parser_objc_keywordexpr (parser);
6175       list = chainon (list, build_tree_list (sel, keywordexpr));
6176       sel = c_parser_objc_selector (parser);
6177       if (!sel && c_parser_next_token_is_not (parser, CPP_COLON))
6178         break;
6179     }
6180   return list;
6181 }
6182
6183 /* Parse an objc-keywordexpr.
6184
6185    objc-keywordexpr:
6186      nonempty-expr-list
6187 */
6188
6189 static tree
6190 c_parser_objc_keywordexpr (c_parser *parser)
6191 {
6192   tree list = c_parser_expr_list (parser);
6193   if (TREE_CHAIN (list) == NULL_TREE)
6194     {
6195       /* Just return the expression, remove a level of
6196          indirection.  */
6197       return TREE_VALUE (list);
6198     }
6199   else
6200     {
6201       /* We have a comma expression, we will collapse later.  */
6202       return list;
6203     }
6204 }
6205
6206 \f
6207 /* The actual parser and external interface.  ??? Does this need to be
6208    garbage-collected?  */
6209
6210 static GTY (()) c_parser *the_parser;
6211
6212 /* Parse a single source file.  */
6213
6214 void
6215 c_parse_file (void)
6216 {
6217   the_parser = c_parser_new ();
6218   c_parser_translation_unit (the_parser);
6219   the_parser = NULL;
6220 }
6221
6222 #include "gt-c-parser.h"