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