OSDN Git Service

Daily bump.
[pf3gnuchains/gcc-fork.git] / gcc / c-parser.c
1 /* Parser for C and Objective-C.
2    Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3    1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
4
5    Parser actions based on the old Bison parser; structure somewhat
6    influenced by and fragments based on the C++ parser.
7
8 This file is part of GCC.
9
10 GCC is free software; you can redistribute it and/or modify it under
11 the terms of the GNU General Public License as published by the Free
12 Software Foundation; either version 2, or (at your option) any later
13 version.
14
15 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
16 WARRANTY; without even the implied warranty of MERCHANTABILITY or
17 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
18 for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with GCC; see the file COPYING.  If not, write to the Free
22 Software Foundation, 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   if (last_label)
3319     error ("label at end of compound statement");
3320   c_parser_consume_token (parser);
3321 }
3322
3323 /* Parse a label (C90 6.6.1, C99 6.8.1).
3324
3325    label:
3326      identifier : attributes[opt]
3327      case constant-expression :
3328      default :
3329
3330    GNU extensions:
3331
3332    label:
3333      case constant-expression ... constant-expression :
3334
3335    The use of attributes on labels is a GNU extension.  The syntax in
3336    GNU C accepts any expressions without commas, non-constant
3337    expressions being rejected later.  */
3338
3339 static void
3340 c_parser_label (c_parser *parser)
3341 {
3342   location_t loc1 = c_parser_peek_token (parser)->location;
3343   tree label = NULL_TREE;
3344   if (c_parser_next_token_is_keyword (parser, RID_CASE))
3345     {
3346       tree exp1, exp2;
3347       c_parser_consume_token (parser);
3348       exp1 = c_parser_expr_no_commas (parser, NULL).value;
3349       if (c_parser_next_token_is (parser, CPP_COLON))
3350         {
3351           c_parser_consume_token (parser);
3352           label = do_case (exp1, NULL_TREE);
3353         }
3354       else if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
3355         {
3356           c_parser_consume_token (parser);
3357           exp2 = c_parser_expr_no_commas (parser, NULL).value;
3358           if (c_parser_require (parser, CPP_COLON, "expected %<:%>"))
3359             label = do_case (exp1, exp2);
3360         }
3361       else
3362         c_parser_error (parser, "expected %<:%> or %<...%>");
3363     }
3364   else if (c_parser_next_token_is_keyword (parser, RID_DEFAULT))
3365     {
3366       c_parser_consume_token (parser);
3367       if (c_parser_require (parser, CPP_COLON, "expected %<:%>"))
3368         label = do_case (NULL_TREE, NULL_TREE);
3369     }
3370   else
3371     {
3372       tree name = c_parser_peek_token (parser)->value;
3373       tree tlab;
3374       location_t loc2;
3375       tree attrs;
3376       gcc_assert (c_parser_next_token_is (parser, CPP_NAME));
3377       c_parser_consume_token (parser);
3378       gcc_assert (c_parser_next_token_is (parser, CPP_COLON));
3379       loc2 = c_parser_peek_token (parser)->location;
3380       c_parser_consume_token (parser);
3381       attrs = c_parser_attributes (parser);
3382       tlab = define_label (loc2, name);
3383       if (tlab)
3384         {
3385           decl_attributes (&tlab, attrs, 0);
3386           label = add_stmt (build_stmt (LABEL_EXPR, tlab));
3387         }
3388     }
3389   if (label)
3390     SET_EXPR_LOCATION (label, loc1);
3391 }
3392
3393 /* Parse a statement (C90 6.6, C99 6.8).
3394
3395    statement:
3396      labeled-statement
3397      compound-statement
3398      expression-statement
3399      selection-statement
3400      iteration-statement
3401      jump-statement
3402
3403    labeled-statement:
3404      label statement
3405
3406    expression-statement:
3407      expression[opt] ;
3408
3409    selection-statement:
3410      if-statement
3411      switch-statement
3412
3413    iteration-statement:
3414      while-statement
3415      do-statement
3416      for-statement
3417
3418    jump-statement:
3419      goto identifier ;
3420      continue ;
3421      break ;
3422      return expression[opt] ;
3423
3424    GNU extensions:
3425
3426    statement:
3427      asm-statement
3428
3429    jump-statement:
3430      goto * expression ;
3431
3432    Objective-C:
3433
3434    statement:
3435      objc-throw-statement
3436      objc-try-catch-statement
3437      objc-synchronized-statement
3438
3439    objc-throw-statement:
3440      @throw expression ;
3441      @throw ;
3442 */
3443
3444 static void
3445 c_parser_statement (c_parser *parser)
3446 {
3447   while (c_parser_next_token_is_keyword (parser, RID_CASE)
3448          || c_parser_next_token_is_keyword (parser, RID_DEFAULT)
3449          || (c_parser_next_token_is (parser, CPP_NAME)
3450              && c_parser_peek_2nd_token (parser)->type == CPP_COLON))
3451     c_parser_label (parser);
3452   c_parser_statement_after_labels (parser);
3453 }
3454
3455 /* Parse a statement, other than a labeled statement.  */
3456
3457 static void
3458 c_parser_statement_after_labels (c_parser *parser)
3459 {
3460   location_t loc = c_parser_peek_token (parser)->location;
3461   tree stmt = NULL_TREE;
3462   switch (c_parser_peek_token (parser)->type)
3463     {
3464     case CPP_OPEN_BRACE:
3465       add_stmt (c_parser_compound_statement (parser));
3466       break;
3467     case CPP_KEYWORD:
3468       switch (c_parser_peek_token (parser)->keyword)
3469         {
3470         case RID_IF:
3471           c_parser_if_statement (parser);
3472           break;
3473         case RID_SWITCH:
3474           c_parser_switch_statement (parser);
3475           break;
3476         case RID_WHILE:
3477           c_parser_while_statement (parser);
3478           break;
3479         case RID_DO:
3480           c_parser_do_statement (parser);
3481           break;
3482         case RID_FOR:
3483           c_parser_for_statement (parser);
3484           break;
3485         case RID_GOTO:
3486           c_parser_consume_token (parser);
3487           if (c_parser_next_token_is (parser, CPP_NAME))
3488             {
3489               stmt = c_finish_goto_label (c_parser_peek_token (parser)->value);
3490               c_parser_consume_token (parser);
3491             }
3492           else if (c_parser_next_token_is (parser, CPP_MULT))
3493             {
3494               c_parser_consume_token (parser);
3495               stmt = c_finish_goto_ptr (c_parser_expression (parser).value);
3496             }
3497           else
3498             c_parser_error (parser, "expected identifier or %<*%>");
3499           goto expect_semicolon;
3500         case RID_CONTINUE:
3501           c_parser_consume_token (parser);
3502           stmt = c_finish_bc_stmt (&c_cont_label, false);
3503           goto expect_semicolon;
3504         case RID_BREAK:
3505           c_parser_consume_token (parser);
3506           stmt = c_finish_bc_stmt (&c_break_label, true);
3507           goto expect_semicolon;
3508         case RID_RETURN:
3509           c_parser_consume_token (parser);
3510           if (c_parser_next_token_is (parser, CPP_SEMICOLON))
3511             {
3512               stmt = c_finish_return (NULL_TREE);
3513               c_parser_consume_token (parser);
3514             }
3515           else
3516             {
3517               stmt = c_finish_return (c_parser_expression_conv (parser).value);
3518               goto expect_semicolon;
3519             }
3520           break;
3521         case RID_ASM:
3522           stmt = c_parser_asm_statement (parser);
3523           break;
3524         case RID_AT_THROW:
3525           gcc_assert (c_dialect_objc ());
3526           c_parser_consume_token (parser);
3527           if (c_parser_next_token_is (parser, CPP_SEMICOLON))
3528             {
3529               stmt = objc_build_throw_stmt (NULL_TREE);
3530               c_parser_consume_token (parser);
3531             }
3532           else
3533             {
3534               stmt
3535                 = objc_build_throw_stmt (c_parser_expression (parser).value);
3536               goto expect_semicolon;
3537             }
3538           break;
3539         case RID_AT_TRY:
3540           gcc_assert (c_dialect_objc ());
3541           c_parser_objc_try_catch_statement (parser);
3542           break;
3543         case RID_AT_SYNCHRONIZED:
3544           gcc_assert (c_dialect_objc ());
3545           c_parser_objc_synchronized_statement (parser);
3546           break;
3547         default:
3548           goto expr_stmt;
3549         }
3550       break;
3551     case CPP_SEMICOLON:
3552       c_parser_consume_token (parser);
3553       break;
3554     case CPP_CLOSE_PAREN:
3555     case CPP_CLOSE_SQUARE:
3556       /* Avoid infinite loop in error recovery:
3557          c_parser_skip_until_found stops at a closing nesting
3558          delimiter without consuming it, but here we need to consume
3559          it to proceed further.  */
3560       c_parser_error (parser, "expected statement");
3561       c_parser_consume_token (parser);
3562       break;
3563     default:
3564     expr_stmt:
3565       stmt = c_finish_expr_stmt (c_parser_expression_conv (parser).value);
3566     expect_semicolon:
3567       c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
3568       break;
3569     }
3570   /* Two cases cannot and do not have line numbers associated: If stmt
3571      is degenerate, such as "2;", then stmt is an INTEGER_CST, which
3572      cannot hold line numbers.  But that's OK because the statement
3573      will either be changed to a MODIFY_EXPR during gimplification of
3574      the statement expr, or discarded.  If stmt was compound, but
3575      without new variables, we will have skipped the creation of a
3576      BIND and will have a bare STATEMENT_LIST.  But that's OK because
3577      (recursively) all of the component statements should already have
3578      line numbers assigned.  ??? Can we discard no-op statements
3579      earlier?  */
3580   if (stmt && EXPR_P (stmt))
3581     SET_EXPR_LOCATION (stmt, loc);
3582 }
3583
3584 /* Parse a parenthesized condition from an if, do or while statement.
3585
3586    condition:
3587      ( expression )
3588 */
3589 static tree
3590 c_parser_paren_condition (c_parser *parser)
3591 {
3592   location_t loc;
3593   tree cond;
3594   if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
3595     return error_mark_node;
3596   loc = c_parser_peek_token (parser)->location;
3597   cond = c_objc_common_truthvalue_conversion
3598     (c_parser_expression_conv (parser).value);
3599   if (EXPR_P (cond))
3600     SET_EXPR_LOCATION (cond, loc);
3601   c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
3602   return cond;
3603 }
3604
3605 /* Parse a statement which is a block in C99.  */
3606
3607 static tree
3608 c_parser_c99_block_statement (c_parser *parser)
3609 {
3610   tree block = c_begin_compound_stmt (flag_isoc99);
3611   c_parser_statement (parser);
3612   return c_end_compound_stmt (block, flag_isoc99);
3613 }
3614
3615 /* Parse the body of an if statement or the else half thereof.  This
3616    is just parsing a statement but (a) it is a block in C99, (b) we
3617    track whether the body is an if statement for the sake of
3618    -Wparentheses warnings, (c) we handle an empty body specially for
3619    the sake of -Wextra warnings.  */
3620
3621 static tree
3622 c_parser_if_body (c_parser *parser, bool *if_p)
3623 {
3624   tree block = c_begin_compound_stmt (flag_isoc99);
3625   while (c_parser_next_token_is_keyword (parser, RID_CASE)
3626          || c_parser_next_token_is_keyword (parser, RID_DEFAULT)
3627          || (c_parser_next_token_is (parser, CPP_NAME)
3628              && c_parser_peek_2nd_token (parser)->type == CPP_COLON))
3629     c_parser_label (parser);
3630   *if_p = c_parser_next_token_is_keyword (parser, RID_IF);
3631   if (extra_warnings && c_parser_next_token_is (parser, CPP_SEMICOLON))
3632     add_stmt (build (NOP_EXPR, NULL_TREE, NULL_TREE));
3633   c_parser_statement_after_labels (parser);
3634   return c_end_compound_stmt (block, flag_isoc99);
3635 }
3636
3637 /* Parse an if statement (C90 6.6.4, C99 6.8.4).
3638
3639    if-statement:
3640      if ( expression ) statement
3641      if ( expression ) statement else statement
3642 */
3643
3644 static void
3645 c_parser_if_statement (c_parser *parser)
3646 {
3647   tree block;
3648   location_t loc;
3649   tree cond;
3650   bool first_if = false, second_if = false;
3651   tree first_body, second_body;
3652   gcc_assert (c_parser_next_token_is_keyword (parser, RID_IF));
3653   c_parser_consume_token (parser);
3654   block = c_begin_compound_stmt (flag_isoc99);
3655   loc = c_parser_peek_token (parser)->location;
3656   cond = c_parser_paren_condition (parser);
3657   first_body = c_parser_if_body (parser, &first_if);
3658   if (c_parser_next_token_is_keyword (parser, RID_ELSE))
3659     {
3660       c_parser_consume_token (parser);
3661       second_body = c_parser_if_body (parser, &second_if);
3662     }
3663   else
3664     second_body = NULL_TREE;
3665   c_finish_if_stmt (loc, cond, first_body, second_body, first_if);
3666   add_stmt (c_end_compound_stmt (block, flag_isoc99));
3667 }
3668
3669 /* Parse a switch statement (C90 6.6.4, C99 6.8.4).
3670
3671    switch-statement:
3672      switch (expression) statement
3673 */
3674
3675 static void
3676 c_parser_switch_statement (c_parser *parser)
3677 {
3678   tree block, expr, body, save_break;
3679   gcc_assert (c_parser_next_token_is_keyword (parser, RID_SWITCH));
3680   c_parser_consume_token (parser);
3681   block = c_begin_compound_stmt (flag_isoc99);
3682   if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
3683     {
3684       expr = c_parser_expression (parser).value;
3685       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
3686     }
3687   else
3688     expr = error_mark_node;
3689   c_start_case (expr);
3690   save_break = c_break_label;
3691   c_break_label = NULL_TREE;
3692   body = c_parser_c99_block_statement (parser);
3693   c_finish_case (body);
3694   if (c_break_label)
3695     add_stmt (build (LABEL_EXPR, void_type_node, c_break_label));
3696   c_break_label = save_break;
3697   add_stmt (c_end_compound_stmt (block, flag_isoc99));
3698 }
3699
3700 /* Parse a while statement (C90 6.6.5, C99 6.8.5).
3701
3702    while-statement:
3703       while (expression) statement
3704 */
3705
3706 static void
3707 c_parser_while_statement (c_parser *parser)
3708 {
3709   tree block, cond, body, save_break, save_cont;
3710   location_t loc;
3711   gcc_assert (c_parser_next_token_is_keyword (parser, RID_WHILE));
3712   c_parser_consume_token (parser);
3713   block = c_begin_compound_stmt (flag_isoc99);
3714   loc = c_parser_peek_token (parser)->location;
3715   cond = c_parser_paren_condition (parser);
3716   save_break = c_break_label;
3717   c_break_label = NULL_TREE;
3718   save_cont = c_cont_label;
3719   c_cont_label = NULL_TREE;
3720   body = c_parser_c99_block_statement (parser);
3721   c_finish_loop (loc, cond, NULL, body, c_break_label, c_cont_label, true);
3722   add_stmt (c_end_compound_stmt (block, flag_isoc99));
3723   c_break_label = save_break;
3724   c_cont_label = save_cont;
3725 }
3726
3727 /* Parse a do statement (C90 6.6.5, C99 6.8.5).
3728
3729    do-statement:
3730      do statement while ( expression ) ;
3731 */
3732
3733 static void
3734 c_parser_do_statement (c_parser *parser)
3735 {
3736   tree block, cond, body, save_break, save_cont, new_break, new_cont;
3737   location_t loc;
3738   gcc_assert (c_parser_next_token_is_keyword (parser, RID_DO));
3739   c_parser_consume_token (parser);
3740   block = c_begin_compound_stmt (flag_isoc99);
3741   loc = c_parser_peek_token (parser)->location;
3742   save_break = c_break_label;
3743   c_break_label = NULL_TREE;
3744   save_cont = c_cont_label;
3745   c_cont_label = NULL_TREE;
3746   body = c_parser_c99_block_statement (parser);
3747   c_parser_require_keyword (parser, RID_WHILE, "expected %<while%>");
3748   new_break = c_break_label;
3749   c_break_label = save_break;
3750   new_cont = c_cont_label;
3751   c_cont_label = save_cont;
3752   cond = c_parser_paren_condition (parser);
3753   if (!c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>"))
3754     c_parser_skip_to_end_of_block_or_statement (parser);
3755   c_finish_loop (loc, cond, NULL, body, new_break, new_cont, false);
3756   add_stmt (c_end_compound_stmt (block, flag_isoc99));
3757 }
3758
3759 /* Parse a for statement (C90 6.6.5, C99 6.8.5).
3760
3761    for-statement:
3762      for ( expression[opt] ; expression[opt] ; expression[opt] ) statement
3763      for ( nested-declaration expression[opt] ; expression[opt] ) statement
3764
3765    The form with a declaration is new in C99.
3766
3767    ??? In accordance with the old parser, the declaration may be a
3768    nested function, which is then rejected in check_for_loop_decls,
3769    but does it make any sense for this to be included in the grammar?
3770    Note in particular that the nested function does not include a
3771    trailing ';', whereas the "declaration" production includes one.
3772    Also, can we reject bad declarations earlier and cheaper than
3773    check_for_loop_decls?  */
3774
3775 static void
3776 c_parser_for_statement (c_parser *parser)
3777 {
3778   tree block, cond, incr, save_break, save_cont, body;
3779   location_t loc;
3780   gcc_assert (c_parser_next_token_is_keyword (parser, RID_FOR));
3781   loc = c_parser_peek_token (parser)->location;
3782   c_parser_consume_token (parser);
3783   block = c_begin_compound_stmt (flag_isoc99);
3784   if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
3785     {
3786       /* Parse the initialization declaration or expression.  */
3787       if (c_parser_next_token_is (parser, CPP_SEMICOLON))
3788         {
3789           c_parser_consume_token (parser);
3790           c_finish_expr_stmt (NULL_TREE);
3791         }
3792       else if (c_parser_next_token_starts_declspecs (parser))
3793         {
3794           c_parser_declaration_or_fndef (parser, true, true, true, true);
3795           check_for_loop_decls ();
3796         }
3797       else if (c_parser_next_token_is_keyword (parser, RID_EXTENSION))
3798         {
3799           /* __extension__ can start a declaration, but is also an
3800              unary operator that can start an expression.  Consume all
3801              but the last of a possible series of __extension__ to
3802              determine which.  */
3803           while (c_parser_peek_2nd_token (parser)->type == CPP_KEYWORD
3804                  && (c_parser_peek_2nd_token (parser)->keyword
3805                      == RID_EXTENSION))
3806             c_parser_consume_token (parser);
3807           if (c_token_starts_declspecs (c_parser_peek_2nd_token (parser)))
3808             {
3809               int ext;
3810               ext = disable_extension_diagnostics ();
3811               c_parser_consume_token (parser);
3812               c_parser_declaration_or_fndef (parser, true, true, true, true);
3813               restore_extension_diagnostics (ext);
3814               check_for_loop_decls ();
3815             }
3816           else
3817             goto init_expr;
3818         }
3819       else
3820         {
3821         init_expr:
3822           c_finish_expr_stmt (c_parser_expression (parser).value);
3823           c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
3824         }
3825       /* Parse the loop condition.  */
3826       loc = c_parser_peek_token (parser)->location;
3827       if (c_parser_next_token_is (parser, CPP_SEMICOLON))
3828         {
3829           c_parser_consume_token (parser);
3830           cond = NULL_TREE;
3831         }
3832       else
3833         {
3834           tree ocond = c_parser_expression_conv (parser).value;
3835           cond = c_objc_common_truthvalue_conversion (ocond);
3836           if (EXPR_P (cond))
3837             SET_EXPR_LOCATION (cond, loc);
3838           c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
3839         }
3840       /* Parse the increment expression.  */
3841       if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3842         incr = c_process_expr_stmt (NULL_TREE);
3843       else
3844         incr = c_process_expr_stmt (c_parser_expression (parser).value);
3845       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
3846     }
3847   else
3848     {
3849       cond = error_mark_node;
3850       incr = error_mark_node;
3851     }
3852   save_break = c_break_label;
3853   c_break_label = NULL_TREE;
3854   save_cont = c_cont_label;
3855   c_cont_label = NULL_TREE;
3856   body = c_parser_c99_block_statement (parser);
3857   c_finish_loop (loc, cond, incr, body, c_break_label, c_cont_label, true);
3858   add_stmt (c_end_compound_stmt (block, flag_isoc99));
3859   c_break_label = save_break;
3860   c_cont_label = save_cont;
3861 }
3862
3863 /* Parse an asm statement, a GNU extension.  This is a full-blown asm
3864    statement with inputs, outputs, clobbers, and volatile tag
3865    allowed.
3866
3867    asm-statement:
3868      asm type-qualifier[opt] ( asm-argument ) ;
3869
3870    asm-argument:
3871      asm-string-literal
3872      asm-string-literal : asm-operands[opt]
3873      asm-string-literal : asm-operands[opt] : asm-operands[opt]
3874      asm-string-literal : asm-operands[opt] : asm-operands[opt] : asm-clobbers
3875
3876    Qualifiers other than volatile are accepted in the syntax but
3877    warned for.  */
3878
3879 static tree
3880 c_parser_asm_statement (c_parser *parser)
3881 {
3882   tree quals, str, outputs, inputs, clobbers, ret;
3883   bool simple;
3884   gcc_assert (c_parser_next_token_is_keyword (parser, RID_ASM));
3885   c_parser_consume_token (parser);
3886   if (c_parser_next_token_is_keyword (parser, RID_VOLATILE))
3887     {
3888       quals = c_parser_peek_token (parser)->value;
3889       c_parser_consume_token (parser);
3890     }
3891   else if (c_parser_next_token_is_keyword (parser, RID_CONST)
3892            || c_parser_next_token_is_keyword (parser, RID_RESTRICT))
3893     {
3894       warning (0, "%E qualifier ignored on asm",
3895                c_parser_peek_token (parser)->value);
3896       quals = NULL_TREE;
3897       c_parser_consume_token (parser);
3898     }
3899   else
3900     quals = NULL_TREE;
3901   /* ??? Follow the C++ parser rather than using the
3902      c_lex_string_translate kludge.  */
3903   c_lex_string_translate = 0;
3904   if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
3905     {
3906       c_lex_string_translate = 1;
3907       return NULL_TREE;
3908     }
3909   str = c_parser_asm_string_literal (parser);
3910   if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3911     {
3912       simple = true;
3913       outputs = NULL_TREE;
3914       inputs = NULL_TREE;
3915       clobbers = NULL_TREE;
3916       goto done_asm;
3917     }
3918   if (!c_parser_require (parser, CPP_COLON, "expected %<:%> or %<)%>"))
3919     {
3920       c_lex_string_translate = 1;
3921       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
3922       return NULL_TREE;
3923     }
3924   simple = false;
3925   /* Parse outputs.  */
3926   if (c_parser_next_token_is (parser, CPP_COLON)
3927       || c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3928     outputs = NULL_TREE;
3929   else
3930     outputs = c_parser_asm_operands (parser, false);
3931   if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3932     {
3933       inputs = NULL_TREE;
3934       clobbers = NULL_TREE;
3935       goto done_asm;
3936     }
3937   if (!c_parser_require (parser, CPP_COLON, "expected %<:%> or %<)%>"))
3938     {
3939       c_lex_string_translate = 1;
3940       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
3941       return NULL_TREE;
3942     }
3943   /* Parse inputs.  */
3944   if (c_parser_next_token_is (parser, CPP_COLON)
3945       || c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3946     inputs = NULL_TREE;
3947   else
3948     inputs = c_parser_asm_operands (parser, true);
3949   if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3950     {
3951       clobbers = NULL_TREE;
3952       goto done_asm;
3953     }
3954   if (!c_parser_require (parser, CPP_COLON, "expected %<:%> or %<)%>"))
3955     {
3956       c_lex_string_translate = 1;
3957       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
3958       return NULL_TREE;
3959     }
3960   /* Parse clobbers.  */
3961   clobbers = c_parser_asm_clobbers (parser);
3962  done_asm:
3963   c_lex_string_translate = 1;
3964   if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
3965     {
3966       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
3967       return NULL_TREE;
3968     }
3969   if (!c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>"))
3970     c_parser_skip_to_end_of_block_or_statement (parser);
3971   ret = build_asm_stmt (quals, build_asm_expr (str, outputs, inputs,
3972                                                clobbers, simple));
3973   return ret;
3974 }
3975
3976 /* Parse asm operands, a GNU extension.  If CONVERT_P (for inputs but
3977    not outputs), apply the default conversion of functions and arrays
3978    to pointers.
3979
3980    asm-operands:
3981      asm-operand
3982      asm-operands , asm-operand
3983
3984    asm-operand:
3985      asm-string-literal ( expression )
3986      [ identifier ] asm-string-literal ( expression )
3987 */
3988
3989 static tree
3990 c_parser_asm_operands (c_parser *parser, bool convert_p)
3991 {
3992   tree list = NULL_TREE;
3993   while (true)
3994     {
3995       tree name, str;
3996       struct c_expr expr;
3997       if (c_parser_next_token_is (parser, CPP_OPEN_SQUARE))
3998         {
3999           c_parser_consume_token (parser);
4000           if (c_parser_next_token_is (parser, CPP_NAME))
4001             {
4002               tree id = c_parser_peek_token (parser)->value;
4003               c_parser_consume_token (parser);
4004               name = build_string (IDENTIFIER_LENGTH (id),
4005                                    IDENTIFIER_POINTER (id));
4006             }
4007           else
4008             {
4009               c_parser_error (parser, "expected identifier");
4010               c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, NULL);
4011               return NULL_TREE;
4012             }
4013           c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
4014                                      "expected %<]%>");
4015         }
4016       else
4017         name = NULL_TREE;
4018       str = c_parser_asm_string_literal (parser);
4019       if (str == NULL_TREE)
4020         return NULL_TREE;
4021       c_lex_string_translate = 1;
4022       if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
4023         {
4024           c_lex_string_translate = 0;
4025           return NULL_TREE;
4026         }
4027       expr = c_parser_expression (parser);
4028       if (convert_p)
4029         expr = default_function_array_conversion (expr);
4030       c_lex_string_translate = 0;
4031       if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
4032         {
4033           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
4034           return NULL_TREE;
4035         }
4036       list = chainon (list, build_tree_list (build_tree_list (name, str),
4037                                              expr.value));
4038       if (c_parser_next_token_is (parser, CPP_COMMA))
4039         c_parser_consume_token (parser);
4040       else
4041         break;
4042     }
4043   return list;
4044 }
4045
4046 /* Parse asm clobbers, a GNU extension.
4047
4048    asm-clobbers:
4049      asm-string-literal
4050      asm-clobbers , asm-string-literal
4051 */
4052
4053 static tree
4054 c_parser_asm_clobbers (c_parser *parser)
4055 {
4056   tree list = NULL_TREE;
4057   while (true)
4058     {
4059       tree str = c_parser_asm_string_literal (parser);
4060       if (str)
4061         list = tree_cons (NULL_TREE, str, list);
4062       else
4063         return NULL_TREE;
4064       if (c_parser_next_token_is (parser, CPP_COMMA))
4065         c_parser_consume_token (parser);
4066       else
4067         break;
4068     }
4069   return list;
4070 }
4071
4072 /* Parse an expression other than a compound expression; that is, an
4073    assignment expression (C90 6.3.16, C99 6.5.16).  If AFTER is not
4074    NULL then it is an Objective-C message expression which is the
4075    primary-expression starting the expression as an initializer.
4076
4077    assignment-expression:
4078      conditional-expression
4079      unary-expression assignment-operator assignment-expression
4080
4081    assignment-operator: one of
4082      = *= /= %= += -= <<= >>= &= ^= |=
4083
4084    In GNU C we accept any conditional expression on the LHS and
4085    diagnose the invalid lvalue rather than producing a syntax
4086    error.  */
4087
4088 static struct c_expr
4089 c_parser_expr_no_commas (c_parser *parser, struct c_expr *after)
4090 {
4091   struct c_expr lhs, rhs, ret;
4092   enum tree_code code;
4093   gcc_assert (!after || c_dialect_objc ());
4094   lhs = c_parser_conditional_expression (parser, after);
4095   switch (c_parser_peek_token (parser)->type)
4096     {
4097     case CPP_EQ:
4098       code = NOP_EXPR;
4099       break;
4100     case CPP_MULT_EQ:
4101       code = MULT_EXPR;
4102       break;
4103     case CPP_DIV_EQ:
4104       code = TRUNC_DIV_EXPR;
4105       break;
4106     case CPP_MOD_EQ:
4107       code = TRUNC_MOD_EXPR;
4108       break;
4109     case CPP_PLUS_EQ:
4110       code = PLUS_EXPR;
4111       break;
4112     case CPP_MINUS_EQ:
4113       code = MINUS_EXPR;
4114       break;
4115     case CPP_LSHIFT_EQ:
4116       code = LSHIFT_EXPR;
4117       break;
4118     case CPP_RSHIFT_EQ:
4119       code = RSHIFT_EXPR;
4120       break;
4121     case CPP_AND_EQ:
4122       code = BIT_AND_EXPR;
4123       break;
4124     case CPP_XOR_EQ:
4125       code = BIT_XOR_EXPR;
4126       break;
4127     case CPP_OR_EQ:
4128       code = BIT_IOR_EXPR;
4129       break;
4130     default:
4131       return lhs;
4132     }
4133   c_parser_consume_token (parser);
4134   rhs = c_parser_expr_no_commas (parser, NULL);
4135   rhs = default_function_array_conversion (rhs);
4136   ret.value = build_modify_expr (lhs.value, code, rhs.value);
4137   if (code == NOP_EXPR)
4138     ret.original_code = MODIFY_EXPR;
4139   else
4140     {
4141       TREE_NO_WARNING (ret.value) = 1;
4142       ret.original_code = ERROR_MARK;
4143     }
4144   return ret;
4145 }
4146
4147 /* Parse a conditional expression (C90 6.3.15, C99 6.5.15).  If AFTER
4148    is not NULL then it is an Objective-C message expression which is
4149    the primary-expression starting the expression as an initializer.
4150
4151    conditional-expression:
4152      logical-OR-expression
4153      logical-OR-expression ? expression : conditional-expression
4154
4155    GNU extensions:
4156
4157    conditional-expression:
4158      logical-OR-expression ? : conditional-expression
4159 */
4160
4161 static struct c_expr
4162 c_parser_conditional_expression (c_parser *parser, struct c_expr *after)
4163 {
4164   struct c_expr cond, exp1, exp2, ret;
4165   gcc_assert (!after || c_dialect_objc ());
4166   cond = c_parser_binary_expression (parser, after);
4167   if (c_parser_next_token_is_not (parser, CPP_QUERY))
4168     return cond;
4169   cond = default_function_array_conversion (cond);
4170   c_parser_consume_token (parser);
4171   if (c_parser_next_token_is (parser, CPP_COLON))
4172     {
4173       if (pedantic)
4174         pedwarn ("ISO C forbids omitting the middle term of a ?: expression");
4175       /* Make sure first operand is calculated only once.  */
4176       exp1.value = save_expr (default_conversion (cond.value));
4177       cond.value = c_objc_common_truthvalue_conversion (exp1.value);
4178       skip_evaluation += cond.value == truthvalue_true_node;
4179     }
4180   else
4181     {
4182       cond.value
4183         = c_objc_common_truthvalue_conversion
4184         (default_conversion (cond.value));
4185       skip_evaluation += cond.value == truthvalue_false_node;
4186       exp1 = c_parser_expression_conv (parser);
4187       skip_evaluation += ((cond.value == truthvalue_true_node)
4188                           - (cond.value == truthvalue_false_node));
4189     }
4190   if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
4191     {
4192       skip_evaluation -= cond.value == truthvalue_true_node;
4193       ret.value = error_mark_node;
4194       ret.original_code = ERROR_MARK;
4195       return ret;
4196     }
4197   exp2 = c_parser_conditional_expression (parser, NULL);
4198   exp2 = default_function_array_conversion (exp2);
4199   skip_evaluation -= cond.value == truthvalue_true_node;
4200   ret.value = build_conditional_expr (cond.value, exp1.value, exp2.value);
4201   ret.original_code = ERROR_MARK;
4202   return ret;
4203 }
4204
4205 /* Parse a binary expression; that is, a logical-OR-expression (C90
4206    6.3.5-6.3.14, C99 6.5.5-6.5.14).  If AFTER is not NULL then it is
4207    an Objective-C message expression which is the primary-expression
4208    starting the expression as an initializer.
4209
4210    multiplicative-expression:
4211      cast-expression
4212      multiplicative-expression * cast-expression
4213      multiplicative-expression / cast-expression
4214      multiplicative-expression % cast-expression
4215
4216    additive-expression:
4217      multiplicative-expression
4218      additive-expression + multiplicative-expression
4219      additive-expression - multiplicative-expression
4220
4221    shift-expression:
4222      additive-expression
4223      shift-expression << additive-expression
4224      shift-expression >> additive-expression
4225
4226    relational-expression:
4227      shift-expression
4228      relational-expression < shift-expression
4229      relational-expression > shift-expression
4230      relational-expression <= shift-expression
4231      relational-expression >= shift-expression
4232
4233    equality-expression:
4234      relational-expression
4235      equality-expression == relational-expression
4236      equality-expression != relational-expression
4237
4238    AND-expression:
4239      equality-expression
4240      AND-expression & equality-expression
4241
4242    exclusive-OR-expression:
4243      AND-expression
4244      exclusive-OR-expression ^ AND-expression
4245
4246    inclusive-OR-expression:
4247      exclusive-OR-expression
4248      inclusive-OR-expression | exclusive-OR-expression
4249
4250    logical-AND-expression:
4251      inclusive-OR-expression
4252      logical-AND-expression && inclusive-OR-expression
4253
4254    logical-OR-expression:
4255      logical-AND-expression
4256      logical-OR-expression || logical-AND-expression
4257 */
4258
4259 static struct c_expr
4260 c_parser_binary_expression (c_parser *parser, struct c_expr *after)
4261 {
4262   /* A binary expression is parsed using operator-precedence parsing,
4263      with the operands being cast expressions.  All the binary
4264      operators are left-associative.  Thus a binary expression is of
4265      form:
4266
4267      E0 op1 E1 op2 E2 ...
4268
4269      which we represent on a stack.  On the stack, the precedence
4270      levels are strictly increasing.  When a new operator is
4271      encountered of higher precedence than that at the top of the
4272      stack, it is pushed; its LHS is the top expression, and its RHS
4273      is everything parsed until it is popped.  When a new operator is
4274      encountered with precedence less than or equal to that at the top
4275      of the stack, triples E[i-1] op[i] E[i] are popped and replaced
4276      by the result of the operation until the operator at the top of
4277      the stack has lower precedence than the new operator or there is
4278      only one element on the stack; then the top expression is the LHS
4279      of the new operator.  In the case of logical AND and OR
4280      expressions, we also need to adjust skip_evaluation as
4281      appropriate when the operators are pushed and popped.  */
4282
4283   /* The precedence levels, where 0 is a dummy lowest level used for
4284      the bottom of the stack.  */
4285   enum prec {
4286     PREC_NONE,
4287     PREC_LOGOR,
4288     PREC_LOGAND,
4289     PREC_BITOR,
4290     PREC_BITXOR,
4291     PREC_BITAND,
4292     PREC_EQ,
4293     PREC_REL,
4294     PREC_SHIFT,
4295     PREC_ADD,
4296     PREC_MULT,
4297     NUM_PRECS
4298   };
4299   struct {
4300     /* The expression at this stack level.  */
4301     struct c_expr expr;
4302     /* The precedence of the operator on its left, PREC_NONE at the
4303        bottom of the stack.  */
4304     enum prec prec;
4305     /* The operation on its left.  */
4306     enum tree_code op;
4307   } stack[NUM_PRECS];
4308   int sp;
4309 #define POP                                                                   \
4310   do {                                                                        \
4311     switch (stack[sp].op)                                                     \
4312       {                                                                       \
4313       case TRUTH_ANDIF_EXPR:                                                  \
4314         skip_evaluation -= stack[sp - 1].expr.value == truthvalue_false_node; \
4315         break;                                                                \
4316       case TRUTH_ORIF_EXPR:                                                   \
4317         skip_evaluation -= stack[sp - 1].expr.value == truthvalue_true_node;  \
4318         break;                                                                \
4319       default:                                                                \
4320         break;                                                                \
4321       }                                                                       \
4322     stack[sp - 1].expr                                                        \
4323       = default_function_array_conversion (stack[sp - 1].expr);               \
4324     stack[sp].expr                                                            \
4325       = default_function_array_conversion (stack[sp].expr);                   \
4326     stack[sp - 1].expr = parser_build_binary_op (stack[sp].op,                \
4327                                                  stack[sp - 1].expr,          \
4328                                                  stack[sp].expr);             \
4329     sp--;                                                                     \
4330   } while (0)
4331   gcc_assert (!after || c_dialect_objc ());
4332   stack[0].expr = c_parser_cast_expression (parser, after);
4333   stack[0].prec = PREC_NONE;
4334   sp = 0;
4335   while (true)
4336     {
4337       enum prec oprec;
4338       enum tree_code ocode;
4339       if (parser->error)
4340         goto out;
4341       switch (c_parser_peek_token (parser)->type)
4342         {
4343         case CPP_MULT:
4344           oprec = PREC_MULT;
4345           ocode = MULT_EXPR;
4346           break;
4347         case CPP_DIV:
4348           oprec = PREC_MULT;
4349           ocode = TRUNC_DIV_EXPR;
4350           break;
4351         case CPP_MOD:
4352           oprec = PREC_MULT;
4353           ocode = TRUNC_MOD_EXPR;
4354           break;
4355         case CPP_PLUS:
4356           oprec = PREC_ADD;
4357           ocode = PLUS_EXPR;
4358           break;
4359         case CPP_MINUS:
4360           oprec = PREC_ADD;
4361           ocode = MINUS_EXPR;
4362           break;
4363         case CPP_LSHIFT:
4364           oprec = PREC_SHIFT;
4365           ocode = LSHIFT_EXPR;
4366           break;
4367         case CPP_RSHIFT:
4368           oprec = PREC_SHIFT;
4369           ocode = RSHIFT_EXPR;
4370           break;
4371         case CPP_LESS:
4372           oprec = PREC_REL;
4373           ocode = LT_EXPR;
4374           break;
4375         case CPP_GREATER:
4376           oprec = PREC_REL;
4377           ocode = GT_EXPR;
4378           break;
4379         case CPP_LESS_EQ:
4380           oprec = PREC_REL;
4381           ocode = LE_EXPR;
4382           break;
4383         case CPP_GREATER_EQ:
4384           oprec = PREC_REL;
4385           ocode = GE_EXPR;
4386           break;
4387         case CPP_EQ_EQ:
4388           oprec = PREC_EQ;
4389           ocode = EQ_EXPR;
4390           break;
4391         case CPP_NOT_EQ:
4392           oprec = PREC_EQ;
4393           ocode = NE_EXPR;
4394           break;
4395         case CPP_AND:
4396           oprec = PREC_BITAND;
4397           ocode = BIT_AND_EXPR;
4398           break;
4399         case CPP_XOR:
4400           oprec = PREC_BITXOR;
4401           ocode = BIT_XOR_EXPR;
4402           break;
4403         case CPP_OR:
4404           oprec = PREC_BITOR;
4405           ocode = BIT_IOR_EXPR;
4406           break;
4407         case CPP_AND_AND:
4408           oprec = PREC_LOGAND;
4409           ocode = TRUTH_ANDIF_EXPR;
4410           break;
4411         case CPP_OR_OR:
4412           oprec = PREC_LOGOR;
4413           ocode = TRUTH_ORIF_EXPR;
4414           break;
4415         default:
4416           /* Not a binary operator, so end of the binary
4417              expression.  */
4418           goto out;
4419         }
4420       c_parser_consume_token (parser);
4421       while (oprec <= stack[sp].prec)
4422         POP;
4423       switch (ocode)
4424         {
4425         case TRUTH_ANDIF_EXPR:
4426           stack[sp].expr
4427             = default_function_array_conversion (stack[sp].expr);
4428           stack[sp].expr.value = c_objc_common_truthvalue_conversion
4429             (default_conversion (stack[sp].expr.value));
4430           skip_evaluation += stack[sp].expr.value == truthvalue_false_node;
4431           break;
4432         case TRUTH_ORIF_EXPR:
4433           stack[sp].expr
4434             = default_function_array_conversion (stack[sp].expr);
4435           stack[sp].expr.value = c_objc_common_truthvalue_conversion
4436             (default_conversion (stack[sp].expr.value));
4437           skip_evaluation += stack[sp].expr.value == truthvalue_true_node;
4438           break;
4439         default:
4440           break;
4441         }
4442       sp++;
4443       stack[sp].expr = c_parser_cast_expression (parser, NULL);
4444       stack[sp].prec = oprec;
4445       stack[sp].op = ocode;
4446     }
4447  out:
4448   while (sp > 0)
4449     POP;
4450   return stack[0].expr;
4451 #undef POP
4452 }
4453
4454 /* Parse a cast expression (C90 6.3.4, C99 6.5.4).  If AFTER is not
4455    NULL then it is an Objective-C message expression which is the
4456    primary-expression starting the expression as an initializer.
4457
4458    cast-expression:
4459      unary-expression
4460      ( type-name ) unary-expression
4461 */
4462
4463 static struct c_expr
4464 c_parser_cast_expression (c_parser *parser, struct c_expr *after)
4465 {
4466   gcc_assert (!after || c_dialect_objc ());
4467   if (after)
4468     return c_parser_postfix_expression_after_primary (parser, *after);
4469   /* If the expression begins with a parenthesized type name, it may
4470      be either a cast or a compound literal; we need to see whether
4471      the next character is '{' to tell the difference.  If not, it is
4472      an unary expression.  */
4473   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)
4474       && c_token_starts_typename (c_parser_peek_2nd_token (parser)))
4475     {
4476       struct c_type_name *type_name;
4477       struct c_expr ret;
4478       struct c_expr expr;
4479       c_parser_consume_token (parser);
4480       type_name = c_parser_type_name (parser);
4481       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
4482       if (type_name == NULL)
4483         {
4484           ret.value = error_mark_node;
4485           ret.original_code = ERROR_MARK;
4486           return ret;
4487         }
4488       if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
4489         return c_parser_postfix_expression_after_paren_type (parser,
4490                                                              type_name);
4491       expr = c_parser_cast_expression (parser, NULL);
4492       expr = default_function_array_conversion (expr);
4493       ret.value = c_cast_expr (type_name, expr.value);
4494       ret.original_code = ERROR_MARK;
4495       return ret;
4496     }
4497   else
4498     return c_parser_unary_expression (parser);
4499 }
4500
4501 /* Parse an unary expression (C90 6.3.3, C99 6.5.3).
4502
4503    unary-expression:
4504      postfix-expression
4505      ++ unary-expression
4506      -- unary-expression
4507      unary-operator cast-expression
4508      sizeof unary-expression
4509      sizeof ( type-name )
4510
4511    unary-operator: one of
4512      & * + - ~ !
4513
4514    GNU extensions:
4515
4516    unary-expression:
4517      __alignof__ unary-expression
4518      __alignof__ ( type-name )
4519      && identifier
4520
4521    unary-operator: one of
4522      __extension__ __real__ __imag__
4523
4524    In addition, the GNU syntax treats ++ and -- as unary operators, so
4525    they may be applied to cast expressions with errors for non-lvalues
4526    given later.  */
4527
4528 static struct c_expr
4529 c_parser_unary_expression (c_parser *parser)
4530 {
4531   int ext;
4532   struct c_expr ret, op;
4533   switch (c_parser_peek_token (parser)->type)
4534     {
4535     case CPP_PLUS_PLUS:
4536       c_parser_consume_token (parser);
4537       op = c_parser_cast_expression (parser, NULL);
4538       op = default_function_array_conversion (op);
4539       return parser_build_unary_op (PREINCREMENT_EXPR, op);
4540     case CPP_MINUS_MINUS:
4541       c_parser_consume_token (parser);
4542       op = c_parser_cast_expression (parser, NULL);
4543       op = default_function_array_conversion (op);
4544       return parser_build_unary_op (PREDECREMENT_EXPR, op);
4545     case CPP_AND:
4546       c_parser_consume_token (parser);
4547       return parser_build_unary_op (ADDR_EXPR,
4548                                     c_parser_cast_expression (parser, NULL));
4549     case CPP_MULT:
4550       c_parser_consume_token (parser);
4551       op = c_parser_cast_expression (parser, NULL);
4552       op = default_function_array_conversion (op);
4553       ret.value = build_indirect_ref (op.value, "unary *");
4554       ret.original_code = ERROR_MARK;
4555       return ret;
4556     case CPP_PLUS:
4557       c_parser_consume_token (parser);
4558       if (!c_dialect_objc () && !in_system_header)
4559         warning (OPT_Wtraditional,
4560                  "traditional C rejects the unary plus operator");
4561       op = c_parser_cast_expression (parser, NULL);
4562       op = default_function_array_conversion (op);
4563       return parser_build_unary_op (CONVERT_EXPR, op);
4564     case CPP_MINUS:
4565       c_parser_consume_token (parser);
4566       op = c_parser_cast_expression (parser, NULL);
4567       op = default_function_array_conversion (op);
4568       return parser_build_unary_op (NEGATE_EXPR, op);
4569     case CPP_COMPL:
4570       c_parser_consume_token (parser);
4571       op = c_parser_cast_expression (parser, NULL);
4572       op = default_function_array_conversion (op);
4573       return parser_build_unary_op (BIT_NOT_EXPR, op);
4574     case CPP_NOT:
4575       c_parser_consume_token (parser);
4576       op = c_parser_cast_expression (parser, NULL);
4577       op = default_function_array_conversion (op);
4578       return parser_build_unary_op (TRUTH_NOT_EXPR, op);
4579     case CPP_AND_AND:
4580       /* Refer to the address of a label as a pointer.  */
4581       c_parser_consume_token (parser);
4582       if (c_parser_next_token_is (parser, CPP_NAME))
4583         {
4584           ret.value = finish_label_address_expr
4585             (c_parser_peek_token (parser)->value);
4586           c_parser_consume_token (parser);
4587         }
4588       else
4589         {
4590           c_parser_error (parser, "expected identifier");
4591           ret.value = error_mark_node;
4592         }
4593         ret.original_code = ERROR_MARK;
4594         return ret;
4595     case CPP_KEYWORD:
4596       switch (c_parser_peek_token (parser)->keyword)
4597         {
4598         case RID_SIZEOF:
4599           return c_parser_sizeof_expression (parser);
4600         case RID_ALIGNOF:
4601           return c_parser_alignof_expression (parser);
4602         case RID_EXTENSION:
4603           c_parser_consume_token (parser);
4604           ext = disable_extension_diagnostics ();
4605           ret = c_parser_cast_expression (parser, NULL);
4606           restore_extension_diagnostics (ext);
4607           return ret;
4608         case RID_REALPART:
4609           c_parser_consume_token (parser);
4610           op = c_parser_cast_expression (parser, NULL);
4611           op = default_function_array_conversion (op);
4612           return parser_build_unary_op (REALPART_EXPR, op);
4613         case RID_IMAGPART:
4614           c_parser_consume_token (parser);
4615           op = c_parser_cast_expression (parser, NULL);
4616           op = default_function_array_conversion (op);
4617           return parser_build_unary_op (IMAGPART_EXPR, op);
4618         default:
4619           return c_parser_postfix_expression (parser);
4620         }
4621     default:
4622       return c_parser_postfix_expression (parser);
4623     }
4624 }
4625
4626 /* Parse a sizeof expression.  */
4627
4628 static struct c_expr
4629 c_parser_sizeof_expression (c_parser *parser)
4630 {
4631   struct c_expr expr;
4632   gcc_assert (c_parser_next_token_is_keyword (parser, RID_SIZEOF));
4633   c_parser_consume_token (parser);
4634   skip_evaluation++;
4635   in_sizeof++;
4636   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)
4637       && c_token_starts_typename (c_parser_peek_2nd_token (parser)))
4638     {
4639       /* Either sizeof ( type-name ) or sizeof unary-expression
4640          starting with a compound literal.  */
4641       struct c_type_name *type_name;
4642       c_parser_consume_token (parser);
4643       type_name = c_parser_type_name (parser);
4644       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
4645       if (type_name == NULL)
4646         {
4647           struct c_expr ret;
4648           skip_evaluation--;
4649           in_sizeof--;
4650           ret.value = error_mark_node;
4651           ret.original_code = ERROR_MARK;
4652           return ret;
4653         }
4654       if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
4655         {
4656           expr = c_parser_postfix_expression_after_paren_type (parser,
4657                                                                type_name);
4658           goto sizeof_expr;
4659         }
4660       /* sizeof ( type-name ).  */
4661       skip_evaluation--;
4662       in_sizeof--;
4663       return c_expr_sizeof_type (type_name);
4664     }
4665   else
4666     {
4667       expr = c_parser_unary_expression (parser);
4668     sizeof_expr:
4669       skip_evaluation--;
4670       in_sizeof--;
4671       if (TREE_CODE (expr.value) == COMPONENT_REF
4672           && DECL_C_BIT_FIELD (TREE_OPERAND (expr.value, 1)))
4673         error ("%<sizeof%> applied to a bit-field");
4674       return c_expr_sizeof_expr (expr);
4675     }
4676 }
4677
4678 /* Parse an alignof expression.  */
4679
4680 static struct c_expr
4681 c_parser_alignof_expression (c_parser *parser)
4682 {
4683   struct c_expr expr;
4684   gcc_assert (c_parser_next_token_is_keyword (parser, RID_ALIGNOF));
4685   c_parser_consume_token (parser);
4686   skip_evaluation++;
4687   in_alignof++;
4688   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)
4689       && c_token_starts_typename (c_parser_peek_2nd_token (parser)))
4690     {
4691       /* Either __alignof__ ( type-name ) or __alignof__
4692          unary-expression starting with a compound literal.  */
4693       struct c_type_name *type_name;
4694       struct c_expr ret;
4695       c_parser_consume_token (parser);
4696       type_name = c_parser_type_name (parser);
4697       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
4698       if (type_name == NULL)
4699         {
4700           struct c_expr ret;
4701           skip_evaluation--;
4702           in_alignof--;
4703           ret.value = error_mark_node;
4704           ret.original_code = ERROR_MARK;
4705           return ret;
4706         }
4707       if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
4708         {
4709           expr = c_parser_postfix_expression_after_paren_type (parser,
4710                                                                type_name);
4711           goto alignof_expr;
4712         }
4713       /* alignof ( type-name ).  */
4714       skip_evaluation--;
4715       in_alignof--;
4716       ret.value = c_alignof (groktypename (type_name));
4717       ret.original_code = ERROR_MARK;
4718       return ret;
4719     }
4720   else
4721     {
4722       struct c_expr ret;
4723       expr = c_parser_unary_expression (parser);
4724     alignof_expr:
4725       skip_evaluation--;
4726       in_alignof--;
4727       ret.value = c_alignof_expr (expr.value);
4728       ret.original_code = ERROR_MARK;
4729       return ret;
4730     }
4731 }
4732
4733 /* Parse a postfix expression (C90 6.3.1-6.3.2, C99 6.5.1-6.5.2).
4734
4735    postfix-expression:
4736      primary-expression
4737      postfix-expression [ expression ]
4738      postfix-expression ( argument-expression-list[opt] )
4739      postfix-expression . identifier
4740      postfix-expression -> identifier
4741      postfix-expression ++
4742      postfix-expression --
4743      ( type-name ) { initializer-list }
4744      ( type-name ) { initializer-list , }
4745
4746    argument-expression-list:
4747      argument-expression
4748      argument-expression-list , argument-expression
4749
4750    primary-expression:
4751      identifier
4752      constant
4753      string-literal
4754      ( expression )
4755
4756    GNU extensions:
4757
4758    primary-expression:
4759      __func__
4760        (treated as a keyword in GNU C)
4761      __FUNCTION__
4762      __PRETTY_FUNCTION__
4763      ( compound-statement )
4764      __builtin_va_arg ( assignment-expression , type-name )
4765      __builtin_offsetof ( type-name , offsetof-member-designator )
4766      __builtin_choose_expr ( assignment-expression ,
4767                              assignment-expression ,
4768                              assignment-expression )
4769      __builtin_types_compatible_p ( type-name , type-name )
4770
4771    offsetof-member-designator:
4772      identifier
4773      offsetof-member-designator . identifier
4774      offsetof-member-designator [ expression ]
4775
4776    Objective-C:
4777
4778    primary-expression:
4779      [ objc-receiver objc-message-args ]
4780      @selector ( objc-selector-arg )
4781      @protocol ( identifier )
4782      @encode ( type-name )
4783      objc-string-literal
4784 */
4785
4786 static struct c_expr
4787 c_parser_postfix_expression (c_parser *parser)
4788 {
4789   struct c_expr expr, e1, e2, e3;
4790   struct c_type_name *t1, *t2;
4791   switch (c_parser_peek_token (parser)->type)
4792     {
4793     case CPP_NUMBER:
4794     case CPP_CHAR:
4795     case CPP_WCHAR:
4796       expr.value = c_parser_peek_token (parser)->value;
4797       expr.original_code = ERROR_MARK;
4798       c_parser_consume_token (parser);
4799       break;
4800     case CPP_STRING:
4801     case CPP_WSTRING:
4802       expr.value = c_parser_peek_token (parser)->value;
4803       expr.original_code = STRING_CST;
4804       c_parser_consume_token (parser);
4805       break;
4806     case CPP_OBJC_STRING:
4807       gcc_assert (c_dialect_objc ());
4808       expr.value
4809         = objc_build_string_object (c_parser_peek_token (parser)->value);
4810       expr.original_code = ERROR_MARK;
4811       c_parser_consume_token (parser);
4812       break;
4813     case CPP_NAME:
4814       if (c_parser_peek_token (parser)->id_kind != C_ID_ID)
4815         {
4816           c_parser_error (parser, "expected expression");
4817           expr.value = error_mark_node;
4818           expr.original_code = ERROR_MARK;
4819           break;
4820         }
4821       {
4822         tree id = c_parser_peek_token (parser)->value;
4823         location_t loc = c_parser_peek_token (parser)->location;
4824         c_parser_consume_token (parser);
4825         expr.value = build_external_ref (id,
4826                                          (c_parser_peek_token (parser)->type
4827                                           == CPP_OPEN_PAREN), loc);
4828         expr.original_code = ERROR_MARK;
4829       }
4830       break;
4831     case CPP_OPEN_PAREN:
4832       /* A parenthesized expression, statement expression or compound
4833          literal.  */
4834       if (c_parser_peek_2nd_token (parser)->type == CPP_OPEN_BRACE)
4835         {
4836           /* A statement expression.  */
4837           tree stmt;
4838           c_parser_consume_token (parser);
4839           c_parser_consume_token (parser);
4840           if (cur_stmt_list == NULL)
4841             {
4842               error ("braced-group within expression allowed "
4843                      "only inside a function");
4844               parser->error = true;
4845               c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL);
4846               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
4847               expr.value = error_mark_node;
4848               expr.original_code = ERROR_MARK;
4849               break;
4850             }
4851           stmt = c_begin_stmt_expr ();
4852           c_parser_compound_statement_nostart (parser);
4853           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
4854                                      "expected %<)%>");
4855           if (pedantic)
4856             pedwarn ("ISO C forbids braced-groups within expressions");
4857           expr.value = c_finish_stmt_expr (stmt);
4858           expr.original_code = ERROR_MARK;
4859         }
4860       else if (c_token_starts_typename (c_parser_peek_2nd_token (parser)))
4861         {
4862           /* A compound literal.  ??? Can we actually get here rather
4863              than going directly to
4864              c_parser_postfix_expression_after_paren_type from
4865              elsewhere?  */
4866           struct c_type_name *type_name;
4867           c_parser_consume_token (parser);
4868           type_name = c_parser_type_name (parser);
4869           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
4870                                      "expected %<)%>");
4871           if (type_name == NULL)
4872             {
4873               expr.value = error_mark_node;
4874               expr.original_code = ERROR_MARK;
4875             }
4876           else
4877             expr = c_parser_postfix_expression_after_paren_type (parser,
4878                                                                  type_name);
4879         }
4880       else
4881         {
4882           /* A parenthesized expression.  */
4883           c_parser_consume_token (parser);
4884           expr = c_parser_expression (parser);
4885           if (TREE_CODE (expr.value) == MODIFY_EXPR)
4886             TREE_NO_WARNING (expr.value) = 1;
4887           expr.original_code = ERROR_MARK;
4888           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
4889                                      "expected %<)%>");
4890         }
4891       break;
4892     case CPP_KEYWORD:
4893       switch (c_parser_peek_token (parser)->keyword)
4894         {
4895         case RID_FUNCTION_NAME:
4896         case RID_PRETTY_FUNCTION_NAME:
4897         case RID_C99_FUNCTION_NAME:
4898           expr.value = fname_decl (c_parser_peek_token (parser)->keyword,
4899                                    c_parser_peek_token (parser)->value);
4900           expr.original_code = ERROR_MARK;
4901           c_parser_consume_token (parser);
4902           break;
4903         case RID_VA_ARG:
4904           c_parser_consume_token (parser);
4905           if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
4906             {
4907               expr.value = error_mark_node;
4908               expr.original_code = ERROR_MARK;
4909               break;
4910             }
4911           e1 = c_parser_expr_no_commas (parser, NULL);
4912           if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
4913             {
4914               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
4915               expr.value = error_mark_node;
4916               expr.original_code = ERROR_MARK;
4917               break;
4918             }
4919           t1 = c_parser_type_name (parser);
4920           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
4921                                      "expected %<)%>");
4922           if (t1 == NULL)
4923             {
4924               expr.value = error_mark_node;
4925               expr.original_code = ERROR_MARK;
4926             }
4927           else
4928             {
4929               expr.value = build_va_arg (e1.value, groktypename (t1));
4930               expr.original_code = ERROR_MARK;
4931             }
4932           break;
4933         case RID_OFFSETOF:
4934           c_parser_consume_token (parser);
4935           if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
4936             {
4937               expr.value = error_mark_node;
4938               expr.original_code = ERROR_MARK;
4939               break;
4940             }
4941           t1 = c_parser_type_name (parser);
4942           if (t1 == NULL)
4943             {
4944               expr.value = error_mark_node;
4945               expr.original_code = ERROR_MARK;
4946               break;
4947             }
4948           if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
4949             {
4950               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
4951               expr.value = error_mark_node;
4952               expr.original_code = ERROR_MARK;
4953               break;
4954             }
4955           {
4956             tree type = groktypename (t1);
4957             tree offsetof_ref;
4958             if (type == error_mark_node)
4959               offsetof_ref = error_mark_node;
4960             else
4961               offsetof_ref = build1 (INDIRECT_REF, type, NULL);
4962             /* Parse the second argument to __builtin_offsetof.  We
4963                must have one identifier, and beyond that we want to
4964                accept sub structure and sub array references.  */
4965             if (c_parser_next_token_is (parser, CPP_NAME))
4966               {
4967                 offsetof_ref = build_component_ref
4968                   (offsetof_ref, c_parser_peek_token (parser)->value);
4969                 c_parser_consume_token (parser);
4970                 while (c_parser_next_token_is (parser, CPP_DOT)
4971                        || c_parser_next_token_is (parser,
4972                                                   CPP_OPEN_SQUARE))
4973                   {
4974                     if (c_parser_next_token_is (parser, CPP_DOT))
4975                       {
4976                         c_parser_consume_token (parser);
4977                         if (c_parser_next_token_is_not (parser,
4978                                                         CPP_NAME))
4979                           {
4980                             c_parser_error (parser, "expected identifier");
4981                             break;
4982                           }
4983                         offsetof_ref = build_component_ref
4984                           (offsetof_ref,
4985                            c_parser_peek_token (parser)->value);
4986                         c_parser_consume_token (parser);
4987                       }
4988                     else
4989                       {
4990                         tree idx;
4991                         c_parser_consume_token (parser);
4992                         idx = c_parser_expression (parser).value;
4993                         c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
4994                                                    "expected %<]%>");
4995                         offsetof_ref = build_array_ref (offsetof_ref, idx);
4996                       }
4997                   }
4998               }
4999             else
5000               c_parser_error (parser, "expected identifier");
5001             c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5002                                        "expected %<)%>");
5003             expr.value = fold_offsetof (offsetof_ref);
5004             expr.original_code = ERROR_MARK;
5005           }
5006           break;
5007         case RID_CHOOSE_EXPR:
5008           c_parser_consume_token (parser);
5009           if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5010             {
5011               expr.value = error_mark_node;
5012               expr.original_code = ERROR_MARK;
5013               break;
5014             }
5015           e1 = c_parser_expr_no_commas (parser, NULL);
5016           if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
5017             {
5018               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5019               expr.value = error_mark_node;
5020               expr.original_code = ERROR_MARK;
5021               break;
5022             }
5023           e2 = c_parser_expr_no_commas (parser, NULL);
5024           if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
5025             {
5026               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5027               expr.value = error_mark_node;
5028               expr.original_code = ERROR_MARK;
5029               break;
5030             }
5031           e3 = c_parser_expr_no_commas (parser, NULL);
5032           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5033                                      "expected %<)%>");
5034           {
5035             tree c;
5036
5037             c = fold (e1.value);
5038             if (TREE_CODE (c) != INTEGER_CST)
5039               error ("first argument to %<__builtin_choose_expr%> not"
5040                      " a constant");
5041             expr = integer_zerop (c) ? e3 : e2;
5042           }
5043           break;
5044         case RID_TYPES_COMPATIBLE_P:
5045           c_parser_consume_token (parser);
5046           if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5047             {
5048               expr.value = error_mark_node;
5049               expr.original_code = ERROR_MARK;
5050               break;
5051             }
5052           t1 = c_parser_type_name (parser);
5053           if (t1 == NULL)
5054             {
5055               expr.value = error_mark_node;
5056               expr.original_code = ERROR_MARK;
5057               break;
5058             }
5059           if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
5060             {
5061               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5062               expr.value = error_mark_node;
5063               expr.original_code = ERROR_MARK;
5064               break;
5065             }
5066           t2 = c_parser_type_name (parser);
5067           if (t2 == NULL)
5068             {
5069               expr.value = error_mark_node;
5070               expr.original_code = ERROR_MARK;
5071               break;
5072             }
5073           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5074                                      "expected %<)%>");
5075           {
5076             tree e1, e2;
5077
5078             e1 = TYPE_MAIN_VARIANT (groktypename (t1));
5079             e2 = TYPE_MAIN_VARIANT (groktypename (t2));
5080
5081             expr.value = comptypes (e1, e2)
5082               ? build_int_cst (NULL_TREE, 1)
5083               : build_int_cst (NULL_TREE, 0);
5084             expr.original_code = ERROR_MARK;
5085           }
5086           break;
5087         case RID_AT_SELECTOR:
5088           gcc_assert (c_dialect_objc ());
5089           c_parser_consume_token (parser);
5090           if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5091             {
5092               expr.value = error_mark_node;
5093               expr.original_code = ERROR_MARK;
5094               break;
5095             }
5096           {
5097             tree sel = c_parser_objc_selector_arg (parser);
5098             c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5099                                        "expected %<)%>");
5100             expr.value = objc_build_selector_expr (sel);
5101             expr.original_code = ERROR_MARK;
5102           }
5103           break;
5104         case RID_AT_PROTOCOL:
5105           gcc_assert (c_dialect_objc ());
5106           c_parser_consume_token (parser);
5107           if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5108             {
5109               expr.value = error_mark_node;
5110               expr.original_code = ERROR_MARK;
5111               break;
5112             }
5113           if (c_parser_next_token_is_not (parser, CPP_NAME))
5114             {
5115               c_parser_error (parser, "expected identifier");
5116               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5117               expr.value = error_mark_node;
5118               expr.original_code = ERROR_MARK;
5119               break;
5120             }
5121           {
5122             tree id = c_parser_peek_token (parser)->value;
5123             c_parser_consume_token (parser);
5124             c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5125                                        "expected %<)%>");
5126             expr.value = objc_build_protocol_expr (id);
5127             expr.original_code = ERROR_MARK;
5128           }
5129           break;
5130         case RID_AT_ENCODE:
5131           /* Extension to support C-structures in the archiver.  */
5132           gcc_assert (c_dialect_objc ());
5133           c_parser_consume_token (parser);
5134           if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5135             {
5136               expr.value = error_mark_node;
5137               expr.original_code = ERROR_MARK;
5138               break;
5139             }
5140           t1 = c_parser_type_name (parser);
5141           if (t1 == NULL)
5142             {
5143               expr.value = error_mark_node;
5144               expr.original_code = ERROR_MARK;
5145               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5146               break;
5147             }
5148           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5149                                      "expected %<)%>");
5150           {
5151             tree type = groktypename (t1);
5152             expr.value = objc_build_encode_expr (type);
5153             expr.original_code = ERROR_MARK;
5154           }
5155           break;
5156         default:
5157           c_parser_error (parser, "expected expression");
5158           expr.value = error_mark_node;
5159           expr.original_code = ERROR_MARK;
5160           break;
5161         }
5162       break;
5163     case CPP_OPEN_SQUARE:
5164       if (c_dialect_objc ())
5165         {
5166           tree receiver, args;
5167           c_parser_consume_token (parser);
5168           receiver = c_parser_objc_receiver (parser);
5169           args = c_parser_objc_message_args (parser);
5170           c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
5171                                      "expected %<]%>");
5172           expr.value = objc_build_message_expr (build_tree_list (receiver,
5173                                                                  args));
5174           expr.original_code = ERROR_MARK;
5175           break;
5176         }
5177       /* Else fall through to report error.  */
5178     default:
5179       c_parser_error (parser, "expected expression");
5180       expr.value = error_mark_node;
5181       expr.original_code = ERROR_MARK;
5182       break;
5183     }
5184   return c_parser_postfix_expression_after_primary (parser, expr);
5185 }
5186
5187 /* Parse a postfix expression after a parenthesized type name: the
5188    brace-enclosed initializer of a compound literal, possibly followed
5189    by some postfix operators.  This is separate because it is not
5190    possible to tell until after the type name whether a cast
5191    expression has a cast or a compound literal, or whether the operand
5192    of sizeof is a parenthesized type name or starts with a compound
5193    literal.  */
5194
5195 static struct c_expr
5196 c_parser_postfix_expression_after_paren_type (c_parser *parser,
5197                                               struct c_type_name *type_name)
5198 {
5199   tree type;
5200   struct c_expr init;
5201   struct c_expr expr;
5202   start_init (NULL_TREE, NULL, 0);
5203   type = groktypename (type_name);
5204   if (C_TYPE_VARIABLE_SIZE (type))
5205     {
5206       error ("compound literal has variable size");
5207       type = error_mark_node;
5208     }
5209   init = c_parser_braced_init (parser, type, false);
5210   finish_init ();
5211   maybe_warn_string_init (type, init);
5212
5213   if (pedantic && !flag_isoc99)
5214     pedwarn ("ISO C90 forbids compound literals");
5215   expr.value = build_compound_literal (type, init.value);
5216   expr.original_code = ERROR_MARK;
5217   return c_parser_postfix_expression_after_primary (parser, expr);
5218 }
5219
5220 /* Parse a postfix expression after the initial primary or compound
5221    literal; that is, parse a series of postfix operators.  */
5222
5223 static struct c_expr
5224 c_parser_postfix_expression_after_primary (c_parser *parser,
5225                                            struct c_expr expr)
5226 {
5227   tree ident, idx, exprlist;
5228   while (true)
5229     {
5230       switch (c_parser_peek_token (parser)->type)
5231         {
5232         case CPP_OPEN_SQUARE:
5233           /* Array reference.  */
5234           c_parser_consume_token (parser);
5235           idx = c_parser_expression (parser).value;
5236           c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
5237                                      "expected %<]%>");
5238           expr.value = build_array_ref (expr.value, idx);
5239           expr.original_code = ERROR_MARK;
5240           break;
5241         case CPP_OPEN_PAREN:
5242           /* Function call.  */
5243           c_parser_consume_token (parser);
5244           if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
5245             exprlist = NULL_TREE;
5246           else
5247             exprlist = c_parser_expr_list (parser, true);
5248           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5249                                      "expected %<)%>");
5250           expr.value = build_function_call (expr.value, exprlist);
5251           expr.original_code = ERROR_MARK;
5252           break;
5253         case CPP_DOT:
5254           /* Structure element reference.  */
5255           c_parser_consume_token (parser);
5256           expr = default_function_array_conversion (expr);
5257           if (c_parser_next_token_is (parser, CPP_NAME))
5258             ident = c_parser_peek_token (parser)->value;
5259           else
5260             {
5261               c_parser_error (parser, "expected identifier");
5262               expr.value = error_mark_node;
5263               expr.original_code = ERROR_MARK;
5264               return expr;
5265             }
5266           c_parser_consume_token (parser);
5267           expr.value = build_component_ref (expr.value, ident);
5268           expr.original_code = ERROR_MARK;
5269           break;
5270         case CPP_DEREF:
5271           /* Structure element reference.  */
5272           c_parser_consume_token (parser);
5273           expr = default_function_array_conversion (expr);
5274           if (c_parser_next_token_is (parser, CPP_NAME))
5275             ident = c_parser_peek_token (parser)->value;
5276           else
5277             {
5278               c_parser_error (parser, "expected identifier");
5279               expr.value = error_mark_node;
5280               expr.original_code = ERROR_MARK;
5281               return expr;
5282             }
5283           c_parser_consume_token (parser);
5284           expr.value = build_component_ref (build_indirect_ref (expr.value,
5285                                                                 "->"), ident);
5286           expr.original_code = ERROR_MARK;
5287           break;
5288         case CPP_PLUS_PLUS:
5289           /* Postincrement.  */
5290           c_parser_consume_token (parser);
5291           expr = default_function_array_conversion (expr);
5292           expr.value = build_unary_op (POSTINCREMENT_EXPR, expr.value, 0);
5293           expr.original_code = ERROR_MARK;
5294           break;
5295         case CPP_MINUS_MINUS:
5296           /* Postdecrement.  */
5297           c_parser_consume_token (parser);
5298           expr = default_function_array_conversion (expr);
5299           expr.value = build_unary_op (POSTDECREMENT_EXPR, expr.value, 0);
5300           expr.original_code = ERROR_MARK;
5301           break;
5302         default:
5303           return expr;
5304         }
5305     }
5306 }
5307
5308 /* Parse an expression (C90 6.3.17, C99 6.5.17).
5309
5310    expression:
5311      assignment-expression
5312      expression , assignment-expression
5313 */
5314
5315 static struct c_expr
5316 c_parser_expression (c_parser *parser)
5317 {
5318   struct c_expr expr;
5319   expr = c_parser_expr_no_commas (parser, NULL);
5320   while (c_parser_next_token_is (parser, CPP_COMMA))
5321     {
5322       struct c_expr next;
5323       c_parser_consume_token (parser);
5324       next = c_parser_expr_no_commas (parser, NULL);
5325       next = default_function_array_conversion (next);
5326       expr.value = build_compound_expr (expr.value, next.value);
5327       expr.original_code = COMPOUND_EXPR;
5328     }
5329   return expr;
5330 }
5331
5332 /* Parse an expression and convert functions or arrays to
5333    pointers.  */
5334
5335 static struct c_expr
5336 c_parser_expression_conv (c_parser *parser)
5337 {
5338   struct c_expr expr;
5339   expr = c_parser_expression (parser);
5340   expr = default_function_array_conversion (expr);
5341   return expr;
5342 }
5343
5344 /* Parse a non-empty list of expressions.  If CONVERT_P, convert
5345    functions and arrays to pointers.
5346
5347    nonempty-expr-list:
5348      assignment-expression
5349      nonempty-expr-list , assignment-expression
5350 */
5351
5352 static tree
5353 c_parser_expr_list (c_parser *parser, bool convert_p)
5354 {
5355   struct c_expr expr;
5356   tree ret, cur;
5357   expr = c_parser_expr_no_commas (parser, NULL);
5358   if (convert_p)
5359     expr = default_function_array_conversion (expr);
5360   ret = cur = build_tree_list (NULL_TREE, expr.value);
5361   while (c_parser_next_token_is (parser, CPP_COMMA))
5362     {
5363       c_parser_consume_token (parser);
5364       expr = c_parser_expr_no_commas (parser, NULL);
5365       if (convert_p)
5366         expr = default_function_array_conversion (expr);
5367       cur = TREE_CHAIN (cur) = build_tree_list (NULL_TREE, expr.value);
5368     }
5369   return ret;
5370 }
5371
5372 \f
5373 /* Parse Objective-C-specific constructs.  */
5374
5375 /* Parse an objc-class-definition.
5376
5377    objc-class-definition:
5378      @interface identifier objc-superclass[opt] objc-protocol-refs[opt]
5379        objc-class-instance-variables[opt] objc-methodprotolist @end
5380      @implementation identifier objc-superclass[opt]
5381        objc-class-instance-variables[opt]
5382      @interface identifier ( identifier ) objc-protocol-refs[opt]
5383        objc-methodprotolist @end
5384      @implementation identifier ( identifier )
5385
5386    objc-superclass:
5387      : identifier
5388
5389    "@interface identifier (" must start "@interface identifier (
5390    identifier ) ...": objc-methodprotolist in the first production may
5391    not start with a parenthesized identifier as a declarator of a data
5392    definition with no declaration specifiers if the objc-superclass,
5393    objc-protocol-refs and objc-class-instance-variables are omitted.  */
5394
5395 static void
5396 c_parser_objc_class_definition (c_parser *parser)
5397 {
5398   bool iface_p;
5399   tree id1;
5400   tree superclass;
5401   if (c_parser_next_token_is_keyword (parser, RID_AT_INTERFACE))
5402     iface_p = true;
5403   else if (c_parser_next_token_is_keyword (parser, RID_AT_IMPLEMENTATION))
5404     iface_p = false;
5405   else
5406     gcc_unreachable ();
5407   c_parser_consume_token (parser);
5408   if (c_parser_next_token_is_not (parser, CPP_NAME))
5409     {
5410       c_parser_error (parser, "expected identifier");
5411       return;
5412     }
5413   id1 = c_parser_peek_token (parser)->value;
5414   c_parser_consume_token (parser);
5415   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
5416     {
5417       tree id2;
5418       tree proto = NULL_TREE;
5419       c_parser_consume_token (parser);
5420       if (c_parser_next_token_is_not (parser, CPP_NAME))
5421         {
5422           c_parser_error (parser, "expected identifier");
5423           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5424           return;
5425         }
5426       id2 = c_parser_peek_token (parser)->value;
5427       c_parser_consume_token (parser);
5428       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
5429       if (!iface_p)
5430         {
5431           objc_start_category_implementation (id1, id2);
5432           return;
5433         }
5434       if (c_parser_next_token_is (parser, CPP_LESS))
5435         proto = c_parser_objc_protocol_refs (parser);
5436       objc_start_category_interface (id1, id2, proto);
5437       c_parser_objc_methodprotolist (parser);
5438       c_parser_require_keyword (parser, RID_AT_END, "expected %<@end%>");
5439       objc_finish_interface ();
5440       return;
5441     }
5442   if (c_parser_next_token_is (parser, CPP_COLON))
5443     {
5444       c_parser_consume_token (parser);
5445       if (c_parser_next_token_is_not (parser, CPP_NAME))
5446         {
5447           c_parser_error (parser, "expected identifier");
5448           return;
5449         }
5450       superclass = c_parser_peek_token (parser)->value;
5451       c_parser_consume_token (parser);
5452     }
5453   else
5454     superclass = NULL_TREE;
5455   if (iface_p)
5456     {
5457       tree proto = NULL_TREE;
5458       if (c_parser_next_token_is (parser, CPP_LESS))
5459         proto = c_parser_objc_protocol_refs (parser);
5460       objc_start_class_interface (id1, superclass, proto);
5461     }
5462   else
5463     objc_start_class_implementation (id1, superclass);
5464   if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
5465     c_parser_objc_class_instance_variables (parser);
5466   if (iface_p)
5467     {
5468       objc_continue_interface ();
5469       c_parser_objc_methodprotolist (parser);
5470       c_parser_require_keyword (parser, RID_AT_END, "expected %<@end%>");
5471       objc_finish_interface ();
5472     }
5473   else
5474     {
5475       objc_continue_implementation ();
5476       return;
5477     }
5478 }
5479
5480 /* Parse objc-class-instance-variables.
5481
5482    objc-class-instance-variables:
5483      { objc-instance-variable-decl-list[opt] }
5484
5485    objc-instance-variable-decl-list:
5486      objc-visibility-spec
5487      objc-instance-variable-decl ;
5488      ;
5489      objc-instance-variable-decl-list objc-visibility-spec
5490      objc-instance-variable-decl-list objc-instance-variable-decl ;
5491      objc-instance-variable-decl-list ;
5492
5493    objc-visibility-spec:
5494      @private
5495      @protected
5496      @public
5497
5498    objc-instance-variable-decl:
5499      struct-declaration
5500 */
5501
5502 static void
5503 c_parser_objc_class_instance_variables (c_parser *parser)
5504 {
5505   gcc_assert (c_parser_next_token_is (parser, CPP_OPEN_BRACE));
5506   c_parser_consume_token (parser);
5507   while (c_parser_next_token_is_not (parser, CPP_EOF))
5508     {
5509       tree decls;
5510       /* Parse any stray semicolon.  */
5511       if (c_parser_next_token_is (parser, CPP_SEMICOLON))
5512         {
5513           if (pedantic)
5514             pedwarn ("extra semicolon in struct or union specified");
5515           c_parser_consume_token (parser);
5516           continue;
5517         }
5518       /* Stop if at the end of the instance variables.  */
5519       if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
5520         {
5521           c_parser_consume_token (parser);
5522           break;
5523         }
5524       /* Parse any objc-visibility-spec.  */
5525       if (c_parser_next_token_is_keyword (parser, RID_AT_PRIVATE))
5526         {
5527           c_parser_consume_token (parser);
5528           objc_set_visibility (2);
5529           continue;
5530         }
5531       else if (c_parser_next_token_is_keyword (parser, RID_AT_PROTECTED))
5532         {
5533           c_parser_consume_token (parser);
5534           objc_set_visibility (0);
5535           continue;
5536         }
5537       else if (c_parser_next_token_is_keyword (parser, RID_AT_PUBLIC))
5538         {
5539           c_parser_consume_token (parser);
5540           objc_set_visibility (1);
5541           continue;
5542         }
5543       /* Parse some comma-separated declarations.  */
5544       decls = c_parser_struct_declaration (parser);
5545       {
5546         /* Comma-separated instance variables are chained together in
5547            reverse order; add them one by one.  */
5548         tree ivar = nreverse (decls);
5549         for (; ivar; ivar = TREE_CHAIN (ivar))
5550           objc_add_instance_variable (copy_node (ivar));
5551       }
5552       c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
5553     }
5554 }
5555
5556 /* Parse an objc-class-declaration.
5557
5558    objc-class-declaration:
5559      @class identifier-list ;
5560 */
5561
5562 static void
5563 c_parser_objc_class_declaration (c_parser *parser)
5564 {
5565   tree list = NULL_TREE;
5566   gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_CLASS));
5567   c_parser_consume_token (parser);
5568   /* Any identifiers, including those declared as type names, are OK
5569      here.  */
5570   while (true)
5571     {
5572       tree id;
5573       if (c_parser_next_token_is_not (parser, CPP_NAME))
5574         {
5575           c_parser_error (parser, "expected identifier");
5576           break;
5577         }
5578       id = c_parser_peek_token (parser)->value;
5579       list = chainon (list, build_tree_list (NULL_TREE, id));
5580       c_parser_consume_token (parser);
5581       if (c_parser_next_token_is (parser, CPP_COMMA))
5582         c_parser_consume_token (parser);
5583       else
5584         break;
5585     }
5586   c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
5587   objc_declare_class (list);
5588 }
5589
5590 /* Parse an objc-alias-declaration.
5591
5592    objc-alias-declaration:
5593      @compatibility_alias identifier identifier ;
5594 */
5595
5596 static void
5597 c_parser_objc_alias_declaration (c_parser *parser)
5598 {
5599   tree id1, id2;
5600   gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_ALIAS));
5601   c_parser_consume_token (parser);
5602   if (c_parser_next_token_is_not (parser, CPP_NAME))
5603     {
5604       c_parser_error (parser, "expected identifier");
5605       c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
5606       return;
5607     }
5608   id1 = c_parser_peek_token (parser)->value;
5609   c_parser_consume_token (parser);
5610   if (c_parser_next_token_is_not (parser, CPP_NAME))
5611     {
5612       c_parser_error (parser, "expected identifier");
5613       c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
5614       return;
5615     }
5616   id2 = c_parser_peek_token (parser)->value;
5617   c_parser_consume_token (parser);
5618   c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
5619   objc_declare_alias (id1, id2);
5620 }
5621
5622 /* Parse an objc-protocol-definition.
5623
5624    objc-protocol-definition:
5625      @protocol identifier objc-protocol-refs[opt] objc-methodprotolist @end
5626      @protocol identifier-list ;
5627
5628    "@protocol identifier ;" should be resolved as "@protocol
5629    identifier-list ;": objc-methodprotolist may not start with a
5630    semicolon in the first alternative if objc-protocol-refs are
5631    omitted.  */
5632
5633 static void
5634 c_parser_objc_protocol_definition (c_parser *parser)
5635 {
5636   gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_PROTOCOL));
5637   c_parser_consume_token (parser);
5638   if (c_parser_next_token_is_not (parser, CPP_NAME))
5639     {
5640       c_parser_error (parser, "expected identifier");
5641       return;
5642     }
5643   if (c_parser_peek_2nd_token (parser)->type == CPP_COMMA
5644       || c_parser_peek_2nd_token (parser)->type == CPP_SEMICOLON)
5645     {
5646       tree list = NULL_TREE;
5647       /* Any identifiers, including those declared as type names, are
5648          OK here.  */
5649       while (true)
5650         {
5651           tree id;
5652           if (c_parser_next_token_is_not (parser, CPP_NAME))
5653             {
5654               c_parser_error (parser, "expected identifier");
5655               break;
5656             }
5657           id = c_parser_peek_token (parser)->value;
5658           list = chainon (list, build_tree_list (NULL_TREE, id));
5659           c_parser_consume_token (parser);
5660           if (c_parser_next_token_is (parser, CPP_COMMA))
5661             c_parser_consume_token (parser);
5662           else
5663             break;
5664         }
5665       c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
5666       objc_declare_protocols (list);
5667     }
5668   else
5669     {
5670       tree id = c_parser_peek_token (parser)->value;
5671       tree proto = NULL_TREE;
5672       c_parser_consume_token (parser);
5673       if (c_parser_next_token_is (parser, CPP_LESS))
5674         proto = c_parser_objc_protocol_refs (parser);
5675       objc_pq_context = 1;
5676       objc_start_protocol (id, proto);
5677       c_parser_objc_methodprotolist (parser);
5678       c_parser_require_keyword (parser, RID_AT_END, "expected %<@end%>");
5679       objc_pq_context = 0;
5680       objc_finish_interface ();
5681     }
5682 }
5683
5684 /* Parse an objc-method-type.
5685
5686    objc-method-type:
5687      +
5688      -
5689 */
5690
5691 static enum tree_code
5692 c_parser_objc_method_type (c_parser *parser)
5693 {
5694   switch (c_parser_peek_token (parser)->type)
5695     {
5696     case CPP_PLUS:
5697       c_parser_consume_token (parser);
5698       return PLUS_EXPR;
5699     case CPP_MINUS:
5700       c_parser_consume_token (parser);
5701       return MINUS_EXPR;
5702     default:
5703       gcc_unreachable ();
5704     }
5705 }
5706
5707 /* Parse an objc-method-definition.
5708
5709    objc-method-definition:
5710      objc-method-type objc-method-decl ;[opt] compound-statement
5711 */
5712
5713 static void
5714 c_parser_objc_method_definition (c_parser *parser)
5715 {
5716   enum tree_code type = c_parser_objc_method_type (parser);
5717   tree decl;
5718   objc_set_method_type (type);
5719   objc_pq_context = 1;
5720   decl = c_parser_objc_method_decl (parser);
5721   if (c_parser_next_token_is (parser, CPP_SEMICOLON))
5722     {
5723       c_parser_consume_token (parser);
5724       if (pedantic)
5725         pedwarn ("extra semicolon in method definition specified");
5726     }
5727   if (!c_parser_next_token_is (parser, CPP_OPEN_BRACE))
5728     {
5729       c_parser_error (parser, "expected %<{%>");
5730       return;
5731     }
5732   objc_pq_context = 0;
5733   objc_start_method_definition (decl);
5734   add_stmt (c_parser_compound_statement (parser));
5735   objc_finish_method_definition (current_function_decl);
5736 }
5737
5738 /* Parse an objc-methodprotolist.
5739
5740    objc-methodprotolist:
5741      empty
5742      objc-methodprotolist objc-methodproto
5743      objc-methodprotolist declaration
5744      objc-methodprotolist ;
5745
5746    The declaration is a data definition, which may be missing
5747    declaration specifiers under the same rules and diagnostics as
5748    other data definitions outside functions, and the stray semicolon
5749    is diagnosed the same way as a stray semicolon outside a
5750    function.  */
5751
5752 static void
5753 c_parser_objc_methodprotolist (c_parser *parser)
5754 {
5755   while (true)
5756     {
5757       /* The list is terminated by @end.  */
5758       switch (c_parser_peek_token (parser)->type)
5759         {
5760         case CPP_SEMICOLON:
5761           if (pedantic)
5762             pedwarn ("ISO C does not allow extra %<;%> outside of a function");
5763           c_parser_consume_token (parser);
5764           break;
5765         case CPP_PLUS:
5766         case CPP_MINUS:
5767           c_parser_objc_methodproto (parser);
5768           break;
5769         case CPP_EOF:
5770           return;
5771         default:
5772           if (c_parser_next_token_is_keyword (parser, RID_AT_END))
5773             return;
5774           c_parser_declaration_or_fndef (parser, false, true, false, true);
5775           break;
5776         }
5777     }
5778 }
5779
5780 /* Parse an objc-methodproto.
5781
5782    objc-methodproto:
5783      objc-method-type objc-method-decl ;
5784 */
5785
5786 static void
5787 c_parser_objc_methodproto (c_parser *parser)
5788 {
5789   enum tree_code type = c_parser_objc_method_type (parser);
5790   tree decl;
5791   objc_set_method_type (type);
5792   /* Remember protocol qualifiers in prototypes.  */
5793   objc_pq_context = 1;
5794   decl = c_parser_objc_method_decl (parser);
5795   /* Forget protocol qualifiers here.  */
5796   objc_pq_context = 0;
5797   objc_add_method_declaration (decl);
5798   c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
5799 }
5800
5801 /* Parse an objc-method-decl.
5802
5803    objc-method-decl:
5804      ( objc-type-name ) objc-selector
5805      objc-selector
5806      ( objc-type-name ) objc-keyword-selector objc-optparmlist
5807      objc-keyword-selector objc-optparmlist
5808
5809    objc-keyword-selector:
5810      objc-keyword-decl
5811      objc-keyword-selector objc-keyword-decl
5812
5813    objc-keyword-decl:
5814      objc-selector : ( objc-type-name ) identifier
5815      objc-selector : identifier
5816      : ( objc-type-name ) identifier
5817      : identifier
5818
5819    objc-optparmlist:
5820      objc-optparms objc-optellipsis
5821
5822    objc-optparms:
5823      empty
5824      objc-opt-parms , parameter-declaration
5825
5826    objc-optellipsis:
5827      empty
5828      , ...
5829 */
5830
5831 static tree
5832 c_parser_objc_method_decl (c_parser *parser)
5833 {
5834   tree type = NULL_TREE;
5835   tree sel;
5836   tree parms = NULL_TREE;
5837   bool ellipsis = false;
5838
5839   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
5840     {
5841       c_parser_consume_token (parser);
5842       type = c_parser_objc_type_name (parser);
5843       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
5844     }
5845   sel = c_parser_objc_selector (parser);
5846   /* If there is no selector, or a colon follows, we have an
5847      objc-keyword-selector.  If there is a selector, and a colon does
5848      not follow, that selector ends the objc-method-decl.  */
5849   if (!sel || c_parser_next_token_is (parser, CPP_COLON))
5850     {
5851       tree tsel = sel;
5852       tree list = NULL_TREE;
5853       while (true)
5854         {
5855           tree atype = NULL_TREE, id, keyworddecl;
5856           if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
5857             break;
5858           if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
5859             {
5860               c_parser_consume_token (parser);
5861               atype = c_parser_objc_type_name (parser);
5862               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5863                                          "expected %<)%>");
5864             }
5865           if (c_parser_next_token_is_not (parser, CPP_NAME))
5866             {
5867               c_parser_error (parser, "expected identifier");
5868               return error_mark_node;
5869             }
5870           id = c_parser_peek_token (parser)->value;
5871           c_parser_consume_token (parser);
5872           keyworddecl = objc_build_keyword_decl (tsel, atype, id);
5873           list = chainon (list, keyworddecl);
5874           tsel = c_parser_objc_selector (parser);
5875           if (!tsel && c_parser_next_token_is_not (parser, CPP_COLON))
5876             break;
5877         }
5878       /* Parse the optional parameter list.  Optional Objective-C
5879          method parameters follow the C syntax, and may include '...'
5880          to denote a variable number of arguments.  */
5881       parms = make_node (TREE_LIST);
5882       while (c_parser_next_token_is (parser, CPP_COMMA))
5883         {
5884           struct c_parm *parm;
5885           c_parser_consume_token (parser);
5886           if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
5887             {
5888               ellipsis = true;
5889               c_parser_consume_token (parser);
5890               break;
5891             }
5892           parm = c_parser_parameter_declaration (parser, NULL_TREE);
5893           if (parm == NULL)
5894             break;
5895           parms = chainon (parms,
5896                            build_tree_list (NULL_TREE, grokparm (parm)));
5897         }
5898       sel = list;
5899     }
5900   return objc_build_method_signature (type, sel, parms, ellipsis);
5901 }
5902
5903 /* Parse an objc-type-name.
5904
5905    objc-type-name:
5906      objc-type-qualifiers[opt] type-name
5907      objc-type-qualifiers[opt]
5908
5909    objc-type-qualifiers:
5910      objc-type-qualifier
5911      objc-type-qualifiers objc-type-qualifier
5912
5913    objc-type-qualifier: one of
5914      in out inout bycopy byref oneway
5915 */
5916
5917 static tree
5918 c_parser_objc_type_name (c_parser *parser)
5919 {
5920   tree quals = NULL_TREE;
5921   struct c_type_name *typename = NULL;
5922   tree type = NULL_TREE;
5923   while (true)
5924     {
5925       c_token *token = c_parser_peek_token (parser);
5926       if (token->type == CPP_KEYWORD
5927           && (token->keyword == RID_IN
5928               || token->keyword == RID_OUT
5929               || token->keyword == RID_INOUT
5930               || token->keyword == RID_BYCOPY
5931               || token->keyword == RID_BYREF
5932               || token->keyword == RID_ONEWAY))
5933         {
5934           quals = chainon (quals, build_tree_list (NULL_TREE, token->value));
5935           c_parser_consume_token (parser);
5936         }
5937       else
5938         break;
5939     }
5940   if (c_parser_next_token_starts_typename (parser))
5941     typename = c_parser_type_name (parser);
5942   if (typename)
5943     type = groktypename (typename);
5944   return build_tree_list (quals, type);
5945 }
5946
5947 /* Parse objc-protocol-refs.
5948
5949    objc-protocol-refs:
5950      < identifier-list >
5951 */
5952
5953 static tree
5954 c_parser_objc_protocol_refs (c_parser *parser)
5955 {
5956   tree list = NULL_TREE;
5957   gcc_assert (c_parser_next_token_is (parser, CPP_LESS));
5958   c_parser_consume_token (parser);
5959   /* Any identifiers, including those declared as type names, are OK
5960      here.  */
5961   while (true)
5962     {
5963       tree id;
5964       if (c_parser_next_token_is_not (parser, CPP_NAME))
5965         {
5966           c_parser_error (parser, "expected identifier");
5967           break;
5968         }
5969       id = c_parser_peek_token (parser)->value;
5970       list = chainon (list, build_tree_list (NULL_TREE, id));
5971       c_parser_consume_token (parser);
5972       if (c_parser_next_token_is (parser, CPP_COMMA))
5973         c_parser_consume_token (parser);
5974       else
5975         break;
5976     }
5977   c_parser_require (parser, CPP_GREATER, "expected %<>%>");
5978   return list;
5979 }
5980
5981 /* Parse an objc-try-catch-statement.
5982
5983    objc-try-catch-statement:
5984      @try compound-statement objc-catch-list[opt]
5985      @try compound-statement objc-catch-list[opt] @finally compound-statement
5986
5987    objc-catch-list:
5988      @catch ( parameter-declaration ) compound-statement
5989      objc-catch-list @catch ( parameter-declaration ) compound-statement
5990 */
5991
5992 static void
5993 c_parser_objc_try_catch_statement (c_parser *parser)
5994 {
5995   location_t loc;
5996   tree stmt;
5997   gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_TRY));
5998   c_parser_consume_token (parser);
5999   loc = c_parser_peek_token (parser)->location;
6000   stmt = c_parser_compound_statement (parser);
6001   objc_begin_try_stmt (loc, stmt);
6002   while (c_parser_next_token_is_keyword (parser, RID_AT_CATCH))
6003     {
6004       struct c_parm *parm;
6005       c_parser_consume_token (parser);
6006       if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
6007         break;
6008       parm = c_parser_parameter_declaration (parser, NULL_TREE);
6009       if (parm == NULL)
6010         {
6011           c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
6012           break;
6013         }
6014       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
6015       objc_begin_catch_clause (grokparm (parm));
6016       if (c_parser_require (parser, CPP_OPEN_BRACE, "expected %<{%>"))
6017         c_parser_compound_statement_nostart (parser);
6018       objc_finish_catch_clause ();
6019     }
6020   if (c_parser_next_token_is_keyword (parser, RID_AT_FINALLY))
6021     {
6022       location_t finloc;
6023       tree finstmt;
6024       c_parser_consume_token (parser);
6025       finloc = c_parser_peek_token (parser)->location;
6026       finstmt = c_parser_compound_statement (parser);
6027       objc_build_finally_clause (finloc, finstmt);
6028     }
6029   objc_finish_try_stmt ();
6030 }
6031
6032 /* Parse an objc-synchronized-statement.
6033
6034    objc-synchronized-statement:
6035      @synchronized ( expression ) compound-statement
6036 */
6037
6038 static void
6039 c_parser_objc_synchronized_statement (c_parser *parser)
6040 {
6041   location_t loc;
6042   tree expr, stmt;
6043   gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_SYNCHRONIZED));
6044   c_parser_consume_token (parser);
6045   loc = c_parser_peek_token (parser)->location;
6046   if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
6047     {
6048       expr = c_parser_expression (parser).value;
6049       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
6050     }
6051   else
6052     expr = error_mark_node;
6053   stmt = c_parser_compound_statement (parser);
6054   objc_build_synchronized (loc, expr, stmt);
6055 }
6056
6057 /* Parse an objc-selector; return NULL_TREE without an error if the
6058    next token is not an objc-selector.
6059
6060    objc-selector:
6061      identifier
6062      one of
6063        enum struct union if else while do for switch case default
6064        break continue return goto asm sizeof typeof __alignof
6065        unsigned long const short volatile signed restrict _Complex
6066        in out inout bycopy byref oneway int char float double void _Bool
6067
6068    ??? Why this selection of keywords but not, for example, storage
6069    class specifiers?  */
6070
6071 static tree
6072 c_parser_objc_selector (c_parser *parser)
6073 {
6074   c_token *token = c_parser_peek_token (parser);
6075   tree value = token->value;
6076   if (token->type == CPP_NAME)
6077     {
6078       c_parser_consume_token (parser);
6079       return value;
6080     }
6081   if (token->type != CPP_KEYWORD)
6082     return NULL_TREE;
6083   switch (token->keyword)
6084     {
6085     case RID_ENUM:
6086     case RID_STRUCT:
6087     case RID_UNION:
6088     case RID_IF:
6089     case RID_ELSE:
6090     case RID_WHILE:
6091     case RID_DO:
6092     case RID_FOR:
6093     case RID_SWITCH:
6094     case RID_CASE:
6095     case RID_DEFAULT:
6096     case RID_BREAK:
6097     case RID_CONTINUE:
6098     case RID_RETURN:
6099     case RID_GOTO:
6100     case RID_ASM:
6101     case RID_SIZEOF:
6102     case RID_TYPEOF:
6103     case RID_ALIGNOF:
6104     case RID_UNSIGNED:
6105     case RID_LONG:
6106     case RID_CONST:
6107     case RID_SHORT:
6108     case RID_VOLATILE:
6109     case RID_SIGNED:
6110     case RID_RESTRICT:
6111     case RID_COMPLEX:
6112     case RID_IN:
6113     case RID_OUT:
6114     case RID_INOUT:
6115     case RID_BYCOPY:
6116     case RID_BYREF:
6117     case RID_ONEWAY:
6118     case RID_INT:
6119     case RID_CHAR:
6120     case RID_FLOAT:
6121     case RID_DOUBLE:
6122     case RID_VOID:
6123     case RID_BOOL:
6124       c_parser_consume_token (parser);
6125       return value;
6126     default:
6127       return NULL_TREE;
6128     }
6129 }
6130
6131 /* Parse an objc-selector-arg.
6132
6133    objc-selector-arg:
6134      objc-selector
6135      objc-keywordname-list
6136
6137    objc-keywordname-list:
6138      objc-keywordname
6139      objc-keywordname-list objc-keywordname
6140
6141    objc-keywordname:
6142      objc-selector :
6143      :
6144 */
6145
6146 static tree
6147 c_parser_objc_selector_arg (c_parser *parser)
6148 {
6149   tree sel = c_parser_objc_selector (parser);
6150   tree list = NULL_TREE;
6151   if (sel && c_parser_next_token_is_not (parser, CPP_COLON))
6152     return sel;
6153   while (true)
6154     {
6155       if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
6156         return list;
6157       list = chainon (list, build_tree_list (sel, NULL_TREE));
6158       sel = c_parser_objc_selector (parser);
6159       if (!sel && c_parser_next_token_is_not (parser, CPP_COLON))
6160         break;
6161     }
6162   return list;
6163 }
6164
6165 /* Parse an objc-receiver.
6166
6167    objc-receiver:
6168      expression
6169      class-name
6170      type-name
6171 */
6172
6173 static tree
6174 c_parser_objc_receiver (c_parser *parser)
6175 {
6176   if (c_parser_peek_token (parser)->type == CPP_NAME
6177       && (c_parser_peek_token (parser)->id_kind == C_ID_TYPENAME
6178           || c_parser_peek_token (parser)->id_kind == C_ID_CLASSNAME))
6179     {
6180       tree id = c_parser_peek_token (parser)->value;
6181       c_parser_consume_token (parser);
6182       return objc_get_class_reference (id);
6183     }
6184   return c_parser_expression (parser).value;
6185 }
6186
6187 /* Parse objc-message-args.
6188
6189    objc-message-args:
6190      objc-selector
6191      objc-keywordarg-list
6192
6193    objc-keywordarg-list:
6194      objc-keywordarg
6195      objc-keywordarg-list objc-keywordarg
6196
6197    objc-keywordarg:
6198      objc-selector : objc-keywordexpr
6199      : objc-keywordexpr
6200 */
6201
6202 static tree
6203 c_parser_objc_message_args (c_parser *parser)
6204 {
6205   tree sel = c_parser_objc_selector (parser);
6206   tree list = NULL_TREE;
6207   if (sel && c_parser_next_token_is_not (parser, CPP_COLON))
6208     return sel;
6209   while (true)
6210     {
6211       tree keywordexpr;
6212       if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
6213         return list;
6214       keywordexpr = c_parser_objc_keywordexpr (parser);
6215       list = chainon (list, build_tree_list (sel, keywordexpr));
6216       sel = c_parser_objc_selector (parser);
6217       if (!sel && c_parser_next_token_is_not (parser, CPP_COLON))
6218         break;
6219     }
6220   return list;
6221 }
6222
6223 /* Parse an objc-keywordexpr.
6224
6225    objc-keywordexpr:
6226      nonempty-expr-list
6227 */
6228
6229 static tree
6230 c_parser_objc_keywordexpr (c_parser *parser)
6231 {
6232   tree list = c_parser_expr_list (parser, true);
6233   if (TREE_CHAIN (list) == NULL_TREE)
6234     {
6235       /* Just return the expression, remove a level of
6236          indirection.  */
6237       return TREE_VALUE (list);
6238     }
6239   else
6240     {
6241       /* We have a comma expression, we will collapse later.  */
6242       return list;
6243     }
6244 }
6245
6246 \f
6247 /* The actual parser and external interface.  ??? Does this need to be
6248    garbage-collected?  */
6249
6250 static GTY (()) c_parser *the_parser;
6251
6252 /* Parse a single source file.  */
6253
6254 void
6255 c_parse_file (void)
6256 {
6257   the_parser = c_parser_new ();
6258   c_parser_translation_unit (the_parser);
6259   the_parser = NULL;
6260 }
6261
6262 #include "gt-c-parser.h"