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