OSDN Git Service

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