PR debug/46799
[official-gcc.git] / gcc / c-parser.c
blob6faaacf157c1ea482b1689897cf105a6fff496ec
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, 2007, 2008, 2009, 2010
4 Free Software Foundation, Inc.
6 Parser actions based on the old Bison parser; structure somewhat
7 influenced by and fragments based on the C++ parser.
9 This file is part of GCC.
11 GCC is free software; you can redistribute it and/or modify it under
12 the terms of the GNU General Public License as published by the Free
13 Software Foundation; either version 3, or (at your option) any later
14 version.
16 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
17 WARRANTY; without even the implied warranty of MERCHANTABILITY or
18 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
19 for more details.
21 You should have received a copy of the GNU General Public License
22 along with GCC; see the file COPYING3. If not see
23 <http://www.gnu.org/licenses/>. */
25 /* TODO:
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.
31 Add testcases covering every input symbol in every state in old and
32 new parsers.
34 Include full syntax for GNU C, including erroneous cases accepted
35 with error messages, in syntax productions in comments.
37 Make more diagnostics in the front end generally take an explicit
38 location rather than implicitly using input_location. */
40 #include "config.h"
41 #include "system.h"
42 #include "coretypes.h"
43 #include "tm.h" /* For rtl.h: needs enum reg_class. */
44 #include "tree.h"
45 #include "langhooks.h"
46 #include "input.h"
47 #include "cpplib.h"
48 #include "timevar.h"
49 #include "c-family/c-pragma.h"
50 #include "c-tree.h"
51 #include "flags.h"
52 #include "output.h"
53 #include "ggc.h"
54 #include "c-family/c-common.h"
55 #include "c-family/c-objc.h"
56 #include "vec.h"
57 #include "target.h"
58 #include "cgraph.h"
59 #include "plugin.h"
62 /* Initialization routine for this file. */
64 void
65 c_parse_init (void)
67 /* The only initialization required is of the reserved word
68 identifiers. */
69 unsigned int i;
70 tree id;
71 int mask = 0;
73 /* Make sure RID_MAX hasn't grown past the 8 bits used to hold the keyword in
74 the c_token structure. */
75 gcc_assert (RID_MAX <= 255);
77 mask |= D_CXXONLY;
78 if (!flag_isoc99)
79 mask |= D_C99;
80 if (flag_no_asm)
82 mask |= D_ASM | D_EXT;
83 if (!flag_isoc99)
84 mask |= D_EXT89;
86 if (!c_dialect_objc ())
87 mask |= D_OBJC | D_CXX_OBJC;
89 ridpointers = ggc_alloc_cleared_vec_tree ((int) RID_MAX);
90 for (i = 0; i < num_c_common_reswords; i++)
92 /* If a keyword is disabled, do not enter it into the table
93 and so create a canonical spelling that isn't a keyword. */
94 if (c_common_reswords[i].disable & mask)
96 if (warn_cxx_compat
97 && (c_common_reswords[i].disable & D_CXXWARN))
99 id = get_identifier (c_common_reswords[i].word);
100 C_SET_RID_CODE (id, RID_CXX_COMPAT_WARN);
101 C_IS_RESERVED_WORD (id) = 1;
103 continue;
106 id = get_identifier (c_common_reswords[i].word);
107 C_SET_RID_CODE (id, c_common_reswords[i].rid);
108 C_IS_RESERVED_WORD (id) = 1;
109 ridpointers [(int) c_common_reswords[i].rid] = id;
113 /* The C lexer intermediates between the lexer in cpplib and c-lex.c
114 and the C parser. Unlike the C++ lexer, the parser structure
115 stores the lexer information instead of using a separate structure.
116 Identifiers are separated into ordinary identifiers, type names,
117 keywords and some other Objective-C types of identifiers, and some
118 look-ahead is maintained.
120 ??? It might be a good idea to lex the whole file up front (as for
121 C++). It would then be possible to share more of the C and C++
122 lexer code, if desired. */
124 /* The following local token type is used. */
126 /* A keyword. */
127 #define CPP_KEYWORD ((enum cpp_ttype) (N_TTYPES + 1))
129 /* More information about the type of a CPP_NAME token. */
130 typedef enum c_id_kind {
131 /* An ordinary identifier. */
132 C_ID_ID,
133 /* An identifier declared as a typedef name. */
134 C_ID_TYPENAME,
135 /* An identifier declared as an Objective-C class name. */
136 C_ID_CLASSNAME,
137 /* An address space identifier. */
138 C_ID_ADDRSPACE,
139 /* Not an identifier. */
140 C_ID_NONE
141 } c_id_kind;
143 /* A single C token after string literal concatenation and conversion
144 of preprocessing tokens to tokens. */
145 typedef struct GTY (()) c_token {
146 /* The kind of token. */
147 ENUM_BITFIELD (cpp_ttype) type : 8;
148 /* If this token is a CPP_NAME, this value indicates whether also
149 declared as some kind of type. Otherwise, it is C_ID_NONE. */
150 ENUM_BITFIELD (c_id_kind) id_kind : 8;
151 /* If this token is a keyword, this value indicates which keyword.
152 Otherwise, this value is RID_MAX. */
153 ENUM_BITFIELD (rid) keyword : 8;
154 /* If this token is a CPP_PRAGMA, this indicates the pragma that
155 was seen. Otherwise it is PRAGMA_NONE. */
156 ENUM_BITFIELD (pragma_kind) pragma_kind : 8;
157 /* The location at which this token was found. */
158 location_t location;
159 /* The value associated with this token, if any. */
160 tree value;
161 } c_token;
163 /* A parser structure recording information about the state and
164 context of parsing. Includes lexer information with up to two
165 tokens of look-ahead; more are not needed for C. */
166 typedef struct GTY(()) c_parser {
167 /* The look-ahead tokens. */
168 c_token tokens[2];
169 /* How many look-ahead tokens are available (0, 1 or 2). */
170 short tokens_avail;
171 /* True if a syntax error is being recovered from; false otherwise.
172 c_parser_error sets this flag. It should clear this flag when
173 enough tokens have been consumed to recover from the error. */
174 BOOL_BITFIELD error : 1;
175 /* True if we're processing a pragma, and shouldn't automatically
176 consume CPP_PRAGMA_EOL. */
177 BOOL_BITFIELD in_pragma : 1;
178 /* True if we're parsing the outermost block of an if statement. */
179 BOOL_BITFIELD in_if_block : 1;
180 /* True if we want to lex an untranslated string. */
181 BOOL_BITFIELD lex_untranslated_string : 1;
183 /* Objective-C specific parser/lexer information. */
185 /* True if we are in a context where the Objective-C "PQ" keywords
186 are considered keywords. */
187 BOOL_BITFIELD objc_pq_context : 1;
188 /* True if we are parsing a (potential) Objective-C foreach
189 statement. This is set to true after we parsed 'for (' and while
190 we wait for 'in' or ';' to decide if it's a standard C for loop or an
191 Objective-C foreach loop. */
192 BOOL_BITFIELD objc_could_be_foreach_context : 1;
193 /* The following flag is needed to contextualize Objective-C lexical
194 analysis. In some cases (e.g., 'int NSObject;'), it is
195 undesirable to bind an identifier to an Objective-C class, even
196 if a class with that name exists. */
197 BOOL_BITFIELD objc_need_raw_identifier : 1;
198 /* True if we are in a context where the Objective-C "Property attribute"
199 keywords are valid. */
200 BOOL_BITFIELD objc_property_attr_context : 1;
201 } c_parser;
204 /* The actual parser and external interface. ??? Does this need to be
205 garbage-collected? */
207 static GTY (()) c_parser *the_parser;
209 /* Read in and lex a single token, storing it in *TOKEN. */
211 static void
212 c_lex_one_token (c_parser *parser, c_token *token)
214 timevar_push (TV_LEX);
216 token->type = c_lex_with_flags (&token->value, &token->location, NULL,
217 (parser->lex_untranslated_string
218 ? C_LEX_STRING_NO_TRANSLATE : 0));
219 token->id_kind = C_ID_NONE;
220 token->keyword = RID_MAX;
221 token->pragma_kind = PRAGMA_NONE;
223 switch (token->type)
225 case CPP_NAME:
227 tree decl;
229 bool objc_force_identifier = parser->objc_need_raw_identifier;
230 if (c_dialect_objc ())
231 parser->objc_need_raw_identifier = false;
233 if (C_IS_RESERVED_WORD (token->value))
235 enum rid rid_code = C_RID_CODE (token->value);
237 if (rid_code == RID_CXX_COMPAT_WARN)
239 warning_at (token->location,
240 OPT_Wc___compat,
241 "identifier %qE conflicts with C++ keyword",
242 token->value);
244 else if (rid_code >= RID_FIRST_ADDR_SPACE
245 && rid_code <= RID_LAST_ADDR_SPACE)
247 token->id_kind = C_ID_ADDRSPACE;
248 token->keyword = rid_code;
249 break;
251 else if (c_dialect_objc () && OBJC_IS_PQ_KEYWORD (rid_code))
253 /* We found an Objective-C "pq" keyword (in, out,
254 inout, bycopy, byref, oneway). They need special
255 care because the interpretation depends on the
256 context.
258 if (parser->objc_pq_context)
260 token->type = CPP_KEYWORD;
261 token->keyword = rid_code;
262 break;
264 else if (parser->objc_could_be_foreach_context
265 && rid_code == RID_IN)
267 /* We are in Objective-C, inside a (potential)
268 foreach context (which means after having
269 parsed 'for (', but before having parsed ';'),
270 and we found 'in'. We consider it the keyword
271 which terminates the declaration at the
272 beginning of a foreach-statement. Note that
273 this means you can't use 'in' for anything else
274 in that context; in particular, in Objective-C
275 you can't use 'in' as the name of the running
276 variable in a C for loop. We could potentially
277 try to add code here to disambiguate, but it
278 seems a reasonable limitation.
280 token->type = CPP_KEYWORD;
281 token->keyword = rid_code;
282 break;
284 /* Else, "pq" keywords outside of the "pq" context are
285 not keywords, and we fall through to the code for
286 normal tokens.
289 else if (c_dialect_objc () && OBJC_IS_PATTR_KEYWORD (rid_code))
291 /* We found an Objective-C "property attribute" keyword
292 (readonly, copies, getter, setter, ivar). These are
293 only valid in the property context. */
294 if (parser->objc_property_attr_context)
296 token->type = CPP_KEYWORD;
297 token->keyword = rid_code;
298 break;
300 /* Else they are not special keywords.
303 else if (c_dialect_objc ()
304 && (OBJC_IS_AT_KEYWORD (rid_code)
305 || OBJC_IS_CXX_KEYWORD (rid_code)))
307 /* We found one of the Objective-C "@" keywords (defs,
308 selector, synchronized, etc) or one of the
309 Objective-C "cxx" keywords (class, private,
310 protected, public, try, catch, throw) without a
311 preceding '@' sign. Do nothing and fall through to
312 the code for normal tokens (in C++ we would still
313 consider the CXX ones keywords, but not in C).
317 else
319 token->type = CPP_KEYWORD;
320 token->keyword = rid_code;
321 break;
325 decl = lookup_name (token->value);
326 if (decl)
328 if (TREE_CODE (decl) == TYPE_DECL)
330 token->id_kind = C_ID_TYPENAME;
331 break;
334 else if (c_dialect_objc ())
336 tree objc_interface_decl = objc_is_class_name (token->value);
337 /* Objective-C class names are in the same namespace as
338 variables and typedefs, and hence are shadowed by local
339 declarations. */
340 if (objc_interface_decl
341 && (global_bindings_p ()
342 || (!objc_force_identifier && !decl)))
344 token->value = objc_interface_decl;
345 token->id_kind = C_ID_CLASSNAME;
346 break;
349 token->id_kind = C_ID_ID;
351 break;
352 case CPP_AT_NAME:
353 /* This only happens in Objective-C; it must be a keyword. */
354 token->type = CPP_KEYWORD;
355 switch (C_RID_CODE (token->value))
357 /* Replace 'class' with '@class', 'private' with '@private',
358 etc. This prevents confusion with the C++ keyword
359 'class', and makes the tokens consistent with other
360 Objective-C 'AT' keywords. For example '@class' is
361 reported as RID_AT_CLASS which is consistent with
362 '@synchronized', which is reported as
363 RID_AT_SYNCHRONIZED.
365 case RID_CLASS: token->keyword = RID_AT_CLASS; break;
366 case RID_PRIVATE: token->keyword = RID_AT_PRIVATE; break;
367 case RID_PROTECTED: token->keyword = RID_AT_PROTECTED; break;
368 case RID_PUBLIC: token->keyword = RID_AT_PUBLIC; break;
369 case RID_THROW: token->keyword = RID_AT_THROW; break;
370 case RID_TRY: token->keyword = RID_AT_TRY; break;
371 case RID_CATCH: token->keyword = RID_AT_CATCH; break;
372 default: token->keyword = C_RID_CODE (token->value);
374 break;
375 case CPP_COLON:
376 case CPP_COMMA:
377 case CPP_CLOSE_PAREN:
378 case CPP_SEMICOLON:
379 /* These tokens may affect the interpretation of any identifiers
380 following, if doing Objective-C. */
381 if (c_dialect_objc ())
382 parser->objc_need_raw_identifier = false;
383 break;
384 case CPP_PRAGMA:
385 /* We smuggled the cpp_token->u.pragma value in an INTEGER_CST. */
386 token->pragma_kind = (enum pragma_kind) TREE_INT_CST_LOW (token->value);
387 token->value = NULL;
388 break;
389 default:
390 break;
392 timevar_pop (TV_LEX);
395 /* Return a pointer to the next token from PARSER, reading it in if
396 necessary. */
398 static inline c_token *
399 c_parser_peek_token (c_parser *parser)
401 if (parser->tokens_avail == 0)
403 c_lex_one_token (parser, &parser->tokens[0]);
404 parser->tokens_avail = 1;
406 return &parser->tokens[0];
409 /* Return true if the next token from PARSER has the indicated
410 TYPE. */
412 static inline bool
413 c_parser_next_token_is (c_parser *parser, enum cpp_ttype type)
415 return c_parser_peek_token (parser)->type == type;
418 /* Return true if the next token from PARSER does not have the
419 indicated TYPE. */
421 static inline bool
422 c_parser_next_token_is_not (c_parser *parser, enum cpp_ttype type)
424 return !c_parser_next_token_is (parser, type);
427 /* Return true if the next token from PARSER is the indicated
428 KEYWORD. */
430 static inline bool
431 c_parser_next_token_is_keyword (c_parser *parser, enum rid keyword)
433 return c_parser_peek_token (parser)->keyword == keyword;
436 /* Return true if TOKEN can start a type name,
437 false otherwise. */
438 static bool
439 c_token_starts_typename (c_token *token)
441 switch (token->type)
443 case CPP_NAME:
444 switch (token->id_kind)
446 case C_ID_ID:
447 return false;
448 case C_ID_ADDRSPACE:
449 return true;
450 case C_ID_TYPENAME:
451 return true;
452 case C_ID_CLASSNAME:
453 gcc_assert (c_dialect_objc ());
454 return true;
455 default:
456 gcc_unreachable ();
458 case CPP_KEYWORD:
459 switch (token->keyword)
461 case RID_UNSIGNED:
462 case RID_LONG:
463 case RID_INT128:
464 case RID_SHORT:
465 case RID_SIGNED:
466 case RID_COMPLEX:
467 case RID_INT:
468 case RID_CHAR:
469 case RID_FLOAT:
470 case RID_DOUBLE:
471 case RID_VOID:
472 case RID_DFLOAT32:
473 case RID_DFLOAT64:
474 case RID_DFLOAT128:
475 case RID_BOOL:
476 case RID_ENUM:
477 case RID_STRUCT:
478 case RID_UNION:
479 case RID_TYPEOF:
480 case RID_CONST:
481 case RID_VOLATILE:
482 case RID_RESTRICT:
483 case RID_ATTRIBUTE:
484 case RID_FRACT:
485 case RID_ACCUM:
486 case RID_SAT:
487 return true;
488 default:
489 return false;
491 case CPP_LESS:
492 if (c_dialect_objc ())
493 return true;
494 return false;
495 default:
496 return false;
500 /* Return true if the next token from PARSER can start a type name,
501 false otherwise. */
502 static inline bool
503 c_parser_next_token_starts_typename (c_parser *parser)
505 c_token *token = c_parser_peek_token (parser);
506 return c_token_starts_typename (token);
509 /* Return true if TOKEN is a type qualifier, false otherwise. */
510 static bool
511 c_token_is_qualifier (c_token *token)
513 switch (token->type)
515 case CPP_NAME:
516 switch (token->id_kind)
518 case C_ID_ADDRSPACE:
519 return true;
520 default:
521 return false;
523 case CPP_KEYWORD:
524 switch (token->keyword)
526 case RID_CONST:
527 case RID_VOLATILE:
528 case RID_RESTRICT:
529 case RID_ATTRIBUTE:
530 return true;
531 default:
532 return false;
534 case CPP_LESS:
535 return false;
536 default:
537 gcc_unreachable ();
541 /* Return true if the next token from PARSER is a type qualifier,
542 false otherwise. */
543 static inline bool
544 c_parser_next_token_is_qualifier (c_parser *parser)
546 c_token *token = c_parser_peek_token (parser);
547 return c_token_is_qualifier (token);
550 /* Return true if TOKEN can start declaration specifiers, false
551 otherwise. */
552 static bool
553 c_token_starts_declspecs (c_token *token)
555 switch (token->type)
557 case CPP_NAME:
558 switch (token->id_kind)
560 case C_ID_ID:
561 return false;
562 case C_ID_ADDRSPACE:
563 return true;
564 case C_ID_TYPENAME:
565 return true;
566 case C_ID_CLASSNAME:
567 gcc_assert (c_dialect_objc ());
568 return true;
569 default:
570 gcc_unreachable ();
572 case CPP_KEYWORD:
573 switch (token->keyword)
575 case RID_STATIC:
576 case RID_EXTERN:
577 case RID_REGISTER:
578 case RID_TYPEDEF:
579 case RID_INLINE:
580 case RID_AUTO:
581 case RID_THREAD:
582 case RID_UNSIGNED:
583 case RID_LONG:
584 case RID_INT128:
585 case RID_SHORT:
586 case RID_SIGNED:
587 case RID_COMPLEX:
588 case RID_INT:
589 case RID_CHAR:
590 case RID_FLOAT:
591 case RID_DOUBLE:
592 case RID_VOID:
593 case RID_DFLOAT32:
594 case RID_DFLOAT64:
595 case RID_DFLOAT128:
596 case RID_BOOL:
597 case RID_ENUM:
598 case RID_STRUCT:
599 case RID_UNION:
600 case RID_TYPEOF:
601 case RID_CONST:
602 case RID_VOLATILE:
603 case RID_RESTRICT:
604 case RID_ATTRIBUTE:
605 case RID_FRACT:
606 case RID_ACCUM:
607 case RID_SAT:
608 return true;
609 default:
610 return false;
612 case CPP_LESS:
613 if (c_dialect_objc ())
614 return true;
615 return false;
616 default:
617 return false;
622 /* Return true if TOKEN can start declaration specifiers or a static
623 assertion, false otherwise. */
624 static bool
625 c_token_starts_declaration (c_token *token)
627 if (c_token_starts_declspecs (token)
628 || token->keyword == RID_STATIC_ASSERT)
629 return true;
630 else
631 return false;
634 static c_token *c_parser_peek_2nd_token (c_parser *parser);
636 /* Return true if the next token from PARSER can start declaration
637 specifiers, false otherwise. */
638 static inline bool
639 c_parser_next_token_starts_declspecs (c_parser *parser)
641 c_token *token = c_parser_peek_token (parser);
643 /* In Objective-C, a classname normally starts a declspecs unless it
644 is immediately followed by a dot. In that case, it is the
645 Objective-C 2.0 "dot-syntax" for class objects, ie, calls the
646 setter/getter on the class. c_token_starts_declspecs() can't
647 differentiate between the two cases because it only checks the
648 current token, so we have a special check here. */
649 if (c_dialect_objc ()
650 && token->type == CPP_NAME
651 && token->id_kind == C_ID_CLASSNAME
652 && c_parser_peek_2nd_token (parser)->type == CPP_DOT)
653 return false;
655 return c_token_starts_declspecs (token);
658 /* Return true if the next tokens from PARSER can start declaration
659 specifiers or a static assertion, false otherwise. */
660 static inline bool
661 c_parser_next_tokens_start_declaration (c_parser *parser)
663 c_token *token = c_parser_peek_token (parser);
665 /* Same as above. */
666 if (c_dialect_objc ()
667 && token->type == CPP_NAME
668 && token->id_kind == C_ID_CLASSNAME
669 && c_parser_peek_2nd_token (parser)->type == CPP_DOT)
670 return false;
672 /* Labels do not start declarations. */
673 if (token->type == CPP_NAME
674 && c_parser_peek_2nd_token (parser)->type == CPP_COLON)
675 return false;
677 if (c_token_starts_declaration (token))
678 return true;
680 /* Try a bit harder to detect an unknown typename. */
681 if (token->type == CPP_NAME
682 && token->id_kind == C_ID_ID
683 && (c_parser_peek_2nd_token (parser)->type == CPP_NAME
684 || c_parser_peek_2nd_token (parser)->type == CPP_MULT)
685 && !lookup_name (token->value)
687 /* Do not try too hard when we could have "object in array". */
688 && !parser->objc_could_be_foreach_context)
689 return true;
691 return false;
694 /* Return a pointer to the next-but-one token from PARSER, reading it
695 in if necessary. The next token is already read in. */
697 static c_token *
698 c_parser_peek_2nd_token (c_parser *parser)
700 if (parser->tokens_avail >= 2)
701 return &parser->tokens[1];
702 gcc_assert (parser->tokens_avail == 1);
703 gcc_assert (parser->tokens[0].type != CPP_EOF);
704 gcc_assert (parser->tokens[0].type != CPP_PRAGMA_EOL);
705 c_lex_one_token (parser, &parser->tokens[1]);
706 parser->tokens_avail = 2;
707 return &parser->tokens[1];
710 /* Consume the next token from PARSER. */
712 static void
713 c_parser_consume_token (c_parser *parser)
715 gcc_assert (parser->tokens_avail >= 1);
716 gcc_assert (parser->tokens[0].type != CPP_EOF);
717 gcc_assert (!parser->in_pragma || parser->tokens[0].type != CPP_PRAGMA_EOL);
718 gcc_assert (parser->error || parser->tokens[0].type != CPP_PRAGMA);
719 if (parser->tokens_avail == 2)
720 parser->tokens[0] = parser->tokens[1];
721 parser->tokens_avail--;
724 /* Expect the current token to be a #pragma. Consume it and remember
725 that we've begun parsing a pragma. */
727 static void
728 c_parser_consume_pragma (c_parser *parser)
730 gcc_assert (!parser->in_pragma);
731 gcc_assert (parser->tokens_avail >= 1);
732 gcc_assert (parser->tokens[0].type == CPP_PRAGMA);
733 if (parser->tokens_avail == 2)
734 parser->tokens[0] = parser->tokens[1];
735 parser->tokens_avail--;
736 parser->in_pragma = true;
739 /* Update the globals input_location and in_system_header from
740 TOKEN. */
741 static inline void
742 c_parser_set_source_position_from_token (c_token *token)
744 if (token->type != CPP_EOF)
746 input_location = token->location;
750 /* Issue a diagnostic of the form
751 FILE:LINE: MESSAGE before TOKEN
752 where TOKEN is the next token in the input stream of PARSER.
753 MESSAGE (specified by the caller) is usually of the form "expected
754 OTHER-TOKEN".
756 Do not issue a diagnostic if still recovering from an error.
758 ??? This is taken from the C++ parser, but building up messages in
759 this way is not i18n-friendly and some other approach should be
760 used. */
762 static void
763 c_parser_error (c_parser *parser, const char *gmsgid)
765 c_token *token = c_parser_peek_token (parser);
766 if (parser->error)
767 return;
768 parser->error = true;
769 if (!gmsgid)
770 return;
771 /* This diagnostic makes more sense if it is tagged to the line of
772 the token we just peeked at. */
773 c_parser_set_source_position_from_token (token);
774 c_parse_error (gmsgid,
775 /* Because c_parse_error does not understand
776 CPP_KEYWORD, keywords are treated like
777 identifiers. */
778 (token->type == CPP_KEYWORD ? CPP_NAME : token->type),
779 /* ??? The C parser does not save the cpp flags of a
780 token, we need to pass 0 here and we will not get
781 the source spelling of some tokens but rather the
782 canonical spelling. */
783 token->value, /*flags=*/0);
786 /* If the next token is of the indicated TYPE, consume it. Otherwise,
787 issue the error MSGID. If MSGID is NULL then a message has already
788 been produced and no message will be produced this time. Returns
789 true if found, false otherwise. */
791 static bool
792 c_parser_require (c_parser *parser,
793 enum cpp_ttype type,
794 const char *msgid)
796 if (c_parser_next_token_is (parser, type))
798 c_parser_consume_token (parser);
799 return true;
801 else
803 c_parser_error (parser, msgid);
804 return false;
808 /* If the next token is the indicated keyword, consume it. Otherwise,
809 issue the error MSGID. Returns true if found, false otherwise. */
811 static bool
812 c_parser_require_keyword (c_parser *parser,
813 enum rid keyword,
814 const char *msgid)
816 if (c_parser_next_token_is_keyword (parser, keyword))
818 c_parser_consume_token (parser);
819 return true;
821 else
823 c_parser_error (parser, msgid);
824 return false;
828 /* Like c_parser_require, except that tokens will be skipped until the
829 desired token is found. An error message is still produced if the
830 next token is not as expected. If MSGID is NULL then a message has
831 already been produced and no message will be produced this
832 time. */
834 static void
835 c_parser_skip_until_found (c_parser *parser,
836 enum cpp_ttype type,
837 const char *msgid)
839 unsigned nesting_depth = 0;
841 if (c_parser_require (parser, type, msgid))
842 return;
844 /* Skip tokens until the desired token is found. */
845 while (true)
847 /* Peek at the next token. */
848 c_token *token = c_parser_peek_token (parser);
849 /* If we've reached the token we want, consume it and stop. */
850 if (token->type == type && !nesting_depth)
852 c_parser_consume_token (parser);
853 break;
856 /* If we've run out of tokens, stop. */
857 if (token->type == CPP_EOF)
858 return;
859 if (token->type == CPP_PRAGMA_EOL && parser->in_pragma)
860 return;
861 if (token->type == CPP_OPEN_BRACE
862 || token->type == CPP_OPEN_PAREN
863 || token->type == CPP_OPEN_SQUARE)
864 ++nesting_depth;
865 else if (token->type == CPP_CLOSE_BRACE
866 || token->type == CPP_CLOSE_PAREN
867 || token->type == CPP_CLOSE_SQUARE)
869 if (nesting_depth-- == 0)
870 break;
872 /* Consume this token. */
873 c_parser_consume_token (parser);
875 parser->error = false;
878 /* Skip tokens until the end of a parameter is found, but do not
879 consume the comma, semicolon or closing delimiter. */
881 static void
882 c_parser_skip_to_end_of_parameter (c_parser *parser)
884 unsigned nesting_depth = 0;
886 while (true)
888 c_token *token = c_parser_peek_token (parser);
889 if ((token->type == CPP_COMMA || token->type == CPP_SEMICOLON)
890 && !nesting_depth)
891 break;
892 /* If we've run out of tokens, stop. */
893 if (token->type == CPP_EOF)
894 return;
895 if (token->type == CPP_PRAGMA_EOL && parser->in_pragma)
896 return;
897 if (token->type == CPP_OPEN_BRACE
898 || token->type == CPP_OPEN_PAREN
899 || token->type == CPP_OPEN_SQUARE)
900 ++nesting_depth;
901 else if (token->type == CPP_CLOSE_BRACE
902 || token->type == CPP_CLOSE_PAREN
903 || token->type == CPP_CLOSE_SQUARE)
905 if (nesting_depth-- == 0)
906 break;
908 /* Consume this token. */
909 c_parser_consume_token (parser);
911 parser->error = false;
914 /* Expect to be at the end of the pragma directive and consume an
915 end of line marker. */
917 static void
918 c_parser_skip_to_pragma_eol (c_parser *parser)
920 gcc_assert (parser->in_pragma);
921 parser->in_pragma = false;
923 if (!c_parser_require (parser, CPP_PRAGMA_EOL, "expected end of line"))
924 while (true)
926 c_token *token = c_parser_peek_token (parser);
927 if (token->type == CPP_EOF)
928 break;
929 if (token->type == CPP_PRAGMA_EOL)
931 c_parser_consume_token (parser);
932 break;
934 c_parser_consume_token (parser);
937 parser->error = false;
940 /* Skip tokens until we have consumed an entire block, or until we
941 have consumed a non-nested ';'. */
943 static void
944 c_parser_skip_to_end_of_block_or_statement (c_parser *parser)
946 unsigned nesting_depth = 0;
947 bool save_error = parser->error;
949 while (true)
951 c_token *token;
953 /* Peek at the next token. */
954 token = c_parser_peek_token (parser);
956 switch (token->type)
958 case CPP_EOF:
959 return;
961 case CPP_PRAGMA_EOL:
962 if (parser->in_pragma)
963 return;
964 break;
966 case CPP_SEMICOLON:
967 /* If the next token is a ';', we have reached the
968 end of the statement. */
969 if (!nesting_depth)
971 /* Consume the ';'. */
972 c_parser_consume_token (parser);
973 goto finished;
975 break;
977 case CPP_CLOSE_BRACE:
978 /* If the next token is a non-nested '}', then we have
979 reached the end of the current block. */
980 if (nesting_depth == 0 || --nesting_depth == 0)
982 c_parser_consume_token (parser);
983 goto finished;
985 break;
987 case CPP_OPEN_BRACE:
988 /* If it the next token is a '{', then we are entering a new
989 block. Consume the entire block. */
990 ++nesting_depth;
991 break;
993 case CPP_PRAGMA:
994 /* If we see a pragma, consume the whole thing at once. We
995 have some safeguards against consuming pragmas willy-nilly.
996 Normally, we'd expect to be here with parser->error set,
997 which disables these safeguards. But it's possible to get
998 here for secondary error recovery, after parser->error has
999 been cleared. */
1000 c_parser_consume_pragma (parser);
1001 c_parser_skip_to_pragma_eol (parser);
1002 parser->error = save_error;
1003 continue;
1005 default:
1006 break;
1009 c_parser_consume_token (parser);
1012 finished:
1013 parser->error = false;
1016 /* CPP's options (initialized by c-opts.c). */
1017 extern cpp_options *cpp_opts;
1019 /* Save the warning flags which are controlled by __extension__. */
1021 static inline int
1022 disable_extension_diagnostics (void)
1024 int ret = (pedantic
1025 | (warn_pointer_arith << 1)
1026 | (warn_traditional << 2)
1027 | (flag_iso << 3)
1028 | (warn_long_long << 4)
1029 | (warn_cxx_compat << 5));
1030 cpp_opts->cpp_pedantic = pedantic = 0;
1031 warn_pointer_arith = 0;
1032 cpp_opts->cpp_warn_traditional = warn_traditional = 0;
1033 flag_iso = 0;
1034 cpp_opts->cpp_warn_long_long = warn_long_long = 0;
1035 warn_cxx_compat = 0;
1036 return ret;
1039 /* Restore the warning flags which are controlled by __extension__.
1040 FLAGS is the return value from disable_extension_diagnostics. */
1042 static inline void
1043 restore_extension_diagnostics (int flags)
1045 cpp_opts->cpp_pedantic = pedantic = flags & 1;
1046 warn_pointer_arith = (flags >> 1) & 1;
1047 cpp_opts->cpp_warn_traditional = warn_traditional = (flags >> 2) & 1;
1048 flag_iso = (flags >> 3) & 1;
1049 cpp_opts->cpp_warn_long_long = warn_long_long = (flags >> 4) & 1;
1050 warn_cxx_compat = (flags >> 5) & 1;
1053 /* Possibly kinds of declarator to parse. */
1054 typedef enum c_dtr_syn {
1055 /* A normal declarator with an identifier. */
1056 C_DTR_NORMAL,
1057 /* An abstract declarator (maybe empty). */
1058 C_DTR_ABSTRACT,
1059 /* A parameter declarator: may be either, but after a type name does
1060 not redeclare a typedef name as an identifier if it can
1061 alternatively be interpreted as a typedef name; see DR#009,
1062 applied in C90 TC1, omitted from C99 and reapplied in C99 TC2
1063 following DR#249. For example, given a typedef T, "int T" and
1064 "int *T" are valid parameter declarations redeclaring T, while
1065 "int (T)" and "int * (T)" and "int (T[])" and "int (T (int))" are
1066 abstract declarators rather than involving redundant parentheses;
1067 the same applies with attributes inside the parentheses before
1068 "T". */
1069 C_DTR_PARM
1070 } c_dtr_syn;
1072 static void c_parser_external_declaration (c_parser *);
1073 static void c_parser_asm_definition (c_parser *);
1074 static void c_parser_declaration_or_fndef (c_parser *, bool, bool, bool,
1075 bool, bool, tree *);
1076 static void c_parser_static_assert_declaration_no_semi (c_parser *);
1077 static void c_parser_static_assert_declaration (c_parser *);
1078 static void c_parser_declspecs (c_parser *, struct c_declspecs *, bool, bool,
1079 bool);
1080 static struct c_typespec c_parser_enum_specifier (c_parser *);
1081 static struct c_typespec c_parser_struct_or_union_specifier (c_parser *);
1082 static tree c_parser_struct_declaration (c_parser *);
1083 static struct c_typespec c_parser_typeof_specifier (c_parser *);
1084 static struct c_declarator *c_parser_declarator (c_parser *, bool, c_dtr_syn,
1085 bool *);
1086 static struct c_declarator *c_parser_direct_declarator (c_parser *, bool,
1087 c_dtr_syn, bool *);
1088 static struct c_declarator *c_parser_direct_declarator_inner (c_parser *,
1089 bool,
1090 struct c_declarator *);
1091 static struct c_arg_info *c_parser_parms_declarator (c_parser *, bool, tree);
1092 static struct c_arg_info *c_parser_parms_list_declarator (c_parser *, tree);
1093 static struct c_parm *c_parser_parameter_declaration (c_parser *, tree);
1094 static tree c_parser_simple_asm_expr (c_parser *);
1095 static tree c_parser_attributes (c_parser *);
1096 static struct c_type_name *c_parser_type_name (c_parser *);
1097 static struct c_expr c_parser_initializer (c_parser *);
1098 static struct c_expr c_parser_braced_init (c_parser *, tree, bool);
1099 static void c_parser_initelt (c_parser *, struct obstack *);
1100 static void c_parser_initval (c_parser *, struct c_expr *,
1101 struct obstack *);
1102 static tree c_parser_compound_statement (c_parser *);
1103 static void c_parser_compound_statement_nostart (c_parser *);
1104 static void c_parser_label (c_parser *);
1105 static void c_parser_statement (c_parser *);
1106 static void c_parser_statement_after_labels (c_parser *);
1107 static void c_parser_if_statement (c_parser *);
1108 static void c_parser_switch_statement (c_parser *);
1109 static void c_parser_while_statement (c_parser *);
1110 static void c_parser_do_statement (c_parser *);
1111 static void c_parser_for_statement (c_parser *);
1112 static tree c_parser_asm_statement (c_parser *);
1113 static tree c_parser_asm_operands (c_parser *, bool);
1114 static tree c_parser_asm_goto_operands (c_parser *);
1115 static tree c_parser_asm_clobbers (c_parser *);
1116 static struct c_expr c_parser_expr_no_commas (c_parser *, struct c_expr *);
1117 static struct c_expr c_parser_conditional_expression (c_parser *,
1118 struct c_expr *);
1119 static struct c_expr c_parser_binary_expression (c_parser *, struct c_expr *);
1120 static struct c_expr c_parser_cast_expression (c_parser *, struct c_expr *);
1121 static struct c_expr c_parser_unary_expression (c_parser *);
1122 static struct c_expr c_parser_sizeof_expression (c_parser *);
1123 static struct c_expr c_parser_alignof_expression (c_parser *);
1124 static struct c_expr c_parser_postfix_expression (c_parser *);
1125 static struct c_expr c_parser_postfix_expression_after_paren_type (c_parser *,
1126 struct c_type_name *,
1127 location_t);
1128 static struct c_expr c_parser_postfix_expression_after_primary (c_parser *,
1129 location_t loc,
1130 struct c_expr);
1131 static struct c_expr c_parser_expression (c_parser *);
1132 static struct c_expr c_parser_expression_conv (c_parser *);
1133 static VEC(tree,gc) *c_parser_expr_list (c_parser *, bool, bool,
1134 VEC(tree,gc) **);
1135 static void c_parser_omp_construct (c_parser *);
1136 static void c_parser_omp_threadprivate (c_parser *);
1137 static void c_parser_omp_barrier (c_parser *);
1138 static void c_parser_omp_flush (c_parser *);
1139 static void c_parser_omp_taskwait (c_parser *);
1141 enum pragma_context { pragma_external, pragma_stmt, pragma_compound };
1142 static bool c_parser_pragma (c_parser *, enum pragma_context);
1144 /* These Objective-C parser functions are only ever called when
1145 compiling Objective-C. */
1146 static void c_parser_objc_class_definition (c_parser *, tree);
1147 static void c_parser_objc_class_instance_variables (c_parser *);
1148 static void c_parser_objc_class_declaration (c_parser *);
1149 static void c_parser_objc_alias_declaration (c_parser *);
1150 static void c_parser_objc_protocol_definition (c_parser *, tree);
1151 static bool c_parser_objc_method_type (c_parser *);
1152 static void c_parser_objc_method_definition (c_parser *);
1153 static void c_parser_objc_methodprotolist (c_parser *);
1154 static void c_parser_objc_methodproto (c_parser *);
1155 static tree c_parser_objc_method_decl (c_parser *, bool, tree *);
1156 static tree c_parser_objc_type_name (c_parser *);
1157 static tree c_parser_objc_protocol_refs (c_parser *);
1158 static void c_parser_objc_try_catch_finally_statement (c_parser *);
1159 static void c_parser_objc_synchronized_statement (c_parser *);
1160 static tree c_parser_objc_selector (c_parser *);
1161 static tree c_parser_objc_selector_arg (c_parser *);
1162 static tree c_parser_objc_receiver (c_parser *);
1163 static tree c_parser_objc_message_args (c_parser *);
1164 static tree c_parser_objc_keywordexpr (c_parser *);
1165 static void c_parser_objc_at_property_declaration (c_parser *);
1166 static void c_parser_objc_at_synthesize_declaration (c_parser *);
1167 static void c_parser_objc_at_dynamic_declaration (c_parser *);
1168 static bool c_parser_objc_diagnose_bad_element_prefix
1169 (c_parser *, struct c_declspecs *);
1171 /* Parse a translation unit (C90 6.7, C99 6.9).
1173 translation-unit:
1174 external-declarations
1176 external-declarations:
1177 external-declaration
1178 external-declarations external-declaration
1180 GNU extensions:
1182 translation-unit:
1183 empty
1186 static void
1187 c_parser_translation_unit (c_parser *parser)
1189 if (c_parser_next_token_is (parser, CPP_EOF))
1191 pedwarn (c_parser_peek_token (parser)->location, OPT_pedantic,
1192 "ISO C forbids an empty translation unit");
1194 else
1196 void *obstack_position = obstack_alloc (&parser_obstack, 0);
1197 mark_valid_location_for_stdc_pragma (false);
1200 ggc_collect ();
1201 c_parser_external_declaration (parser);
1202 obstack_free (&parser_obstack, obstack_position);
1204 while (c_parser_next_token_is_not (parser, CPP_EOF));
1208 /* Parse an external declaration (C90 6.7, C99 6.9).
1210 external-declaration:
1211 function-definition
1212 declaration
1214 GNU extensions:
1216 external-declaration:
1217 asm-definition
1219 __extension__ external-declaration
1221 Objective-C:
1223 external-declaration:
1224 objc-class-definition
1225 objc-class-declaration
1226 objc-alias-declaration
1227 objc-protocol-definition
1228 objc-method-definition
1229 @end
1232 static void
1233 c_parser_external_declaration (c_parser *parser)
1235 int ext;
1236 switch (c_parser_peek_token (parser)->type)
1238 case CPP_KEYWORD:
1239 switch (c_parser_peek_token (parser)->keyword)
1241 case RID_EXTENSION:
1242 ext = disable_extension_diagnostics ();
1243 c_parser_consume_token (parser);
1244 c_parser_external_declaration (parser);
1245 restore_extension_diagnostics (ext);
1246 break;
1247 case RID_ASM:
1248 c_parser_asm_definition (parser);
1249 break;
1250 case RID_AT_INTERFACE:
1251 case RID_AT_IMPLEMENTATION:
1252 gcc_assert (c_dialect_objc ());
1253 c_parser_objc_class_definition (parser, NULL_TREE);
1254 break;
1255 case RID_AT_CLASS:
1256 gcc_assert (c_dialect_objc ());
1257 c_parser_objc_class_declaration (parser);
1258 break;
1259 case RID_AT_ALIAS:
1260 gcc_assert (c_dialect_objc ());
1261 c_parser_objc_alias_declaration (parser);
1262 break;
1263 case RID_AT_PROTOCOL:
1264 gcc_assert (c_dialect_objc ());
1265 c_parser_objc_protocol_definition (parser, NULL_TREE);
1266 break;
1267 case RID_AT_PROPERTY:
1268 gcc_assert (c_dialect_objc ());
1269 c_parser_objc_at_property_declaration (parser);
1270 break;
1271 case RID_AT_SYNTHESIZE:
1272 gcc_assert (c_dialect_objc ());
1273 c_parser_objc_at_synthesize_declaration (parser);
1274 break;
1275 case RID_AT_DYNAMIC:
1276 gcc_assert (c_dialect_objc ());
1277 c_parser_objc_at_dynamic_declaration (parser);
1278 break;
1279 case RID_AT_END:
1280 gcc_assert (c_dialect_objc ());
1281 c_parser_consume_token (parser);
1282 objc_finish_implementation ();
1283 break;
1284 default:
1285 goto decl_or_fndef;
1287 break;
1288 case CPP_SEMICOLON:
1289 pedwarn (c_parser_peek_token (parser)->location, OPT_pedantic,
1290 "ISO C does not allow extra %<;%> outside of a function");
1291 c_parser_consume_token (parser);
1292 break;
1293 case CPP_PRAGMA:
1294 mark_valid_location_for_stdc_pragma (true);
1295 c_parser_pragma (parser, pragma_external);
1296 mark_valid_location_for_stdc_pragma (false);
1297 break;
1298 case CPP_PLUS:
1299 case CPP_MINUS:
1300 if (c_dialect_objc ())
1302 c_parser_objc_method_definition (parser);
1303 break;
1305 /* Else fall through, and yield a syntax error trying to parse
1306 as a declaration or function definition. */
1307 default:
1308 decl_or_fndef:
1309 /* A declaration or a function definition (or, in Objective-C,
1310 an @interface or @protocol with prefix attributes). We can
1311 only tell which after parsing the declaration specifiers, if
1312 any, and the first declarator. */
1313 c_parser_declaration_or_fndef (parser, true, true, true, false, true, NULL);
1314 break;
1318 /* Parse a declaration or function definition (C90 6.5, 6.7.1, C99
1319 6.7, 6.9.1). If FNDEF_OK is true, a function definition is
1320 accepted; otherwise (old-style parameter declarations) only other
1321 declarations are accepted. If STATIC_ASSERT_OK is true, a static
1322 assertion is accepted; otherwise (old-style parameter declarations)
1323 it is not. If NESTED is true, we are inside a function or parsing
1324 old-style parameter declarations; any functions encountered are
1325 nested functions and declaration specifiers are required; otherwise
1326 we are at top level and functions are normal functions and
1327 declaration specifiers may be optional. If EMPTY_OK is true, empty
1328 declarations are OK (subject to all other constraints); otherwise
1329 (old-style parameter declarations) they are diagnosed. If
1330 START_ATTR_OK is true, the declaration specifiers may start with
1331 attributes; otherwise they may not.
1332 OBJC_FOREACH_OBJECT_DECLARATION can be used to get back the parsed
1333 declaration when parsing an Objective-C foreach statement.
1335 declaration:
1336 declaration-specifiers init-declarator-list[opt] ;
1337 static_assert-declaration
1339 function-definition:
1340 declaration-specifiers[opt] declarator declaration-list[opt]
1341 compound-statement
1343 declaration-list:
1344 declaration
1345 declaration-list declaration
1347 init-declarator-list:
1348 init-declarator
1349 init-declarator-list , init-declarator
1351 init-declarator:
1352 declarator simple-asm-expr[opt] attributes[opt]
1353 declarator simple-asm-expr[opt] attributes[opt] = initializer
1355 GNU extensions:
1357 nested-function-definition:
1358 declaration-specifiers declarator declaration-list[opt]
1359 compound-statement
1361 Objective-C:
1362 attributes objc-class-definition
1363 attributes objc-category-definition
1364 attributes objc-protocol-definition
1366 The simple-asm-expr and attributes are GNU extensions.
1368 This function does not handle __extension__; that is handled in its
1369 callers. ??? Following the old parser, __extension__ may start
1370 external declarations, declarations in functions and declarations
1371 at the start of "for" loops, but not old-style parameter
1372 declarations.
1374 C99 requires declaration specifiers in a function definition; the
1375 absence is diagnosed through the diagnosis of implicit int. In GNU
1376 C we also allow but diagnose declarations without declaration
1377 specifiers, but only at top level (elsewhere they conflict with
1378 other syntax).
1380 In Objective-C, declarations of the looping variable in a foreach
1381 statement are exceptionally terminated by 'in' (for example, 'for
1382 (NSObject *object in array) { ... }').
1384 OpenMP:
1386 declaration:
1387 threadprivate-directive */
1389 static void
1390 c_parser_declaration_or_fndef (c_parser *parser, bool fndef_ok,
1391 bool static_assert_ok, bool empty_ok,
1392 bool nested, bool start_attr_ok,
1393 tree *objc_foreach_object_declaration)
1395 struct c_declspecs *specs;
1396 tree prefix_attrs;
1397 tree all_prefix_attrs;
1398 bool diagnosed_no_specs = false;
1399 location_t here = c_parser_peek_token (parser)->location;
1401 if (static_assert_ok
1402 && c_parser_next_token_is_keyword (parser, RID_STATIC_ASSERT))
1404 c_parser_static_assert_declaration (parser);
1405 return;
1407 specs = build_null_declspecs ();
1409 /* Try to detect an unknown type name when we have "A B" or "A *B". */
1410 if (c_parser_peek_token (parser)->type == CPP_NAME
1411 && c_parser_peek_token (parser)->id_kind == C_ID_ID
1412 && (c_parser_peek_2nd_token (parser)->type == CPP_NAME
1413 || c_parser_peek_2nd_token (parser)->type == CPP_MULT)
1414 && (!nested || !lookup_name (c_parser_peek_token (parser)->value)))
1416 error_at (here, "unknown type name %qE",
1417 c_parser_peek_token (parser)->value);
1419 /* Parse declspecs normally to get a correct pointer type, but avoid
1420 a further "fails to be a type name" error. Refuse nested functions
1421 since it is not how the user likely wants us to recover. */
1422 c_parser_peek_token (parser)->type = CPP_KEYWORD;
1423 c_parser_peek_token (parser)->keyword = RID_VOID;
1424 c_parser_peek_token (parser)->value = error_mark_node;
1425 fndef_ok = !nested;
1428 c_parser_declspecs (parser, specs, true, true, start_attr_ok);
1429 if (parser->error)
1431 c_parser_skip_to_end_of_block_or_statement (parser);
1432 return;
1434 if (nested && !specs->declspecs_seen_p)
1436 c_parser_error (parser, "expected declaration specifiers");
1437 c_parser_skip_to_end_of_block_or_statement (parser);
1438 return;
1440 finish_declspecs (specs);
1441 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
1443 if (empty_ok)
1444 shadow_tag (specs);
1445 else
1447 shadow_tag_warned (specs, 1);
1448 pedwarn (here, 0, "empty declaration");
1450 c_parser_consume_token (parser);
1451 return;
1454 /* Provide better error recovery. Note that a type name here is usually
1455 better diagnosed as a redeclaration. */
1456 if (empty_ok
1457 && specs->typespec_kind == ctsk_tagdef
1458 && c_parser_next_token_starts_declspecs (parser)
1459 && !c_parser_next_token_is (parser, CPP_NAME))
1461 c_parser_error (parser, "expected %<;%>, identifier or %<(%>");
1462 parser->error = false;
1463 shadow_tag_warned (specs, 1);
1464 return;
1466 else if (c_dialect_objc ())
1468 /* Prefix attributes are an error on method decls. */
1469 switch (c_parser_peek_token (parser)->type)
1471 case CPP_PLUS:
1472 case CPP_MINUS:
1473 if (c_parser_objc_diagnose_bad_element_prefix (parser, specs))
1474 return;
1475 if (specs->attrs)
1477 warning_at (c_parser_peek_token (parser)->location,
1478 OPT_Wattributes,
1479 "prefix attributes are ignored for methods");
1480 specs->attrs = NULL_TREE;
1482 if (fndef_ok)
1483 c_parser_objc_method_definition (parser);
1484 else
1485 c_parser_objc_methodproto (parser);
1486 return;
1487 break;
1488 default:
1489 break;
1491 /* This is where we parse 'attributes @interface ...',
1492 'attributes @implementation ...', 'attributes @protocol ...'
1493 (where attributes could be, for example, __attribute__
1494 ((deprecated)).
1496 switch (c_parser_peek_token (parser)->keyword)
1498 case RID_AT_INTERFACE:
1500 if (c_parser_objc_diagnose_bad_element_prefix (parser, specs))
1501 return;
1502 c_parser_objc_class_definition (parser, specs->attrs);
1503 return;
1505 break;
1506 case RID_AT_IMPLEMENTATION:
1508 if (c_parser_objc_diagnose_bad_element_prefix (parser, specs))
1509 return;
1510 if (specs->attrs)
1512 warning_at (c_parser_peek_token (parser)->location,
1513 OPT_Wattributes,
1514 "prefix attributes are ignored for implementations");
1515 specs->attrs = NULL_TREE;
1517 c_parser_objc_class_definition (parser, NULL_TREE);
1518 return;
1520 break;
1521 case RID_AT_PROTOCOL:
1523 if (c_parser_objc_diagnose_bad_element_prefix (parser, specs))
1524 return;
1525 c_parser_objc_protocol_definition (parser, specs->attrs);
1526 return;
1528 break;
1529 case RID_AT_ALIAS:
1530 case RID_AT_CLASS:
1531 case RID_AT_END:
1532 case RID_AT_PROPERTY:
1533 if (specs->attrs)
1535 c_parser_error (parser,
1536 "attributes may not be specified before" );
1537 specs->attrs = NULL;
1539 break;
1540 default:
1541 break;
1545 pending_xref_error ();
1546 prefix_attrs = specs->attrs;
1547 all_prefix_attrs = prefix_attrs;
1548 specs->attrs = NULL_TREE;
1549 while (true)
1551 struct c_declarator *declarator;
1552 bool dummy = false;
1553 tree fnbody;
1554 /* Declaring either one or more declarators (in which case we
1555 should diagnose if there were no declaration specifiers) or a
1556 function definition (in which case the diagnostic for
1557 implicit int suffices). */
1558 declarator = c_parser_declarator (parser,
1559 specs->typespec_kind != ctsk_none,
1560 C_DTR_NORMAL, &dummy);
1561 if (declarator == NULL)
1563 c_parser_skip_to_end_of_block_or_statement (parser);
1564 return;
1566 if (c_parser_next_token_is (parser, CPP_EQ)
1567 || c_parser_next_token_is (parser, CPP_COMMA)
1568 || c_parser_next_token_is (parser, CPP_SEMICOLON)
1569 || c_parser_next_token_is_keyword (parser, RID_ASM)
1570 || c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE)
1571 || c_parser_next_token_is_keyword (parser, RID_IN))
1573 tree asm_name = NULL_TREE;
1574 tree postfix_attrs = NULL_TREE;
1575 if (!diagnosed_no_specs && !specs->declspecs_seen_p)
1577 diagnosed_no_specs = true;
1578 pedwarn (here, 0, "data definition has no type or storage class");
1580 /* Having seen a data definition, there cannot now be a
1581 function definition. */
1582 fndef_ok = false;
1583 if (c_parser_next_token_is_keyword (parser, RID_ASM))
1584 asm_name = c_parser_simple_asm_expr (parser);
1585 if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
1586 postfix_attrs = c_parser_attributes (parser);
1587 if (c_parser_next_token_is (parser, CPP_EQ))
1589 tree d;
1590 struct c_expr init;
1591 location_t init_loc;
1592 c_parser_consume_token (parser);
1593 /* The declaration of the variable is in effect while
1594 its initializer is parsed. */
1595 d = start_decl (declarator, specs, true,
1596 chainon (postfix_attrs, all_prefix_attrs));
1597 if (!d)
1598 d = error_mark_node;
1599 start_init (d, asm_name, global_bindings_p ());
1600 init_loc = c_parser_peek_token (parser)->location;
1601 init = c_parser_initializer (parser);
1602 finish_init ();
1603 if (d != error_mark_node)
1605 maybe_warn_string_init (TREE_TYPE (d), init);
1606 finish_decl (d, init_loc, init.value,
1607 init.original_type, asm_name);
1610 else
1612 tree d = start_decl (declarator, specs, false,
1613 chainon (postfix_attrs,
1614 all_prefix_attrs));
1615 if (d)
1616 finish_decl (d, UNKNOWN_LOCATION, NULL_TREE,
1617 NULL_TREE, asm_name);
1619 if (c_parser_next_token_is_keyword (parser, RID_IN))
1621 if (d)
1622 *objc_foreach_object_declaration = d;
1623 else
1624 *objc_foreach_object_declaration = error_mark_node;
1627 if (c_parser_next_token_is (parser, CPP_COMMA))
1629 c_parser_consume_token (parser);
1630 if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
1631 all_prefix_attrs = chainon (c_parser_attributes (parser),
1632 prefix_attrs);
1633 else
1634 all_prefix_attrs = prefix_attrs;
1635 continue;
1637 else if (c_parser_next_token_is (parser, CPP_SEMICOLON))
1639 c_parser_consume_token (parser);
1640 return;
1642 else if (c_parser_next_token_is_keyword (parser, RID_IN))
1644 /* This can only happen in Objective-C: we found the
1645 'in' that terminates the declaration inside an
1646 Objective-C foreach statement. Do not consume the
1647 token, so that the caller can use it to determine
1648 that this indeed is a foreach context. */
1649 return;
1651 else
1653 c_parser_error (parser, "expected %<,%> or %<;%>");
1654 c_parser_skip_to_end_of_block_or_statement (parser);
1655 return;
1658 else if (!fndef_ok)
1660 c_parser_error (parser, "expected %<=%>, %<,%>, %<;%>, "
1661 "%<asm%> or %<__attribute__%>");
1662 c_parser_skip_to_end_of_block_or_statement (parser);
1663 return;
1665 /* Function definition (nested or otherwise). */
1666 if (nested)
1668 pedwarn (here, OPT_pedantic, "ISO C forbids nested functions");
1669 c_push_function_context ();
1671 if (!start_function (specs, declarator, all_prefix_attrs))
1673 /* This can appear in many cases looking nothing like a
1674 function definition, so we don't give a more specific
1675 error suggesting there was one. */
1676 c_parser_error (parser, "expected %<=%>, %<,%>, %<;%>, %<asm%> "
1677 "or %<__attribute__%>");
1678 if (nested)
1679 c_pop_function_context ();
1680 break;
1682 /* Parse old-style parameter declarations. ??? Attributes are
1683 not allowed to start declaration specifiers here because of a
1684 syntax conflict between a function declaration with attribute
1685 suffix and a function definition with an attribute prefix on
1686 first old-style parameter declaration. Following the old
1687 parser, they are not accepted on subsequent old-style
1688 parameter declarations either. However, there is no
1689 ambiguity after the first declaration, nor indeed on the
1690 first as long as we don't allow postfix attributes after a
1691 declarator with a nonempty identifier list in a definition;
1692 and postfix attributes have never been accepted here in
1693 function definitions either. */
1694 while (c_parser_next_token_is_not (parser, CPP_EOF)
1695 && c_parser_next_token_is_not (parser, CPP_OPEN_BRACE))
1696 c_parser_declaration_or_fndef (parser, false, false, false,
1697 true, false, NULL);
1698 store_parm_decls ();
1699 DECL_STRUCT_FUNCTION (current_function_decl)->function_start_locus
1700 = c_parser_peek_token (parser)->location;
1701 fnbody = c_parser_compound_statement (parser);
1702 if (nested)
1704 tree decl = current_function_decl;
1705 /* Mark nested functions as needing static-chain initially.
1706 lower_nested_functions will recompute it but the
1707 DECL_STATIC_CHAIN flag is also used before that happens,
1708 by initializer_constant_valid_p. See gcc.dg/nested-fn-2.c. */
1709 DECL_STATIC_CHAIN (decl) = 1;
1710 add_stmt (fnbody);
1711 finish_function ();
1712 c_pop_function_context ();
1713 add_stmt (build_stmt (DECL_SOURCE_LOCATION (decl), DECL_EXPR, decl));
1715 else
1717 add_stmt (fnbody);
1718 finish_function ();
1720 break;
1724 /* Parse an asm-definition (asm() outside a function body). This is a
1725 GNU extension.
1727 asm-definition:
1728 simple-asm-expr ;
1731 static void
1732 c_parser_asm_definition (c_parser *parser)
1734 tree asm_str = c_parser_simple_asm_expr (parser);
1735 if (asm_str)
1736 cgraph_add_asm_node (asm_str);
1737 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
1740 /* Parse a static assertion (C1X N1425 6.7.10).
1742 static_assert-declaration:
1743 static_assert-declaration-no-semi ;
1746 static void
1747 c_parser_static_assert_declaration (c_parser *parser)
1749 c_parser_static_assert_declaration_no_semi (parser);
1750 if (parser->error
1751 || !c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>"))
1752 c_parser_skip_to_end_of_block_or_statement (parser);
1755 /* Parse a static assertion (C1X N1425 6.7.10), without the trailing
1756 semicolon.
1758 static_assert-declaration-no-semi:
1759 _Static_assert ( constant-expression , string-literal )
1762 static void
1763 c_parser_static_assert_declaration_no_semi (c_parser *parser)
1765 location_t assert_loc, value_loc;
1766 tree value;
1767 tree string;
1769 gcc_assert (c_parser_next_token_is_keyword (parser, RID_STATIC_ASSERT));
1770 assert_loc = c_parser_peek_token (parser)->location;
1771 if (!flag_isoc1x)
1773 if (flag_isoc99)
1774 pedwarn (assert_loc, OPT_pedantic,
1775 "ISO C99 does not support %<_Static_assert%>");
1776 else
1777 pedwarn (assert_loc, OPT_pedantic,
1778 "ISO C90 does not support %<_Static_assert%>");
1780 c_parser_consume_token (parser);
1781 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
1782 return;
1783 value_loc = c_parser_peek_token (parser)->location;
1784 value = c_parser_expr_no_commas (parser, NULL).value;
1785 parser->lex_untranslated_string = true;
1786 if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
1788 parser->lex_untranslated_string = false;
1789 return;
1791 switch (c_parser_peek_token (parser)->type)
1793 case CPP_STRING:
1794 case CPP_STRING16:
1795 case CPP_STRING32:
1796 case CPP_WSTRING:
1797 case CPP_UTF8STRING:
1798 string = c_parser_peek_token (parser)->value;
1799 c_parser_consume_token (parser);
1800 parser->lex_untranslated_string = false;
1801 break;
1802 default:
1803 c_parser_error (parser, "expected string literal");
1804 parser->lex_untranslated_string = false;
1805 return;
1807 c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>");
1809 if (!INTEGRAL_TYPE_P (TREE_TYPE (value)))
1811 error_at (value_loc, "expression in static assertion is not an integer");
1812 return;
1814 if (TREE_CODE (value) != INTEGER_CST)
1816 value = c_fully_fold (value, false, NULL);
1817 if (TREE_CODE (value) == INTEGER_CST)
1818 pedwarn (value_loc, OPT_pedantic, "expression in static assertion "
1819 "is not an integer constant expression");
1821 if (TREE_CODE (value) != INTEGER_CST)
1823 error_at (value_loc, "expression in static assertion is not constant");
1824 return;
1826 constant_expression_warning (value);
1827 if (integer_zerop (value))
1828 error_at (assert_loc, "static assertion failed: %E", string);
1831 /* Parse some declaration specifiers (possibly none) (C90 6.5, C99
1832 6.7), adding them to SPECS (which may already include some).
1833 Storage class specifiers are accepted iff SCSPEC_OK; type
1834 specifiers are accepted iff TYPESPEC_OK; attributes are accepted at
1835 the start iff START_ATTR_OK.
1837 declaration-specifiers:
1838 storage-class-specifier declaration-specifiers[opt]
1839 type-specifier declaration-specifiers[opt]
1840 type-qualifier declaration-specifiers[opt]
1841 function-specifier declaration-specifiers[opt]
1843 Function specifiers (inline) are from C99, and are currently
1844 handled as storage class specifiers, as is __thread.
1846 C90 6.5.1, C99 6.7.1:
1847 storage-class-specifier:
1848 typedef
1849 extern
1850 static
1851 auto
1852 register
1854 C99 6.7.4:
1855 function-specifier:
1856 inline
1858 C90 6.5.2, C99 6.7.2:
1859 type-specifier:
1860 void
1861 char
1862 short
1864 long
1865 float
1866 double
1867 signed
1868 unsigned
1869 _Bool
1870 _Complex
1871 [_Imaginary removed in C99 TC2]
1872 struct-or-union-specifier
1873 enum-specifier
1874 typedef-name
1876 (_Bool and _Complex are new in C99.)
1878 C90 6.5.3, C99 6.7.3:
1880 type-qualifier:
1881 const
1882 restrict
1883 volatile
1884 address-space-qualifier
1886 (restrict is new in C99.)
1888 GNU extensions:
1890 declaration-specifiers:
1891 attributes declaration-specifiers[opt]
1893 type-qualifier:
1894 address-space
1896 address-space:
1897 identifier recognized by the target
1899 storage-class-specifier:
1900 __thread
1902 type-specifier:
1903 typeof-specifier
1904 __int128
1905 _Decimal32
1906 _Decimal64
1907 _Decimal128
1908 _Fract
1909 _Accum
1910 _Sat
1912 (_Fract, _Accum, and _Sat are new from ISO/IEC DTR 18037:
1913 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1169.pdf)
1915 Objective-C:
1917 type-specifier:
1918 class-name objc-protocol-refs[opt]
1919 typedef-name objc-protocol-refs
1920 objc-protocol-refs
1923 static void
1924 c_parser_declspecs (c_parser *parser, struct c_declspecs *specs,
1925 bool scspec_ok, bool typespec_ok, bool start_attr_ok)
1927 bool attrs_ok = start_attr_ok;
1928 bool seen_type = specs->typespec_kind != ctsk_none;
1929 while ((c_parser_next_token_is (parser, CPP_NAME)
1930 && c_parser_peek_token (parser)->id_kind != C_ID_ID)
1931 || c_parser_next_token_is (parser, CPP_KEYWORD)
1932 || (c_dialect_objc () && c_parser_next_token_is (parser, CPP_LESS)))
1934 struct c_typespec t;
1935 tree attrs;
1936 location_t loc = c_parser_peek_token (parser)->location;
1938 if (!c_parser_next_token_is_qualifier (parser))
1940 /* Exit for TYPENAMEs after any type because they can appear as a
1941 field name. */
1942 if (seen_type && c_parser_next_token_is (parser, CPP_NAME))
1943 break;
1945 /* If we cannot accept a type, and the next token must start one,
1946 exit. Do the same if we already have seen a tagged definition,
1947 since it would be an error anyway and likely the user has simply
1948 forgotten a semicolon. */
1949 if ((!typespec_ok || specs->typespec_kind == ctsk_tagdef)
1950 && c_parser_next_token_starts_typename (parser))
1951 break;
1954 if (c_parser_next_token_is (parser, CPP_NAME))
1956 tree value = c_parser_peek_token (parser)->value;
1957 c_id_kind kind = c_parser_peek_token (parser)->id_kind;
1959 if (kind == C_ID_ADDRSPACE)
1961 addr_space_t as
1962 = c_parser_peek_token (parser)->keyword - RID_FIRST_ADDR_SPACE;
1963 declspecs_add_addrspace (specs, as);
1964 c_parser_consume_token (parser);
1965 attrs_ok = true;
1966 continue;
1969 /* Now at a C_ID_TYPENAME or C_ID_CLASSNAME. */
1970 c_parser_consume_token (parser);
1971 seen_type = true;
1972 attrs_ok = true;
1973 if (kind == C_ID_TYPENAME
1974 && (!c_dialect_objc ()
1975 || c_parser_next_token_is_not (parser, CPP_LESS)))
1977 t.kind = ctsk_typedef;
1978 /* For a typedef name, record the meaning, not the name.
1979 In case of 'foo foo, bar;'. */
1980 t.spec = lookup_name (value);
1981 t.expr = NULL_TREE;
1982 t.expr_const_operands = true;
1984 else
1986 tree proto = NULL_TREE;
1987 gcc_assert (c_dialect_objc ());
1988 t.kind = ctsk_objc;
1989 if (c_parser_next_token_is (parser, CPP_LESS))
1990 proto = c_parser_objc_protocol_refs (parser);
1991 t.spec = objc_get_protocol_qualified_type (value, proto);
1992 t.expr = NULL_TREE;
1993 t.expr_const_operands = true;
1995 declspecs_add_type (loc, specs, t);
1996 continue;
1998 if (c_parser_next_token_is (parser, CPP_LESS))
2000 /* Make "<SomeProtocol>" equivalent to "id <SomeProtocol>" -
2001 nisse@lysator.liu.se. */
2002 tree proto;
2003 gcc_assert (c_dialect_objc ());
2004 if (!typespec_ok || seen_type)
2005 break;
2006 proto = c_parser_objc_protocol_refs (parser);
2007 t.kind = ctsk_objc;
2008 t.spec = objc_get_protocol_qualified_type (NULL_TREE, proto);
2009 t.expr = NULL_TREE;
2010 t.expr_const_operands = true;
2011 declspecs_add_type (loc, specs, t);
2012 continue;
2014 gcc_assert (c_parser_next_token_is (parser, CPP_KEYWORD));
2015 switch (c_parser_peek_token (parser)->keyword)
2017 case RID_STATIC:
2018 case RID_EXTERN:
2019 case RID_REGISTER:
2020 case RID_TYPEDEF:
2021 case RID_INLINE:
2022 case RID_AUTO:
2023 case RID_THREAD:
2024 if (!scspec_ok)
2025 goto out;
2026 attrs_ok = true;
2027 /* TODO: Distinguish between function specifiers (inline)
2028 and storage class specifiers, either here or in
2029 declspecs_add_scspec. */
2030 declspecs_add_scspec (specs, c_parser_peek_token (parser)->value);
2031 c_parser_consume_token (parser);
2032 break;
2033 case RID_UNSIGNED:
2034 case RID_LONG:
2035 case RID_INT128:
2036 case RID_SHORT:
2037 case RID_SIGNED:
2038 case RID_COMPLEX:
2039 case RID_INT:
2040 case RID_CHAR:
2041 case RID_FLOAT:
2042 case RID_DOUBLE:
2043 case RID_VOID:
2044 case RID_DFLOAT32:
2045 case RID_DFLOAT64:
2046 case RID_DFLOAT128:
2047 case RID_BOOL:
2048 case RID_FRACT:
2049 case RID_ACCUM:
2050 case RID_SAT:
2051 if (!typespec_ok)
2052 goto out;
2053 attrs_ok = true;
2054 seen_type = true;
2055 if (c_dialect_objc ())
2056 parser->objc_need_raw_identifier = true;
2057 t.kind = ctsk_resword;
2058 t.spec = c_parser_peek_token (parser)->value;
2059 t.expr = NULL_TREE;
2060 t.expr_const_operands = true;
2061 declspecs_add_type (loc, specs, t);
2062 c_parser_consume_token (parser);
2063 break;
2064 case RID_ENUM:
2065 if (!typespec_ok)
2066 goto out;
2067 attrs_ok = true;
2068 seen_type = true;
2069 t = c_parser_enum_specifier (parser);
2070 declspecs_add_type (loc, specs, t);
2071 break;
2072 case RID_STRUCT:
2073 case RID_UNION:
2074 if (!typespec_ok)
2075 goto out;
2076 attrs_ok = true;
2077 seen_type = true;
2078 t = c_parser_struct_or_union_specifier (parser);
2079 invoke_plugin_callbacks (PLUGIN_FINISH_TYPE, t.spec);
2080 declspecs_add_type (loc, specs, t);
2081 break;
2082 case RID_TYPEOF:
2083 /* ??? The old parser rejected typeof after other type
2084 specifiers, but is a syntax error the best way of
2085 handling this? */
2086 if (!typespec_ok || seen_type)
2087 goto out;
2088 attrs_ok = true;
2089 seen_type = true;
2090 t = c_parser_typeof_specifier (parser);
2091 declspecs_add_type (loc, specs, t);
2092 break;
2093 case RID_CONST:
2094 case RID_VOLATILE:
2095 case RID_RESTRICT:
2096 attrs_ok = true;
2097 declspecs_add_qual (specs, c_parser_peek_token (parser)->value);
2098 c_parser_consume_token (parser);
2099 break;
2100 case RID_ATTRIBUTE:
2101 if (!attrs_ok)
2102 goto out;
2103 attrs = c_parser_attributes (parser);
2104 declspecs_add_attrs (specs, attrs);
2105 break;
2106 default:
2107 goto out;
2110 out: ;
2113 /* Parse an enum specifier (C90 6.5.2.2, C99 6.7.2.2).
2115 enum-specifier:
2116 enum attributes[opt] identifier[opt] { enumerator-list } attributes[opt]
2117 enum attributes[opt] identifier[opt] { enumerator-list , } attributes[opt]
2118 enum attributes[opt] identifier
2120 The form with trailing comma is new in C99. The forms with
2121 attributes are GNU extensions. In GNU C, we accept any expression
2122 without commas in the syntax (assignment expressions, not just
2123 conditional expressions); assignment expressions will be diagnosed
2124 as non-constant.
2126 enumerator-list:
2127 enumerator
2128 enumerator-list , enumerator
2130 enumerator:
2131 enumeration-constant
2132 enumeration-constant = constant-expression
2135 static struct c_typespec
2136 c_parser_enum_specifier (c_parser *parser)
2138 struct c_typespec ret;
2139 tree attrs;
2140 tree ident = NULL_TREE;
2141 location_t enum_loc;
2142 location_t ident_loc = UNKNOWN_LOCATION; /* Quiet warning. */
2143 gcc_assert (c_parser_next_token_is_keyword (parser, RID_ENUM));
2144 enum_loc = c_parser_peek_token (parser)->location;
2145 c_parser_consume_token (parser);
2146 attrs = c_parser_attributes (parser);
2147 enum_loc = c_parser_peek_token (parser)->location;
2148 /* Set the location in case we create a decl now. */
2149 c_parser_set_source_position_from_token (c_parser_peek_token (parser));
2150 if (c_parser_next_token_is (parser, CPP_NAME))
2152 ident = c_parser_peek_token (parser)->value;
2153 ident_loc = c_parser_peek_token (parser)->location;
2154 enum_loc = ident_loc;
2155 c_parser_consume_token (parser);
2157 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
2159 /* Parse an enum definition. */
2160 struct c_enum_contents the_enum;
2161 tree type = start_enum (enum_loc, &the_enum, ident);
2162 tree postfix_attrs;
2163 /* We chain the enumerators in reverse order, then put them in
2164 forward order at the end. */
2165 tree values = NULL_TREE;
2166 c_parser_consume_token (parser);
2167 while (true)
2169 tree enum_id;
2170 tree enum_value;
2171 tree enum_decl;
2172 bool seen_comma;
2173 c_token *token;
2174 location_t comma_loc = UNKNOWN_LOCATION; /* Quiet warning. */
2175 location_t decl_loc, value_loc;
2176 if (c_parser_next_token_is_not (parser, CPP_NAME))
2178 c_parser_error (parser, "expected identifier");
2179 c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL);
2180 values = error_mark_node;
2181 break;
2183 token = c_parser_peek_token (parser);
2184 enum_id = token->value;
2185 /* Set the location in case we create a decl now. */
2186 c_parser_set_source_position_from_token (token);
2187 decl_loc = value_loc = token->location;
2188 c_parser_consume_token (parser);
2189 if (c_parser_next_token_is (parser, CPP_EQ))
2191 c_parser_consume_token (parser);
2192 value_loc = c_parser_peek_token (parser)->location;
2193 enum_value = c_parser_expr_no_commas (parser, NULL).value;
2195 else
2196 enum_value = NULL_TREE;
2197 enum_decl = build_enumerator (decl_loc, value_loc,
2198 &the_enum, enum_id, enum_value);
2199 TREE_CHAIN (enum_decl) = values;
2200 values = enum_decl;
2201 seen_comma = false;
2202 if (c_parser_next_token_is (parser, CPP_COMMA))
2204 comma_loc = c_parser_peek_token (parser)->location;
2205 seen_comma = true;
2206 c_parser_consume_token (parser);
2208 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
2210 if (seen_comma && !flag_isoc99)
2211 pedwarn (comma_loc, OPT_pedantic, "comma at end of enumerator list");
2212 c_parser_consume_token (parser);
2213 break;
2215 if (!seen_comma)
2217 c_parser_error (parser, "expected %<,%> or %<}%>");
2218 c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL);
2219 values = error_mark_node;
2220 break;
2223 postfix_attrs = c_parser_attributes (parser);
2224 ret.spec = finish_enum (type, nreverse (values),
2225 chainon (attrs, postfix_attrs));
2226 ret.kind = ctsk_tagdef;
2227 ret.expr = NULL_TREE;
2228 ret.expr_const_operands = true;
2229 return ret;
2231 else if (!ident)
2233 c_parser_error (parser, "expected %<{%>");
2234 ret.spec = error_mark_node;
2235 ret.kind = ctsk_tagref;
2236 ret.expr = NULL_TREE;
2237 ret.expr_const_operands = true;
2238 return ret;
2240 ret = parser_xref_tag (ident_loc, ENUMERAL_TYPE, ident);
2241 /* In ISO C, enumerated types can be referred to only if already
2242 defined. */
2243 if (pedantic && !COMPLETE_TYPE_P (ret.spec))
2245 gcc_assert (ident);
2246 pedwarn (enum_loc, OPT_pedantic,
2247 "ISO C forbids forward references to %<enum%> types");
2249 return ret;
2252 /* Parse a struct or union specifier (C90 6.5.2.1, C99 6.7.2.1).
2254 struct-or-union-specifier:
2255 struct-or-union attributes[opt] identifier[opt]
2256 { struct-contents } attributes[opt]
2257 struct-or-union attributes[opt] identifier
2259 struct-contents:
2260 struct-declaration-list
2262 struct-declaration-list:
2263 struct-declaration ;
2264 struct-declaration-list struct-declaration ;
2266 GNU extensions:
2268 struct-contents:
2269 empty
2270 struct-declaration
2271 struct-declaration-list struct-declaration
2273 struct-declaration-list:
2274 struct-declaration-list ;
2277 (Note that in the syntax here, unlike that in ISO C, the semicolons
2278 are included here rather than in struct-declaration, in order to
2279 describe the syntax with extra semicolons and missing semicolon at
2280 end.)
2282 Objective-C:
2284 struct-declaration-list:
2285 @defs ( class-name )
2287 (Note this does not include a trailing semicolon, but can be
2288 followed by further declarations, and gets a pedwarn-if-pedantic
2289 when followed by a semicolon.) */
2291 static struct c_typespec
2292 c_parser_struct_or_union_specifier (c_parser *parser)
2294 struct c_typespec ret;
2295 tree attrs;
2296 tree ident = NULL_TREE;
2297 location_t struct_loc;
2298 location_t ident_loc = UNKNOWN_LOCATION;
2299 enum tree_code code;
2300 switch (c_parser_peek_token (parser)->keyword)
2302 case RID_STRUCT:
2303 code = RECORD_TYPE;
2304 break;
2305 case RID_UNION:
2306 code = UNION_TYPE;
2307 break;
2308 default:
2309 gcc_unreachable ();
2311 struct_loc = c_parser_peek_token (parser)->location;
2312 c_parser_consume_token (parser);
2313 attrs = c_parser_attributes (parser);
2315 /* Set the location in case we create a decl now. */
2316 c_parser_set_source_position_from_token (c_parser_peek_token (parser));
2318 if (c_parser_next_token_is (parser, CPP_NAME))
2320 ident = c_parser_peek_token (parser)->value;
2321 ident_loc = c_parser_peek_token (parser)->location;
2322 struct_loc = ident_loc;
2323 c_parser_consume_token (parser);
2325 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
2327 /* Parse a struct or union definition. Start the scope of the
2328 tag before parsing components. */
2329 struct c_struct_parse_info *struct_info;
2330 tree type = start_struct (struct_loc, code, ident, &struct_info);
2331 tree postfix_attrs;
2332 /* We chain the components in reverse order, then put them in
2333 forward order at the end. Each struct-declaration may
2334 declare multiple components (comma-separated), so we must use
2335 chainon to join them, although when parsing each
2336 struct-declaration we can use TREE_CHAIN directly.
2338 The theory behind all this is that there will be more
2339 semicolon separated fields than comma separated fields, and
2340 so we'll be minimizing the number of node traversals required
2341 by chainon. */
2342 tree contents = NULL_TREE;
2343 c_parser_consume_token (parser);
2344 /* Handle the Objective-C @defs construct,
2345 e.g. foo(sizeof(struct{ @defs(ClassName) }));. */
2346 if (c_parser_next_token_is_keyword (parser, RID_AT_DEFS))
2348 tree name;
2349 gcc_assert (c_dialect_objc ());
2350 c_parser_consume_token (parser);
2351 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
2352 goto end_at_defs;
2353 if (c_parser_next_token_is (parser, CPP_NAME)
2354 && c_parser_peek_token (parser)->id_kind == C_ID_CLASSNAME)
2356 name = c_parser_peek_token (parser)->value;
2357 c_parser_consume_token (parser);
2359 else
2361 c_parser_error (parser, "expected class name");
2362 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
2363 goto end_at_defs;
2365 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2366 "expected %<)%>");
2367 contents = nreverse (objc_get_class_ivars (name));
2369 end_at_defs:
2370 /* Parse the struct-declarations and semicolons. Problems with
2371 semicolons are diagnosed here; empty structures are diagnosed
2372 elsewhere. */
2373 while (true)
2375 tree decls;
2376 /* Parse any stray semicolon. */
2377 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
2379 pedwarn (c_parser_peek_token (parser)->location, OPT_pedantic,
2380 "extra semicolon in struct or union specified");
2381 c_parser_consume_token (parser);
2382 continue;
2384 /* Stop if at the end of the struct or union contents. */
2385 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
2387 c_parser_consume_token (parser);
2388 break;
2390 /* Accept #pragmas at struct scope. */
2391 if (c_parser_next_token_is (parser, CPP_PRAGMA))
2393 c_parser_pragma (parser, pragma_external);
2394 continue;
2396 /* Parse some comma-separated declarations, but not the
2397 trailing semicolon if any. */
2398 decls = c_parser_struct_declaration (parser);
2399 contents = chainon (decls, contents);
2400 /* If no semicolon follows, either we have a parse error or
2401 are at the end of the struct or union and should
2402 pedwarn. */
2403 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
2404 c_parser_consume_token (parser);
2405 else
2407 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
2408 pedwarn (c_parser_peek_token (parser)->location, 0,
2409 "no semicolon at end of struct or union");
2410 else if (parser->error
2411 || !c_parser_next_token_starts_declspecs (parser))
2413 c_parser_error (parser, "expected %<;%>");
2414 c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL);
2415 break;
2418 /* If we come here, we have already emitted an error
2419 for an expected `;', identifier or `(', and we also
2420 recovered already. Go on with the next field. */
2423 postfix_attrs = c_parser_attributes (parser);
2424 ret.spec = finish_struct (struct_loc, type, nreverse (contents),
2425 chainon (attrs, postfix_attrs), struct_info);
2426 ret.kind = ctsk_tagdef;
2427 ret.expr = NULL_TREE;
2428 ret.expr_const_operands = true;
2429 return ret;
2431 else if (!ident)
2433 c_parser_error (parser, "expected %<{%>");
2434 ret.spec = error_mark_node;
2435 ret.kind = ctsk_tagref;
2436 ret.expr = NULL_TREE;
2437 ret.expr_const_operands = true;
2438 return ret;
2440 ret = parser_xref_tag (ident_loc, code, ident);
2441 return ret;
2444 /* Parse a struct-declaration (C90 6.5.2.1, C99 6.7.2.1), *without*
2445 the trailing semicolon.
2447 struct-declaration:
2448 specifier-qualifier-list struct-declarator-list
2449 static_assert-declaration-no-semi
2451 specifier-qualifier-list:
2452 type-specifier specifier-qualifier-list[opt]
2453 type-qualifier specifier-qualifier-list[opt]
2454 attributes specifier-qualifier-list[opt]
2456 struct-declarator-list:
2457 struct-declarator
2458 struct-declarator-list , attributes[opt] struct-declarator
2460 struct-declarator:
2461 declarator attributes[opt]
2462 declarator[opt] : constant-expression attributes[opt]
2464 GNU extensions:
2466 struct-declaration:
2467 __extension__ struct-declaration
2468 specifier-qualifier-list
2470 Unlike the ISO C syntax, semicolons are handled elsewhere. The use
2471 of attributes where shown is a GNU extension. In GNU C, we accept
2472 any expression without commas in the syntax (assignment
2473 expressions, not just conditional expressions); assignment
2474 expressions will be diagnosed as non-constant. */
2476 static tree
2477 c_parser_struct_declaration (c_parser *parser)
2479 struct c_declspecs *specs;
2480 tree prefix_attrs;
2481 tree all_prefix_attrs;
2482 tree decls;
2483 location_t decl_loc;
2484 if (c_parser_next_token_is_keyword (parser, RID_EXTENSION))
2486 int ext;
2487 tree decl;
2488 ext = disable_extension_diagnostics ();
2489 c_parser_consume_token (parser);
2490 decl = c_parser_struct_declaration (parser);
2491 restore_extension_diagnostics (ext);
2492 return decl;
2494 if (c_parser_next_token_is_keyword (parser, RID_STATIC_ASSERT))
2496 c_parser_static_assert_declaration_no_semi (parser);
2497 return NULL_TREE;
2499 specs = build_null_declspecs ();
2500 decl_loc = c_parser_peek_token (parser)->location;
2501 c_parser_declspecs (parser, specs, false, true, true);
2502 if (parser->error)
2503 return NULL_TREE;
2504 if (!specs->declspecs_seen_p)
2506 c_parser_error (parser, "expected specifier-qualifier-list");
2507 return NULL_TREE;
2509 finish_declspecs (specs);
2510 if (c_parser_next_token_is (parser, CPP_SEMICOLON)
2511 || c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
2513 tree ret;
2514 if (specs->typespec_kind == ctsk_none)
2516 pedwarn (decl_loc, OPT_pedantic,
2517 "ISO C forbids member declarations with no members");
2518 shadow_tag_warned (specs, pedantic);
2519 ret = NULL_TREE;
2521 else
2523 /* Support for unnamed structs or unions as members of
2524 structs or unions (which is [a] useful and [b] supports
2525 MS P-SDK). */
2526 tree attrs = NULL;
2528 ret = grokfield (c_parser_peek_token (parser)->location,
2529 build_id_declarator (NULL_TREE), specs,
2530 NULL_TREE, &attrs);
2531 if (ret)
2532 decl_attributes (&ret, attrs, 0);
2534 return ret;
2537 /* Provide better error recovery. Note that a type name here is valid,
2538 and will be treated as a field name. */
2539 if (specs->typespec_kind == ctsk_tagdef
2540 && TREE_CODE (specs->type) != ENUMERAL_TYPE
2541 && c_parser_next_token_starts_declspecs (parser)
2542 && !c_parser_next_token_is (parser, CPP_NAME))
2544 c_parser_error (parser, "expected %<;%>, identifier or %<(%>");
2545 parser->error = false;
2546 return NULL_TREE;
2549 pending_xref_error ();
2550 prefix_attrs = specs->attrs;
2551 all_prefix_attrs = prefix_attrs;
2552 specs->attrs = NULL_TREE;
2553 decls = NULL_TREE;
2554 while (true)
2556 /* Declaring one or more declarators or un-named bit-fields. */
2557 struct c_declarator *declarator;
2558 bool dummy = false;
2559 if (c_parser_next_token_is (parser, CPP_COLON))
2560 declarator = build_id_declarator (NULL_TREE);
2561 else
2562 declarator = c_parser_declarator (parser,
2563 specs->typespec_kind != ctsk_none,
2564 C_DTR_NORMAL, &dummy);
2565 if (declarator == NULL)
2567 c_parser_skip_to_end_of_block_or_statement (parser);
2568 break;
2570 if (c_parser_next_token_is (parser, CPP_COLON)
2571 || c_parser_next_token_is (parser, CPP_COMMA)
2572 || c_parser_next_token_is (parser, CPP_SEMICOLON)
2573 || c_parser_next_token_is (parser, CPP_CLOSE_BRACE)
2574 || c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
2576 tree postfix_attrs = NULL_TREE;
2577 tree width = NULL_TREE;
2578 tree d;
2579 if (c_parser_next_token_is (parser, CPP_COLON))
2581 c_parser_consume_token (parser);
2582 width = c_parser_expr_no_commas (parser, NULL).value;
2584 if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
2585 postfix_attrs = c_parser_attributes (parser);
2586 d = grokfield (c_parser_peek_token (parser)->location,
2587 declarator, specs, width, &all_prefix_attrs);
2588 decl_attributes (&d, chainon (postfix_attrs,
2589 all_prefix_attrs), 0);
2590 DECL_CHAIN (d) = decls;
2591 decls = d;
2592 if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
2593 all_prefix_attrs = chainon (c_parser_attributes (parser),
2594 prefix_attrs);
2595 else
2596 all_prefix_attrs = prefix_attrs;
2597 if (c_parser_next_token_is (parser, CPP_COMMA))
2598 c_parser_consume_token (parser);
2599 else if (c_parser_next_token_is (parser, CPP_SEMICOLON)
2600 || c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
2602 /* Semicolon consumed in caller. */
2603 break;
2605 else
2607 c_parser_error (parser, "expected %<,%>, %<;%> or %<}%>");
2608 break;
2611 else
2613 c_parser_error (parser,
2614 "expected %<:%>, %<,%>, %<;%>, %<}%> or "
2615 "%<__attribute__%>");
2616 break;
2619 return decls;
2622 /* Parse a typeof specifier (a GNU extension).
2624 typeof-specifier:
2625 typeof ( expression )
2626 typeof ( type-name )
2629 static struct c_typespec
2630 c_parser_typeof_specifier (c_parser *parser)
2632 struct c_typespec ret;
2633 ret.kind = ctsk_typeof;
2634 ret.spec = error_mark_node;
2635 ret.expr = NULL_TREE;
2636 ret.expr_const_operands = true;
2637 gcc_assert (c_parser_next_token_is_keyword (parser, RID_TYPEOF));
2638 c_parser_consume_token (parser);
2639 c_inhibit_evaluation_warnings++;
2640 in_typeof++;
2641 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
2643 c_inhibit_evaluation_warnings--;
2644 in_typeof--;
2645 return ret;
2647 if (c_parser_next_token_starts_typename (parser))
2649 struct c_type_name *type = c_parser_type_name (parser);
2650 c_inhibit_evaluation_warnings--;
2651 in_typeof--;
2652 if (type != NULL)
2654 ret.spec = groktypename (type, &ret.expr, &ret.expr_const_operands);
2655 pop_maybe_used (variably_modified_type_p (ret.spec, NULL_TREE));
2658 else
2660 bool was_vm;
2661 location_t here = c_parser_peek_token (parser)->location;
2662 struct c_expr expr = c_parser_expression (parser);
2663 c_inhibit_evaluation_warnings--;
2664 in_typeof--;
2665 if (TREE_CODE (expr.value) == COMPONENT_REF
2666 && DECL_C_BIT_FIELD (TREE_OPERAND (expr.value, 1)))
2667 error_at (here, "%<typeof%> applied to a bit-field");
2668 mark_exp_read (expr.value);
2669 ret.spec = TREE_TYPE (expr.value);
2670 was_vm = variably_modified_type_p (ret.spec, NULL_TREE);
2671 /* This is returned with the type so that when the type is
2672 evaluated, this can be evaluated. */
2673 if (was_vm)
2674 ret.expr = c_fully_fold (expr.value, false, &ret.expr_const_operands);
2675 pop_maybe_used (was_vm);
2677 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
2678 return ret;
2681 /* Parse a declarator, possibly an abstract declarator (C90 6.5.4,
2682 6.5.5, C99 6.7.5, 6.7.6). If TYPE_SEEN_P then a typedef name may
2683 be redeclared; otherwise it may not. KIND indicates which kind of
2684 declarator is wanted. Returns a valid declarator except in the
2685 case of a syntax error in which case NULL is returned. *SEEN_ID is
2686 set to true if an identifier being declared is seen; this is used
2687 to diagnose bad forms of abstract array declarators and to
2688 determine whether an identifier list is syntactically permitted.
2690 declarator:
2691 pointer[opt] direct-declarator
2693 direct-declarator:
2694 identifier
2695 ( attributes[opt] declarator )
2696 direct-declarator array-declarator
2697 direct-declarator ( parameter-type-list )
2698 direct-declarator ( identifier-list[opt] )
2700 pointer:
2701 * type-qualifier-list[opt]
2702 * type-qualifier-list[opt] pointer
2704 type-qualifier-list:
2705 type-qualifier
2706 attributes
2707 type-qualifier-list type-qualifier
2708 type-qualifier-list attributes
2710 parameter-type-list:
2711 parameter-list
2712 parameter-list , ...
2714 parameter-list:
2715 parameter-declaration
2716 parameter-list , parameter-declaration
2718 parameter-declaration:
2719 declaration-specifiers declarator attributes[opt]
2720 declaration-specifiers abstract-declarator[opt] attributes[opt]
2722 identifier-list:
2723 identifier
2724 identifier-list , identifier
2726 abstract-declarator:
2727 pointer
2728 pointer[opt] direct-abstract-declarator
2730 direct-abstract-declarator:
2731 ( attributes[opt] abstract-declarator )
2732 direct-abstract-declarator[opt] array-declarator
2733 direct-abstract-declarator[opt] ( parameter-type-list[opt] )
2735 GNU extensions:
2737 direct-declarator:
2738 direct-declarator ( parameter-forward-declarations
2739 parameter-type-list[opt] )
2741 direct-abstract-declarator:
2742 direct-abstract-declarator[opt] ( parameter-forward-declarations
2743 parameter-type-list[opt] )
2745 parameter-forward-declarations:
2746 parameter-list ;
2747 parameter-forward-declarations parameter-list ;
2749 The uses of attributes shown above are GNU extensions.
2751 Some forms of array declarator are not included in C99 in the
2752 syntax for abstract declarators; these are disallowed elsewhere.
2753 This may be a defect (DR#289).
2755 This function also accepts an omitted abstract declarator as being
2756 an abstract declarator, although not part of the formal syntax. */
2758 static struct c_declarator *
2759 c_parser_declarator (c_parser *parser, bool type_seen_p, c_dtr_syn kind,
2760 bool *seen_id)
2762 /* Parse any initial pointer part. */
2763 if (c_parser_next_token_is (parser, CPP_MULT))
2765 struct c_declspecs *quals_attrs = build_null_declspecs ();
2766 struct c_declarator *inner;
2767 c_parser_consume_token (parser);
2768 c_parser_declspecs (parser, quals_attrs, false, false, true);
2769 inner = c_parser_declarator (parser, type_seen_p, kind, seen_id);
2770 if (inner == NULL)
2771 return NULL;
2772 else
2773 return make_pointer_declarator (quals_attrs, inner);
2775 /* Now we have a direct declarator, direct abstract declarator or
2776 nothing (which counts as a direct abstract declarator here). */
2777 return c_parser_direct_declarator (parser, type_seen_p, kind, seen_id);
2780 /* Parse a direct declarator or direct abstract declarator; arguments
2781 as c_parser_declarator. */
2783 static struct c_declarator *
2784 c_parser_direct_declarator (c_parser *parser, bool type_seen_p, c_dtr_syn kind,
2785 bool *seen_id)
2787 /* The direct declarator must start with an identifier (possibly
2788 omitted) or a parenthesized declarator (possibly abstract). In
2789 an ordinary declarator, initial parentheses must start a
2790 parenthesized declarator. In an abstract declarator or parameter
2791 declarator, they could start a parenthesized declarator or a
2792 parameter list. To tell which, the open parenthesis and any
2793 following attributes must be read. If a declaration specifier
2794 follows, then it is a parameter list; if the specifier is a
2795 typedef name, there might be an ambiguity about redeclaring it,
2796 which is resolved in the direction of treating it as a typedef
2797 name. If a close parenthesis follows, it is also an empty
2798 parameter list, as the syntax does not permit empty abstract
2799 declarators. Otherwise, it is a parenthesized declarator (in
2800 which case the analysis may be repeated inside it, recursively).
2802 ??? There is an ambiguity in a parameter declaration "int
2803 (__attribute__((foo)) x)", where x is not a typedef name: it
2804 could be an abstract declarator for a function, or declare x with
2805 parentheses. The proper resolution of this ambiguity needs
2806 documenting. At present we follow an accident of the old
2807 parser's implementation, whereby the first parameter must have
2808 some declaration specifiers other than just attributes. Thus as
2809 a parameter declaration it is treated as a parenthesized
2810 parameter named x, and as an abstract declarator it is
2811 rejected.
2813 ??? Also following the old parser, attributes inside an empty
2814 parameter list are ignored, making it a list not yielding a
2815 prototype, rather than giving an error or making it have one
2816 parameter with implicit type int.
2818 ??? Also following the old parser, typedef names may be
2819 redeclared in declarators, but not Objective-C class names. */
2821 if (kind != C_DTR_ABSTRACT
2822 && c_parser_next_token_is (parser, CPP_NAME)
2823 && ((type_seen_p
2824 && (c_parser_peek_token (parser)->id_kind == C_ID_TYPENAME
2825 || c_parser_peek_token (parser)->id_kind == C_ID_CLASSNAME))
2826 || c_parser_peek_token (parser)->id_kind == C_ID_ID))
2828 struct c_declarator *inner
2829 = build_id_declarator (c_parser_peek_token (parser)->value);
2830 *seen_id = true;
2831 inner->id_loc = c_parser_peek_token (parser)->location;
2832 c_parser_consume_token (parser);
2833 return c_parser_direct_declarator_inner (parser, *seen_id, inner);
2836 if (kind != C_DTR_NORMAL
2837 && c_parser_next_token_is (parser, CPP_OPEN_SQUARE))
2839 struct c_declarator *inner = build_id_declarator (NULL_TREE);
2840 return c_parser_direct_declarator_inner (parser, *seen_id, inner);
2843 /* Either we are at the end of an abstract declarator, or we have
2844 parentheses. */
2846 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
2848 tree attrs;
2849 struct c_declarator *inner;
2850 c_parser_consume_token (parser);
2851 attrs = c_parser_attributes (parser);
2852 if (kind != C_DTR_NORMAL
2853 && (c_parser_next_token_starts_declspecs (parser)
2854 || c_parser_next_token_is (parser, CPP_CLOSE_PAREN)))
2856 struct c_arg_info *args
2857 = c_parser_parms_declarator (parser, kind == C_DTR_NORMAL,
2858 attrs);
2859 if (args == NULL)
2860 return NULL;
2861 else
2863 inner
2864 = build_function_declarator (args,
2865 build_id_declarator (NULL_TREE));
2866 return c_parser_direct_declarator_inner (parser, *seen_id,
2867 inner);
2870 /* A parenthesized declarator. */
2871 inner = c_parser_declarator (parser, type_seen_p, kind, seen_id);
2872 if (inner != NULL && attrs != NULL)
2873 inner = build_attrs_declarator (attrs, inner);
2874 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2876 c_parser_consume_token (parser);
2877 if (inner == NULL)
2878 return NULL;
2879 else
2880 return c_parser_direct_declarator_inner (parser, *seen_id, inner);
2882 else
2884 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2885 "expected %<)%>");
2886 return NULL;
2889 else
2891 if (kind == C_DTR_NORMAL)
2893 c_parser_error (parser, "expected identifier or %<(%>");
2894 return NULL;
2896 else
2897 return build_id_declarator (NULL_TREE);
2901 /* Parse part of a direct declarator or direct abstract declarator,
2902 given that some (in INNER) has already been parsed; ID_PRESENT is
2903 true if an identifier is present, false for an abstract
2904 declarator. */
2906 static struct c_declarator *
2907 c_parser_direct_declarator_inner (c_parser *parser, bool id_present,
2908 struct c_declarator *inner)
2910 /* Parse a sequence of array declarators and parameter lists. */
2911 if (c_parser_next_token_is (parser, CPP_OPEN_SQUARE))
2913 location_t brace_loc = c_parser_peek_token (parser)->location;
2914 struct c_declarator *declarator;
2915 struct c_declspecs *quals_attrs = build_null_declspecs ();
2916 bool static_seen;
2917 bool star_seen;
2918 tree dimen;
2919 c_parser_consume_token (parser);
2920 c_parser_declspecs (parser, quals_attrs, false, false, true);
2921 static_seen = c_parser_next_token_is_keyword (parser, RID_STATIC);
2922 if (static_seen)
2923 c_parser_consume_token (parser);
2924 if (static_seen && !quals_attrs->declspecs_seen_p)
2925 c_parser_declspecs (parser, quals_attrs, false, false, true);
2926 if (!quals_attrs->declspecs_seen_p)
2927 quals_attrs = NULL;
2928 /* If "static" is present, there must be an array dimension.
2929 Otherwise, there may be a dimension, "*", or no
2930 dimension. */
2931 if (static_seen)
2933 star_seen = false;
2934 dimen = c_parser_expr_no_commas (parser, NULL).value;
2936 else
2938 if (c_parser_next_token_is (parser, CPP_CLOSE_SQUARE))
2940 dimen = NULL_TREE;
2941 star_seen = false;
2943 else if (c_parser_next_token_is (parser, CPP_MULT))
2945 if (c_parser_peek_2nd_token (parser)->type == CPP_CLOSE_SQUARE)
2947 dimen = NULL_TREE;
2948 star_seen = true;
2949 c_parser_consume_token (parser);
2951 else
2953 star_seen = false;
2954 dimen = c_parser_expr_no_commas (parser, NULL).value;
2957 else
2959 star_seen = false;
2960 dimen = c_parser_expr_no_commas (parser, NULL).value;
2963 if (c_parser_next_token_is (parser, CPP_CLOSE_SQUARE))
2964 c_parser_consume_token (parser);
2965 else
2967 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
2968 "expected %<]%>");
2969 return NULL;
2971 if (dimen)
2972 mark_exp_read (dimen);
2973 declarator = build_array_declarator (brace_loc, dimen, quals_attrs,
2974 static_seen, star_seen);
2975 if (declarator == NULL)
2976 return NULL;
2977 inner = set_array_declarator_inner (declarator, inner);
2978 return c_parser_direct_declarator_inner (parser, id_present, inner);
2980 else if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
2982 tree attrs;
2983 struct c_arg_info *args;
2984 c_parser_consume_token (parser);
2985 attrs = c_parser_attributes (parser);
2986 args = c_parser_parms_declarator (parser, id_present, attrs);
2987 if (args == NULL)
2988 return NULL;
2989 else
2991 inner = build_function_declarator (args, inner);
2992 return c_parser_direct_declarator_inner (parser, id_present, inner);
2995 return inner;
2998 /* Parse a parameter list or identifier list, including the closing
2999 parenthesis but not the opening one. ATTRS are the attributes at
3000 the start of the list. ID_LIST_OK is true if an identifier list is
3001 acceptable; such a list must not have attributes at the start. */
3003 static struct c_arg_info *
3004 c_parser_parms_declarator (c_parser *parser, bool id_list_ok, tree attrs)
3006 push_scope ();
3007 declare_parm_level ();
3008 /* If the list starts with an identifier, it is an identifier list.
3009 Otherwise, it is either a prototype list or an empty list. */
3010 if (id_list_ok
3011 && !attrs
3012 && c_parser_next_token_is (parser, CPP_NAME)
3013 && c_parser_peek_token (parser)->id_kind == C_ID_ID)
3015 tree list = NULL_TREE, *nextp = &list;
3016 while (c_parser_next_token_is (parser, CPP_NAME)
3017 && c_parser_peek_token (parser)->id_kind == C_ID_ID)
3019 *nextp = build_tree_list (NULL_TREE,
3020 c_parser_peek_token (parser)->value);
3021 nextp = & TREE_CHAIN (*nextp);
3022 c_parser_consume_token (parser);
3023 if (c_parser_next_token_is_not (parser, CPP_COMMA))
3024 break;
3025 c_parser_consume_token (parser);
3026 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3028 c_parser_error (parser, "expected identifier");
3029 break;
3032 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3034 struct c_arg_info *ret = build_arg_info ();
3035 ret->types = list;
3036 c_parser_consume_token (parser);
3037 pop_scope ();
3038 return ret;
3040 else
3042 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
3043 "expected %<)%>");
3044 pop_scope ();
3045 return NULL;
3048 else
3050 struct c_arg_info *ret = c_parser_parms_list_declarator (parser, attrs);
3051 pop_scope ();
3052 return ret;
3056 /* Parse a parameter list (possibly empty), including the closing
3057 parenthesis but not the opening one. ATTRS are the attributes at
3058 the start of the list. */
3060 static struct c_arg_info *
3061 c_parser_parms_list_declarator (c_parser *parser, tree attrs)
3063 bool bad_parm = false;
3064 /* ??? Following the old parser, forward parameter declarations may
3065 use abstract declarators, and if no real parameter declarations
3066 follow the forward declarations then this is not diagnosed. Also
3067 note as above that attributes are ignored as the only contents of
3068 the parentheses, or as the only contents after forward
3069 declarations. */
3070 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3072 struct c_arg_info *ret = build_arg_info ();
3073 c_parser_consume_token (parser);
3074 return ret;
3076 if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
3078 struct c_arg_info *ret = build_arg_info ();
3079 /* Suppress -Wold-style-definition for this case. */
3080 ret->types = error_mark_node;
3081 error_at (c_parser_peek_token (parser)->location,
3082 "ISO C requires a named argument before %<...%>");
3083 c_parser_consume_token (parser);
3084 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3086 c_parser_consume_token (parser);
3087 return ret;
3089 else
3091 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
3092 "expected %<)%>");
3093 return NULL;
3096 /* Nonempty list of parameters, either terminated with semicolon
3097 (forward declarations; recurse) or with close parenthesis (normal
3098 function) or with ", ... )" (variadic function). */
3099 while (true)
3101 /* Parse a parameter. */
3102 struct c_parm *parm = c_parser_parameter_declaration (parser, attrs);
3103 attrs = NULL_TREE;
3104 if (parm == NULL)
3105 bad_parm = true;
3106 else
3107 push_parm_decl (parm);
3108 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
3110 tree new_attrs;
3111 c_parser_consume_token (parser);
3112 mark_forward_parm_decls ();
3113 new_attrs = c_parser_attributes (parser);
3114 return c_parser_parms_list_declarator (parser, new_attrs);
3116 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3118 c_parser_consume_token (parser);
3119 if (bad_parm)
3121 get_pending_sizes ();
3122 return NULL;
3124 else
3125 return get_parm_info (false);
3127 if (!c_parser_require (parser, CPP_COMMA,
3128 "expected %<;%>, %<,%> or %<)%>"))
3130 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
3131 get_pending_sizes ();
3132 return NULL;
3134 if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
3136 c_parser_consume_token (parser);
3137 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3139 c_parser_consume_token (parser);
3140 if (bad_parm)
3142 get_pending_sizes ();
3143 return NULL;
3145 else
3146 return get_parm_info (true);
3148 else
3150 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
3151 "expected %<)%>");
3152 get_pending_sizes ();
3153 return NULL;
3159 /* Parse a parameter declaration. ATTRS are the attributes at the
3160 start of the declaration if it is the first parameter. */
3162 static struct c_parm *
3163 c_parser_parameter_declaration (c_parser *parser, tree attrs)
3165 struct c_declspecs *specs;
3166 struct c_declarator *declarator;
3167 tree prefix_attrs;
3168 tree postfix_attrs = NULL_TREE;
3169 bool dummy = false;
3170 if (!c_parser_next_token_starts_declspecs (parser))
3172 c_token *token = c_parser_peek_token (parser);
3173 if (parser->error)
3174 return NULL;
3175 c_parser_set_source_position_from_token (token);
3176 if (token->type == CPP_NAME
3177 && c_parser_peek_2nd_token (parser)->type != CPP_COMMA
3178 && c_parser_peek_2nd_token (parser)->type != CPP_CLOSE_PAREN)
3180 error ("unknown type name %qE", token->value);
3181 parser->error = true;
3183 /* ??? In some Objective-C cases '...' isn't applicable so there
3184 should be a different message. */
3185 else
3186 c_parser_error (parser,
3187 "expected declaration specifiers or %<...%>");
3188 c_parser_skip_to_end_of_parameter (parser);
3189 return NULL;
3191 specs = build_null_declspecs ();
3192 if (attrs)
3194 declspecs_add_attrs (specs, attrs);
3195 attrs = NULL_TREE;
3197 c_parser_declspecs (parser, specs, true, true, true);
3198 finish_declspecs (specs);
3199 pending_xref_error ();
3200 prefix_attrs = specs->attrs;
3201 specs->attrs = NULL_TREE;
3202 declarator = c_parser_declarator (parser,
3203 specs->typespec_kind != ctsk_none,
3204 C_DTR_PARM, &dummy);
3205 if (declarator == NULL)
3207 c_parser_skip_until_found (parser, CPP_COMMA, NULL);
3208 return NULL;
3210 if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
3211 postfix_attrs = c_parser_attributes (parser);
3212 return build_c_parm (specs, chainon (postfix_attrs, prefix_attrs),
3213 declarator);
3216 /* Parse a string literal in an asm expression. It should not be
3217 translated, and wide string literals are an error although
3218 permitted by the syntax. This is a GNU extension.
3220 asm-string-literal:
3221 string-literal
3223 ??? At present, following the old parser, the caller needs to have
3224 set lex_untranslated_string to 1. It would be better to follow the
3225 C++ parser rather than using this kludge. */
3227 static tree
3228 c_parser_asm_string_literal (c_parser *parser)
3230 tree str;
3231 if (c_parser_next_token_is (parser, CPP_STRING))
3233 str = c_parser_peek_token (parser)->value;
3234 c_parser_consume_token (parser);
3236 else if (c_parser_next_token_is (parser, CPP_WSTRING))
3238 error_at (c_parser_peek_token (parser)->location,
3239 "wide string literal in %<asm%>");
3240 str = build_string (1, "");
3241 c_parser_consume_token (parser);
3243 else
3245 c_parser_error (parser, "expected string literal");
3246 str = NULL_TREE;
3248 return str;
3251 /* Parse a simple asm expression. This is used in restricted
3252 contexts, where a full expression with inputs and outputs does not
3253 make sense. This is a GNU extension.
3255 simple-asm-expr:
3256 asm ( asm-string-literal )
3259 static tree
3260 c_parser_simple_asm_expr (c_parser *parser)
3262 tree str;
3263 gcc_assert (c_parser_next_token_is_keyword (parser, RID_ASM));
3264 /* ??? Follow the C++ parser rather than using the
3265 lex_untranslated_string kludge. */
3266 parser->lex_untranslated_string = true;
3267 c_parser_consume_token (parser);
3268 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
3270 parser->lex_untranslated_string = false;
3271 return NULL_TREE;
3273 str = c_parser_asm_string_literal (parser);
3274 parser->lex_untranslated_string = false;
3275 if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
3277 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
3278 return NULL_TREE;
3280 return str;
3283 /* Parse (possibly empty) attributes. This is a GNU extension.
3285 attributes:
3286 empty
3287 attributes attribute
3289 attribute:
3290 __attribute__ ( ( attribute-list ) )
3292 attribute-list:
3293 attrib
3294 attribute_list , attrib
3296 attrib:
3297 empty
3298 any-word
3299 any-word ( identifier )
3300 any-word ( identifier , nonempty-expr-list )
3301 any-word ( expr-list )
3303 where the "identifier" must not be declared as a type, and
3304 "any-word" may be any identifier (including one declared as a
3305 type), a reserved word storage class specifier, type specifier or
3306 type qualifier. ??? This still leaves out most reserved keywords
3307 (following the old parser), shouldn't we include them, and why not
3308 allow identifiers declared as types to start the arguments? */
3310 static tree
3311 c_parser_attributes (c_parser *parser)
3313 tree attrs = NULL_TREE;
3314 while (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
3316 /* ??? Follow the C++ parser rather than using the
3317 lex_untranslated_string kludge. */
3318 parser->lex_untranslated_string = true;
3319 c_parser_consume_token (parser);
3320 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
3322 parser->lex_untranslated_string = false;
3323 return attrs;
3325 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
3327 parser->lex_untranslated_string = false;
3328 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
3329 return attrs;
3331 /* Parse the attribute list. */
3332 while (c_parser_next_token_is (parser, CPP_COMMA)
3333 || c_parser_next_token_is (parser, CPP_NAME)
3334 || c_parser_next_token_is (parser, CPP_KEYWORD))
3336 tree attr, attr_name, attr_args;
3337 VEC(tree,gc) *expr_list;
3338 if (c_parser_next_token_is (parser, CPP_COMMA))
3340 c_parser_consume_token (parser);
3341 continue;
3343 if (c_parser_next_token_is (parser, CPP_KEYWORD))
3345 /* ??? See comment above about what keywords are
3346 accepted here. */
3347 bool ok;
3348 switch (c_parser_peek_token (parser)->keyword)
3350 case RID_STATIC:
3351 case RID_UNSIGNED:
3352 case RID_LONG:
3353 case RID_INT128:
3354 case RID_CONST:
3355 case RID_EXTERN:
3356 case RID_REGISTER:
3357 case RID_TYPEDEF:
3358 case RID_SHORT:
3359 case RID_INLINE:
3360 case RID_VOLATILE:
3361 case RID_SIGNED:
3362 case RID_AUTO:
3363 case RID_RESTRICT:
3364 case RID_COMPLEX:
3365 case RID_THREAD:
3366 case RID_INT:
3367 case RID_CHAR:
3368 case RID_FLOAT:
3369 case RID_DOUBLE:
3370 case RID_VOID:
3371 case RID_DFLOAT32:
3372 case RID_DFLOAT64:
3373 case RID_DFLOAT128:
3374 case RID_BOOL:
3375 case RID_FRACT:
3376 case RID_ACCUM:
3377 case RID_SAT:
3378 ok = true;
3379 break;
3380 default:
3381 ok = false;
3382 break;
3384 if (!ok)
3385 break;
3386 /* Accept __attribute__((__const)) as __attribute__((const))
3387 etc. */
3388 attr_name
3389 = ridpointers[(int) c_parser_peek_token (parser)->keyword];
3391 else
3392 attr_name = c_parser_peek_token (parser)->value;
3393 c_parser_consume_token (parser);
3394 if (c_parser_next_token_is_not (parser, CPP_OPEN_PAREN))
3396 attr = build_tree_list (attr_name, NULL_TREE);
3397 attrs = chainon (attrs, attr);
3398 continue;
3400 c_parser_consume_token (parser);
3401 /* Parse the attribute contents. If they start with an
3402 identifier which is followed by a comma or close
3403 parenthesis, then the arguments start with that
3404 identifier; otherwise they are an expression list.
3405 In objective-c the identifier may be a classname. */
3406 if (c_parser_next_token_is (parser, CPP_NAME)
3407 && (c_parser_peek_token (parser)->id_kind == C_ID_ID
3408 || (c_dialect_objc ()
3409 && c_parser_peek_token (parser)->id_kind == C_ID_CLASSNAME))
3410 && ((c_parser_peek_2nd_token (parser)->type == CPP_COMMA)
3411 || (c_parser_peek_2nd_token (parser)->type
3412 == CPP_CLOSE_PAREN)))
3414 tree arg1 = c_parser_peek_token (parser)->value;
3415 c_parser_consume_token (parser);
3416 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3417 attr_args = build_tree_list (NULL_TREE, arg1);
3418 else
3420 tree tree_list;
3421 c_parser_consume_token (parser);
3422 expr_list = c_parser_expr_list (parser, false, true, NULL);
3423 tree_list = build_tree_list_vec (expr_list);
3424 attr_args = tree_cons (NULL_TREE, arg1, tree_list);
3425 release_tree_vector (expr_list);
3428 else
3430 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3431 attr_args = NULL_TREE;
3432 else
3434 expr_list = c_parser_expr_list (parser, false, true, NULL);
3435 attr_args = build_tree_list_vec (expr_list);
3436 release_tree_vector (expr_list);
3439 attr = build_tree_list (attr_name, attr_args);
3440 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3441 c_parser_consume_token (parser);
3442 else
3444 parser->lex_untranslated_string = false;
3445 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
3446 "expected %<)%>");
3447 return attrs;
3449 attrs = chainon (attrs, attr);
3451 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3452 c_parser_consume_token (parser);
3453 else
3455 parser->lex_untranslated_string = false;
3456 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
3457 "expected %<)%>");
3458 return attrs;
3460 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3461 c_parser_consume_token (parser);
3462 else
3464 parser->lex_untranslated_string = false;
3465 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
3466 "expected %<)%>");
3467 return attrs;
3469 parser->lex_untranslated_string = false;
3471 return attrs;
3474 /* Parse a type name (C90 6.5.5, C99 6.7.6).
3476 type-name:
3477 specifier-qualifier-list abstract-declarator[opt]
3480 static struct c_type_name *
3481 c_parser_type_name (c_parser *parser)
3483 struct c_declspecs *specs = build_null_declspecs ();
3484 struct c_declarator *declarator;
3485 struct c_type_name *ret;
3486 bool dummy = false;
3487 c_parser_declspecs (parser, specs, false, true, true);
3488 if (!specs->declspecs_seen_p)
3490 c_parser_error (parser, "expected specifier-qualifier-list");
3491 return NULL;
3493 pending_xref_error ();
3494 finish_declspecs (specs);
3495 declarator = c_parser_declarator (parser,
3496 specs->typespec_kind != ctsk_none,
3497 C_DTR_ABSTRACT, &dummy);
3498 if (declarator == NULL)
3499 return NULL;
3500 ret = XOBNEW (&parser_obstack, struct c_type_name);
3501 ret->specs = specs;
3502 ret->declarator = declarator;
3503 return ret;
3506 /* Parse an initializer (C90 6.5.7, C99 6.7.8).
3508 initializer:
3509 assignment-expression
3510 { initializer-list }
3511 { initializer-list , }
3513 initializer-list:
3514 designation[opt] initializer
3515 initializer-list , designation[opt] initializer
3517 designation:
3518 designator-list =
3520 designator-list:
3521 designator
3522 designator-list designator
3524 designator:
3525 array-designator
3526 . identifier
3528 array-designator:
3529 [ constant-expression ]
3531 GNU extensions:
3533 initializer:
3536 designation:
3537 array-designator
3538 identifier :
3540 array-designator:
3541 [ constant-expression ... constant-expression ]
3543 Any expression without commas is accepted in the syntax for the
3544 constant-expressions, with non-constant expressions rejected later.
3546 This function is only used for top-level initializers; for nested
3547 ones, see c_parser_initval. */
3549 static struct c_expr
3550 c_parser_initializer (c_parser *parser)
3552 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
3553 return c_parser_braced_init (parser, NULL_TREE, false);
3554 else
3556 struct c_expr ret;
3557 location_t loc = c_parser_peek_token (parser)->location;
3558 ret = c_parser_expr_no_commas (parser, NULL);
3559 if (TREE_CODE (ret.value) != STRING_CST
3560 && TREE_CODE (ret.value) != COMPOUND_LITERAL_EXPR)
3561 ret = default_function_array_read_conversion (loc, ret);
3562 return ret;
3566 /* Parse a braced initializer list. TYPE is the type specified for a
3567 compound literal, and NULL_TREE for other initializers and for
3568 nested braced lists. NESTED_P is true for nested braced lists,
3569 false for the list of a compound literal or the list that is the
3570 top-level initializer in a declaration. */
3572 static struct c_expr
3573 c_parser_braced_init (c_parser *parser, tree type, bool nested_p)
3575 struct c_expr ret;
3576 struct obstack braced_init_obstack;
3577 location_t brace_loc = c_parser_peek_token (parser)->location;
3578 gcc_obstack_init (&braced_init_obstack);
3579 gcc_assert (c_parser_next_token_is (parser, CPP_OPEN_BRACE));
3580 c_parser_consume_token (parser);
3581 if (nested_p)
3582 push_init_level (0, &braced_init_obstack);
3583 else
3584 really_start_incremental_init (type);
3585 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
3587 pedwarn (brace_loc, OPT_pedantic, "ISO C forbids empty initializer braces");
3589 else
3591 /* Parse a non-empty initializer list, possibly with a trailing
3592 comma. */
3593 while (true)
3595 c_parser_initelt (parser, &braced_init_obstack);
3596 if (parser->error)
3597 break;
3598 if (c_parser_next_token_is (parser, CPP_COMMA))
3599 c_parser_consume_token (parser);
3600 else
3601 break;
3602 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
3603 break;
3606 if (c_parser_next_token_is_not (parser, CPP_CLOSE_BRACE))
3608 ret.value = error_mark_node;
3609 ret.original_code = ERROR_MARK;
3610 ret.original_type = NULL;
3611 c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, "expected %<}%>");
3612 pop_init_level (0, &braced_init_obstack);
3613 obstack_free (&braced_init_obstack, NULL);
3614 return ret;
3616 c_parser_consume_token (parser);
3617 ret = pop_init_level (0, &braced_init_obstack);
3618 obstack_free (&braced_init_obstack, NULL);
3619 return ret;
3622 /* Parse a nested initializer, including designators. */
3624 static void
3625 c_parser_initelt (c_parser *parser, struct obstack * braced_init_obstack)
3627 /* Parse any designator or designator list. A single array
3628 designator may have the subsequent "=" omitted in GNU C, but a
3629 longer list or a structure member designator may not. */
3630 if (c_parser_next_token_is (parser, CPP_NAME)
3631 && c_parser_peek_2nd_token (parser)->type == CPP_COLON)
3633 /* Old-style structure member designator. */
3634 set_init_label (c_parser_peek_token (parser)->value,
3635 braced_init_obstack);
3636 /* Use the colon as the error location. */
3637 pedwarn (c_parser_peek_2nd_token (parser)->location, OPT_pedantic,
3638 "obsolete use of designated initializer with %<:%>");
3639 c_parser_consume_token (parser);
3640 c_parser_consume_token (parser);
3642 else
3644 /* des_seen is 0 if there have been no designators, 1 if there
3645 has been a single array designator and 2 otherwise. */
3646 int des_seen = 0;
3647 /* Location of a designator. */
3648 location_t des_loc = UNKNOWN_LOCATION; /* Quiet warning. */
3649 while (c_parser_next_token_is (parser, CPP_OPEN_SQUARE)
3650 || c_parser_next_token_is (parser, CPP_DOT))
3652 int des_prev = des_seen;
3653 if (!des_seen)
3654 des_loc = c_parser_peek_token (parser)->location;
3655 if (des_seen < 2)
3656 des_seen++;
3657 if (c_parser_next_token_is (parser, CPP_DOT))
3659 des_seen = 2;
3660 c_parser_consume_token (parser);
3661 if (c_parser_next_token_is (parser, CPP_NAME))
3663 set_init_label (c_parser_peek_token (parser)->value,
3664 braced_init_obstack);
3665 c_parser_consume_token (parser);
3667 else
3669 struct c_expr init;
3670 init.value = error_mark_node;
3671 init.original_code = ERROR_MARK;
3672 init.original_type = NULL;
3673 c_parser_error (parser, "expected identifier");
3674 c_parser_skip_until_found (parser, CPP_COMMA, NULL);
3675 process_init_element (init, false, braced_init_obstack);
3676 return;
3679 else
3681 tree first, second;
3682 location_t ellipsis_loc = UNKNOWN_LOCATION; /* Quiet warning. */
3683 /* ??? Following the old parser, [ objc-receiver
3684 objc-message-args ] is accepted as an initializer,
3685 being distinguished from a designator by what follows
3686 the first assignment expression inside the square
3687 brackets, but after a first array designator a
3688 subsequent square bracket is for Objective-C taken to
3689 start an expression, using the obsolete form of
3690 designated initializer without '=', rather than
3691 possibly being a second level of designation: in LALR
3692 terms, the '[' is shifted rather than reducing
3693 designator to designator-list. */
3694 if (des_prev == 1 && c_dialect_objc ())
3696 des_seen = des_prev;
3697 break;
3699 if (des_prev == 0 && c_dialect_objc ())
3701 /* This might be an array designator or an
3702 Objective-C message expression. If the former,
3703 continue parsing here; if the latter, parse the
3704 remainder of the initializer given the starting
3705 primary-expression. ??? It might make sense to
3706 distinguish when des_prev == 1 as well; see
3707 previous comment. */
3708 tree rec, args;
3709 struct c_expr mexpr;
3710 c_parser_consume_token (parser);
3711 if (c_parser_peek_token (parser)->type == CPP_NAME
3712 && ((c_parser_peek_token (parser)->id_kind
3713 == C_ID_TYPENAME)
3714 || (c_parser_peek_token (parser)->id_kind
3715 == C_ID_CLASSNAME)))
3717 /* Type name receiver. */
3718 tree id = c_parser_peek_token (parser)->value;
3719 c_parser_consume_token (parser);
3720 rec = objc_get_class_reference (id);
3721 goto parse_message_args;
3723 first = c_parser_expr_no_commas (parser, NULL).value;
3724 mark_exp_read (first);
3725 if (c_parser_next_token_is (parser, CPP_ELLIPSIS)
3726 || c_parser_next_token_is (parser, CPP_CLOSE_SQUARE))
3727 goto array_desig_after_first;
3728 /* Expression receiver. So far only one part
3729 without commas has been parsed; there might be
3730 more of the expression. */
3731 rec = first;
3732 while (c_parser_next_token_is (parser, CPP_COMMA))
3734 struct c_expr next;
3735 location_t comma_loc, exp_loc;
3736 comma_loc = c_parser_peek_token (parser)->location;
3737 c_parser_consume_token (parser);
3738 exp_loc = c_parser_peek_token (parser)->location;
3739 next = c_parser_expr_no_commas (parser, NULL);
3740 next = default_function_array_read_conversion (exp_loc,
3741 next);
3742 rec = build_compound_expr (comma_loc, rec, next.value);
3744 parse_message_args:
3745 /* Now parse the objc-message-args. */
3746 args = c_parser_objc_message_args (parser);
3747 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
3748 "expected %<]%>");
3749 mexpr.value
3750 = objc_build_message_expr (build_tree_list (rec, args));
3751 mexpr.original_code = ERROR_MARK;
3752 mexpr.original_type = NULL;
3753 /* Now parse and process the remainder of the
3754 initializer, starting with this message
3755 expression as a primary-expression. */
3756 c_parser_initval (parser, &mexpr, braced_init_obstack);
3757 return;
3759 c_parser_consume_token (parser);
3760 first = c_parser_expr_no_commas (parser, NULL).value;
3761 mark_exp_read (first);
3762 array_desig_after_first:
3763 if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
3765 ellipsis_loc = c_parser_peek_token (parser)->location;
3766 c_parser_consume_token (parser);
3767 second = c_parser_expr_no_commas (parser, NULL).value;
3768 mark_exp_read (second);
3770 else
3771 second = NULL_TREE;
3772 if (c_parser_next_token_is (parser, CPP_CLOSE_SQUARE))
3774 c_parser_consume_token (parser);
3775 set_init_index (first, second, braced_init_obstack);
3776 if (second)
3777 pedwarn (ellipsis_loc, OPT_pedantic,
3778 "ISO C forbids specifying range of elements to initialize");
3780 else
3781 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
3782 "expected %<]%>");
3785 if (des_seen >= 1)
3787 if (c_parser_next_token_is (parser, CPP_EQ))
3789 if (!flag_isoc99)
3790 pedwarn (des_loc, OPT_pedantic,
3791 "ISO C90 forbids specifying subobject to initialize");
3792 c_parser_consume_token (parser);
3794 else
3796 if (des_seen == 1)
3797 pedwarn (c_parser_peek_token (parser)->location, OPT_pedantic,
3798 "obsolete use of designated initializer without %<=%>");
3799 else
3801 struct c_expr init;
3802 init.value = error_mark_node;
3803 init.original_code = ERROR_MARK;
3804 init.original_type = NULL;
3805 c_parser_error (parser, "expected %<=%>");
3806 c_parser_skip_until_found (parser, CPP_COMMA, NULL);
3807 process_init_element (init, false, braced_init_obstack);
3808 return;
3813 c_parser_initval (parser, NULL, braced_init_obstack);
3816 /* Parse a nested initializer; as c_parser_initializer but parses
3817 initializers within braced lists, after any designators have been
3818 applied. If AFTER is not NULL then it is an Objective-C message
3819 expression which is the primary-expression starting the
3820 initializer. */
3822 static void
3823 c_parser_initval (c_parser *parser, struct c_expr *after,
3824 struct obstack * braced_init_obstack)
3826 struct c_expr init;
3827 gcc_assert (!after || c_dialect_objc ());
3828 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE) && !after)
3829 init = c_parser_braced_init (parser, NULL_TREE, true);
3830 else
3832 location_t loc = c_parser_peek_token (parser)->location;
3833 init = c_parser_expr_no_commas (parser, after);
3834 if (init.value != NULL_TREE
3835 && TREE_CODE (init.value) != STRING_CST
3836 && TREE_CODE (init.value) != COMPOUND_LITERAL_EXPR)
3837 init = default_function_array_read_conversion (loc, init);
3839 process_init_element (init, false, braced_init_obstack);
3842 /* Parse a compound statement (possibly a function body) (C90 6.6.2,
3843 C99 6.8.2).
3845 compound-statement:
3846 { block-item-list[opt] }
3847 { label-declarations block-item-list }
3849 block-item-list:
3850 block-item
3851 block-item-list block-item
3853 block-item:
3854 nested-declaration
3855 statement
3857 nested-declaration:
3858 declaration
3860 GNU extensions:
3862 compound-statement:
3863 { label-declarations block-item-list }
3865 nested-declaration:
3866 __extension__ nested-declaration
3867 nested-function-definition
3869 label-declarations:
3870 label-declaration
3871 label-declarations label-declaration
3873 label-declaration:
3874 __label__ identifier-list ;
3876 Allowing the mixing of declarations and code is new in C99. The
3877 GNU syntax also permits (not shown above) labels at the end of
3878 compound statements, which yield an error. We don't allow labels
3879 on declarations; this might seem like a natural extension, but
3880 there would be a conflict between attributes on the label and
3881 prefix attributes on the declaration. ??? The syntax follows the
3882 old parser in requiring something after label declarations.
3883 Although they are erroneous if the labels declared aren't defined,
3884 is it useful for the syntax to be this way?
3886 OpenMP:
3888 block-item:
3889 openmp-directive
3891 openmp-directive:
3892 barrier-directive
3893 flush-directive */
3895 static tree
3896 c_parser_compound_statement (c_parser *parser)
3898 tree stmt;
3899 location_t brace_loc;
3900 brace_loc = c_parser_peek_token (parser)->location;
3901 if (!c_parser_require (parser, CPP_OPEN_BRACE, "expected %<{%>"))
3903 /* Ensure a scope is entered and left anyway to avoid confusion
3904 if we have just prepared to enter a function body. */
3905 stmt = c_begin_compound_stmt (true);
3906 c_end_compound_stmt (brace_loc, stmt, true);
3907 return error_mark_node;
3909 stmt = c_begin_compound_stmt (true);
3910 c_parser_compound_statement_nostart (parser);
3911 return c_end_compound_stmt (brace_loc, stmt, true);
3914 /* Parse a compound statement except for the opening brace. This is
3915 used for parsing both compound statements and statement expressions
3916 (which follow different paths to handling the opening). */
3918 static void
3919 c_parser_compound_statement_nostart (c_parser *parser)
3921 bool last_stmt = false;
3922 bool last_label = false;
3923 bool save_valid_for_pragma = valid_location_for_stdc_pragma_p ();
3924 location_t label_loc = UNKNOWN_LOCATION; /* Quiet warning. */
3925 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
3927 c_parser_consume_token (parser);
3928 return;
3930 mark_valid_location_for_stdc_pragma (true);
3931 if (c_parser_next_token_is_keyword (parser, RID_LABEL))
3933 /* Read zero or more forward-declarations for labels that nested
3934 functions can jump to. */
3935 mark_valid_location_for_stdc_pragma (false);
3936 while (c_parser_next_token_is_keyword (parser, RID_LABEL))
3938 label_loc = c_parser_peek_token (parser)->location;
3939 c_parser_consume_token (parser);
3940 /* Any identifiers, including those declared as type names,
3941 are OK here. */
3942 while (true)
3944 tree label;
3945 if (c_parser_next_token_is_not (parser, CPP_NAME))
3947 c_parser_error (parser, "expected identifier");
3948 break;
3950 label
3951 = declare_label (c_parser_peek_token (parser)->value);
3952 C_DECLARED_LABEL_FLAG (label) = 1;
3953 add_stmt (build_stmt (label_loc, DECL_EXPR, label));
3954 c_parser_consume_token (parser);
3955 if (c_parser_next_token_is (parser, CPP_COMMA))
3956 c_parser_consume_token (parser);
3957 else
3958 break;
3960 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
3962 pedwarn (label_loc, OPT_pedantic, "ISO C forbids label declarations");
3964 /* We must now have at least one statement, label or declaration. */
3965 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
3967 mark_valid_location_for_stdc_pragma (save_valid_for_pragma);
3968 c_parser_error (parser, "expected declaration or statement");
3969 c_parser_consume_token (parser);
3970 return;
3972 while (c_parser_next_token_is_not (parser, CPP_CLOSE_BRACE))
3974 location_t loc = c_parser_peek_token (parser)->location;
3975 if (c_parser_next_token_is_keyword (parser, RID_CASE)
3976 || c_parser_next_token_is_keyword (parser, RID_DEFAULT)
3977 || (c_parser_next_token_is (parser, CPP_NAME)
3978 && c_parser_peek_2nd_token (parser)->type == CPP_COLON))
3980 if (c_parser_next_token_is_keyword (parser, RID_CASE))
3981 label_loc = c_parser_peek_2nd_token (parser)->location;
3982 else
3983 label_loc = c_parser_peek_token (parser)->location;
3984 last_label = true;
3985 last_stmt = false;
3986 mark_valid_location_for_stdc_pragma (false);
3987 c_parser_label (parser);
3989 else if (!last_label
3990 && c_parser_next_tokens_start_declaration (parser))
3992 last_label = false;
3993 mark_valid_location_for_stdc_pragma (false);
3994 c_parser_declaration_or_fndef (parser, true, true, true, true, true, NULL);
3995 if (last_stmt)
3996 pedwarn_c90 (loc,
3997 (pedantic && !flag_isoc99)
3998 ? OPT_pedantic
3999 : OPT_Wdeclaration_after_statement,
4000 "ISO C90 forbids mixed declarations and code");
4001 last_stmt = false;
4003 else if (!last_label
4004 && c_parser_next_token_is_keyword (parser, RID_EXTENSION))
4006 /* __extension__ can start a declaration, but is also an
4007 unary operator that can start an expression. Consume all
4008 but the last of a possible series of __extension__ to
4009 determine which. */
4010 while (c_parser_peek_2nd_token (parser)->type == CPP_KEYWORD
4011 && (c_parser_peek_2nd_token (parser)->keyword
4012 == RID_EXTENSION))
4013 c_parser_consume_token (parser);
4014 if (c_token_starts_declaration (c_parser_peek_2nd_token (parser)))
4016 int ext;
4017 ext = disable_extension_diagnostics ();
4018 c_parser_consume_token (parser);
4019 last_label = false;
4020 mark_valid_location_for_stdc_pragma (false);
4021 c_parser_declaration_or_fndef (parser, true, true, true, true,
4022 true, NULL);
4023 /* Following the old parser, __extension__ does not
4024 disable this diagnostic. */
4025 restore_extension_diagnostics (ext);
4026 if (last_stmt)
4027 pedwarn_c90 (loc, (pedantic && !flag_isoc99)
4028 ? OPT_pedantic
4029 : OPT_Wdeclaration_after_statement,
4030 "ISO C90 forbids mixed declarations and code");
4031 last_stmt = false;
4033 else
4034 goto statement;
4036 else if (c_parser_next_token_is (parser, CPP_PRAGMA))
4038 /* External pragmas, and some omp pragmas, are not associated
4039 with regular c code, and so are not to be considered statements
4040 syntactically. This ensures that the user doesn't put them
4041 places that would turn into syntax errors if the directive
4042 were ignored. */
4043 if (c_parser_pragma (parser, pragma_compound))
4044 last_label = false, last_stmt = true;
4046 else if (c_parser_next_token_is (parser, CPP_EOF))
4048 mark_valid_location_for_stdc_pragma (save_valid_for_pragma);
4049 c_parser_error (parser, "expected declaration or statement");
4050 return;
4052 else if (c_parser_next_token_is_keyword (parser, RID_ELSE))
4054 if (parser->in_if_block)
4056 mark_valid_location_for_stdc_pragma (save_valid_for_pragma);
4057 error_at (loc, """expected %<}%> before %<else%>");
4058 return;
4060 else
4062 error_at (loc, "%<else%> without a previous %<if%>");
4063 c_parser_consume_token (parser);
4064 continue;
4067 else
4069 statement:
4070 last_label = false;
4071 last_stmt = true;
4072 mark_valid_location_for_stdc_pragma (false);
4073 c_parser_statement_after_labels (parser);
4076 parser->error = false;
4078 if (last_label)
4079 error_at (label_loc, "label at end of compound statement");
4080 c_parser_consume_token (parser);
4081 /* Restore the value we started with. */
4082 mark_valid_location_for_stdc_pragma (save_valid_for_pragma);
4085 /* Parse a label (C90 6.6.1, C99 6.8.1).
4087 label:
4088 identifier : attributes[opt]
4089 case constant-expression :
4090 default :
4092 GNU extensions:
4094 label:
4095 case constant-expression ... constant-expression :
4097 The use of attributes on labels is a GNU extension. The syntax in
4098 GNU C accepts any expressions without commas, non-constant
4099 expressions being rejected later. */
4101 static void
4102 c_parser_label (c_parser *parser)
4104 location_t loc1 = c_parser_peek_token (parser)->location;
4105 tree label = NULL_TREE;
4106 if (c_parser_next_token_is_keyword (parser, RID_CASE))
4108 tree exp1, exp2;
4109 c_parser_consume_token (parser);
4110 exp1 = c_parser_expr_no_commas (parser, NULL).value;
4111 if (c_parser_next_token_is (parser, CPP_COLON))
4113 c_parser_consume_token (parser);
4114 label = do_case (loc1, exp1, NULL_TREE);
4116 else if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
4118 c_parser_consume_token (parser);
4119 exp2 = c_parser_expr_no_commas (parser, NULL).value;
4120 if (c_parser_require (parser, CPP_COLON, "expected %<:%>"))
4121 label = do_case (loc1, exp1, exp2);
4123 else
4124 c_parser_error (parser, "expected %<:%> or %<...%>");
4126 else if (c_parser_next_token_is_keyword (parser, RID_DEFAULT))
4128 c_parser_consume_token (parser);
4129 if (c_parser_require (parser, CPP_COLON, "expected %<:%>"))
4130 label = do_case (loc1, NULL_TREE, NULL_TREE);
4132 else
4134 tree name = c_parser_peek_token (parser)->value;
4135 tree tlab;
4136 tree attrs;
4137 location_t loc2 = c_parser_peek_token (parser)->location;
4138 gcc_assert (c_parser_next_token_is (parser, CPP_NAME));
4139 c_parser_consume_token (parser);
4140 gcc_assert (c_parser_next_token_is (parser, CPP_COLON));
4141 c_parser_consume_token (parser);
4142 attrs = c_parser_attributes (parser);
4143 tlab = define_label (loc2, name);
4144 if (tlab)
4146 decl_attributes (&tlab, attrs, 0);
4147 label = add_stmt (build_stmt (loc1, LABEL_EXPR, tlab));
4150 if (label)
4152 if (c_parser_next_tokens_start_declaration (parser))
4154 error_at (c_parser_peek_token (parser)->location,
4155 "a label can only be part of a statement and "
4156 "a declaration is not a statement");
4157 c_parser_declaration_or_fndef (parser, /*fndef_ok*/ false,
4158 /*static_assert_ok*/ true,
4159 /*nested*/ true, /*empty_ok*/ false,
4160 /*start_attr_ok*/ true, NULL);
4165 /* Parse a statement (C90 6.6, C99 6.8).
4167 statement:
4168 labeled-statement
4169 compound-statement
4170 expression-statement
4171 selection-statement
4172 iteration-statement
4173 jump-statement
4175 labeled-statement:
4176 label statement
4178 expression-statement:
4179 expression[opt] ;
4181 selection-statement:
4182 if-statement
4183 switch-statement
4185 iteration-statement:
4186 while-statement
4187 do-statement
4188 for-statement
4190 jump-statement:
4191 goto identifier ;
4192 continue ;
4193 break ;
4194 return expression[opt] ;
4196 GNU extensions:
4198 statement:
4199 asm-statement
4201 jump-statement:
4202 goto * expression ;
4204 Objective-C:
4206 statement:
4207 objc-throw-statement
4208 objc-try-catch-statement
4209 objc-synchronized-statement
4211 objc-throw-statement:
4212 @throw expression ;
4213 @throw ;
4215 OpenMP:
4217 statement:
4218 openmp-construct
4220 openmp-construct:
4221 parallel-construct
4222 for-construct
4223 sections-construct
4224 single-construct
4225 parallel-for-construct
4226 parallel-sections-construct
4227 master-construct
4228 critical-construct
4229 atomic-construct
4230 ordered-construct
4232 parallel-construct:
4233 parallel-directive structured-block
4235 for-construct:
4236 for-directive iteration-statement
4238 sections-construct:
4239 sections-directive section-scope
4241 single-construct:
4242 single-directive structured-block
4244 parallel-for-construct:
4245 parallel-for-directive iteration-statement
4247 parallel-sections-construct:
4248 parallel-sections-directive section-scope
4250 master-construct:
4251 master-directive structured-block
4253 critical-construct:
4254 critical-directive structured-block
4256 atomic-construct:
4257 atomic-directive expression-statement
4259 ordered-construct:
4260 ordered-directive structured-block */
4262 static void
4263 c_parser_statement (c_parser *parser)
4265 while (c_parser_next_token_is_keyword (parser, RID_CASE)
4266 || c_parser_next_token_is_keyword (parser, RID_DEFAULT)
4267 || (c_parser_next_token_is (parser, CPP_NAME)
4268 && c_parser_peek_2nd_token (parser)->type == CPP_COLON))
4269 c_parser_label (parser);
4270 c_parser_statement_after_labels (parser);
4273 /* Parse a statement, other than a labeled statement. */
4275 static void
4276 c_parser_statement_after_labels (c_parser *parser)
4278 location_t loc = c_parser_peek_token (parser)->location;
4279 tree stmt = NULL_TREE;
4280 bool in_if_block = parser->in_if_block;
4281 parser->in_if_block = false;
4282 switch (c_parser_peek_token (parser)->type)
4284 case CPP_OPEN_BRACE:
4285 add_stmt (c_parser_compound_statement (parser));
4286 break;
4287 case CPP_KEYWORD:
4288 switch (c_parser_peek_token (parser)->keyword)
4290 case RID_IF:
4291 c_parser_if_statement (parser);
4292 break;
4293 case RID_SWITCH:
4294 c_parser_switch_statement (parser);
4295 break;
4296 case RID_WHILE:
4297 c_parser_while_statement (parser);
4298 break;
4299 case RID_DO:
4300 c_parser_do_statement (parser);
4301 break;
4302 case RID_FOR:
4303 c_parser_for_statement (parser);
4304 break;
4305 case RID_GOTO:
4306 c_parser_consume_token (parser);
4307 if (c_parser_next_token_is (parser, CPP_NAME))
4309 stmt = c_finish_goto_label (loc,
4310 c_parser_peek_token (parser)->value);
4311 c_parser_consume_token (parser);
4313 else if (c_parser_next_token_is (parser, CPP_MULT))
4315 tree val;
4317 c_parser_consume_token (parser);
4318 val = c_parser_expression (parser).value;
4319 mark_exp_read (val);
4320 stmt = c_finish_goto_ptr (loc, val);
4322 else
4323 c_parser_error (parser, "expected identifier or %<*%>");
4324 goto expect_semicolon;
4325 case RID_CONTINUE:
4326 c_parser_consume_token (parser);
4327 stmt = c_finish_bc_stmt (loc, &c_cont_label, false);
4328 goto expect_semicolon;
4329 case RID_BREAK:
4330 c_parser_consume_token (parser);
4331 stmt = c_finish_bc_stmt (loc, &c_break_label, true);
4332 goto expect_semicolon;
4333 case RID_RETURN:
4334 c_parser_consume_token (parser);
4335 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
4337 stmt = c_finish_return (loc, NULL_TREE, NULL_TREE);
4338 c_parser_consume_token (parser);
4340 else
4342 struct c_expr expr = c_parser_expression_conv (parser);
4343 mark_exp_read (expr.value);
4344 stmt = c_finish_return (loc, expr.value, expr.original_type);
4345 goto expect_semicolon;
4347 break;
4348 case RID_ASM:
4349 stmt = c_parser_asm_statement (parser);
4350 break;
4351 case RID_AT_THROW:
4352 gcc_assert (c_dialect_objc ());
4353 c_parser_consume_token (parser);
4354 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
4356 stmt = objc_build_throw_stmt (loc, NULL_TREE);
4357 c_parser_consume_token (parser);
4359 else
4361 tree expr = c_parser_expression (parser).value;
4362 expr = c_fully_fold (expr, false, NULL);
4363 stmt = objc_build_throw_stmt (loc, expr);
4364 goto expect_semicolon;
4366 break;
4367 case RID_AT_TRY:
4368 gcc_assert (c_dialect_objc ());
4369 c_parser_objc_try_catch_finally_statement (parser);
4370 break;
4371 case RID_AT_SYNCHRONIZED:
4372 gcc_assert (c_dialect_objc ());
4373 c_parser_objc_synchronized_statement (parser);
4374 break;
4375 default:
4376 goto expr_stmt;
4378 break;
4379 case CPP_SEMICOLON:
4380 c_parser_consume_token (parser);
4381 break;
4382 case CPP_CLOSE_PAREN:
4383 case CPP_CLOSE_SQUARE:
4384 /* Avoid infinite loop in error recovery:
4385 c_parser_skip_until_found stops at a closing nesting
4386 delimiter without consuming it, but here we need to consume
4387 it to proceed further. */
4388 c_parser_error (parser, "expected statement");
4389 c_parser_consume_token (parser);
4390 break;
4391 case CPP_PRAGMA:
4392 c_parser_pragma (parser, pragma_stmt);
4393 break;
4394 default:
4395 expr_stmt:
4396 stmt = c_finish_expr_stmt (loc, c_parser_expression_conv (parser).value);
4397 expect_semicolon:
4398 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
4399 break;
4401 /* Two cases cannot and do not have line numbers associated: If stmt
4402 is degenerate, such as "2;", then stmt is an INTEGER_CST, which
4403 cannot hold line numbers. But that's OK because the statement
4404 will either be changed to a MODIFY_EXPR during gimplification of
4405 the statement expr, or discarded. If stmt was compound, but
4406 without new variables, we will have skipped the creation of a
4407 BIND and will have a bare STATEMENT_LIST. But that's OK because
4408 (recursively) all of the component statements should already have
4409 line numbers assigned. ??? Can we discard no-op statements
4410 earlier? */
4411 if (CAN_HAVE_LOCATION_P (stmt)
4412 && EXPR_LOCATION (stmt) == UNKNOWN_LOCATION)
4413 SET_EXPR_LOCATION (stmt, loc);
4415 parser->in_if_block = in_if_block;
4418 /* Parse the condition from an if, do, while or for statements. */
4420 static tree
4421 c_parser_condition (c_parser *parser)
4423 location_t loc = c_parser_peek_token (parser)->location;
4424 tree cond;
4425 cond = c_parser_expression_conv (parser).value;
4426 cond = c_objc_common_truthvalue_conversion (loc, cond);
4427 cond = c_fully_fold (cond, false, NULL);
4428 if (warn_sequence_point)
4429 verify_sequence_points (cond);
4430 return cond;
4433 /* Parse a parenthesized condition from an if, do or while statement.
4435 condition:
4436 ( expression )
4438 static tree
4439 c_parser_paren_condition (c_parser *parser)
4441 tree cond;
4442 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
4443 return error_mark_node;
4444 cond = c_parser_condition (parser);
4445 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
4446 return cond;
4449 /* Parse a statement which is a block in C99. */
4451 static tree
4452 c_parser_c99_block_statement (c_parser *parser)
4454 tree block = c_begin_compound_stmt (flag_isoc99);
4455 location_t loc = c_parser_peek_token (parser)->location;
4456 c_parser_statement (parser);
4457 return c_end_compound_stmt (loc, block, flag_isoc99);
4460 /* Parse the body of an if statement. This is just parsing a
4461 statement but (a) it is a block in C99, (b) we track whether the
4462 body is an if statement for the sake of -Wparentheses warnings, (c)
4463 we handle an empty body specially for the sake of -Wempty-body
4464 warnings, and (d) we call parser_compound_statement directly
4465 because c_parser_statement_after_labels resets
4466 parser->in_if_block. */
4468 static tree
4469 c_parser_if_body (c_parser *parser, bool *if_p)
4471 tree block = c_begin_compound_stmt (flag_isoc99);
4472 location_t body_loc = c_parser_peek_token (parser)->location;
4473 while (c_parser_next_token_is_keyword (parser, RID_CASE)
4474 || c_parser_next_token_is_keyword (parser, RID_DEFAULT)
4475 || (c_parser_next_token_is (parser, CPP_NAME)
4476 && c_parser_peek_2nd_token (parser)->type == CPP_COLON))
4477 c_parser_label (parser);
4478 *if_p = c_parser_next_token_is_keyword (parser, RID_IF);
4479 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
4481 location_t loc = c_parser_peek_token (parser)->location;
4482 add_stmt (build_empty_stmt (loc));
4483 c_parser_consume_token (parser);
4484 if (!c_parser_next_token_is_keyword (parser, RID_ELSE))
4485 warning_at (loc, OPT_Wempty_body,
4486 "suggest braces around empty body in an %<if%> statement");
4488 else if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
4489 add_stmt (c_parser_compound_statement (parser));
4490 else
4491 c_parser_statement_after_labels (parser);
4492 return c_end_compound_stmt (body_loc, block, flag_isoc99);
4495 /* Parse the else body of an if statement. This is just parsing a
4496 statement but (a) it is a block in C99, (b) we handle an empty body
4497 specially for the sake of -Wempty-body warnings. */
4499 static tree
4500 c_parser_else_body (c_parser *parser)
4502 location_t else_loc = c_parser_peek_token (parser)->location;
4503 tree block = c_begin_compound_stmt (flag_isoc99);
4504 while (c_parser_next_token_is_keyword (parser, RID_CASE)
4505 || c_parser_next_token_is_keyword (parser, RID_DEFAULT)
4506 || (c_parser_next_token_is (parser, CPP_NAME)
4507 && c_parser_peek_2nd_token (parser)->type == CPP_COLON))
4508 c_parser_label (parser);
4509 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
4511 location_t loc = c_parser_peek_token (parser)->location;
4512 warning_at (loc,
4513 OPT_Wempty_body,
4514 "suggest braces around empty body in an %<else%> statement");
4515 add_stmt (build_empty_stmt (loc));
4516 c_parser_consume_token (parser);
4518 else
4519 c_parser_statement_after_labels (parser);
4520 return c_end_compound_stmt (else_loc, block, flag_isoc99);
4523 /* Parse an if statement (C90 6.6.4, C99 6.8.4).
4525 if-statement:
4526 if ( expression ) statement
4527 if ( expression ) statement else statement
4530 static void
4531 c_parser_if_statement (c_parser *parser)
4533 tree block;
4534 location_t loc;
4535 tree cond;
4536 bool first_if = false;
4537 tree first_body, second_body;
4538 bool in_if_block;
4540 gcc_assert (c_parser_next_token_is_keyword (parser, RID_IF));
4541 c_parser_consume_token (parser);
4542 block = c_begin_compound_stmt (flag_isoc99);
4543 loc = c_parser_peek_token (parser)->location;
4544 cond = c_parser_paren_condition (parser);
4545 in_if_block = parser->in_if_block;
4546 parser->in_if_block = true;
4547 first_body = c_parser_if_body (parser, &first_if);
4548 parser->in_if_block = in_if_block;
4549 if (c_parser_next_token_is_keyword (parser, RID_ELSE))
4551 c_parser_consume_token (parser);
4552 second_body = c_parser_else_body (parser);
4554 else
4555 second_body = NULL_TREE;
4556 c_finish_if_stmt (loc, cond, first_body, second_body, first_if);
4557 add_stmt (c_end_compound_stmt (loc, block, flag_isoc99));
4560 /* Parse a switch statement (C90 6.6.4, C99 6.8.4).
4562 switch-statement:
4563 switch (expression) statement
4566 static void
4567 c_parser_switch_statement (c_parser *parser)
4569 tree block, expr, body, save_break;
4570 location_t switch_loc = c_parser_peek_token (parser)->location;
4571 location_t switch_cond_loc;
4572 gcc_assert (c_parser_next_token_is_keyword (parser, RID_SWITCH));
4573 c_parser_consume_token (parser);
4574 block = c_begin_compound_stmt (flag_isoc99);
4575 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
4577 switch_cond_loc = c_parser_peek_token (parser)->location;
4578 expr = c_parser_expression (parser).value;
4579 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
4581 else
4583 switch_cond_loc = UNKNOWN_LOCATION;
4584 expr = error_mark_node;
4586 c_start_case (switch_loc, switch_cond_loc, expr);
4587 save_break = c_break_label;
4588 c_break_label = NULL_TREE;
4589 body = c_parser_c99_block_statement (parser);
4590 c_finish_case (body);
4591 if (c_break_label)
4593 location_t here = c_parser_peek_token (parser)->location;
4594 tree t = build1 (LABEL_EXPR, void_type_node, c_break_label);
4595 SET_EXPR_LOCATION (t, here);
4596 add_stmt (t);
4598 c_break_label = save_break;
4599 add_stmt (c_end_compound_stmt (switch_loc, block, flag_isoc99));
4602 /* Parse a while statement (C90 6.6.5, C99 6.8.5).
4604 while-statement:
4605 while (expression) statement
4608 static void
4609 c_parser_while_statement (c_parser *parser)
4611 tree block, cond, body, save_break, save_cont;
4612 location_t loc;
4613 gcc_assert (c_parser_next_token_is_keyword (parser, RID_WHILE));
4614 c_parser_consume_token (parser);
4615 block = c_begin_compound_stmt (flag_isoc99);
4616 loc = c_parser_peek_token (parser)->location;
4617 cond = c_parser_paren_condition (parser);
4618 save_break = c_break_label;
4619 c_break_label = NULL_TREE;
4620 save_cont = c_cont_label;
4621 c_cont_label = NULL_TREE;
4622 body = c_parser_c99_block_statement (parser);
4623 c_finish_loop (loc, cond, NULL, body, c_break_label, c_cont_label, true);
4624 add_stmt (c_end_compound_stmt (loc, block, flag_isoc99));
4625 c_break_label = save_break;
4626 c_cont_label = save_cont;
4629 /* Parse a do statement (C90 6.6.5, C99 6.8.5).
4631 do-statement:
4632 do statement while ( expression ) ;
4635 static void
4636 c_parser_do_statement (c_parser *parser)
4638 tree block, cond, body, save_break, save_cont, new_break, new_cont;
4639 location_t loc;
4640 gcc_assert (c_parser_next_token_is_keyword (parser, RID_DO));
4641 c_parser_consume_token (parser);
4642 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
4643 warning_at (c_parser_peek_token (parser)->location,
4644 OPT_Wempty_body,
4645 "suggest braces around empty body in %<do%> statement");
4646 block = c_begin_compound_stmt (flag_isoc99);
4647 loc = c_parser_peek_token (parser)->location;
4648 save_break = c_break_label;
4649 c_break_label = NULL_TREE;
4650 save_cont = c_cont_label;
4651 c_cont_label = NULL_TREE;
4652 body = c_parser_c99_block_statement (parser);
4653 c_parser_require_keyword (parser, RID_WHILE, "expected %<while%>");
4654 new_break = c_break_label;
4655 c_break_label = save_break;
4656 new_cont = c_cont_label;
4657 c_cont_label = save_cont;
4658 cond = c_parser_paren_condition (parser);
4659 if (!c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>"))
4660 c_parser_skip_to_end_of_block_or_statement (parser);
4661 c_finish_loop (loc, cond, NULL, body, new_break, new_cont, false);
4662 add_stmt (c_end_compound_stmt (loc, block, flag_isoc99));
4665 /* Parse a for statement (C90 6.6.5, C99 6.8.5).
4667 for-statement:
4668 for ( expression[opt] ; expression[opt] ; expression[opt] ) statement
4669 for ( nested-declaration expression[opt] ; expression[opt] ) statement
4671 The form with a declaration is new in C99.
4673 ??? In accordance with the old parser, the declaration may be a
4674 nested function, which is then rejected in check_for_loop_decls,
4675 but does it make any sense for this to be included in the grammar?
4676 Note in particular that the nested function does not include a
4677 trailing ';', whereas the "declaration" production includes one.
4678 Also, can we reject bad declarations earlier and cheaper than
4679 check_for_loop_decls?
4681 In Objective-C, there are two additional variants:
4683 foreach-statement:
4684 for ( expression in expresssion ) statement
4685 for ( declaration in expression ) statement
4687 This is inconsistent with C, because the second variant is allowed
4688 even if c99 is not enabled.
4690 The rest of the comment documents these Objective-C foreach-statement.
4692 Here is the canonical example of the first variant:
4693 for (object in array) { do something with object }
4694 we call the first expression ("object") the "object_expression" and
4695 the second expression ("array") the "collection_expression".
4696 object_expression must be an lvalue of type "id" (a generic Objective-C
4697 object) because the loop works by assigning to object_expression the
4698 various objects from the collection_expression. collection_expression
4699 must evaluate to something of type "id" which responds to the method
4700 countByEnumeratingWithState:objects:count:.
4702 The canonical example of the second variant is:
4703 for (id object in array) { do something with object }
4704 which is completely equivalent to
4706 id object;
4707 for (object in array) { do something with object }
4709 Note that initizializing 'object' in some way (eg, "for ((object =
4710 xxx) in array) { do something with object }") is possibly
4711 technically valid, but completely pointless as 'object' will be
4712 assigned to something else as soon as the loop starts. We should
4713 most likely reject it (TODO).
4715 The beginning of the Objective-C foreach-statement looks exactly
4716 like the beginning of the for-statement, and we can tell it is a
4717 foreach-statement only because the initial declaration or
4718 expression is terminated by 'in' instead of ';'.
4721 static void
4722 c_parser_for_statement (c_parser *parser)
4724 tree block, cond, incr, save_break, save_cont, body;
4725 /* The following are only used when parsing an ObjC foreach statement. */
4726 tree object_expression, collection_expression;
4727 location_t loc = c_parser_peek_token (parser)->location;
4728 location_t for_loc = c_parser_peek_token (parser)->location;
4729 bool is_foreach_statement = false;
4730 gcc_assert (c_parser_next_token_is_keyword (parser, RID_FOR));
4731 c_parser_consume_token (parser);
4732 /* Open a compound statement in Objective-C as well, just in case this is
4733 as foreach expression. */
4734 block = c_begin_compound_stmt (flag_isoc99 || c_dialect_objc ());
4735 cond = error_mark_node;
4736 incr = error_mark_node;
4737 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
4739 /* Parse the initialization declaration or expression. */
4740 object_expression = error_mark_node;
4741 parser->objc_could_be_foreach_context = c_dialect_objc ();
4742 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
4744 parser->objc_could_be_foreach_context = false;
4745 c_parser_consume_token (parser);
4746 c_finish_expr_stmt (loc, NULL_TREE);
4748 else if (c_parser_next_tokens_start_declaration (parser))
4750 c_parser_declaration_or_fndef (parser, true, true, true, true, true,
4751 &object_expression);
4752 parser->objc_could_be_foreach_context = false;
4754 if (c_parser_next_token_is_keyword (parser, RID_IN))
4756 c_parser_consume_token (parser);
4757 is_foreach_statement = true;
4758 if (check_for_loop_decls (for_loc, true) == NULL_TREE)
4759 c_parser_error (parser, "multiple iterating variables in fast enumeration");
4761 else
4762 check_for_loop_decls (for_loc, flag_isoc99);
4764 else if (c_parser_next_token_is_keyword (parser, RID_EXTENSION))
4766 /* __extension__ can start a declaration, but is also an
4767 unary operator that can start an expression. Consume all
4768 but the last of a possible series of __extension__ to
4769 determine which. */
4770 while (c_parser_peek_2nd_token (parser)->type == CPP_KEYWORD
4771 && (c_parser_peek_2nd_token (parser)->keyword
4772 == RID_EXTENSION))
4773 c_parser_consume_token (parser);
4774 if (c_token_starts_declaration (c_parser_peek_2nd_token (parser)))
4776 int ext;
4777 ext = disable_extension_diagnostics ();
4778 c_parser_consume_token (parser);
4779 c_parser_declaration_or_fndef (parser, true, true, true, true,
4780 true, &object_expression);
4781 parser->objc_could_be_foreach_context = false;
4783 restore_extension_diagnostics (ext);
4784 if (c_parser_next_token_is_keyword (parser, RID_IN))
4786 c_parser_consume_token (parser);
4787 is_foreach_statement = true;
4788 if (check_for_loop_decls (for_loc, true) == NULL_TREE)
4789 c_parser_error (parser, "multiple iterating variables in fast enumeration");
4791 else
4792 check_for_loop_decls (for_loc, flag_isoc99);
4794 else
4795 goto init_expr;
4797 else
4799 init_expr:
4801 tree init_expression;
4802 init_expression = c_parser_expression (parser).value;
4803 parser->objc_could_be_foreach_context = false;
4804 if (c_parser_next_token_is_keyword (parser, RID_IN))
4806 c_parser_consume_token (parser);
4807 is_foreach_statement = true;
4808 if (! lvalue_p (init_expression))
4809 c_parser_error (parser, "invalid iterating variable in fast enumeration");
4810 object_expression = c_fully_fold (init_expression, false, NULL);
4812 else
4814 c_finish_expr_stmt (loc, init_expression);
4815 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
4819 /* Parse the loop condition. In the case of a foreach
4820 statement, there is no loop condition. */
4821 gcc_assert (!parser->objc_could_be_foreach_context);
4822 if (!is_foreach_statement)
4824 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
4826 c_parser_consume_token (parser);
4827 cond = NULL_TREE;
4829 else
4831 cond = c_parser_condition (parser);
4832 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
4835 /* Parse the increment expression (the third expression in a
4836 for-statement). In the case of a foreach-statement, this is
4837 the expression that follows the 'in'. */
4838 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
4840 if (is_foreach_statement)
4842 c_parser_error (parser, "missing collection in fast enumeration");
4843 collection_expression = error_mark_node;
4845 else
4846 incr = c_process_expr_stmt (loc, NULL_TREE);
4848 else
4850 if (is_foreach_statement)
4851 collection_expression = c_fully_fold (c_parser_expression (parser).value,
4852 false, NULL);
4853 else
4854 incr = c_process_expr_stmt (loc, c_parser_expression (parser).value);
4856 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
4858 save_break = c_break_label;
4859 c_break_label = NULL_TREE;
4860 save_cont = c_cont_label;
4861 c_cont_label = NULL_TREE;
4862 body = c_parser_c99_block_statement (parser);
4863 if (is_foreach_statement)
4864 objc_finish_foreach_loop (loc, object_expression, collection_expression, body, c_break_label, c_cont_label);
4865 else
4866 c_finish_loop (loc, cond, incr, body, c_break_label, c_cont_label, true);
4867 add_stmt (c_end_compound_stmt (loc, block, flag_isoc99 || c_dialect_objc ()));
4868 c_break_label = save_break;
4869 c_cont_label = save_cont;
4872 /* Parse an asm statement, a GNU extension. This is a full-blown asm
4873 statement with inputs, outputs, clobbers, and volatile tag
4874 allowed.
4876 asm-statement:
4877 asm type-qualifier[opt] ( asm-argument ) ;
4878 asm type-qualifier[opt] goto ( asm-goto-argument ) ;
4880 asm-argument:
4881 asm-string-literal
4882 asm-string-literal : asm-operands[opt]
4883 asm-string-literal : asm-operands[opt] : asm-operands[opt]
4884 asm-string-literal : asm-operands[opt] : asm-operands[opt] : asm-clobbers[opt]
4886 asm-goto-argument:
4887 asm-string-literal : : asm-operands[opt] : asm-clobbers[opt] \
4888 : asm-goto-operands
4890 Qualifiers other than volatile are accepted in the syntax but
4891 warned for. */
4893 static tree
4894 c_parser_asm_statement (c_parser *parser)
4896 tree quals, str, outputs, inputs, clobbers, labels, ret;
4897 bool simple, is_goto;
4898 location_t asm_loc = c_parser_peek_token (parser)->location;
4899 int section, nsections;
4901 gcc_assert (c_parser_next_token_is_keyword (parser, RID_ASM));
4902 c_parser_consume_token (parser);
4903 if (c_parser_next_token_is_keyword (parser, RID_VOLATILE))
4905 quals = c_parser_peek_token (parser)->value;
4906 c_parser_consume_token (parser);
4908 else if (c_parser_next_token_is_keyword (parser, RID_CONST)
4909 || c_parser_next_token_is_keyword (parser, RID_RESTRICT))
4911 warning_at (c_parser_peek_token (parser)->location,
4913 "%E qualifier ignored on asm",
4914 c_parser_peek_token (parser)->value);
4915 quals = NULL_TREE;
4916 c_parser_consume_token (parser);
4918 else
4919 quals = NULL_TREE;
4921 is_goto = false;
4922 if (c_parser_next_token_is_keyword (parser, RID_GOTO))
4924 c_parser_consume_token (parser);
4925 is_goto = true;
4928 /* ??? Follow the C++ parser rather than using the
4929 lex_untranslated_string kludge. */
4930 parser->lex_untranslated_string = true;
4931 ret = NULL;
4933 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
4934 goto error;
4936 str = c_parser_asm_string_literal (parser);
4937 if (str == NULL_TREE)
4938 goto error_close_paren;
4940 simple = true;
4941 outputs = NULL_TREE;
4942 inputs = NULL_TREE;
4943 clobbers = NULL_TREE;
4944 labels = NULL_TREE;
4946 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN) && !is_goto)
4947 goto done_asm;
4949 /* Parse each colon-delimited section of operands. */
4950 nsections = 3 + is_goto;
4951 for (section = 0; section < nsections; ++section)
4953 if (!c_parser_require (parser, CPP_COLON,
4954 is_goto
4955 ? "expected %<:%>"
4956 : "expected %<:%> or %<)%>"))
4957 goto error_close_paren;
4959 /* Once past any colon, we're no longer a simple asm. */
4960 simple = false;
4962 if ((!c_parser_next_token_is (parser, CPP_COLON)
4963 && !c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
4964 || section == 3)
4965 switch (section)
4967 case 0:
4968 /* For asm goto, we don't allow output operands, but reserve
4969 the slot for a future extension that does allow them. */
4970 if (!is_goto)
4971 outputs = c_parser_asm_operands (parser, false);
4972 break;
4973 case 1:
4974 inputs = c_parser_asm_operands (parser, true);
4975 break;
4976 case 2:
4977 clobbers = c_parser_asm_clobbers (parser);
4978 break;
4979 case 3:
4980 labels = c_parser_asm_goto_operands (parser);
4981 break;
4982 default:
4983 gcc_unreachable ();
4986 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN) && !is_goto)
4987 goto done_asm;
4990 done_asm:
4991 if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
4993 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
4994 goto error;
4997 if (!c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>"))
4998 c_parser_skip_to_end_of_block_or_statement (parser);
5000 ret = build_asm_stmt (quals, build_asm_expr (asm_loc, str, outputs, inputs,
5001 clobbers, labels, simple));
5003 error:
5004 parser->lex_untranslated_string = false;
5005 return ret;
5007 error_close_paren:
5008 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5009 goto error;
5012 /* Parse asm operands, a GNU extension. If CONVERT_P (for inputs but
5013 not outputs), apply the default conversion of functions and arrays
5014 to pointers.
5016 asm-operands:
5017 asm-operand
5018 asm-operands , asm-operand
5020 asm-operand:
5021 asm-string-literal ( expression )
5022 [ identifier ] asm-string-literal ( expression )
5025 static tree
5026 c_parser_asm_operands (c_parser *parser, bool convert_p)
5028 tree list = NULL_TREE;
5029 location_t loc;
5030 while (true)
5032 tree name, str;
5033 struct c_expr expr;
5034 if (c_parser_next_token_is (parser, CPP_OPEN_SQUARE))
5036 c_parser_consume_token (parser);
5037 if (c_parser_next_token_is (parser, CPP_NAME))
5039 tree id = c_parser_peek_token (parser)->value;
5040 c_parser_consume_token (parser);
5041 name = build_string (IDENTIFIER_LENGTH (id),
5042 IDENTIFIER_POINTER (id));
5044 else
5046 c_parser_error (parser, "expected identifier");
5047 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, NULL);
5048 return NULL_TREE;
5050 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
5051 "expected %<]%>");
5053 else
5054 name = NULL_TREE;
5055 str = c_parser_asm_string_literal (parser);
5056 if (str == NULL_TREE)
5057 return NULL_TREE;
5058 parser->lex_untranslated_string = false;
5059 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5061 parser->lex_untranslated_string = true;
5062 return NULL_TREE;
5064 loc = c_parser_peek_token (parser)->location;
5065 expr = c_parser_expression (parser);
5066 mark_exp_read (expr.value);
5067 if (convert_p)
5068 expr = default_function_array_conversion (loc, expr);
5069 expr.value = c_fully_fold (expr.value, false, NULL);
5070 parser->lex_untranslated_string = true;
5071 if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
5073 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5074 return NULL_TREE;
5076 list = chainon (list, build_tree_list (build_tree_list (name, str),
5077 expr.value));
5078 if (c_parser_next_token_is (parser, CPP_COMMA))
5079 c_parser_consume_token (parser);
5080 else
5081 break;
5083 return list;
5086 /* Parse asm clobbers, a GNU extension.
5088 asm-clobbers:
5089 asm-string-literal
5090 asm-clobbers , asm-string-literal
5093 static tree
5094 c_parser_asm_clobbers (c_parser *parser)
5096 tree list = NULL_TREE;
5097 while (true)
5099 tree str = c_parser_asm_string_literal (parser);
5100 if (str)
5101 list = tree_cons (NULL_TREE, str, list);
5102 else
5103 return NULL_TREE;
5104 if (c_parser_next_token_is (parser, CPP_COMMA))
5105 c_parser_consume_token (parser);
5106 else
5107 break;
5109 return list;
5112 /* Parse asm goto labels, a GNU extension.
5114 asm-goto-operands:
5115 identifier
5116 asm-goto-operands , identifier
5119 static tree
5120 c_parser_asm_goto_operands (c_parser *parser)
5122 tree list = NULL_TREE;
5123 while (true)
5125 tree name, label;
5127 if (c_parser_next_token_is (parser, CPP_NAME))
5129 c_token *tok = c_parser_peek_token (parser);
5130 name = tok->value;
5131 label = lookup_label_for_goto (tok->location, name);
5132 c_parser_consume_token (parser);
5133 TREE_USED (label) = 1;
5135 else
5137 c_parser_error (parser, "expected identifier");
5138 return NULL_TREE;
5141 name = build_string (IDENTIFIER_LENGTH (name),
5142 IDENTIFIER_POINTER (name));
5143 list = tree_cons (name, label, list);
5144 if (c_parser_next_token_is (parser, CPP_COMMA))
5145 c_parser_consume_token (parser);
5146 else
5147 return nreverse (list);
5151 /* Parse an expression other than a compound expression; that is, an
5152 assignment expression (C90 6.3.16, C99 6.5.16). If AFTER is not
5153 NULL then it is an Objective-C message expression which is the
5154 primary-expression starting the expression as an initializer.
5156 assignment-expression:
5157 conditional-expression
5158 unary-expression assignment-operator assignment-expression
5160 assignment-operator: one of
5161 = *= /= %= += -= <<= >>= &= ^= |=
5163 In GNU C we accept any conditional expression on the LHS and
5164 diagnose the invalid lvalue rather than producing a syntax
5165 error. */
5167 static struct c_expr
5168 c_parser_expr_no_commas (c_parser *parser, struct c_expr *after)
5170 struct c_expr lhs, rhs, ret;
5171 enum tree_code code;
5172 location_t op_location, exp_location;
5173 gcc_assert (!after || c_dialect_objc ());
5174 lhs = c_parser_conditional_expression (parser, after);
5175 op_location = c_parser_peek_token (parser)->location;
5176 switch (c_parser_peek_token (parser)->type)
5178 case CPP_EQ:
5179 code = NOP_EXPR;
5180 break;
5181 case CPP_MULT_EQ:
5182 code = MULT_EXPR;
5183 break;
5184 case CPP_DIV_EQ:
5185 code = TRUNC_DIV_EXPR;
5186 break;
5187 case CPP_MOD_EQ:
5188 code = TRUNC_MOD_EXPR;
5189 break;
5190 case CPP_PLUS_EQ:
5191 code = PLUS_EXPR;
5192 break;
5193 case CPP_MINUS_EQ:
5194 code = MINUS_EXPR;
5195 break;
5196 case CPP_LSHIFT_EQ:
5197 code = LSHIFT_EXPR;
5198 break;
5199 case CPP_RSHIFT_EQ:
5200 code = RSHIFT_EXPR;
5201 break;
5202 case CPP_AND_EQ:
5203 code = BIT_AND_EXPR;
5204 break;
5205 case CPP_XOR_EQ:
5206 code = BIT_XOR_EXPR;
5207 break;
5208 case CPP_OR_EQ:
5209 code = BIT_IOR_EXPR;
5210 break;
5211 default:
5212 return lhs;
5214 c_parser_consume_token (parser);
5215 exp_location = c_parser_peek_token (parser)->location;
5216 rhs = c_parser_expr_no_commas (parser, NULL);
5217 rhs = default_function_array_read_conversion (exp_location, rhs);
5218 ret.value = build_modify_expr (op_location, lhs.value, lhs.original_type,
5219 code, exp_location, rhs.value,
5220 rhs.original_type);
5221 if (code == NOP_EXPR)
5222 ret.original_code = MODIFY_EXPR;
5223 else
5225 TREE_NO_WARNING (ret.value) = 1;
5226 ret.original_code = ERROR_MARK;
5228 ret.original_type = NULL;
5229 return ret;
5232 /* Parse a conditional expression (C90 6.3.15, C99 6.5.15). If AFTER
5233 is not NULL then it is an Objective-C message expression which is
5234 the primary-expression starting the expression as an initializer.
5236 conditional-expression:
5237 logical-OR-expression
5238 logical-OR-expression ? expression : conditional-expression
5240 GNU extensions:
5242 conditional-expression:
5243 logical-OR-expression ? : conditional-expression
5246 static struct c_expr
5247 c_parser_conditional_expression (c_parser *parser, struct c_expr *after)
5249 struct c_expr cond, exp1, exp2, ret;
5250 location_t cond_loc, colon_loc, middle_loc;
5252 gcc_assert (!after || c_dialect_objc ());
5254 cond = c_parser_binary_expression (parser, after);
5256 if (c_parser_next_token_is_not (parser, CPP_QUERY))
5257 return cond;
5258 cond_loc = c_parser_peek_token (parser)->location;
5259 cond = default_function_array_read_conversion (cond_loc, cond);
5260 c_parser_consume_token (parser);
5261 if (c_parser_next_token_is (parser, CPP_COLON))
5263 tree eptype = NULL_TREE;
5265 middle_loc = c_parser_peek_token (parser)->location;
5266 pedwarn (middle_loc, OPT_pedantic,
5267 "ISO C forbids omitting the middle term of a ?: expression");
5268 warn_for_omitted_condop (middle_loc, cond.value);
5269 if (TREE_CODE (cond.value) == EXCESS_PRECISION_EXPR)
5271 eptype = TREE_TYPE (cond.value);
5272 cond.value = TREE_OPERAND (cond.value, 0);
5274 /* Make sure first operand is calculated only once. */
5275 exp1.value = c_save_expr (default_conversion (cond.value));
5276 if (eptype)
5277 exp1.value = build1 (EXCESS_PRECISION_EXPR, eptype, exp1.value);
5278 exp1.original_type = NULL;
5279 cond.value = c_objc_common_truthvalue_conversion (cond_loc, exp1.value);
5280 c_inhibit_evaluation_warnings += cond.value == truthvalue_true_node;
5282 else
5284 cond.value
5285 = c_objc_common_truthvalue_conversion
5286 (cond_loc, default_conversion (cond.value));
5287 c_inhibit_evaluation_warnings += cond.value == truthvalue_false_node;
5288 exp1 = c_parser_expression_conv (parser);
5289 mark_exp_read (exp1.value);
5290 c_inhibit_evaluation_warnings +=
5291 ((cond.value == truthvalue_true_node)
5292 - (cond.value == truthvalue_false_node));
5295 colon_loc = c_parser_peek_token (parser)->location;
5296 if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
5298 c_inhibit_evaluation_warnings -= cond.value == truthvalue_true_node;
5299 ret.value = error_mark_node;
5300 ret.original_code = ERROR_MARK;
5301 ret.original_type = NULL;
5302 return ret;
5305 location_t exp2_loc = c_parser_peek_token (parser)->location;
5306 exp2 = c_parser_conditional_expression (parser, NULL);
5307 exp2 = default_function_array_read_conversion (exp2_loc, exp2);
5309 c_inhibit_evaluation_warnings -= cond.value == truthvalue_true_node;
5310 ret.value = build_conditional_expr (colon_loc, cond.value,
5311 cond.original_code == C_MAYBE_CONST_EXPR,
5312 exp1.value, exp1.original_type,
5313 exp2.value, exp2.original_type);
5314 ret.original_code = ERROR_MARK;
5315 if (exp1.value == error_mark_node || exp2.value == error_mark_node)
5316 ret.original_type = NULL;
5317 else
5319 tree t1, t2;
5321 /* If both sides are enum type, the default conversion will have
5322 made the type of the result be an integer type. We want to
5323 remember the enum types we started with. */
5324 t1 = exp1.original_type ? exp1.original_type : TREE_TYPE (exp1.value);
5325 t2 = exp2.original_type ? exp2.original_type : TREE_TYPE (exp2.value);
5326 ret.original_type = ((t1 != error_mark_node
5327 && t2 != error_mark_node
5328 && (TYPE_MAIN_VARIANT (t1)
5329 == TYPE_MAIN_VARIANT (t2)))
5330 ? t1
5331 : NULL);
5333 return ret;
5336 /* Parse a binary expression; that is, a logical-OR-expression (C90
5337 6.3.5-6.3.14, C99 6.5.5-6.5.14). If AFTER is not NULL then it is
5338 an Objective-C message expression which is the primary-expression
5339 starting the expression as an initializer.
5341 multiplicative-expression:
5342 cast-expression
5343 multiplicative-expression * cast-expression
5344 multiplicative-expression / cast-expression
5345 multiplicative-expression % cast-expression
5347 additive-expression:
5348 multiplicative-expression
5349 additive-expression + multiplicative-expression
5350 additive-expression - multiplicative-expression
5352 shift-expression:
5353 additive-expression
5354 shift-expression << additive-expression
5355 shift-expression >> additive-expression
5357 relational-expression:
5358 shift-expression
5359 relational-expression < shift-expression
5360 relational-expression > shift-expression
5361 relational-expression <= shift-expression
5362 relational-expression >= shift-expression
5364 equality-expression:
5365 relational-expression
5366 equality-expression == relational-expression
5367 equality-expression != relational-expression
5369 AND-expression:
5370 equality-expression
5371 AND-expression & equality-expression
5373 exclusive-OR-expression:
5374 AND-expression
5375 exclusive-OR-expression ^ AND-expression
5377 inclusive-OR-expression:
5378 exclusive-OR-expression
5379 inclusive-OR-expression | exclusive-OR-expression
5381 logical-AND-expression:
5382 inclusive-OR-expression
5383 logical-AND-expression && inclusive-OR-expression
5385 logical-OR-expression:
5386 logical-AND-expression
5387 logical-OR-expression || logical-AND-expression
5390 static struct c_expr
5391 c_parser_binary_expression (c_parser *parser, struct c_expr *after)
5393 /* A binary expression is parsed using operator-precedence parsing,
5394 with the operands being cast expressions. All the binary
5395 operators are left-associative. Thus a binary expression is of
5396 form:
5398 E0 op1 E1 op2 E2 ...
5400 which we represent on a stack. On the stack, the precedence
5401 levels are strictly increasing. When a new operator is
5402 encountered of higher precedence than that at the top of the
5403 stack, it is pushed; its LHS is the top expression, and its RHS
5404 is everything parsed until it is popped. When a new operator is
5405 encountered with precedence less than or equal to that at the top
5406 of the stack, triples E[i-1] op[i] E[i] are popped and replaced
5407 by the result of the operation until the operator at the top of
5408 the stack has lower precedence than the new operator or there is
5409 only one element on the stack; then the top expression is the LHS
5410 of the new operator. In the case of logical AND and OR
5411 expressions, we also need to adjust c_inhibit_evaluation_warnings
5412 as appropriate when the operators are pushed and popped. */
5414 /* The precedence levels, where 0 is a dummy lowest level used for
5415 the bottom of the stack. */
5416 enum prec {
5417 PREC_NONE,
5418 PREC_LOGOR,
5419 PREC_LOGAND,
5420 PREC_BITOR,
5421 PREC_BITXOR,
5422 PREC_BITAND,
5423 PREC_EQ,
5424 PREC_REL,
5425 PREC_SHIFT,
5426 PREC_ADD,
5427 PREC_MULT,
5428 NUM_PRECS
5430 struct {
5431 /* The expression at this stack level. */
5432 struct c_expr expr;
5433 /* The precedence of the operator on its left, PREC_NONE at the
5434 bottom of the stack. */
5435 enum prec prec;
5436 /* The operation on its left. */
5437 enum tree_code op;
5438 /* The source location of this operation. */
5439 location_t loc;
5440 } stack[NUM_PRECS];
5441 int sp;
5442 /* Location of the binary operator. */
5443 location_t binary_loc = UNKNOWN_LOCATION; /* Quiet warning. */
5444 #define POP \
5445 do { \
5446 switch (stack[sp].op) \
5448 case TRUTH_ANDIF_EXPR: \
5449 c_inhibit_evaluation_warnings -= (stack[sp - 1].expr.value \
5450 == truthvalue_false_node); \
5451 break; \
5452 case TRUTH_ORIF_EXPR: \
5453 c_inhibit_evaluation_warnings -= (stack[sp - 1].expr.value \
5454 == truthvalue_true_node); \
5455 break; \
5456 default: \
5457 break; \
5459 stack[sp - 1].expr \
5460 = default_function_array_read_conversion (stack[sp - 1].loc, \
5461 stack[sp - 1].expr); \
5462 stack[sp].expr \
5463 = default_function_array_read_conversion (stack[sp].loc, \
5464 stack[sp].expr); \
5465 stack[sp - 1].expr = parser_build_binary_op (stack[sp].loc, \
5466 stack[sp].op, \
5467 stack[sp - 1].expr, \
5468 stack[sp].expr); \
5469 sp--; \
5470 } while (0)
5471 gcc_assert (!after || c_dialect_objc ());
5472 stack[0].loc = c_parser_peek_token (parser)->location;
5473 stack[0].expr = c_parser_cast_expression (parser, after);
5474 stack[0].prec = PREC_NONE;
5475 sp = 0;
5476 while (true)
5478 enum prec oprec;
5479 enum tree_code ocode;
5480 if (parser->error)
5481 goto out;
5482 switch (c_parser_peek_token (parser)->type)
5484 case CPP_MULT:
5485 oprec = PREC_MULT;
5486 ocode = MULT_EXPR;
5487 break;
5488 case CPP_DIV:
5489 oprec = PREC_MULT;
5490 ocode = TRUNC_DIV_EXPR;
5491 break;
5492 case CPP_MOD:
5493 oprec = PREC_MULT;
5494 ocode = TRUNC_MOD_EXPR;
5495 break;
5496 case CPP_PLUS:
5497 oprec = PREC_ADD;
5498 ocode = PLUS_EXPR;
5499 break;
5500 case CPP_MINUS:
5501 oprec = PREC_ADD;
5502 ocode = MINUS_EXPR;
5503 break;
5504 case CPP_LSHIFT:
5505 oprec = PREC_SHIFT;
5506 ocode = LSHIFT_EXPR;
5507 break;
5508 case CPP_RSHIFT:
5509 oprec = PREC_SHIFT;
5510 ocode = RSHIFT_EXPR;
5511 break;
5512 case CPP_LESS:
5513 oprec = PREC_REL;
5514 ocode = LT_EXPR;
5515 break;
5516 case CPP_GREATER:
5517 oprec = PREC_REL;
5518 ocode = GT_EXPR;
5519 break;
5520 case CPP_LESS_EQ:
5521 oprec = PREC_REL;
5522 ocode = LE_EXPR;
5523 break;
5524 case CPP_GREATER_EQ:
5525 oprec = PREC_REL;
5526 ocode = GE_EXPR;
5527 break;
5528 case CPP_EQ_EQ:
5529 oprec = PREC_EQ;
5530 ocode = EQ_EXPR;
5531 break;
5532 case CPP_NOT_EQ:
5533 oprec = PREC_EQ;
5534 ocode = NE_EXPR;
5535 break;
5536 case CPP_AND:
5537 oprec = PREC_BITAND;
5538 ocode = BIT_AND_EXPR;
5539 break;
5540 case CPP_XOR:
5541 oprec = PREC_BITXOR;
5542 ocode = BIT_XOR_EXPR;
5543 break;
5544 case CPP_OR:
5545 oprec = PREC_BITOR;
5546 ocode = BIT_IOR_EXPR;
5547 break;
5548 case CPP_AND_AND:
5549 oprec = PREC_LOGAND;
5550 ocode = TRUTH_ANDIF_EXPR;
5551 break;
5552 case CPP_OR_OR:
5553 oprec = PREC_LOGOR;
5554 ocode = TRUTH_ORIF_EXPR;
5555 break;
5556 default:
5557 /* Not a binary operator, so end of the binary
5558 expression. */
5559 goto out;
5561 binary_loc = c_parser_peek_token (parser)->location;
5562 c_parser_consume_token (parser);
5563 while (oprec <= stack[sp].prec)
5564 POP;
5565 switch (ocode)
5567 case TRUTH_ANDIF_EXPR:
5568 stack[sp].expr
5569 = default_function_array_read_conversion (stack[sp].loc,
5570 stack[sp].expr);
5571 stack[sp].expr.value = c_objc_common_truthvalue_conversion
5572 (stack[sp].loc, default_conversion (stack[sp].expr.value));
5573 c_inhibit_evaluation_warnings += (stack[sp].expr.value
5574 == truthvalue_false_node);
5575 break;
5576 case TRUTH_ORIF_EXPR:
5577 stack[sp].expr
5578 = default_function_array_read_conversion (stack[sp].loc,
5579 stack[sp].expr);
5580 stack[sp].expr.value = c_objc_common_truthvalue_conversion
5581 (stack[sp].loc, default_conversion (stack[sp].expr.value));
5582 c_inhibit_evaluation_warnings += (stack[sp].expr.value
5583 == truthvalue_true_node);
5584 break;
5585 default:
5586 break;
5588 sp++;
5589 stack[sp].loc = binary_loc;
5590 stack[sp].expr = c_parser_cast_expression (parser, NULL);
5591 stack[sp].prec = oprec;
5592 stack[sp].op = ocode;
5593 stack[sp].loc = binary_loc;
5595 out:
5596 while (sp > 0)
5597 POP;
5598 return stack[0].expr;
5599 #undef POP
5602 /* Parse a cast expression (C90 6.3.4, C99 6.5.4). If AFTER is not
5603 NULL then it is an Objective-C message expression which is the
5604 primary-expression starting the expression as an initializer.
5606 cast-expression:
5607 unary-expression
5608 ( type-name ) unary-expression
5611 static struct c_expr
5612 c_parser_cast_expression (c_parser *parser, struct c_expr *after)
5614 location_t cast_loc = c_parser_peek_token (parser)->location;
5615 gcc_assert (!after || c_dialect_objc ());
5616 if (after)
5617 return c_parser_postfix_expression_after_primary (parser,
5618 cast_loc, *after);
5619 /* If the expression begins with a parenthesized type name, it may
5620 be either a cast or a compound literal; we need to see whether
5621 the next character is '{' to tell the difference. If not, it is
5622 an unary expression. */
5623 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)
5624 && c_token_starts_typename (c_parser_peek_2nd_token (parser)))
5626 struct c_type_name *type_name;
5627 struct c_expr ret;
5628 struct c_expr expr;
5629 c_parser_consume_token (parser);
5630 type_name = c_parser_type_name (parser);
5631 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
5632 if (type_name == NULL)
5634 ret.value = error_mark_node;
5635 ret.original_code = ERROR_MARK;
5636 ret.original_type = NULL;
5637 return ret;
5640 /* Save casted types in the function's used types hash table. */
5641 used_types_insert (type_name->specs->type);
5643 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
5644 return c_parser_postfix_expression_after_paren_type (parser, type_name,
5645 cast_loc);
5647 location_t expr_loc = c_parser_peek_token (parser)->location;
5648 expr = c_parser_cast_expression (parser, NULL);
5649 expr = default_function_array_read_conversion (expr_loc, expr);
5651 ret.value = c_cast_expr (cast_loc, type_name, expr.value);
5652 ret.original_code = ERROR_MARK;
5653 ret.original_type = NULL;
5654 return ret;
5656 else
5657 return c_parser_unary_expression (parser);
5660 /* Parse an unary expression (C90 6.3.3, C99 6.5.3).
5662 unary-expression:
5663 postfix-expression
5664 ++ unary-expression
5665 -- unary-expression
5666 unary-operator cast-expression
5667 sizeof unary-expression
5668 sizeof ( type-name )
5670 unary-operator: one of
5671 & * + - ~ !
5673 GNU extensions:
5675 unary-expression:
5676 __alignof__ unary-expression
5677 __alignof__ ( type-name )
5678 && identifier
5680 unary-operator: one of
5681 __extension__ __real__ __imag__
5683 In addition, the GNU syntax treats ++ and -- as unary operators, so
5684 they may be applied to cast expressions with errors for non-lvalues
5685 given later. */
5687 static struct c_expr
5688 c_parser_unary_expression (c_parser *parser)
5690 int ext;
5691 struct c_expr ret, op;
5692 location_t op_loc = c_parser_peek_token (parser)->location;
5693 location_t exp_loc;
5694 ret.original_code = ERROR_MARK;
5695 ret.original_type = NULL;
5696 switch (c_parser_peek_token (parser)->type)
5698 case CPP_PLUS_PLUS:
5699 c_parser_consume_token (parser);
5700 exp_loc = c_parser_peek_token (parser)->location;
5701 op = c_parser_cast_expression (parser, NULL);
5702 op = default_function_array_read_conversion (exp_loc, op);
5703 return parser_build_unary_op (op_loc, PREINCREMENT_EXPR, op);
5704 case CPP_MINUS_MINUS:
5705 c_parser_consume_token (parser);
5706 exp_loc = c_parser_peek_token (parser)->location;
5707 op = c_parser_cast_expression (parser, NULL);
5708 op = default_function_array_read_conversion (exp_loc, op);
5709 return parser_build_unary_op (op_loc, PREDECREMENT_EXPR, op);
5710 case CPP_AND:
5711 c_parser_consume_token (parser);
5712 op = c_parser_cast_expression (parser, NULL);
5713 mark_exp_read (op.value);
5714 return parser_build_unary_op (op_loc, ADDR_EXPR, op);
5715 case CPP_MULT:
5716 c_parser_consume_token (parser);
5717 exp_loc = c_parser_peek_token (parser)->location;
5718 op = c_parser_cast_expression (parser, NULL);
5719 op = default_function_array_read_conversion (exp_loc, op);
5720 ret.value = build_indirect_ref (op_loc, op.value, RO_UNARY_STAR);
5721 return ret;
5722 case CPP_PLUS:
5723 if (!c_dialect_objc () && !in_system_header)
5724 warning_at (op_loc,
5725 OPT_Wtraditional,
5726 "traditional C rejects the unary plus operator");
5727 c_parser_consume_token (parser);
5728 exp_loc = c_parser_peek_token (parser)->location;
5729 op = c_parser_cast_expression (parser, NULL);
5730 op = default_function_array_read_conversion (exp_loc, op);
5731 return parser_build_unary_op (op_loc, CONVERT_EXPR, op);
5732 case CPP_MINUS:
5733 c_parser_consume_token (parser);
5734 exp_loc = c_parser_peek_token (parser)->location;
5735 op = c_parser_cast_expression (parser, NULL);
5736 op = default_function_array_read_conversion (exp_loc, op);
5737 return parser_build_unary_op (op_loc, NEGATE_EXPR, op);
5738 case CPP_COMPL:
5739 c_parser_consume_token (parser);
5740 exp_loc = c_parser_peek_token (parser)->location;
5741 op = c_parser_cast_expression (parser, NULL);
5742 op = default_function_array_read_conversion (exp_loc, op);
5743 return parser_build_unary_op (op_loc, BIT_NOT_EXPR, op);
5744 case CPP_NOT:
5745 c_parser_consume_token (parser);
5746 exp_loc = c_parser_peek_token (parser)->location;
5747 op = c_parser_cast_expression (parser, NULL);
5748 op = default_function_array_read_conversion (exp_loc, op);
5749 return parser_build_unary_op (op_loc, TRUTH_NOT_EXPR, op);
5750 case CPP_AND_AND:
5751 /* Refer to the address of a label as a pointer. */
5752 c_parser_consume_token (parser);
5753 if (c_parser_next_token_is (parser, CPP_NAME))
5755 ret.value = finish_label_address_expr
5756 (c_parser_peek_token (parser)->value, op_loc);
5757 c_parser_consume_token (parser);
5759 else
5761 c_parser_error (parser, "expected identifier");
5762 ret.value = error_mark_node;
5764 return ret;
5765 case CPP_KEYWORD:
5766 switch (c_parser_peek_token (parser)->keyword)
5768 case RID_SIZEOF:
5769 return c_parser_sizeof_expression (parser);
5770 case RID_ALIGNOF:
5771 return c_parser_alignof_expression (parser);
5772 case RID_EXTENSION:
5773 c_parser_consume_token (parser);
5774 ext = disable_extension_diagnostics ();
5775 ret = c_parser_cast_expression (parser, NULL);
5776 restore_extension_diagnostics (ext);
5777 return ret;
5778 case RID_REALPART:
5779 c_parser_consume_token (parser);
5780 exp_loc = c_parser_peek_token (parser)->location;
5781 op = c_parser_cast_expression (parser, NULL);
5782 op = default_function_array_conversion (exp_loc, op);
5783 return parser_build_unary_op (op_loc, REALPART_EXPR, op);
5784 case RID_IMAGPART:
5785 c_parser_consume_token (parser);
5786 exp_loc = c_parser_peek_token (parser)->location;
5787 op = c_parser_cast_expression (parser, NULL);
5788 op = default_function_array_conversion (exp_loc, op);
5789 return parser_build_unary_op (op_loc, IMAGPART_EXPR, op);
5790 default:
5791 return c_parser_postfix_expression (parser);
5793 default:
5794 return c_parser_postfix_expression (parser);
5798 /* Parse a sizeof expression. */
5800 static struct c_expr
5801 c_parser_sizeof_expression (c_parser *parser)
5803 struct c_expr expr;
5804 location_t expr_loc;
5805 gcc_assert (c_parser_next_token_is_keyword (parser, RID_SIZEOF));
5806 c_parser_consume_token (parser);
5807 c_inhibit_evaluation_warnings++;
5808 in_sizeof++;
5809 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)
5810 && c_token_starts_typename (c_parser_peek_2nd_token (parser)))
5812 /* Either sizeof ( type-name ) or sizeof unary-expression
5813 starting with a compound literal. */
5814 struct c_type_name *type_name;
5815 c_parser_consume_token (parser);
5816 expr_loc = c_parser_peek_token (parser)->location;
5817 type_name = c_parser_type_name (parser);
5818 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
5819 if (type_name == NULL)
5821 struct c_expr ret;
5822 c_inhibit_evaluation_warnings--;
5823 in_sizeof--;
5824 ret.value = error_mark_node;
5825 ret.original_code = ERROR_MARK;
5826 ret.original_type = NULL;
5827 return ret;
5829 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
5831 expr = c_parser_postfix_expression_after_paren_type (parser,
5832 type_name,
5833 expr_loc);
5834 goto sizeof_expr;
5836 /* sizeof ( type-name ). */
5837 c_inhibit_evaluation_warnings--;
5838 in_sizeof--;
5839 return c_expr_sizeof_type (expr_loc, type_name);
5841 else
5843 expr_loc = c_parser_peek_token (parser)->location;
5844 expr = c_parser_unary_expression (parser);
5845 sizeof_expr:
5846 c_inhibit_evaluation_warnings--;
5847 in_sizeof--;
5848 mark_exp_read (expr.value);
5849 if (TREE_CODE (expr.value) == COMPONENT_REF
5850 && DECL_C_BIT_FIELD (TREE_OPERAND (expr.value, 1)))
5851 error_at (expr_loc, "%<sizeof%> applied to a bit-field");
5852 return c_expr_sizeof_expr (expr_loc, expr);
5856 /* Parse an alignof expression. */
5858 static struct c_expr
5859 c_parser_alignof_expression (c_parser *parser)
5861 struct c_expr expr;
5862 location_t loc = c_parser_peek_token (parser)->location;
5863 gcc_assert (c_parser_next_token_is_keyword (parser, RID_ALIGNOF));
5864 c_parser_consume_token (parser);
5865 c_inhibit_evaluation_warnings++;
5866 in_alignof++;
5867 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)
5868 && c_token_starts_typename (c_parser_peek_2nd_token (parser)))
5870 /* Either __alignof__ ( type-name ) or __alignof__
5871 unary-expression starting with a compound literal. */
5872 location_t loc;
5873 struct c_type_name *type_name;
5874 struct c_expr ret;
5875 c_parser_consume_token (parser);
5876 loc = c_parser_peek_token (parser)->location;
5877 type_name = c_parser_type_name (parser);
5878 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
5879 if (type_name == NULL)
5881 struct c_expr ret;
5882 c_inhibit_evaluation_warnings--;
5883 in_alignof--;
5884 ret.value = error_mark_node;
5885 ret.original_code = ERROR_MARK;
5886 ret.original_type = NULL;
5887 return ret;
5889 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
5891 expr = c_parser_postfix_expression_after_paren_type (parser,
5892 type_name,
5893 loc);
5894 goto alignof_expr;
5896 /* alignof ( type-name ). */
5897 c_inhibit_evaluation_warnings--;
5898 in_alignof--;
5899 ret.value = c_alignof (loc, groktypename (type_name, NULL, NULL));
5900 ret.original_code = ERROR_MARK;
5901 ret.original_type = NULL;
5902 return ret;
5904 else
5906 struct c_expr ret;
5907 expr = c_parser_unary_expression (parser);
5908 alignof_expr:
5909 mark_exp_read (expr.value);
5910 c_inhibit_evaluation_warnings--;
5911 in_alignof--;
5912 ret.value = c_alignof_expr (loc, expr.value);
5913 ret.original_code = ERROR_MARK;
5914 ret.original_type = NULL;
5915 return ret;
5919 /* Parse a postfix expression (C90 6.3.1-6.3.2, C99 6.5.1-6.5.2).
5921 postfix-expression:
5922 primary-expression
5923 postfix-expression [ expression ]
5924 postfix-expression ( argument-expression-list[opt] )
5925 postfix-expression . identifier
5926 postfix-expression -> identifier
5927 postfix-expression ++
5928 postfix-expression --
5929 ( type-name ) { initializer-list }
5930 ( type-name ) { initializer-list , }
5932 argument-expression-list:
5933 argument-expression
5934 argument-expression-list , argument-expression
5936 primary-expression:
5937 identifier
5938 constant
5939 string-literal
5940 ( expression )
5942 GNU extensions:
5944 primary-expression:
5945 __func__
5946 (treated as a keyword in GNU C)
5947 __FUNCTION__
5948 __PRETTY_FUNCTION__
5949 ( compound-statement )
5950 __builtin_va_arg ( assignment-expression , type-name )
5951 __builtin_offsetof ( type-name , offsetof-member-designator )
5952 __builtin_choose_expr ( assignment-expression ,
5953 assignment-expression ,
5954 assignment-expression )
5955 __builtin_types_compatible_p ( type-name , type-name )
5957 offsetof-member-designator:
5958 identifier
5959 offsetof-member-designator . identifier
5960 offsetof-member-designator [ expression ]
5962 Objective-C:
5964 primary-expression:
5965 [ objc-receiver objc-message-args ]
5966 @selector ( objc-selector-arg )
5967 @protocol ( identifier )
5968 @encode ( type-name )
5969 objc-string-literal
5970 Classname . identifier
5973 static struct c_expr
5974 c_parser_postfix_expression (c_parser *parser)
5976 struct c_expr expr, e1, e2, e3;
5977 struct c_type_name *t1, *t2;
5978 location_t loc = c_parser_peek_token (parser)->location;;
5979 expr.original_code = ERROR_MARK;
5980 expr.original_type = NULL;
5981 switch (c_parser_peek_token (parser)->type)
5983 case CPP_NUMBER:
5984 expr.value = c_parser_peek_token (parser)->value;
5985 loc = c_parser_peek_token (parser)->location;
5986 c_parser_consume_token (parser);
5987 if (TREE_CODE (expr.value) == FIXED_CST
5988 && !targetm.fixed_point_supported_p ())
5990 error_at (loc, "fixed-point types not supported for this target");
5991 expr.value = error_mark_node;
5993 break;
5994 case CPP_CHAR:
5995 case CPP_CHAR16:
5996 case CPP_CHAR32:
5997 case CPP_WCHAR:
5998 expr.value = c_parser_peek_token (parser)->value;
5999 c_parser_consume_token (parser);
6000 break;
6001 case CPP_STRING:
6002 case CPP_STRING16:
6003 case CPP_STRING32:
6004 case CPP_WSTRING:
6005 case CPP_UTF8STRING:
6006 expr.value = c_parser_peek_token (parser)->value;
6007 expr.original_code = STRING_CST;
6008 c_parser_consume_token (parser);
6009 break;
6010 case CPP_OBJC_STRING:
6011 gcc_assert (c_dialect_objc ());
6012 expr.value
6013 = objc_build_string_object (c_parser_peek_token (parser)->value);
6014 c_parser_consume_token (parser);
6015 break;
6016 case CPP_NAME:
6017 switch (c_parser_peek_token (parser)->id_kind)
6019 case C_ID_ID:
6021 tree id = c_parser_peek_token (parser)->value;
6022 c_parser_consume_token (parser);
6023 expr.value = build_external_ref (loc, id,
6024 (c_parser_peek_token (parser)->type
6025 == CPP_OPEN_PAREN),
6026 &expr.original_type);
6027 break;
6029 case C_ID_CLASSNAME:
6031 /* Here we parse the Objective-C 2.0 Class.name dot
6032 syntax. */
6033 tree class_name = c_parser_peek_token (parser)->value;
6034 tree component;
6035 c_parser_consume_token (parser);
6036 gcc_assert (c_dialect_objc ());
6037 if (!c_parser_require (parser, CPP_DOT, "expected %<.%>"))
6039 expr.value = error_mark_node;
6040 break;
6042 if (c_parser_next_token_is_not (parser, CPP_NAME))
6044 c_parser_error (parser, "expected identifier");
6045 expr.value = error_mark_node;
6046 break;
6048 component = c_parser_peek_token (parser)->value;
6049 c_parser_consume_token (parser);
6050 expr.value = objc_build_class_component_ref (class_name,
6051 component);
6052 break;
6054 default:
6055 c_parser_error (parser, "expected expression");
6056 expr.value = error_mark_node;
6057 break;
6059 break;
6060 case CPP_OPEN_PAREN:
6061 /* A parenthesized expression, statement expression or compound
6062 literal. */
6063 if (c_parser_peek_2nd_token (parser)->type == CPP_OPEN_BRACE)
6065 /* A statement expression. */
6066 tree stmt;
6067 location_t brace_loc;
6068 c_parser_consume_token (parser);
6069 brace_loc = c_parser_peek_token (parser)->location;
6070 c_parser_consume_token (parser);
6071 if (cur_stmt_list == NULL)
6073 error_at (loc, "braced-group within expression allowed "
6074 "only inside a function");
6075 parser->error = true;
6076 c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL);
6077 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
6078 expr.value = error_mark_node;
6079 break;
6081 stmt = c_begin_stmt_expr ();
6082 c_parser_compound_statement_nostart (parser);
6083 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
6084 "expected %<)%>");
6085 pedwarn (loc, OPT_pedantic,
6086 "ISO C forbids braced-groups within expressions");
6087 expr.value = c_finish_stmt_expr (brace_loc, stmt);
6088 mark_exp_read (expr.value);
6090 else if (c_token_starts_typename (c_parser_peek_2nd_token (parser)))
6092 /* A compound literal. ??? Can we actually get here rather
6093 than going directly to
6094 c_parser_postfix_expression_after_paren_type from
6095 elsewhere? */
6096 location_t loc;
6097 struct c_type_name *type_name;
6098 c_parser_consume_token (parser);
6099 loc = c_parser_peek_token (parser)->location;
6100 type_name = c_parser_type_name (parser);
6101 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
6102 "expected %<)%>");
6103 if (type_name == NULL)
6105 expr.value = error_mark_node;
6107 else
6108 expr = c_parser_postfix_expression_after_paren_type (parser,
6109 type_name,
6110 loc);
6112 else
6114 /* A parenthesized expression. */
6115 c_parser_consume_token (parser);
6116 expr = c_parser_expression (parser);
6117 if (TREE_CODE (expr.value) == MODIFY_EXPR)
6118 TREE_NO_WARNING (expr.value) = 1;
6119 if (expr.original_code != C_MAYBE_CONST_EXPR)
6120 expr.original_code = ERROR_MARK;
6121 /* Don't change EXPR.ORIGINAL_TYPE. */
6122 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
6123 "expected %<)%>");
6125 break;
6126 case CPP_KEYWORD:
6127 switch (c_parser_peek_token (parser)->keyword)
6129 case RID_FUNCTION_NAME:
6130 case RID_PRETTY_FUNCTION_NAME:
6131 case RID_C99_FUNCTION_NAME:
6132 expr.value = fname_decl (loc,
6133 c_parser_peek_token (parser)->keyword,
6134 c_parser_peek_token (parser)->value);
6135 c_parser_consume_token (parser);
6136 break;
6137 case RID_VA_ARG:
6138 c_parser_consume_token (parser);
6139 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
6141 expr.value = error_mark_node;
6142 break;
6144 e1 = c_parser_expr_no_commas (parser, NULL);
6145 mark_exp_read (e1.value);
6146 e1.value = c_fully_fold (e1.value, false, NULL);
6147 if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
6149 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
6150 expr.value = error_mark_node;
6151 break;
6153 loc = c_parser_peek_token (parser)->location;
6154 t1 = c_parser_type_name (parser);
6155 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
6156 "expected %<)%>");
6157 if (t1 == NULL)
6159 expr.value = error_mark_node;
6161 else
6163 tree type_expr = NULL_TREE;
6164 expr.value = c_build_va_arg (loc, e1.value,
6165 groktypename (t1, &type_expr, NULL));
6166 if (type_expr)
6168 expr.value = build2 (C_MAYBE_CONST_EXPR,
6169 TREE_TYPE (expr.value), type_expr,
6170 expr.value);
6171 C_MAYBE_CONST_EXPR_NON_CONST (expr.value) = true;
6174 break;
6175 case RID_OFFSETOF:
6176 c_parser_consume_token (parser);
6177 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
6179 expr.value = error_mark_node;
6180 break;
6182 t1 = c_parser_type_name (parser);
6183 if (t1 == NULL)
6185 expr.value = error_mark_node;
6186 break;
6188 if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
6190 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
6191 expr.value = error_mark_node;
6192 break;
6195 tree type = groktypename (t1, NULL, NULL);
6196 tree offsetof_ref;
6197 if (type == error_mark_node)
6198 offsetof_ref = error_mark_node;
6199 else
6201 offsetof_ref = build1 (INDIRECT_REF, type, null_pointer_node);
6202 SET_EXPR_LOCATION (offsetof_ref, loc);
6204 /* Parse the second argument to __builtin_offsetof. We
6205 must have one identifier, and beyond that we want to
6206 accept sub structure and sub array references. */
6207 if (c_parser_next_token_is (parser, CPP_NAME))
6209 offsetof_ref = build_component_ref
6210 (loc, offsetof_ref, c_parser_peek_token (parser)->value);
6211 c_parser_consume_token (parser);
6212 while (c_parser_next_token_is (parser, CPP_DOT)
6213 || c_parser_next_token_is (parser,
6214 CPP_OPEN_SQUARE)
6215 || c_parser_next_token_is (parser,
6216 CPP_DEREF))
6218 if (c_parser_next_token_is (parser, CPP_DEREF))
6220 loc = c_parser_peek_token (parser)->location;
6221 offsetof_ref = build_array_ref (loc,
6222 offsetof_ref,
6223 integer_zero_node);
6224 goto do_dot;
6226 else if (c_parser_next_token_is (parser, CPP_DOT))
6228 do_dot:
6229 c_parser_consume_token (parser);
6230 if (c_parser_next_token_is_not (parser,
6231 CPP_NAME))
6233 c_parser_error (parser, "expected identifier");
6234 break;
6236 offsetof_ref = build_component_ref
6237 (loc, offsetof_ref,
6238 c_parser_peek_token (parser)->value);
6239 c_parser_consume_token (parser);
6241 else
6243 tree idx;
6244 loc = c_parser_peek_token (parser)->location;
6245 c_parser_consume_token (parser);
6246 idx = c_parser_expression (parser).value;
6247 idx = c_fully_fold (idx, false, NULL);
6248 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
6249 "expected %<]%>");
6250 offsetof_ref = build_array_ref (loc, offsetof_ref, idx);
6254 else
6255 c_parser_error (parser, "expected identifier");
6256 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
6257 "expected %<)%>");
6258 expr.value = fold_offsetof (offsetof_ref, NULL_TREE);
6260 break;
6261 case RID_CHOOSE_EXPR:
6262 c_parser_consume_token (parser);
6263 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
6265 expr.value = error_mark_node;
6266 break;
6268 loc = c_parser_peek_token (parser)->location;
6269 e1 = c_parser_expr_no_commas (parser, NULL);
6270 if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
6272 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
6273 expr.value = error_mark_node;
6274 break;
6276 e2 = c_parser_expr_no_commas (parser, NULL);
6277 if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
6279 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
6280 expr.value = error_mark_node;
6281 break;
6283 e3 = c_parser_expr_no_commas (parser, NULL);
6284 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
6285 "expected %<)%>");
6287 tree c;
6289 c = e1.value;
6290 mark_exp_read (e2.value);
6291 mark_exp_read (e3.value);
6292 if (TREE_CODE (c) != INTEGER_CST
6293 || !INTEGRAL_TYPE_P (TREE_TYPE (c)))
6294 error_at (loc,
6295 "first argument to %<__builtin_choose_expr%> not"
6296 " a constant");
6297 constant_expression_warning (c);
6298 expr = integer_zerop (c) ? e3 : e2;
6300 break;
6301 case RID_TYPES_COMPATIBLE_P:
6302 c_parser_consume_token (parser);
6303 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
6305 expr.value = error_mark_node;
6306 break;
6308 t1 = c_parser_type_name (parser);
6309 if (t1 == NULL)
6311 expr.value = error_mark_node;
6312 break;
6314 if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
6316 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
6317 expr.value = error_mark_node;
6318 break;
6320 t2 = c_parser_type_name (parser);
6321 if (t2 == NULL)
6323 expr.value = error_mark_node;
6324 break;
6326 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
6327 "expected %<)%>");
6329 tree e1, e2;
6331 e1 = TYPE_MAIN_VARIANT (groktypename (t1, NULL, NULL));
6332 e2 = TYPE_MAIN_VARIANT (groktypename (t2, NULL, NULL));
6334 expr.value
6335 = comptypes (e1, e2) ? integer_one_node : integer_zero_node;
6337 break;
6338 case RID_AT_SELECTOR:
6339 gcc_assert (c_dialect_objc ());
6340 c_parser_consume_token (parser);
6341 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
6343 expr.value = error_mark_node;
6344 break;
6347 tree sel = c_parser_objc_selector_arg (parser);
6348 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
6349 "expected %<)%>");
6350 expr.value = objc_build_selector_expr (loc, sel);
6352 break;
6353 case RID_AT_PROTOCOL:
6354 gcc_assert (c_dialect_objc ());
6355 c_parser_consume_token (parser);
6356 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
6358 expr.value = error_mark_node;
6359 break;
6361 if (c_parser_next_token_is_not (parser, CPP_NAME))
6363 c_parser_error (parser, "expected identifier");
6364 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
6365 expr.value = error_mark_node;
6366 break;
6369 tree id = c_parser_peek_token (parser)->value;
6370 c_parser_consume_token (parser);
6371 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
6372 "expected %<)%>");
6373 expr.value = objc_build_protocol_expr (id);
6375 break;
6376 case RID_AT_ENCODE:
6377 /* Extension to support C-structures in the archiver. */
6378 gcc_assert (c_dialect_objc ());
6379 c_parser_consume_token (parser);
6380 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
6382 expr.value = error_mark_node;
6383 break;
6385 t1 = c_parser_type_name (parser);
6386 if (t1 == NULL)
6388 expr.value = error_mark_node;
6389 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
6390 break;
6392 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
6393 "expected %<)%>");
6395 tree type = groktypename (t1, NULL, NULL);
6396 expr.value = objc_build_encode_expr (type);
6398 break;
6399 default:
6400 c_parser_error (parser, "expected expression");
6401 expr.value = error_mark_node;
6402 break;
6404 break;
6405 case CPP_OPEN_SQUARE:
6406 if (c_dialect_objc ())
6408 tree receiver, args;
6409 c_parser_consume_token (parser);
6410 receiver = c_parser_objc_receiver (parser);
6411 args = c_parser_objc_message_args (parser);
6412 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
6413 "expected %<]%>");
6414 expr.value = objc_build_message_expr (build_tree_list (receiver,
6415 args));
6416 break;
6418 /* Else fall through to report error. */
6419 default:
6420 c_parser_error (parser, "expected expression");
6421 expr.value = error_mark_node;
6422 break;
6424 return c_parser_postfix_expression_after_primary (parser, loc, expr);
6427 /* Parse a postfix expression after a parenthesized type name: the
6428 brace-enclosed initializer of a compound literal, possibly followed
6429 by some postfix operators. This is separate because it is not
6430 possible to tell until after the type name whether a cast
6431 expression has a cast or a compound literal, or whether the operand
6432 of sizeof is a parenthesized type name or starts with a compound
6433 literal. TYPE_LOC is the location where TYPE_NAME starts--the
6434 location of the first token after the parentheses around the type
6435 name. */
6437 static struct c_expr
6438 c_parser_postfix_expression_after_paren_type (c_parser *parser,
6439 struct c_type_name *type_name,
6440 location_t type_loc)
6442 tree type;
6443 struct c_expr init;
6444 bool non_const;
6445 struct c_expr expr;
6446 location_t start_loc;
6447 tree type_expr = NULL_TREE;
6448 bool type_expr_const = true;
6449 check_compound_literal_type (type_loc, type_name);
6450 start_init (NULL_TREE, NULL, 0);
6451 type = groktypename (type_name, &type_expr, &type_expr_const);
6452 start_loc = c_parser_peek_token (parser)->location;
6453 if (type != error_mark_node && C_TYPE_VARIABLE_SIZE (type))
6455 error_at (type_loc, "compound literal has variable size");
6456 type = error_mark_node;
6458 init = c_parser_braced_init (parser, type, false);
6459 finish_init ();
6460 maybe_warn_string_init (type, init);
6462 if (type != error_mark_node
6463 && !ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (type))
6464 && current_function_decl)
6466 error ("compound literal qualified by address-space qualifier");
6467 type = error_mark_node;
6470 if (!flag_isoc99)
6471 pedwarn (start_loc, OPT_pedantic, "ISO C90 forbids compound literals");
6472 non_const = ((init.value && TREE_CODE (init.value) == CONSTRUCTOR)
6473 ? CONSTRUCTOR_NON_CONST (init.value)
6474 : init.original_code == C_MAYBE_CONST_EXPR);
6475 non_const |= !type_expr_const;
6476 expr.value = build_compound_literal (start_loc, type, init.value, non_const);
6477 expr.original_code = ERROR_MARK;
6478 expr.original_type = NULL;
6479 if (type_expr)
6481 if (TREE_CODE (expr.value) == C_MAYBE_CONST_EXPR)
6483 gcc_assert (C_MAYBE_CONST_EXPR_PRE (expr.value) == NULL_TREE);
6484 C_MAYBE_CONST_EXPR_PRE (expr.value) = type_expr;
6486 else
6488 gcc_assert (!non_const);
6489 expr.value = build2 (C_MAYBE_CONST_EXPR, type,
6490 type_expr, expr.value);
6493 return c_parser_postfix_expression_after_primary (parser, start_loc, expr);
6496 /* Parse a postfix expression after the initial primary or compound
6497 literal; that is, parse a series of postfix operators.
6499 EXPR_LOC is the location of the primary expression. */
6501 static struct c_expr
6502 c_parser_postfix_expression_after_primary (c_parser *parser,
6503 location_t expr_loc,
6504 struct c_expr expr)
6506 struct c_expr orig_expr;
6507 tree ident, idx;
6508 VEC(tree,gc) *exprlist;
6509 VEC(tree,gc) *origtypes;
6510 while (true)
6512 location_t op_loc = c_parser_peek_token (parser)->location;
6513 switch (c_parser_peek_token (parser)->type)
6515 case CPP_OPEN_SQUARE:
6516 /* Array reference. */
6517 c_parser_consume_token (parser);
6518 idx = c_parser_expression (parser).value;
6519 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
6520 "expected %<]%>");
6521 expr.value = build_array_ref (op_loc, expr.value, idx);
6522 expr.original_code = ERROR_MARK;
6523 expr.original_type = NULL;
6524 break;
6525 case CPP_OPEN_PAREN:
6526 /* Function call. */
6527 c_parser_consume_token (parser);
6528 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
6529 exprlist = NULL;
6530 else
6531 exprlist = c_parser_expr_list (parser, true, false, &origtypes);
6532 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
6533 "expected %<)%>");
6534 orig_expr = expr;
6535 mark_exp_read (expr.value);
6536 /* FIXME diagnostics: Ideally we want the FUNCNAME, not the
6537 "(" after the FUNCNAME, which is what we have now. */
6538 expr.value = build_function_call_vec (op_loc, expr.value, exprlist,
6539 origtypes);
6540 expr.original_code = ERROR_MARK;
6541 if (TREE_CODE (expr.value) == INTEGER_CST
6542 && TREE_CODE (orig_expr.value) == FUNCTION_DECL
6543 && DECL_BUILT_IN_CLASS (orig_expr.value) == BUILT_IN_NORMAL
6544 && DECL_FUNCTION_CODE (orig_expr.value) == BUILT_IN_CONSTANT_P)
6545 expr.original_code = C_MAYBE_CONST_EXPR;
6546 expr.original_type = NULL;
6547 if (exprlist != NULL)
6549 release_tree_vector (exprlist);
6550 release_tree_vector (origtypes);
6552 break;
6553 case CPP_DOT:
6554 /* Structure element reference. */
6555 c_parser_consume_token (parser);
6556 expr = default_function_array_conversion (expr_loc, expr);
6557 if (c_parser_next_token_is (parser, CPP_NAME))
6558 ident = c_parser_peek_token (parser)->value;
6559 else
6561 c_parser_error (parser, "expected identifier");
6562 expr.value = error_mark_node;
6563 expr.original_code = ERROR_MARK;
6564 expr.original_type = NULL;
6565 return expr;
6567 c_parser_consume_token (parser);
6568 expr.value = build_component_ref (op_loc, expr.value, ident);
6569 expr.original_code = ERROR_MARK;
6570 if (TREE_CODE (expr.value) != COMPONENT_REF)
6571 expr.original_type = NULL;
6572 else
6574 /* Remember the original type of a bitfield. */
6575 tree field = TREE_OPERAND (expr.value, 1);
6576 if (TREE_CODE (field) != FIELD_DECL)
6577 expr.original_type = NULL;
6578 else
6579 expr.original_type = DECL_BIT_FIELD_TYPE (field);
6581 break;
6582 case CPP_DEREF:
6583 /* Structure element reference. */
6584 c_parser_consume_token (parser);
6585 expr = default_function_array_conversion (expr_loc, expr);
6586 if (c_parser_next_token_is (parser, CPP_NAME))
6587 ident = c_parser_peek_token (parser)->value;
6588 else
6590 c_parser_error (parser, "expected identifier");
6591 expr.value = error_mark_node;
6592 expr.original_code = ERROR_MARK;
6593 expr.original_type = NULL;
6594 return expr;
6596 c_parser_consume_token (parser);
6597 expr.value = build_component_ref (op_loc,
6598 build_indirect_ref (op_loc,
6599 expr.value,
6600 RO_ARROW),
6601 ident);
6602 expr.original_code = ERROR_MARK;
6603 if (TREE_CODE (expr.value) != COMPONENT_REF)
6604 expr.original_type = NULL;
6605 else
6607 /* Remember the original type of a bitfield. */
6608 tree field = TREE_OPERAND (expr.value, 1);
6609 if (TREE_CODE (field) != FIELD_DECL)
6610 expr.original_type = NULL;
6611 else
6612 expr.original_type = DECL_BIT_FIELD_TYPE (field);
6614 break;
6615 case CPP_PLUS_PLUS:
6616 /* Postincrement. */
6617 c_parser_consume_token (parser);
6618 expr = default_function_array_read_conversion (expr_loc, expr);
6619 expr.value = build_unary_op (op_loc,
6620 POSTINCREMENT_EXPR, expr.value, 0);
6621 expr.original_code = ERROR_MARK;
6622 expr.original_type = NULL;
6623 break;
6624 case CPP_MINUS_MINUS:
6625 /* Postdecrement. */
6626 c_parser_consume_token (parser);
6627 expr = default_function_array_read_conversion (expr_loc, expr);
6628 expr.value = build_unary_op (op_loc,
6629 POSTDECREMENT_EXPR, expr.value, 0);
6630 expr.original_code = ERROR_MARK;
6631 expr.original_type = NULL;
6632 break;
6633 default:
6634 return expr;
6639 /* Parse an expression (C90 6.3.17, C99 6.5.17).
6641 expression:
6642 assignment-expression
6643 expression , assignment-expression
6646 static struct c_expr
6647 c_parser_expression (c_parser *parser)
6649 struct c_expr expr;
6650 expr = c_parser_expr_no_commas (parser, NULL);
6651 while (c_parser_next_token_is (parser, CPP_COMMA))
6653 struct c_expr next;
6654 tree lhsval;
6655 location_t loc = c_parser_peek_token (parser)->location;
6656 location_t expr_loc;
6657 c_parser_consume_token (parser);
6658 expr_loc = c_parser_peek_token (parser)->location;
6659 lhsval = expr.value;
6660 while (TREE_CODE (lhsval) == COMPOUND_EXPR)
6661 lhsval = TREE_OPERAND (lhsval, 1);
6662 if (DECL_P (lhsval) || handled_component_p (lhsval))
6663 mark_exp_read (lhsval);
6664 next = c_parser_expr_no_commas (parser, NULL);
6665 next = default_function_array_conversion (expr_loc, next);
6666 expr.value = build_compound_expr (loc, expr.value, next.value);
6667 expr.original_code = COMPOUND_EXPR;
6668 expr.original_type = next.original_type;
6670 return expr;
6673 /* Parse an expression and convert functions or arrays to
6674 pointers. */
6676 static struct c_expr
6677 c_parser_expression_conv (c_parser *parser)
6679 struct c_expr expr;
6680 location_t loc = c_parser_peek_token (parser)->location;
6681 expr = c_parser_expression (parser);
6682 expr = default_function_array_conversion (loc, expr);
6683 return expr;
6686 /* Parse a non-empty list of expressions. If CONVERT_P, convert
6687 functions and arrays to pointers. If FOLD_P, fold the expressions.
6689 nonempty-expr-list:
6690 assignment-expression
6691 nonempty-expr-list , assignment-expression
6694 static VEC(tree,gc) *
6695 c_parser_expr_list (c_parser *parser, bool convert_p, bool fold_p,
6696 VEC(tree,gc) **p_orig_types)
6698 VEC(tree,gc) *ret;
6699 VEC(tree,gc) *orig_types;
6700 struct c_expr expr;
6701 location_t loc = c_parser_peek_token (parser)->location;
6703 ret = make_tree_vector ();
6704 if (p_orig_types == NULL)
6705 orig_types = NULL;
6706 else
6707 orig_types = make_tree_vector ();
6709 expr = c_parser_expr_no_commas (parser, NULL);
6710 if (convert_p)
6711 expr = default_function_array_read_conversion (loc, expr);
6712 if (fold_p)
6713 expr.value = c_fully_fold (expr.value, false, NULL);
6714 VEC_quick_push (tree, ret, expr.value);
6715 if (orig_types != NULL)
6716 VEC_quick_push (tree, orig_types, expr.original_type);
6717 while (c_parser_next_token_is (parser, CPP_COMMA))
6719 c_parser_consume_token (parser);
6720 loc = c_parser_peek_token (parser)->location;
6721 expr = c_parser_expr_no_commas (parser, NULL);
6722 if (convert_p)
6723 expr = default_function_array_read_conversion (loc, expr);
6724 if (fold_p)
6725 expr.value = c_fully_fold (expr.value, false, NULL);
6726 VEC_safe_push (tree, gc, ret, expr.value);
6727 if (orig_types != NULL)
6728 VEC_safe_push (tree, gc, orig_types, expr.original_type);
6730 if (orig_types != NULL)
6731 *p_orig_types = orig_types;
6732 return ret;
6735 /* Parse Objective-C-specific constructs. */
6737 /* Parse an objc-class-definition.
6739 objc-class-definition:
6740 @interface identifier objc-superclass[opt] objc-protocol-refs[opt]
6741 objc-class-instance-variables[opt] objc-methodprotolist @end
6742 @implementation identifier objc-superclass[opt]
6743 objc-class-instance-variables[opt]
6744 @interface identifier ( identifier ) objc-protocol-refs[opt]
6745 objc-methodprotolist @end
6746 @implementation identifier ( identifier )
6748 objc-superclass:
6749 : identifier
6751 "@interface identifier (" must start "@interface identifier (
6752 identifier ) ...": objc-methodprotolist in the first production may
6753 not start with a parenthesized identifier as a declarator of a data
6754 definition with no declaration specifiers if the objc-superclass,
6755 objc-protocol-refs and objc-class-instance-variables are omitted. */
6757 static void
6758 c_parser_objc_class_definition (c_parser *parser, tree attributes)
6760 bool iface_p;
6761 tree id1;
6762 tree superclass;
6763 if (c_parser_next_token_is_keyword (parser, RID_AT_INTERFACE))
6764 iface_p = true;
6765 else if (c_parser_next_token_is_keyword (parser, RID_AT_IMPLEMENTATION))
6766 iface_p = false;
6767 else
6768 gcc_unreachable ();
6770 c_parser_consume_token (parser);
6771 if (c_parser_next_token_is_not (parser, CPP_NAME))
6773 c_parser_error (parser, "expected identifier");
6774 return;
6776 id1 = c_parser_peek_token (parser)->value;
6777 c_parser_consume_token (parser);
6778 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
6780 tree id2;
6781 tree proto = NULL_TREE;
6782 c_parser_consume_token (parser);
6783 if (c_parser_next_token_is_not (parser, CPP_NAME))
6785 c_parser_error (parser, "expected identifier");
6786 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
6787 return;
6789 id2 = c_parser_peek_token (parser)->value;
6790 c_parser_consume_token (parser);
6791 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
6792 if (!iface_p)
6794 objc_start_category_implementation (id1, id2);
6795 return;
6797 if (c_parser_next_token_is (parser, CPP_LESS))
6798 proto = c_parser_objc_protocol_refs (parser);
6799 objc_start_category_interface (id1, id2, proto, attributes);
6800 c_parser_objc_methodprotolist (parser);
6801 c_parser_require_keyword (parser, RID_AT_END, "expected %<@end%>");
6802 objc_finish_interface ();
6803 return;
6805 if (c_parser_next_token_is (parser, CPP_COLON))
6807 c_parser_consume_token (parser);
6808 if (c_parser_next_token_is_not (parser, CPP_NAME))
6810 c_parser_error (parser, "expected identifier");
6811 return;
6813 superclass = c_parser_peek_token (parser)->value;
6814 c_parser_consume_token (parser);
6816 else
6817 superclass = NULL_TREE;
6818 if (iface_p)
6820 tree proto = NULL_TREE;
6821 if (c_parser_next_token_is (parser, CPP_LESS))
6822 proto = c_parser_objc_protocol_refs (parser);
6823 objc_start_class_interface (id1, superclass, proto, attributes);
6825 else
6826 objc_start_class_implementation (id1, superclass);
6827 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
6828 c_parser_objc_class_instance_variables (parser);
6829 if (iface_p)
6831 objc_continue_interface ();
6832 c_parser_objc_methodprotolist (parser);
6833 c_parser_require_keyword (parser, RID_AT_END, "expected %<@end%>");
6834 objc_finish_interface ();
6836 else
6838 objc_continue_implementation ();
6839 return;
6843 /* Parse objc-class-instance-variables.
6845 objc-class-instance-variables:
6846 { objc-instance-variable-decl-list[opt] }
6848 objc-instance-variable-decl-list:
6849 objc-visibility-spec
6850 objc-instance-variable-decl ;
6852 objc-instance-variable-decl-list objc-visibility-spec
6853 objc-instance-variable-decl-list objc-instance-variable-decl ;
6854 objc-instance-variable-decl-list ;
6856 objc-visibility-spec:
6857 @private
6858 @protected
6859 @public
6861 objc-instance-variable-decl:
6862 struct-declaration
6865 static void
6866 c_parser_objc_class_instance_variables (c_parser *parser)
6868 gcc_assert (c_parser_next_token_is (parser, CPP_OPEN_BRACE));
6869 c_parser_consume_token (parser);
6870 while (c_parser_next_token_is_not (parser, CPP_EOF))
6872 tree decls;
6873 /* Parse any stray semicolon. */
6874 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
6876 pedwarn (c_parser_peek_token (parser)->location, OPT_pedantic,
6877 "extra semicolon in struct or union specified");
6878 c_parser_consume_token (parser);
6879 continue;
6881 /* Stop if at the end of the instance variables. */
6882 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
6884 c_parser_consume_token (parser);
6885 break;
6887 /* Parse any objc-visibility-spec. */
6888 if (c_parser_next_token_is_keyword (parser, RID_AT_PRIVATE))
6890 c_parser_consume_token (parser);
6891 objc_set_visibility (OBJC_IVAR_VIS_PRIVATE);
6892 continue;
6894 else if (c_parser_next_token_is_keyword (parser, RID_AT_PROTECTED))
6896 c_parser_consume_token (parser);
6897 objc_set_visibility (OBJC_IVAR_VIS_PROTECTED);
6898 continue;
6900 else if (c_parser_next_token_is_keyword (parser, RID_AT_PUBLIC))
6902 c_parser_consume_token (parser);
6903 objc_set_visibility (OBJC_IVAR_VIS_PUBLIC);
6904 continue;
6906 else if (c_parser_next_token_is_keyword (parser, RID_AT_PACKAGE))
6908 c_parser_consume_token (parser);
6909 objc_set_visibility (OBJC_IVAR_VIS_PACKAGE);
6910 continue;
6912 else if (c_parser_next_token_is (parser, CPP_PRAGMA))
6914 c_parser_pragma (parser, pragma_external);
6915 continue;
6918 /* Parse some comma-separated declarations. */
6919 decls = c_parser_struct_declaration (parser);
6921 /* Comma-separated instance variables are chained together in
6922 reverse order; add them one by one. */
6923 tree ivar = nreverse (decls);
6924 for (; ivar; ivar = DECL_CHAIN (ivar))
6925 objc_add_instance_variable (copy_node (ivar));
6927 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
6931 /* Parse an objc-class-declaration.
6933 objc-class-declaration:
6934 @class identifier-list ;
6937 static void
6938 c_parser_objc_class_declaration (c_parser *parser)
6940 tree list = NULL_TREE;
6941 gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_CLASS));
6942 c_parser_consume_token (parser);
6943 /* Any identifiers, including those declared as type names, are OK
6944 here. */
6945 while (true)
6947 tree id;
6948 if (c_parser_next_token_is_not (parser, CPP_NAME))
6950 c_parser_error (parser, "expected identifier");
6951 c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
6952 parser->error = false;
6953 return;
6955 id = c_parser_peek_token (parser)->value;
6956 list = chainon (list, build_tree_list (NULL_TREE, id));
6957 c_parser_consume_token (parser);
6958 if (c_parser_next_token_is (parser, CPP_COMMA))
6959 c_parser_consume_token (parser);
6960 else
6961 break;
6963 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
6964 objc_declare_class (list);
6967 /* Parse an objc-alias-declaration.
6969 objc-alias-declaration:
6970 @compatibility_alias identifier identifier ;
6973 static void
6974 c_parser_objc_alias_declaration (c_parser *parser)
6976 tree id1, id2;
6977 gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_ALIAS));
6978 c_parser_consume_token (parser);
6979 if (c_parser_next_token_is_not (parser, CPP_NAME))
6981 c_parser_error (parser, "expected identifier");
6982 c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
6983 return;
6985 id1 = c_parser_peek_token (parser)->value;
6986 c_parser_consume_token (parser);
6987 if (c_parser_next_token_is_not (parser, CPP_NAME))
6989 c_parser_error (parser, "expected identifier");
6990 c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
6991 return;
6993 id2 = c_parser_peek_token (parser)->value;
6994 c_parser_consume_token (parser);
6995 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
6996 objc_declare_alias (id1, id2);
6999 /* Parse an objc-protocol-definition.
7001 objc-protocol-definition:
7002 @protocol identifier objc-protocol-refs[opt] objc-methodprotolist @end
7003 @protocol identifier-list ;
7005 "@protocol identifier ;" should be resolved as "@protocol
7006 identifier-list ;": objc-methodprotolist may not start with a
7007 semicolon in the first alternative if objc-protocol-refs are
7008 omitted. */
7010 static void
7011 c_parser_objc_protocol_definition (c_parser *parser, tree attributes)
7013 gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_PROTOCOL));
7015 c_parser_consume_token (parser);
7016 if (c_parser_next_token_is_not (parser, CPP_NAME))
7018 c_parser_error (parser, "expected identifier");
7019 return;
7021 if (c_parser_peek_2nd_token (parser)->type == CPP_COMMA
7022 || c_parser_peek_2nd_token (parser)->type == CPP_SEMICOLON)
7024 tree list = NULL_TREE;
7025 /* Any identifiers, including those declared as type names, are
7026 OK here. */
7027 while (true)
7029 tree id;
7030 if (c_parser_next_token_is_not (parser, CPP_NAME))
7032 c_parser_error (parser, "expected identifier");
7033 break;
7035 id = c_parser_peek_token (parser)->value;
7036 list = chainon (list, build_tree_list (NULL_TREE, id));
7037 c_parser_consume_token (parser);
7038 if (c_parser_next_token_is (parser, CPP_COMMA))
7039 c_parser_consume_token (parser);
7040 else
7041 break;
7043 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
7044 objc_declare_protocols (list, attributes);
7046 else
7048 tree id = c_parser_peek_token (parser)->value;
7049 tree proto = NULL_TREE;
7050 c_parser_consume_token (parser);
7051 if (c_parser_next_token_is (parser, CPP_LESS))
7052 proto = c_parser_objc_protocol_refs (parser);
7053 parser->objc_pq_context = true;
7054 objc_start_protocol (id, proto, attributes);
7055 c_parser_objc_methodprotolist (parser);
7056 c_parser_require_keyword (parser, RID_AT_END, "expected %<@end%>");
7057 parser->objc_pq_context = false;
7058 objc_finish_interface ();
7062 /* Parse an objc-method-type.
7064 objc-method-type:
7068 Return true if it is a class method (+) and false if it is
7069 an instance method (-).
7071 static inline bool
7072 c_parser_objc_method_type (c_parser *parser)
7074 switch (c_parser_peek_token (parser)->type)
7076 case CPP_PLUS:
7077 c_parser_consume_token (parser);
7078 return true;
7079 case CPP_MINUS:
7080 c_parser_consume_token (parser);
7081 return false;
7082 default:
7083 gcc_unreachable ();
7087 /* Parse an objc-method-definition.
7089 objc-method-definition:
7090 objc-method-type objc-method-decl ;[opt] compound-statement
7093 static void
7094 c_parser_objc_method_definition (c_parser *parser)
7096 bool is_class_method = c_parser_objc_method_type (parser);
7097 tree decl, attributes = NULL_TREE;
7098 parser->objc_pq_context = true;
7099 decl = c_parser_objc_method_decl (parser, is_class_method, &attributes);
7100 if (decl == error_mark_node)
7101 return; /* Bail here. */
7103 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
7105 c_parser_consume_token (parser);
7106 pedwarn (c_parser_peek_token (parser)->location, OPT_pedantic,
7107 "extra semicolon in method definition specified");
7110 if (!c_parser_next_token_is (parser, CPP_OPEN_BRACE))
7112 c_parser_error (parser, "expected %<{%>");
7113 return;
7116 parser->objc_pq_context = false;
7117 if (objc_start_method_definition (is_class_method, decl, attributes))
7119 add_stmt (c_parser_compound_statement (parser));
7120 objc_finish_method_definition (current_function_decl);
7122 else
7124 /* This code is executed when we find a method definition
7125 outside of an @implementation context (or invalid for other
7126 reasons). Parse the method (to keep going) but do not emit
7127 any code.
7129 c_parser_compound_statement (parser);
7133 /* Parse an objc-methodprotolist.
7135 objc-methodprotolist:
7136 empty
7137 objc-methodprotolist objc-methodproto
7138 objc-methodprotolist declaration
7139 objc-methodprotolist ;
7140 @optional
7141 @required
7143 The declaration is a data definition, which may be missing
7144 declaration specifiers under the same rules and diagnostics as
7145 other data definitions outside functions, and the stray semicolon
7146 is diagnosed the same way as a stray semicolon outside a
7147 function. */
7149 static void
7150 c_parser_objc_methodprotolist (c_parser *parser)
7152 while (true)
7154 /* The list is terminated by @end. */
7155 switch (c_parser_peek_token (parser)->type)
7157 case CPP_SEMICOLON:
7158 pedwarn (c_parser_peek_token (parser)->location, OPT_pedantic,
7159 "ISO C does not allow extra %<;%> outside of a function");
7160 c_parser_consume_token (parser);
7161 break;
7162 case CPP_PLUS:
7163 case CPP_MINUS:
7164 c_parser_objc_methodproto (parser);
7165 break;
7166 case CPP_PRAGMA:
7167 c_parser_pragma (parser, pragma_external);
7168 break;
7169 case CPP_EOF:
7170 return;
7171 default:
7172 if (c_parser_next_token_is_keyword (parser, RID_AT_END))
7173 return;
7174 else if (c_parser_next_token_is_keyword (parser, RID_AT_PROPERTY))
7175 c_parser_objc_at_property_declaration (parser);
7176 else if (c_parser_next_token_is_keyword (parser, RID_AT_OPTIONAL))
7178 objc_set_method_opt (true);
7179 c_parser_consume_token (parser);
7181 else if (c_parser_next_token_is_keyword (parser, RID_AT_REQUIRED))
7183 objc_set_method_opt (false);
7184 c_parser_consume_token (parser);
7186 else
7187 c_parser_declaration_or_fndef (parser, false, false, true,
7188 false, true, NULL);
7189 break;
7194 /* Parse an objc-methodproto.
7196 objc-methodproto:
7197 objc-method-type objc-method-decl ;
7200 static void
7201 c_parser_objc_methodproto (c_parser *parser)
7203 bool is_class_method = c_parser_objc_method_type (parser);
7204 tree decl, attributes = NULL_TREE;
7206 /* Remember protocol qualifiers in prototypes. */
7207 parser->objc_pq_context = true;
7208 decl = c_parser_objc_method_decl (parser, is_class_method, &attributes);
7209 /* Forget protocol qualifiers now. */
7210 parser->objc_pq_context = false;
7212 /* Do not allow the presence of attributes to hide an erroneous
7213 method implementation in the interface section. */
7214 if (!c_parser_next_token_is (parser, CPP_SEMICOLON))
7216 c_parser_error (parser, "expected %<;%>");
7217 return;
7220 if (decl != error_mark_node)
7221 objc_add_method_declaration (is_class_method, decl, attributes);
7223 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
7226 /* If we are at a position that method attributes may be present, check that
7227 there are not any parsed already (a syntax error) and then collect any
7228 specified at the current location. Finally, if new attributes were present,
7229 check that the next token is legal ( ';' for decls and '{' for defs). */
7231 static bool
7232 c_parser_objc_maybe_method_attributes (c_parser* parser, tree* attributes)
7234 bool bad = false;
7235 if (*attributes)
7237 c_parser_error (parser,
7238 "method attributes must be specified at the end only");
7239 *attributes = NULL_TREE;
7240 bad = true;
7243 if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
7244 *attributes = c_parser_attributes (parser);
7246 /* If there were no attributes here, just report any earlier error. */
7247 if (*attributes == NULL_TREE || bad)
7248 return bad;
7250 /* If the attributes are followed by a ; or {, then just report any earlier
7251 error. */
7252 if (c_parser_next_token_is (parser, CPP_SEMICOLON)
7253 || c_parser_next_token_is (parser, CPP_OPEN_BRACE))
7254 return bad;
7256 /* We've got attributes, but not at the end. */
7257 c_parser_error (parser,
7258 "expected %<;%> or %<{%> after method attribute definition");
7259 return true;
7262 /* Parse an objc-method-decl.
7264 objc-method-decl:
7265 ( objc-type-name ) objc-selector
7266 objc-selector
7267 ( objc-type-name ) objc-keyword-selector objc-optparmlist
7268 objc-keyword-selector objc-optparmlist
7269 attributes
7271 objc-keyword-selector:
7272 objc-keyword-decl
7273 objc-keyword-selector objc-keyword-decl
7275 objc-keyword-decl:
7276 objc-selector : ( objc-type-name ) identifier
7277 objc-selector : identifier
7278 : ( objc-type-name ) identifier
7279 : identifier
7281 objc-optparmlist:
7282 objc-optparms objc-optellipsis
7284 objc-optparms:
7285 empty
7286 objc-opt-parms , parameter-declaration
7288 objc-optellipsis:
7289 empty
7290 , ...
7293 static tree
7294 c_parser_objc_method_decl (c_parser *parser, bool is_class_method, tree *attributes)
7296 tree type = NULL_TREE;
7297 tree sel;
7298 tree parms = NULL_TREE;
7299 bool ellipsis = false;
7300 bool attr_err = false;
7302 *attributes = NULL_TREE;
7303 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
7305 c_parser_consume_token (parser);
7306 type = c_parser_objc_type_name (parser);
7307 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
7309 sel = c_parser_objc_selector (parser);
7310 /* If there is no selector, or a colon follows, we have an
7311 objc-keyword-selector. If there is a selector, and a colon does
7312 not follow, that selector ends the objc-method-decl. */
7313 if (!sel || c_parser_next_token_is (parser, CPP_COLON))
7315 tree tsel = sel;
7316 tree list = NULL_TREE;
7317 while (true)
7319 tree atype = NULL_TREE, id, keyworddecl;
7320 tree param_attr = NULL_TREE;
7321 if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
7322 break;
7323 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
7325 c_parser_consume_token (parser);
7326 atype = c_parser_objc_type_name (parser);
7327 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
7328 "expected %<)%>");
7330 /* New ObjC allows attributes on method parameters. */
7331 if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
7332 param_attr = c_parser_attributes (parser);
7333 if (c_parser_next_token_is_not (parser, CPP_NAME))
7335 c_parser_error (parser, "expected identifier");
7336 return error_mark_node;
7338 id = c_parser_peek_token (parser)->value;
7339 c_parser_consume_token (parser);
7340 keyworddecl = objc_build_keyword_decl (tsel, atype, id, param_attr);
7341 list = chainon (list, keyworddecl);
7342 tsel = c_parser_objc_selector (parser);
7343 if (!tsel && c_parser_next_token_is_not (parser, CPP_COLON))
7344 break;
7347 attr_err |= c_parser_objc_maybe_method_attributes (parser, attributes) ;
7349 /* Parse the optional parameter list. Optional Objective-C
7350 method parameters follow the C syntax, and may include '...'
7351 to denote a variable number of arguments. */
7352 parms = make_node (TREE_LIST);
7353 while (c_parser_next_token_is (parser, CPP_COMMA))
7355 struct c_parm *parm;
7356 c_parser_consume_token (parser);
7357 if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
7359 ellipsis = true;
7360 c_parser_consume_token (parser);
7361 attr_err |= c_parser_objc_maybe_method_attributes
7362 (parser, attributes) ;
7363 break;
7365 parm = c_parser_parameter_declaration (parser, NULL_TREE);
7366 if (parm == NULL)
7367 break;
7368 parms = chainon (parms,
7369 build_tree_list (NULL_TREE, grokparm (parm)));
7371 sel = list;
7373 else
7374 attr_err |= c_parser_objc_maybe_method_attributes (parser, attributes) ;
7376 if (sel == NULL)
7378 c_parser_error (parser, "objective-c method declaration is expected");
7379 return error_mark_node;
7382 if (attr_err)
7383 return error_mark_node;
7385 return objc_build_method_signature (is_class_method, type, sel, parms, ellipsis);
7388 /* Parse an objc-type-name.
7390 objc-type-name:
7391 objc-type-qualifiers[opt] type-name
7392 objc-type-qualifiers[opt]
7394 objc-type-qualifiers:
7395 objc-type-qualifier
7396 objc-type-qualifiers objc-type-qualifier
7398 objc-type-qualifier: one of
7399 in out inout bycopy byref oneway
7402 static tree
7403 c_parser_objc_type_name (c_parser *parser)
7405 tree quals = NULL_TREE;
7406 struct c_type_name *type_name = NULL;
7407 tree type = NULL_TREE;
7408 while (true)
7410 c_token *token = c_parser_peek_token (parser);
7411 if (token->type == CPP_KEYWORD
7412 && (token->keyword == RID_IN
7413 || token->keyword == RID_OUT
7414 || token->keyword == RID_INOUT
7415 || token->keyword == RID_BYCOPY
7416 || token->keyword == RID_BYREF
7417 || token->keyword == RID_ONEWAY))
7419 quals = chainon (build_tree_list (NULL_TREE, token->value), quals);
7420 c_parser_consume_token (parser);
7422 else
7423 break;
7425 if (c_parser_next_token_starts_typename (parser))
7426 type_name = c_parser_type_name (parser);
7427 if (type_name)
7428 type = groktypename (type_name, NULL, NULL);
7429 return build_tree_list (quals, type);
7432 /* Parse objc-protocol-refs.
7434 objc-protocol-refs:
7435 < identifier-list >
7438 static tree
7439 c_parser_objc_protocol_refs (c_parser *parser)
7441 tree list = NULL_TREE;
7442 gcc_assert (c_parser_next_token_is (parser, CPP_LESS));
7443 c_parser_consume_token (parser);
7444 /* Any identifiers, including those declared as type names, are OK
7445 here. */
7446 while (true)
7448 tree id;
7449 if (c_parser_next_token_is_not (parser, CPP_NAME))
7451 c_parser_error (parser, "expected identifier");
7452 break;
7454 id = c_parser_peek_token (parser)->value;
7455 list = chainon (list, build_tree_list (NULL_TREE, id));
7456 c_parser_consume_token (parser);
7457 if (c_parser_next_token_is (parser, CPP_COMMA))
7458 c_parser_consume_token (parser);
7459 else
7460 break;
7462 c_parser_require (parser, CPP_GREATER, "expected %<>%>");
7463 return list;
7466 /* Parse an objc-try-catch-finally-statement.
7468 objc-try-catch-finally-statement:
7469 @try compound-statement objc-catch-list[opt]
7470 @try compound-statement objc-catch-list[opt] @finally compound-statement
7472 objc-catch-list:
7473 @catch ( objc-catch-parameter-declaration ) compound-statement
7474 objc-catch-list @catch ( objc-catch-parameter-declaration ) compound-statement
7476 objc-catch-parameter-declaration:
7477 parameter-declaration
7478 '...'
7480 where '...' is to be interpreted literally, that is, it means CPP_ELLIPSIS.
7482 PS: This function is identical to cp_parser_objc_try_catch_finally_statement
7483 for C++. Keep them in sync. */
7485 static void
7486 c_parser_objc_try_catch_finally_statement (c_parser *parser)
7488 location_t location;
7489 tree stmt;
7491 gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_TRY));
7492 c_parser_consume_token (parser);
7493 location = c_parser_peek_token (parser)->location;
7494 stmt = c_parser_compound_statement (parser);
7495 objc_begin_try_stmt (location, stmt);
7497 while (c_parser_next_token_is_keyword (parser, RID_AT_CATCH))
7499 struct c_parm *parm;
7500 tree parameter_declaration = error_mark_node;
7501 bool seen_open_paren = false;
7503 c_parser_consume_token (parser);
7504 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
7505 seen_open_paren = true;
7506 if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
7508 /* We have "@catch (...)" (where the '...' are literally
7509 what is in the code). Skip the '...'.
7510 parameter_declaration is set to NULL_TREE, and
7511 objc_being_catch_clauses() knows that that means
7512 '...'. */
7513 c_parser_consume_token (parser);
7514 parameter_declaration = NULL_TREE;
7516 else
7518 /* We have "@catch (NSException *exception)" or something
7519 like that. Parse the parameter declaration. */
7520 parm = c_parser_parameter_declaration (parser, NULL_TREE);
7521 if (parm == NULL)
7522 parameter_declaration = error_mark_node;
7523 else
7524 parameter_declaration = grokparm (parm);
7526 if (seen_open_paren)
7527 c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>");
7528 else
7530 /* If there was no open parenthesis, we are recovering from
7531 an error, and we are trying to figure out what mistake
7532 the user has made. */
7534 /* If there is an immediate closing parenthesis, the user
7535 probably forgot the opening one (ie, they typed "@catch
7536 NSException *e)". Parse the closing parenthesis and keep
7537 going. */
7538 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
7539 c_parser_consume_token (parser);
7541 /* If these is no immediate closing parenthesis, the user
7542 probably doesn't know that parenthesis are required at
7543 all (ie, they typed "@catch NSException *e"). So, just
7544 forget about the closing parenthesis and keep going. */
7546 objc_begin_catch_clause (parameter_declaration);
7547 if (c_parser_require (parser, CPP_OPEN_BRACE, "expected %<{%>"))
7548 c_parser_compound_statement_nostart (parser);
7549 objc_finish_catch_clause ();
7551 if (c_parser_next_token_is_keyword (parser, RID_AT_FINALLY))
7553 c_parser_consume_token (parser);
7554 location = c_parser_peek_token (parser)->location;
7555 stmt = c_parser_compound_statement (parser);
7556 objc_build_finally_clause (location, stmt);
7558 objc_finish_try_stmt ();
7561 /* Parse an objc-synchronized-statement.
7563 objc-synchronized-statement:
7564 @synchronized ( expression ) compound-statement
7567 static void
7568 c_parser_objc_synchronized_statement (c_parser *parser)
7570 location_t loc;
7571 tree expr, stmt;
7572 gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_SYNCHRONIZED));
7573 c_parser_consume_token (parser);
7574 loc = c_parser_peek_token (parser)->location;
7575 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
7577 expr = c_parser_expression (parser).value;
7578 expr = c_fully_fold (expr, false, NULL);
7579 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
7581 else
7582 expr = error_mark_node;
7583 stmt = c_parser_compound_statement (parser);
7584 objc_build_synchronized (loc, expr, stmt);
7587 /* Parse an objc-selector; return NULL_TREE without an error if the
7588 next token is not an objc-selector.
7590 objc-selector:
7591 identifier
7592 one of
7593 enum struct union if else while do for switch case default
7594 break continue return goto asm sizeof typeof __alignof
7595 unsigned long const short volatile signed restrict _Complex
7596 in out inout bycopy byref oneway int char float double void _Bool
7598 ??? Why this selection of keywords but not, for example, storage
7599 class specifiers? */
7601 static tree
7602 c_parser_objc_selector (c_parser *parser)
7604 c_token *token = c_parser_peek_token (parser);
7605 tree value = token->value;
7606 if (token->type == CPP_NAME)
7608 c_parser_consume_token (parser);
7609 return value;
7611 if (token->type != CPP_KEYWORD)
7612 return NULL_TREE;
7613 switch (token->keyword)
7615 case RID_ENUM:
7616 case RID_STRUCT:
7617 case RID_UNION:
7618 case RID_IF:
7619 case RID_ELSE:
7620 case RID_WHILE:
7621 case RID_DO:
7622 case RID_FOR:
7623 case RID_SWITCH:
7624 case RID_CASE:
7625 case RID_DEFAULT:
7626 case RID_BREAK:
7627 case RID_CONTINUE:
7628 case RID_RETURN:
7629 case RID_GOTO:
7630 case RID_ASM:
7631 case RID_SIZEOF:
7632 case RID_TYPEOF:
7633 case RID_ALIGNOF:
7634 case RID_UNSIGNED:
7635 case RID_LONG:
7636 case RID_INT128:
7637 case RID_CONST:
7638 case RID_SHORT:
7639 case RID_VOLATILE:
7640 case RID_SIGNED:
7641 case RID_RESTRICT:
7642 case RID_COMPLEX:
7643 case RID_IN:
7644 case RID_OUT:
7645 case RID_INOUT:
7646 case RID_BYCOPY:
7647 case RID_BYREF:
7648 case RID_ONEWAY:
7649 case RID_INT:
7650 case RID_CHAR:
7651 case RID_FLOAT:
7652 case RID_DOUBLE:
7653 case RID_VOID:
7654 case RID_BOOL:
7655 c_parser_consume_token (parser);
7656 return value;
7657 default:
7658 return NULL_TREE;
7662 /* Parse an objc-selector-arg.
7664 objc-selector-arg:
7665 objc-selector
7666 objc-keywordname-list
7668 objc-keywordname-list:
7669 objc-keywordname
7670 objc-keywordname-list objc-keywordname
7672 objc-keywordname:
7673 objc-selector :
7677 static tree
7678 c_parser_objc_selector_arg (c_parser *parser)
7680 tree sel = c_parser_objc_selector (parser);
7681 tree list = NULL_TREE;
7682 if (sel && c_parser_next_token_is_not (parser, CPP_COLON))
7683 return sel;
7684 while (true)
7686 if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
7687 return list;
7688 list = chainon (list, build_tree_list (sel, NULL_TREE));
7689 sel = c_parser_objc_selector (parser);
7690 if (!sel && c_parser_next_token_is_not (parser, CPP_COLON))
7691 break;
7693 return list;
7696 /* Parse an objc-receiver.
7698 objc-receiver:
7699 expression
7700 class-name
7701 type-name
7704 static tree
7705 c_parser_objc_receiver (c_parser *parser)
7707 if (c_parser_peek_token (parser)->type == CPP_NAME
7708 && (c_parser_peek_token (parser)->id_kind == C_ID_TYPENAME
7709 || c_parser_peek_token (parser)->id_kind == C_ID_CLASSNAME))
7711 tree id = c_parser_peek_token (parser)->value;
7712 c_parser_consume_token (parser);
7713 return objc_get_class_reference (id);
7715 return c_fully_fold (c_parser_expression (parser).value, false, NULL);
7718 /* Parse objc-message-args.
7720 objc-message-args:
7721 objc-selector
7722 objc-keywordarg-list
7724 objc-keywordarg-list:
7725 objc-keywordarg
7726 objc-keywordarg-list objc-keywordarg
7728 objc-keywordarg:
7729 objc-selector : objc-keywordexpr
7730 : objc-keywordexpr
7733 static tree
7734 c_parser_objc_message_args (c_parser *parser)
7736 tree sel = c_parser_objc_selector (parser);
7737 tree list = NULL_TREE;
7738 if (sel && c_parser_next_token_is_not (parser, CPP_COLON))
7739 return sel;
7740 while (true)
7742 tree keywordexpr;
7743 if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
7744 return error_mark_node;
7745 keywordexpr = c_parser_objc_keywordexpr (parser);
7746 list = chainon (list, build_tree_list (sel, keywordexpr));
7747 sel = c_parser_objc_selector (parser);
7748 if (!sel && c_parser_next_token_is_not (parser, CPP_COLON))
7749 break;
7751 return list;
7754 /* Parse an objc-keywordexpr.
7756 objc-keywordexpr:
7757 nonempty-expr-list
7760 static tree
7761 c_parser_objc_keywordexpr (c_parser *parser)
7763 tree ret;
7764 VEC(tree,gc) *expr_list = c_parser_expr_list (parser, true, true, NULL);
7765 if (VEC_length (tree, expr_list) == 1)
7767 /* Just return the expression, remove a level of
7768 indirection. */
7769 ret = VEC_index (tree, expr_list, 0);
7771 else
7773 /* We have a comma expression, we will collapse later. */
7774 ret = build_tree_list_vec (expr_list);
7776 release_tree_vector (expr_list);
7777 return ret;
7780 /* A check, needed in several places, that ObjC interface, implementation or
7781 method definitions are not prefixed by incorrect items. */
7782 static bool
7783 c_parser_objc_diagnose_bad_element_prefix (c_parser *parser,
7784 struct c_declspecs *specs)
7786 if (!specs->declspecs_seen_p || specs->non_sc_seen_p
7787 || specs->typespec_kind != ctsk_none)
7789 c_parser_error (parser,
7790 "no type or storage class may be specified here,");
7791 c_parser_skip_to_end_of_block_or_statement (parser);
7792 return true;
7794 return false;
7797 /* Parse an Objective-C @property declaration. The syntax is:
7799 objc-property-declaration:
7800 '@property' objc-property-attributes[opt] struct-declaration ;
7802 objc-property-attributes:
7803 '(' objc-property-attribute-list ')'
7805 objc-property-attribute-list:
7806 objc-property-attribute
7807 objc-property-attribute-list, objc-property-attribute
7809 objc-property-attribute
7810 'getter' = identifier
7811 'setter' = identifier
7812 'readonly'
7813 'readwrite'
7814 'assign'
7815 'retain'
7816 'copy'
7817 'nonatomic'
7819 For example:
7820 @property NSString *name;
7821 @property (readonly) id object;
7822 @property (retain, nonatomic, getter=getTheName) id name;
7823 @property int a, b, c;
7825 PS: This function is identical to cp_parser_objc_at_propery_declaration
7826 for C++. Keep them in sync. */
7827 static void
7828 c_parser_objc_at_property_declaration (c_parser *parser)
7830 /* The following variables hold the attributes of the properties as
7831 parsed. They are 'false' or 'NULL_TREE' if the attribute was not
7832 seen. When we see an attribute, we set them to 'true' (if they
7833 are boolean properties) or to the identifier (if they have an
7834 argument, ie, for getter and setter). Note that here we only
7835 parse the list of attributes, check the syntax and accumulate the
7836 attributes that we find. objc_add_property_declaration() will
7837 then process the information. */
7838 bool property_assign = false;
7839 bool property_copy = false;
7840 tree property_getter_ident = NULL_TREE;
7841 bool property_nonatomic = false;
7842 bool property_readonly = false;
7843 bool property_readwrite = false;
7844 bool property_retain = false;
7845 tree property_setter_ident = NULL_TREE;
7847 /* 'properties' is the list of properties that we read. Usually a
7848 single one, but maybe more (eg, in "@property int a, b, c;" there
7849 are three). */
7850 tree properties;
7851 location_t loc;
7853 loc = c_parser_peek_token (parser)->location;
7854 gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_PROPERTY));
7856 c_parser_consume_token (parser); /* Eat '@property'. */
7858 /* Parse the optional attribute list... */
7859 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
7861 /* Eat the '(' */
7862 c_parser_consume_token (parser);
7864 /* Property attribute keywords are valid now. */
7865 parser->objc_property_attr_context = true;
7867 while (true)
7869 bool syntax_error = false;
7870 c_token *token = c_parser_peek_token (parser);
7871 enum rid keyword;
7873 if (token->type != CPP_KEYWORD)
7875 if (token->type == CPP_CLOSE_PAREN)
7876 c_parser_error (parser, "expected identifier");
7877 else
7879 c_parser_consume_token (parser);
7880 c_parser_error (parser, "unknown property attribute");
7882 break;
7884 keyword = token->keyword;
7885 c_parser_consume_token (parser);
7886 switch (keyword)
7888 case RID_ASSIGN: property_assign = true; break;
7889 case RID_COPY: property_copy = true; break;
7890 case RID_NONATOMIC: property_nonatomic = true; break;
7891 case RID_READONLY: property_readonly = true; break;
7892 case RID_READWRITE: property_readwrite = true; break;
7893 case RID_RETAIN: property_retain = true; break;
7895 case RID_GETTER:
7896 case RID_SETTER:
7897 if (c_parser_next_token_is_not (parser, CPP_EQ))
7899 c_parser_error (parser,
7900 "getter/setter attribute must be followed by %<=%>");
7901 syntax_error = true;
7902 break;
7904 c_parser_consume_token (parser); /* eat the = */
7905 if (c_parser_next_token_is_not (parser, CPP_NAME))
7907 c_parser_error (parser, "expected identifier");
7908 syntax_error = true;
7909 break;
7911 if (keyword == RID_SETTER)
7913 if (property_setter_ident != NULL_TREE)
7914 c_parser_error (parser, "the %<setter%> attribute may only be specified once");
7915 else
7916 property_setter_ident = c_parser_peek_token (parser)->value;
7917 c_parser_consume_token (parser);
7918 if (c_parser_next_token_is_not (parser, CPP_COLON))
7919 c_parser_error (parser, "setter name must terminate with %<:%>");
7920 else
7921 c_parser_consume_token (parser);
7923 else
7925 if (property_getter_ident != NULL_TREE)
7926 c_parser_error (parser, "the %<getter%> attribute may only be specified once");
7927 else
7928 property_getter_ident = c_parser_peek_token (parser)->value;
7929 c_parser_consume_token (parser);
7931 break;
7932 default:
7933 c_parser_error (parser, "unknown property attribute");
7934 syntax_error = true;
7935 break;
7938 if (syntax_error)
7939 break;
7941 if (c_parser_next_token_is (parser, CPP_COMMA))
7942 c_parser_consume_token (parser);
7943 else
7944 break;
7946 parser->objc_property_attr_context = false;
7947 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
7949 /* ... and the property declaration(s). */
7950 properties = c_parser_struct_declaration (parser);
7952 if (properties == error_mark_node)
7954 c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
7955 parser->error = false;
7956 return;
7959 if (properties == NULL_TREE)
7960 c_parser_error (parser, "expected identifier");
7961 else
7963 /* Comma-separated properties are chained together in
7964 reverse order; add them one by one. */
7965 properties = nreverse (properties);
7967 for (; properties; properties = TREE_CHAIN (properties))
7968 objc_add_property_declaration (loc, copy_node (properties),
7969 property_readonly, property_readwrite,
7970 property_assign, property_retain,
7971 property_copy, property_nonatomic,
7972 property_getter_ident, property_setter_ident);
7975 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
7976 parser->error = false;
7979 /* Parse an Objective-C @synthesize declaration. The syntax is:
7981 objc-synthesize-declaration:
7982 @synthesize objc-synthesize-identifier-list ;
7984 objc-synthesize-identifier-list:
7985 objc-synthesize-identifier
7986 objc-synthesize-identifier-list, objc-synthesize-identifier
7988 objc-synthesize-identifier
7989 identifier
7990 identifier = identifier
7992 For example:
7993 @synthesize MyProperty;
7994 @synthesize OneProperty, AnotherProperty=MyIvar, YetAnotherProperty;
7996 PS: This function is identical to cp_parser_objc_at_synthesize_declaration
7997 for C++. Keep them in sync.
7999 static void
8000 c_parser_objc_at_synthesize_declaration (c_parser *parser)
8002 tree list = NULL_TREE;
8003 location_t loc;
8004 gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_SYNTHESIZE));
8005 loc = c_parser_peek_token (parser)->location;
8007 c_parser_consume_token (parser);
8008 while (true)
8010 tree property, ivar;
8011 if (c_parser_next_token_is_not (parser, CPP_NAME))
8013 c_parser_error (parser, "expected identifier");
8014 c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
8015 /* Once we find the semicolon, we can resume normal parsing.
8016 We have to reset parser->error manually because
8017 c_parser_skip_until_found() won't reset it for us if the
8018 next token is precisely a semicolon. */
8019 parser->error = false;
8020 return;
8022 property = c_parser_peek_token (parser)->value;
8023 c_parser_consume_token (parser);
8024 if (c_parser_next_token_is (parser, CPP_EQ))
8026 c_parser_consume_token (parser);
8027 if (c_parser_next_token_is_not (parser, CPP_NAME))
8029 c_parser_error (parser, "expected identifier");
8030 c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
8031 parser->error = false;
8032 return;
8034 ivar = c_parser_peek_token (parser)->value;
8035 c_parser_consume_token (parser);
8037 else
8038 ivar = NULL_TREE;
8039 list = chainon (list, build_tree_list (ivar, property));
8040 if (c_parser_next_token_is (parser, CPP_COMMA))
8041 c_parser_consume_token (parser);
8042 else
8043 break;
8045 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
8046 objc_add_synthesize_declaration (loc, list);
8049 /* Parse an Objective-C @dynamic declaration. The syntax is:
8051 objc-dynamic-declaration:
8052 @dynamic identifier-list ;
8054 For example:
8055 @dynamic MyProperty;
8056 @dynamic MyProperty, AnotherProperty;
8058 PS: This function is identical to cp_parser_objc_at_dynamic_declaration
8059 for C++. Keep them in sync.
8061 static void
8062 c_parser_objc_at_dynamic_declaration (c_parser *parser)
8064 tree list = NULL_TREE;
8065 location_t loc;
8066 gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_DYNAMIC));
8067 loc = c_parser_peek_token (parser)->location;
8069 c_parser_consume_token (parser);
8070 while (true)
8072 tree property;
8073 if (c_parser_next_token_is_not (parser, CPP_NAME))
8075 c_parser_error (parser, "expected identifier");
8076 c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
8077 parser->error = false;
8078 return;
8080 property = c_parser_peek_token (parser)->value;
8081 list = chainon (list, build_tree_list (NULL_TREE, property));
8082 c_parser_consume_token (parser);
8083 if (c_parser_next_token_is (parser, CPP_COMMA))
8084 c_parser_consume_token (parser);
8085 else
8086 break;
8088 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
8089 objc_add_dynamic_declaration (loc, list);
8093 /* Handle pragmas. Some OpenMP pragmas are associated with, and therefore
8094 should be considered, statements. ALLOW_STMT is true if we're within
8095 the context of a function and such pragmas are to be allowed. Returns
8096 true if we actually parsed such a pragma. */
8098 static bool
8099 c_parser_pragma (c_parser *parser, enum pragma_context context)
8101 unsigned int id;
8103 id = c_parser_peek_token (parser)->pragma_kind;
8104 gcc_assert (id != PRAGMA_NONE);
8106 switch (id)
8108 case PRAGMA_OMP_BARRIER:
8109 if (context != pragma_compound)
8111 if (context == pragma_stmt)
8112 c_parser_error (parser, "%<#pragma omp barrier%> may only be "
8113 "used in compound statements");
8114 goto bad_stmt;
8116 c_parser_omp_barrier (parser);
8117 return false;
8119 case PRAGMA_OMP_FLUSH:
8120 if (context != pragma_compound)
8122 if (context == pragma_stmt)
8123 c_parser_error (parser, "%<#pragma omp flush%> may only be "
8124 "used in compound statements");
8125 goto bad_stmt;
8127 c_parser_omp_flush (parser);
8128 return false;
8130 case PRAGMA_OMP_TASKWAIT:
8131 if (context != pragma_compound)
8133 if (context == pragma_stmt)
8134 c_parser_error (parser, "%<#pragma omp taskwait%> may only be "
8135 "used in compound statements");
8136 goto bad_stmt;
8138 c_parser_omp_taskwait (parser);
8139 return false;
8141 case PRAGMA_OMP_THREADPRIVATE:
8142 c_parser_omp_threadprivate (parser);
8143 return false;
8145 case PRAGMA_OMP_SECTION:
8146 error_at (c_parser_peek_token (parser)->location,
8147 "%<#pragma omp section%> may only be used in "
8148 "%<#pragma omp sections%> construct");
8149 c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL);
8150 return false;
8152 case PRAGMA_GCC_PCH_PREPROCESS:
8153 c_parser_error (parser, "%<#pragma GCC pch_preprocess%> must be first");
8154 c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL);
8155 return false;
8157 default:
8158 if (id < PRAGMA_FIRST_EXTERNAL)
8160 if (context == pragma_external)
8162 bad_stmt:
8163 c_parser_error (parser, "expected declaration specifiers");
8164 c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL);
8165 return false;
8167 c_parser_omp_construct (parser);
8168 return true;
8170 break;
8173 c_parser_consume_pragma (parser);
8174 c_invoke_pragma_handler (id);
8176 /* Skip to EOL, but suppress any error message. Those will have been
8177 generated by the handler routine through calling error, as opposed
8178 to calling c_parser_error. */
8179 parser->error = true;
8180 c_parser_skip_to_pragma_eol (parser);
8182 return false;
8185 /* The interface the pragma parsers have to the lexer. */
8187 enum cpp_ttype
8188 pragma_lex (tree *value)
8190 c_token *tok = c_parser_peek_token (the_parser);
8191 enum cpp_ttype ret = tok->type;
8193 *value = tok->value;
8194 if (ret == CPP_PRAGMA_EOL || ret == CPP_EOF)
8195 ret = CPP_EOF;
8196 else
8198 if (ret == CPP_KEYWORD)
8199 ret = CPP_NAME;
8200 c_parser_consume_token (the_parser);
8203 return ret;
8206 static void
8207 c_parser_pragma_pch_preprocess (c_parser *parser)
8209 tree name = NULL;
8211 c_parser_consume_pragma (parser);
8212 if (c_parser_next_token_is (parser, CPP_STRING))
8214 name = c_parser_peek_token (parser)->value;
8215 c_parser_consume_token (parser);
8217 else
8218 c_parser_error (parser, "expected string literal");
8219 c_parser_skip_to_pragma_eol (parser);
8221 if (name)
8222 c_common_pch_pragma (parse_in, TREE_STRING_POINTER (name));
8225 /* OpenMP 2.5 parsing routines. */
8227 /* Returns name of the next clause.
8228 If the clause is not recognized PRAGMA_OMP_CLAUSE_NONE is returned and
8229 the token is not consumed. Otherwise appropriate pragma_omp_clause is
8230 returned and the token is consumed. */
8232 static pragma_omp_clause
8233 c_parser_omp_clause_name (c_parser *parser)
8235 pragma_omp_clause result = PRAGMA_OMP_CLAUSE_NONE;
8237 if (c_parser_next_token_is_keyword (parser, RID_IF))
8238 result = PRAGMA_OMP_CLAUSE_IF;
8239 else if (c_parser_next_token_is_keyword (parser, RID_DEFAULT))
8240 result = PRAGMA_OMP_CLAUSE_DEFAULT;
8241 else if (c_parser_next_token_is (parser, CPP_NAME))
8243 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
8245 switch (p[0])
8247 case 'c':
8248 if (!strcmp ("collapse", p))
8249 result = PRAGMA_OMP_CLAUSE_COLLAPSE;
8250 else if (!strcmp ("copyin", p))
8251 result = PRAGMA_OMP_CLAUSE_COPYIN;
8252 else if (!strcmp ("copyprivate", p))
8253 result = PRAGMA_OMP_CLAUSE_COPYPRIVATE;
8254 break;
8255 case 'f':
8256 if (!strcmp ("firstprivate", p))
8257 result = PRAGMA_OMP_CLAUSE_FIRSTPRIVATE;
8258 break;
8259 case 'l':
8260 if (!strcmp ("lastprivate", p))
8261 result = PRAGMA_OMP_CLAUSE_LASTPRIVATE;
8262 break;
8263 case 'n':
8264 if (!strcmp ("nowait", p))
8265 result = PRAGMA_OMP_CLAUSE_NOWAIT;
8266 else if (!strcmp ("num_threads", p))
8267 result = PRAGMA_OMP_CLAUSE_NUM_THREADS;
8268 break;
8269 case 'o':
8270 if (!strcmp ("ordered", p))
8271 result = PRAGMA_OMP_CLAUSE_ORDERED;
8272 break;
8273 case 'p':
8274 if (!strcmp ("private", p))
8275 result = PRAGMA_OMP_CLAUSE_PRIVATE;
8276 break;
8277 case 'r':
8278 if (!strcmp ("reduction", p))
8279 result = PRAGMA_OMP_CLAUSE_REDUCTION;
8280 break;
8281 case 's':
8282 if (!strcmp ("schedule", p))
8283 result = PRAGMA_OMP_CLAUSE_SCHEDULE;
8284 else if (!strcmp ("shared", p))
8285 result = PRAGMA_OMP_CLAUSE_SHARED;
8286 break;
8287 case 'u':
8288 if (!strcmp ("untied", p))
8289 result = PRAGMA_OMP_CLAUSE_UNTIED;
8290 break;
8294 if (result != PRAGMA_OMP_CLAUSE_NONE)
8295 c_parser_consume_token (parser);
8297 return result;
8300 /* Validate that a clause of the given type does not already exist. */
8302 static void
8303 check_no_duplicate_clause (tree clauses, enum omp_clause_code code,
8304 const char *name)
8306 tree c;
8308 for (c = clauses; c ; c = OMP_CLAUSE_CHAIN (c))
8309 if (OMP_CLAUSE_CODE (c) == code)
8311 location_t loc = OMP_CLAUSE_LOCATION (c);
8312 error_at (loc, "too many %qs clauses", name);
8313 break;
8317 /* OpenMP 2.5:
8318 variable-list:
8319 identifier
8320 variable-list , identifier
8322 If KIND is nonzero, create the appropriate node and install the
8323 decl in OMP_CLAUSE_DECL and add the node to the head of the list.
8324 If KIND is nonzero, CLAUSE_LOC is the location of the clause.
8326 If KIND is zero, create a TREE_LIST with the decl in TREE_PURPOSE;
8327 return the list created. */
8329 static tree
8330 c_parser_omp_variable_list (c_parser *parser,
8331 location_t clause_loc,
8332 enum omp_clause_code kind,
8333 tree list)
8335 if (c_parser_next_token_is_not (parser, CPP_NAME)
8336 || c_parser_peek_token (parser)->id_kind != C_ID_ID)
8337 c_parser_error (parser, "expected identifier");
8339 while (c_parser_next_token_is (parser, CPP_NAME)
8340 && c_parser_peek_token (parser)->id_kind == C_ID_ID)
8342 tree t = lookup_name (c_parser_peek_token (parser)->value);
8344 if (t == NULL_TREE)
8345 undeclared_variable (c_parser_peek_token (parser)->location,
8346 c_parser_peek_token (parser)->value);
8347 else if (t == error_mark_node)
8349 else if (kind != 0)
8351 tree u = build_omp_clause (clause_loc, kind);
8352 OMP_CLAUSE_DECL (u) = t;
8353 OMP_CLAUSE_CHAIN (u) = list;
8354 list = u;
8356 else
8357 list = tree_cons (t, NULL_TREE, list);
8359 c_parser_consume_token (parser);
8361 if (c_parser_next_token_is_not (parser, CPP_COMMA))
8362 break;
8364 c_parser_consume_token (parser);
8367 return list;
8370 /* Similarly, but expect leading and trailing parenthesis. This is a very
8371 common case for omp clauses. */
8373 static tree
8374 c_parser_omp_var_list_parens (c_parser *parser, enum omp_clause_code kind,
8375 tree list)
8377 /* The clauses location. */
8378 location_t loc = c_parser_peek_token (parser)->location;
8380 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
8382 list = c_parser_omp_variable_list (parser, loc, kind, list);
8383 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
8385 return list;
8388 /* OpenMP 3.0:
8389 collapse ( constant-expression ) */
8391 static tree
8392 c_parser_omp_clause_collapse (c_parser *parser, tree list)
8394 tree c, num = error_mark_node;
8395 HOST_WIDE_INT n;
8396 location_t loc;
8398 check_no_duplicate_clause (list, OMP_CLAUSE_COLLAPSE, "collapse");
8400 loc = c_parser_peek_token (parser)->location;
8401 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
8403 num = c_parser_expr_no_commas (parser, NULL).value;
8404 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
8406 if (num == error_mark_node)
8407 return list;
8408 if (!INTEGRAL_TYPE_P (TREE_TYPE (num))
8409 || !host_integerp (num, 0)
8410 || (n = tree_low_cst (num, 0)) <= 0
8411 || (int) n != n)
8413 error_at (loc,
8414 "collapse argument needs positive constant integer expression");
8415 return list;
8417 c = build_omp_clause (loc, OMP_CLAUSE_COLLAPSE);
8418 OMP_CLAUSE_COLLAPSE_EXPR (c) = num;
8419 OMP_CLAUSE_CHAIN (c) = list;
8420 return c;
8423 /* OpenMP 2.5:
8424 copyin ( variable-list ) */
8426 static tree
8427 c_parser_omp_clause_copyin (c_parser *parser, tree list)
8429 return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_COPYIN, list);
8432 /* OpenMP 2.5:
8433 copyprivate ( variable-list ) */
8435 static tree
8436 c_parser_omp_clause_copyprivate (c_parser *parser, tree list)
8438 return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_COPYPRIVATE, list);
8441 /* OpenMP 2.5:
8442 default ( shared | none ) */
8444 static tree
8445 c_parser_omp_clause_default (c_parser *parser, tree list)
8447 enum omp_clause_default_kind kind = OMP_CLAUSE_DEFAULT_UNSPECIFIED;
8448 location_t loc = c_parser_peek_token (parser)->location;
8449 tree c;
8451 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
8452 return list;
8453 if (c_parser_next_token_is (parser, CPP_NAME))
8455 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
8457 switch (p[0])
8459 case 'n':
8460 if (strcmp ("none", p) != 0)
8461 goto invalid_kind;
8462 kind = OMP_CLAUSE_DEFAULT_NONE;
8463 break;
8465 case 's':
8466 if (strcmp ("shared", p) != 0)
8467 goto invalid_kind;
8468 kind = OMP_CLAUSE_DEFAULT_SHARED;
8469 break;
8471 default:
8472 goto invalid_kind;
8475 c_parser_consume_token (parser);
8477 else
8479 invalid_kind:
8480 c_parser_error (parser, "expected %<none%> or %<shared%>");
8482 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
8484 if (kind == OMP_CLAUSE_DEFAULT_UNSPECIFIED)
8485 return list;
8487 check_no_duplicate_clause (list, OMP_CLAUSE_DEFAULT, "default");
8488 c = build_omp_clause (loc, OMP_CLAUSE_DEFAULT);
8489 OMP_CLAUSE_CHAIN (c) = list;
8490 OMP_CLAUSE_DEFAULT_KIND (c) = kind;
8492 return c;
8495 /* OpenMP 2.5:
8496 firstprivate ( variable-list ) */
8498 static tree
8499 c_parser_omp_clause_firstprivate (c_parser *parser, tree list)
8501 return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_FIRSTPRIVATE, list);
8504 /* OpenMP 2.5:
8505 if ( expression ) */
8507 static tree
8508 c_parser_omp_clause_if (c_parser *parser, tree list)
8510 location_t loc = c_parser_peek_token (parser)->location;
8511 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
8513 tree t = c_parser_paren_condition (parser);
8514 tree c;
8516 check_no_duplicate_clause (list, OMP_CLAUSE_IF, "if");
8518 c = build_omp_clause (loc, OMP_CLAUSE_IF);
8519 OMP_CLAUSE_IF_EXPR (c) = t;
8520 OMP_CLAUSE_CHAIN (c) = list;
8521 list = c;
8523 else
8524 c_parser_error (parser, "expected %<(%>");
8526 return list;
8529 /* OpenMP 2.5:
8530 lastprivate ( variable-list ) */
8532 static tree
8533 c_parser_omp_clause_lastprivate (c_parser *parser, tree list)
8535 return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_LASTPRIVATE, list);
8538 /* OpenMP 2.5:
8539 nowait */
8541 static tree
8542 c_parser_omp_clause_nowait (c_parser *parser ATTRIBUTE_UNUSED, tree list)
8544 tree c;
8545 location_t loc = c_parser_peek_token (parser)->location;
8547 check_no_duplicate_clause (list, OMP_CLAUSE_NOWAIT, "nowait");
8549 c = build_omp_clause (loc, OMP_CLAUSE_NOWAIT);
8550 OMP_CLAUSE_CHAIN (c) = list;
8551 return c;
8554 /* OpenMP 2.5:
8555 num_threads ( expression ) */
8557 static tree
8558 c_parser_omp_clause_num_threads (c_parser *parser, tree list)
8560 location_t num_threads_loc = c_parser_peek_token (parser)->location;
8561 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
8563 location_t expr_loc = c_parser_peek_token (parser)->location;
8564 tree c, t = c_parser_expression (parser).value;
8565 t = c_fully_fold (t, false, NULL);
8567 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
8569 if (!INTEGRAL_TYPE_P (TREE_TYPE (t)))
8571 c_parser_error (parser, "expected integer expression");
8572 return list;
8575 /* Attempt to statically determine when the number isn't positive. */
8576 c = fold_build2_loc (expr_loc, LE_EXPR, boolean_type_node, t,
8577 build_int_cst (TREE_TYPE (t), 0));
8578 if (CAN_HAVE_LOCATION_P (c))
8579 SET_EXPR_LOCATION (c, expr_loc);
8580 if (c == boolean_true_node)
8582 warning_at (expr_loc, 0,
8583 "%<num_threads%> value must be positive");
8584 t = integer_one_node;
8587 check_no_duplicate_clause (list, OMP_CLAUSE_NUM_THREADS, "num_threads");
8589 c = build_omp_clause (num_threads_loc, OMP_CLAUSE_NUM_THREADS);
8590 OMP_CLAUSE_NUM_THREADS_EXPR (c) = t;
8591 OMP_CLAUSE_CHAIN (c) = list;
8592 list = c;
8595 return list;
8598 /* OpenMP 2.5:
8599 ordered */
8601 static tree
8602 c_parser_omp_clause_ordered (c_parser *parser, tree list)
8604 tree c;
8606 check_no_duplicate_clause (list, OMP_CLAUSE_ORDERED, "ordered");
8608 c = build_omp_clause (c_parser_peek_token (parser)->location,
8609 OMP_CLAUSE_ORDERED);
8610 OMP_CLAUSE_CHAIN (c) = list;
8612 return c;
8615 /* OpenMP 2.5:
8616 private ( variable-list ) */
8618 static tree
8619 c_parser_omp_clause_private (c_parser *parser, tree list)
8621 return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_PRIVATE, list);
8624 /* OpenMP 2.5:
8625 reduction ( reduction-operator : variable-list )
8627 reduction-operator:
8628 One of: + * - & ^ | && || */
8630 static tree
8631 c_parser_omp_clause_reduction (c_parser *parser, tree list)
8633 location_t clause_loc = c_parser_peek_token (parser)->location;
8634 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
8636 enum tree_code code;
8638 switch (c_parser_peek_token (parser)->type)
8640 case CPP_PLUS:
8641 code = PLUS_EXPR;
8642 break;
8643 case CPP_MULT:
8644 code = MULT_EXPR;
8645 break;
8646 case CPP_MINUS:
8647 code = MINUS_EXPR;
8648 break;
8649 case CPP_AND:
8650 code = BIT_AND_EXPR;
8651 break;
8652 case CPP_XOR:
8653 code = BIT_XOR_EXPR;
8654 break;
8655 case CPP_OR:
8656 code = BIT_IOR_EXPR;
8657 break;
8658 case CPP_AND_AND:
8659 code = TRUTH_ANDIF_EXPR;
8660 break;
8661 case CPP_OR_OR:
8662 code = TRUTH_ORIF_EXPR;
8663 break;
8664 default:
8665 c_parser_error (parser,
8666 "expected %<+%>, %<*%>, %<-%>, %<&%>, "
8667 "%<^%>, %<|%>, %<&&%>, or %<||%>");
8668 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 0);
8669 return list;
8671 c_parser_consume_token (parser);
8672 if (c_parser_require (parser, CPP_COLON, "expected %<:%>"))
8674 tree nl, c;
8676 nl = c_parser_omp_variable_list (parser, clause_loc,
8677 OMP_CLAUSE_REDUCTION, list);
8678 for (c = nl; c != list; c = OMP_CLAUSE_CHAIN (c))
8679 OMP_CLAUSE_REDUCTION_CODE (c) = code;
8681 list = nl;
8683 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
8685 return list;
8688 /* OpenMP 2.5:
8689 schedule ( schedule-kind )
8690 schedule ( schedule-kind , expression )
8692 schedule-kind:
8693 static | dynamic | guided | runtime | auto
8696 static tree
8697 c_parser_omp_clause_schedule (c_parser *parser, tree list)
8699 tree c, t;
8700 location_t loc = c_parser_peek_token (parser)->location;
8702 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
8703 return list;
8705 c = build_omp_clause (loc, OMP_CLAUSE_SCHEDULE);
8707 if (c_parser_next_token_is (parser, CPP_NAME))
8709 tree kind = c_parser_peek_token (parser)->value;
8710 const char *p = IDENTIFIER_POINTER (kind);
8712 switch (p[0])
8714 case 'd':
8715 if (strcmp ("dynamic", p) != 0)
8716 goto invalid_kind;
8717 OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_DYNAMIC;
8718 break;
8720 case 'g':
8721 if (strcmp ("guided", p) != 0)
8722 goto invalid_kind;
8723 OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_GUIDED;
8724 break;
8726 case 'r':
8727 if (strcmp ("runtime", p) != 0)
8728 goto invalid_kind;
8729 OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_RUNTIME;
8730 break;
8732 default:
8733 goto invalid_kind;
8736 else if (c_parser_next_token_is_keyword (parser, RID_STATIC))
8737 OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_STATIC;
8738 else if (c_parser_next_token_is_keyword (parser, RID_AUTO))
8739 OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_AUTO;
8740 else
8741 goto invalid_kind;
8743 c_parser_consume_token (parser);
8744 if (c_parser_next_token_is (parser, CPP_COMMA))
8746 location_t here;
8747 c_parser_consume_token (parser);
8749 here = c_parser_peek_token (parser)->location;
8750 t = c_parser_expr_no_commas (parser, NULL).value;
8751 t = c_fully_fold (t, false, NULL);
8753 if (OMP_CLAUSE_SCHEDULE_KIND (c) == OMP_CLAUSE_SCHEDULE_RUNTIME)
8754 error_at (here, "schedule %<runtime%> does not take "
8755 "a %<chunk_size%> parameter");
8756 else if (OMP_CLAUSE_SCHEDULE_KIND (c) == OMP_CLAUSE_SCHEDULE_AUTO)
8757 error_at (here,
8758 "schedule %<auto%> does not take "
8759 "a %<chunk_size%> parameter");
8760 else if (TREE_CODE (TREE_TYPE (t)) == INTEGER_TYPE)
8761 OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (c) = t;
8762 else
8763 c_parser_error (parser, "expected integer expression");
8765 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
8767 else
8768 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
8769 "expected %<,%> or %<)%>");
8771 check_no_duplicate_clause (list, OMP_CLAUSE_SCHEDULE, "schedule");
8772 OMP_CLAUSE_CHAIN (c) = list;
8773 return c;
8775 invalid_kind:
8776 c_parser_error (parser, "invalid schedule kind");
8777 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 0);
8778 return list;
8781 /* OpenMP 2.5:
8782 shared ( variable-list ) */
8784 static tree
8785 c_parser_omp_clause_shared (c_parser *parser, tree list)
8787 return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_SHARED, list);
8790 /* OpenMP 3.0:
8791 untied */
8793 static tree
8794 c_parser_omp_clause_untied (c_parser *parser ATTRIBUTE_UNUSED, tree list)
8796 tree c;
8798 /* FIXME: Should we allow duplicates? */
8799 check_no_duplicate_clause (list, OMP_CLAUSE_UNTIED, "untied");
8801 c = build_omp_clause (c_parser_peek_token (parser)->location,
8802 OMP_CLAUSE_UNTIED);
8803 OMP_CLAUSE_CHAIN (c) = list;
8805 return c;
8808 /* Parse all OpenMP clauses. The set clauses allowed by the directive
8809 is a bitmask in MASK. Return the list of clauses found; the result
8810 of clause default goes in *pdefault. */
8812 static tree
8813 c_parser_omp_all_clauses (c_parser *parser, unsigned int mask,
8814 const char *where)
8816 tree clauses = NULL;
8817 bool first = true;
8819 while (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL))
8821 location_t here;
8822 pragma_omp_clause c_kind;
8823 const char *c_name;
8824 tree prev = clauses;
8826 if (!first && c_parser_next_token_is (parser, CPP_COMMA))
8827 c_parser_consume_token (parser);
8829 first = false;
8830 here = c_parser_peek_token (parser)->location;
8831 c_kind = c_parser_omp_clause_name (parser);
8833 switch (c_kind)
8835 case PRAGMA_OMP_CLAUSE_COLLAPSE:
8836 clauses = c_parser_omp_clause_collapse (parser, clauses);
8837 c_name = "collapse";
8838 break;
8839 case PRAGMA_OMP_CLAUSE_COPYIN:
8840 clauses = c_parser_omp_clause_copyin (parser, clauses);
8841 c_name = "copyin";
8842 break;
8843 case PRAGMA_OMP_CLAUSE_COPYPRIVATE:
8844 clauses = c_parser_omp_clause_copyprivate (parser, clauses);
8845 c_name = "copyprivate";
8846 break;
8847 case PRAGMA_OMP_CLAUSE_DEFAULT:
8848 clauses = c_parser_omp_clause_default (parser, clauses);
8849 c_name = "default";
8850 break;
8851 case PRAGMA_OMP_CLAUSE_FIRSTPRIVATE:
8852 clauses = c_parser_omp_clause_firstprivate (parser, clauses);
8853 c_name = "firstprivate";
8854 break;
8855 case PRAGMA_OMP_CLAUSE_IF:
8856 clauses = c_parser_omp_clause_if (parser, clauses);
8857 c_name = "if";
8858 break;
8859 case PRAGMA_OMP_CLAUSE_LASTPRIVATE:
8860 clauses = c_parser_omp_clause_lastprivate (parser, clauses);
8861 c_name = "lastprivate";
8862 break;
8863 case PRAGMA_OMP_CLAUSE_NOWAIT:
8864 clauses = c_parser_omp_clause_nowait (parser, clauses);
8865 c_name = "nowait";
8866 break;
8867 case PRAGMA_OMP_CLAUSE_NUM_THREADS:
8868 clauses = c_parser_omp_clause_num_threads (parser, clauses);
8869 c_name = "num_threads";
8870 break;
8871 case PRAGMA_OMP_CLAUSE_ORDERED:
8872 clauses = c_parser_omp_clause_ordered (parser, clauses);
8873 c_name = "ordered";
8874 break;
8875 case PRAGMA_OMP_CLAUSE_PRIVATE:
8876 clauses = c_parser_omp_clause_private (parser, clauses);
8877 c_name = "private";
8878 break;
8879 case PRAGMA_OMP_CLAUSE_REDUCTION:
8880 clauses = c_parser_omp_clause_reduction (parser, clauses);
8881 c_name = "reduction";
8882 break;
8883 case PRAGMA_OMP_CLAUSE_SCHEDULE:
8884 clauses = c_parser_omp_clause_schedule (parser, clauses);
8885 c_name = "schedule";
8886 break;
8887 case PRAGMA_OMP_CLAUSE_SHARED:
8888 clauses = c_parser_omp_clause_shared (parser, clauses);
8889 c_name = "shared";
8890 break;
8891 case PRAGMA_OMP_CLAUSE_UNTIED:
8892 clauses = c_parser_omp_clause_untied (parser, clauses);
8893 c_name = "untied";
8894 break;
8895 default:
8896 c_parser_error (parser, "expected %<#pragma omp%> clause");
8897 goto saw_error;
8900 if (((mask >> c_kind) & 1) == 0 && !parser->error)
8902 /* Remove the invalid clause(s) from the list to avoid
8903 confusing the rest of the compiler. */
8904 clauses = prev;
8905 error_at (here, "%qs is not valid for %qs", c_name, where);
8909 saw_error:
8910 c_parser_skip_to_pragma_eol (parser);
8912 return c_finish_omp_clauses (clauses);
8915 /* OpenMP 2.5:
8916 structured-block:
8917 statement
8919 In practice, we're also interested in adding the statement to an
8920 outer node. So it is convenient if we work around the fact that
8921 c_parser_statement calls add_stmt. */
8923 static tree
8924 c_parser_omp_structured_block (c_parser *parser)
8926 tree stmt = push_stmt_list ();
8927 c_parser_statement (parser);
8928 return pop_stmt_list (stmt);
8931 /* OpenMP 2.5:
8932 # pragma omp atomic new-line
8933 expression-stmt
8935 expression-stmt:
8936 x binop= expr | x++ | ++x | x-- | --x
8937 binop:
8938 +, *, -, /, &, ^, |, <<, >>
8940 where x is an lvalue expression with scalar type.
8942 LOC is the location of the #pragma token. */
8944 static void
8945 c_parser_omp_atomic (location_t loc, c_parser *parser)
8947 tree lhs, rhs;
8948 tree stmt;
8949 enum tree_code code;
8950 struct c_expr rhs_expr;
8952 c_parser_skip_to_pragma_eol (parser);
8954 lhs = c_parser_unary_expression (parser).value;
8955 lhs = c_fully_fold (lhs, false, NULL);
8956 switch (TREE_CODE (lhs))
8958 case ERROR_MARK:
8959 saw_error:
8960 c_parser_skip_to_end_of_block_or_statement (parser);
8961 return;
8963 case PREINCREMENT_EXPR:
8964 case POSTINCREMENT_EXPR:
8965 lhs = TREE_OPERAND (lhs, 0);
8966 code = PLUS_EXPR;
8967 rhs = integer_one_node;
8968 break;
8970 case PREDECREMENT_EXPR:
8971 case POSTDECREMENT_EXPR:
8972 lhs = TREE_OPERAND (lhs, 0);
8973 code = MINUS_EXPR;
8974 rhs = integer_one_node;
8975 break;
8977 case COMPOUND_EXPR:
8978 if (TREE_CODE (TREE_OPERAND (lhs, 0)) == SAVE_EXPR
8979 && TREE_CODE (TREE_OPERAND (lhs, 1)) == COMPOUND_EXPR
8980 && TREE_CODE (TREE_OPERAND (TREE_OPERAND (lhs, 1), 0)) == MODIFY_EXPR
8981 && TREE_OPERAND (TREE_OPERAND (lhs, 1), 1) == TREE_OPERAND (lhs, 0)
8982 && TREE_CODE (TREE_TYPE (TREE_OPERAND (TREE_OPERAND
8983 (TREE_OPERAND (lhs, 1), 0), 0)))
8984 == BOOLEAN_TYPE)
8985 /* Undo effects of boolean_increment for post {in,de}crement. */
8986 lhs = TREE_OPERAND (TREE_OPERAND (lhs, 1), 0);
8987 /* FALLTHRU */
8988 case MODIFY_EXPR:
8989 if (TREE_CODE (lhs) == MODIFY_EXPR
8990 && TREE_CODE (TREE_TYPE (TREE_OPERAND (lhs, 0))) == BOOLEAN_TYPE)
8992 /* Undo effects of boolean_increment. */
8993 if (integer_onep (TREE_OPERAND (lhs, 1)))
8995 /* This is pre or post increment. */
8996 rhs = TREE_OPERAND (lhs, 1);
8997 lhs = TREE_OPERAND (lhs, 0);
8998 code = NOP_EXPR;
8999 break;
9001 if (TREE_CODE (TREE_OPERAND (lhs, 1)) == TRUTH_NOT_EXPR
9002 && TREE_OPERAND (lhs, 0)
9003 == TREE_OPERAND (TREE_OPERAND (lhs, 1), 0))
9005 /* This is pre or post decrement. */
9006 rhs = TREE_OPERAND (lhs, 1);
9007 lhs = TREE_OPERAND (lhs, 0);
9008 code = NOP_EXPR;
9009 break;
9012 /* FALLTHRU */
9013 default:
9014 switch (c_parser_peek_token (parser)->type)
9016 case CPP_MULT_EQ:
9017 code = MULT_EXPR;
9018 break;
9019 case CPP_DIV_EQ:
9020 code = TRUNC_DIV_EXPR;
9021 break;
9022 case CPP_PLUS_EQ:
9023 code = PLUS_EXPR;
9024 break;
9025 case CPP_MINUS_EQ:
9026 code = MINUS_EXPR;
9027 break;
9028 case CPP_LSHIFT_EQ:
9029 code = LSHIFT_EXPR;
9030 break;
9031 case CPP_RSHIFT_EQ:
9032 code = RSHIFT_EXPR;
9033 break;
9034 case CPP_AND_EQ:
9035 code = BIT_AND_EXPR;
9036 break;
9037 case CPP_OR_EQ:
9038 code = BIT_IOR_EXPR;
9039 break;
9040 case CPP_XOR_EQ:
9041 code = BIT_XOR_EXPR;
9042 break;
9043 default:
9044 c_parser_error (parser,
9045 "invalid operator for %<#pragma omp atomic%>");
9046 goto saw_error;
9049 c_parser_consume_token (parser);
9051 location_t rhs_loc = c_parser_peek_token (parser)->location;
9052 rhs_expr = c_parser_expression (parser);
9053 rhs_expr = default_function_array_read_conversion (rhs_loc, rhs_expr);
9055 rhs = rhs_expr.value;
9056 rhs = c_fully_fold (rhs, false, NULL);
9057 break;
9059 stmt = c_finish_omp_atomic (loc, code, lhs, rhs);
9060 if (stmt != error_mark_node)
9061 add_stmt (stmt);
9062 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
9066 /* OpenMP 2.5:
9067 # pragma omp barrier new-line
9070 static void
9071 c_parser_omp_barrier (c_parser *parser)
9073 location_t loc = c_parser_peek_token (parser)->location;
9074 c_parser_consume_pragma (parser);
9075 c_parser_skip_to_pragma_eol (parser);
9077 c_finish_omp_barrier (loc);
9080 /* OpenMP 2.5:
9081 # pragma omp critical [(name)] new-line
9082 structured-block
9084 LOC is the location of the #pragma itself. */
9086 static tree
9087 c_parser_omp_critical (location_t loc, c_parser *parser)
9089 tree stmt, name = NULL;
9091 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
9093 c_parser_consume_token (parser);
9094 if (c_parser_next_token_is (parser, CPP_NAME))
9096 name = c_parser_peek_token (parser)->value;
9097 c_parser_consume_token (parser);
9098 c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>");
9100 else
9101 c_parser_error (parser, "expected identifier");
9103 else if (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL))
9104 c_parser_error (parser, "expected %<(%> or end of line");
9105 c_parser_skip_to_pragma_eol (parser);
9107 stmt = c_parser_omp_structured_block (parser);
9108 return c_finish_omp_critical (loc, stmt, name);
9111 /* OpenMP 2.5:
9112 # pragma omp flush flush-vars[opt] new-line
9114 flush-vars:
9115 ( variable-list ) */
9117 static void
9118 c_parser_omp_flush (c_parser *parser)
9120 location_t loc = c_parser_peek_token (parser)->location;
9121 c_parser_consume_pragma (parser);
9122 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
9123 c_parser_omp_var_list_parens (parser, OMP_CLAUSE_ERROR, NULL);
9124 else if (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL))
9125 c_parser_error (parser, "expected %<(%> or end of line");
9126 c_parser_skip_to_pragma_eol (parser);
9128 c_finish_omp_flush (loc);
9131 /* Parse the restricted form of the for statement allowed by OpenMP.
9132 The real trick here is to determine the loop control variable early
9133 so that we can push a new decl if necessary to make it private.
9134 LOC is the location of the OMP in "#pragma omp". */
9136 static tree
9137 c_parser_omp_for_loop (location_t loc,
9138 c_parser *parser, tree clauses, tree *par_clauses)
9140 tree decl, cond, incr, save_break, save_cont, body, init, stmt, cl;
9141 tree declv, condv, incrv, initv, ret = NULL;
9142 bool fail = false, open_brace_parsed = false;
9143 int i, collapse = 1, nbraces = 0;
9144 location_t for_loc;
9145 VEC(tree,gc) *for_block = make_tree_vector ();
9147 for (cl = clauses; cl; cl = OMP_CLAUSE_CHAIN (cl))
9148 if (OMP_CLAUSE_CODE (cl) == OMP_CLAUSE_COLLAPSE)
9149 collapse = tree_low_cst (OMP_CLAUSE_COLLAPSE_EXPR (cl), 0);
9151 gcc_assert (collapse >= 1);
9153 declv = make_tree_vec (collapse);
9154 initv = make_tree_vec (collapse);
9155 condv = make_tree_vec (collapse);
9156 incrv = make_tree_vec (collapse);
9158 if (!c_parser_next_token_is_keyword (parser, RID_FOR))
9160 c_parser_error (parser, "for statement expected");
9161 return NULL;
9163 for_loc = c_parser_peek_token (parser)->location;
9164 c_parser_consume_token (parser);
9166 for (i = 0; i < collapse; i++)
9168 int bracecount = 0;
9170 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
9171 goto pop_scopes;
9173 /* Parse the initialization declaration or expression. */
9174 if (c_parser_next_tokens_start_declaration (parser))
9176 if (i > 0)
9177 VEC_safe_push (tree, gc, for_block, c_begin_compound_stmt (true));
9178 c_parser_declaration_or_fndef (parser, true, true, true, true, true, NULL);
9179 decl = check_for_loop_decls (for_loc, flag_isoc99);
9180 if (decl == NULL)
9181 goto error_init;
9182 if (DECL_INITIAL (decl) == error_mark_node)
9183 decl = error_mark_node;
9184 init = decl;
9186 else if (c_parser_next_token_is (parser, CPP_NAME)
9187 && c_parser_peek_2nd_token (parser)->type == CPP_EQ)
9189 struct c_expr decl_exp;
9190 struct c_expr init_exp;
9191 location_t init_loc;
9193 decl_exp = c_parser_postfix_expression (parser);
9194 decl = decl_exp.value;
9196 c_parser_require (parser, CPP_EQ, "expected %<=%>");
9198 init_loc = c_parser_peek_token (parser)->location;
9199 init_exp = c_parser_expr_no_commas (parser, NULL);
9200 init_exp = default_function_array_read_conversion (init_loc,
9201 init_exp);
9202 init = build_modify_expr (init_loc, decl, decl_exp.original_type,
9203 NOP_EXPR, init_loc, init_exp.value,
9204 init_exp.original_type);
9205 init = c_process_expr_stmt (init_loc, init);
9207 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
9209 else
9211 error_init:
9212 c_parser_error (parser,
9213 "expected iteration declaration or initialization");
9214 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
9215 "expected %<)%>");
9216 fail = true;
9217 goto parse_next;
9220 /* Parse the loop condition. */
9221 cond = NULL_TREE;
9222 if (c_parser_next_token_is_not (parser, CPP_SEMICOLON))
9224 location_t cond_loc = c_parser_peek_token (parser)->location;
9225 struct c_expr cond_expr = c_parser_binary_expression (parser, NULL);
9227 cond = cond_expr.value;
9228 cond = c_objc_common_truthvalue_conversion (cond_loc, cond);
9229 cond = c_fully_fold (cond, false, NULL);
9230 switch (cond_expr.original_code)
9232 case GT_EXPR:
9233 case GE_EXPR:
9234 case LT_EXPR:
9235 case LE_EXPR:
9236 break;
9237 default:
9238 /* Can't be cond = error_mark_node, because we want to preserve
9239 the location until c_finish_omp_for. */
9240 cond = build1 (NOP_EXPR, boolean_type_node, error_mark_node);
9241 break;
9243 protected_set_expr_location (cond, cond_loc);
9245 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
9247 /* Parse the increment expression. */
9248 incr = NULL_TREE;
9249 if (c_parser_next_token_is_not (parser, CPP_CLOSE_PAREN))
9251 location_t incr_loc = c_parser_peek_token (parser)->location;
9253 incr = c_process_expr_stmt (incr_loc,
9254 c_parser_expression (parser).value);
9256 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
9258 if (decl == NULL || decl == error_mark_node || init == error_mark_node)
9259 fail = true;
9260 else
9262 TREE_VEC_ELT (declv, i) = decl;
9263 TREE_VEC_ELT (initv, i) = init;
9264 TREE_VEC_ELT (condv, i) = cond;
9265 TREE_VEC_ELT (incrv, i) = incr;
9268 parse_next:
9269 if (i == collapse - 1)
9270 break;
9272 /* FIXME: OpenMP 3.0 draft isn't very clear on what exactly is allowed
9273 in between the collapsed for loops to be still considered perfectly
9274 nested. Hopefully the final version clarifies this.
9275 For now handle (multiple) {'s and empty statements. */
9278 if (c_parser_next_token_is_keyword (parser, RID_FOR))
9280 c_parser_consume_token (parser);
9281 break;
9283 else if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
9285 c_parser_consume_token (parser);
9286 bracecount++;
9288 else if (bracecount
9289 && c_parser_next_token_is (parser, CPP_SEMICOLON))
9290 c_parser_consume_token (parser);
9291 else
9293 c_parser_error (parser, "not enough perfectly nested loops");
9294 if (bracecount)
9296 open_brace_parsed = true;
9297 bracecount--;
9299 fail = true;
9300 collapse = 0;
9301 break;
9304 while (1);
9306 nbraces += bracecount;
9309 save_break = c_break_label;
9310 c_break_label = size_one_node;
9311 save_cont = c_cont_label;
9312 c_cont_label = NULL_TREE;
9313 body = push_stmt_list ();
9315 if (open_brace_parsed)
9317 location_t here = c_parser_peek_token (parser)->location;
9318 stmt = c_begin_compound_stmt (true);
9319 c_parser_compound_statement_nostart (parser);
9320 add_stmt (c_end_compound_stmt (here, stmt, true));
9322 else
9323 add_stmt (c_parser_c99_block_statement (parser));
9324 if (c_cont_label)
9326 tree t = build1 (LABEL_EXPR, void_type_node, c_cont_label);
9327 SET_EXPR_LOCATION (t, loc);
9328 add_stmt (t);
9331 body = pop_stmt_list (body);
9332 c_break_label = save_break;
9333 c_cont_label = save_cont;
9335 while (nbraces)
9337 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
9339 c_parser_consume_token (parser);
9340 nbraces--;
9342 else if (c_parser_next_token_is (parser, CPP_SEMICOLON))
9343 c_parser_consume_token (parser);
9344 else
9346 c_parser_error (parser, "collapsed loops not perfectly nested");
9347 while (nbraces)
9349 location_t here = c_parser_peek_token (parser)->location;
9350 stmt = c_begin_compound_stmt (true);
9351 add_stmt (body);
9352 c_parser_compound_statement_nostart (parser);
9353 body = c_end_compound_stmt (here, stmt, true);
9354 nbraces--;
9356 goto pop_scopes;
9360 /* Only bother calling c_finish_omp_for if we haven't already generated
9361 an error from the initialization parsing. */
9362 if (!fail)
9364 stmt = c_finish_omp_for (loc, declv, initv, condv, incrv, body, NULL);
9365 if (stmt)
9367 if (par_clauses != NULL)
9369 tree *c;
9370 for (c = par_clauses; *c ; )
9371 if (OMP_CLAUSE_CODE (*c) != OMP_CLAUSE_FIRSTPRIVATE
9372 && OMP_CLAUSE_CODE (*c) != OMP_CLAUSE_LASTPRIVATE)
9373 c = &OMP_CLAUSE_CHAIN (*c);
9374 else
9376 for (i = 0; i < collapse; i++)
9377 if (TREE_VEC_ELT (declv, i) == OMP_CLAUSE_DECL (*c))
9378 break;
9379 if (i == collapse)
9380 c = &OMP_CLAUSE_CHAIN (*c);
9381 else if (OMP_CLAUSE_CODE (*c) == OMP_CLAUSE_FIRSTPRIVATE)
9383 error_at (loc,
9384 "iteration variable %qD should not be firstprivate",
9385 OMP_CLAUSE_DECL (*c));
9386 *c = OMP_CLAUSE_CHAIN (*c);
9388 else
9390 /* Copy lastprivate (decl) clause to OMP_FOR_CLAUSES,
9391 change it to shared (decl) in
9392 OMP_PARALLEL_CLAUSES. */
9393 tree l = build_omp_clause (OMP_CLAUSE_LOCATION (*c),
9394 OMP_CLAUSE_LASTPRIVATE);
9395 OMP_CLAUSE_DECL (l) = OMP_CLAUSE_DECL (*c);
9396 OMP_CLAUSE_CHAIN (l) = clauses;
9397 clauses = l;
9398 OMP_CLAUSE_SET_CODE (*c, OMP_CLAUSE_SHARED);
9402 OMP_FOR_CLAUSES (stmt) = clauses;
9404 ret = stmt;
9406 pop_scopes:
9407 while (!VEC_empty (tree, for_block))
9409 /* FIXME diagnostics: LOC below should be the actual location of
9410 this particular for block. We need to build a list of
9411 locations to go along with FOR_BLOCK. */
9412 stmt = c_end_compound_stmt (loc, VEC_pop (tree, for_block), true);
9413 add_stmt (stmt);
9415 release_tree_vector (for_block);
9416 return ret;
9419 /* OpenMP 2.5:
9420 #pragma omp for for-clause[optseq] new-line
9421 for-loop
9423 LOC is the location of the #pragma token.
9426 #define OMP_FOR_CLAUSE_MASK \
9427 ( (1u << PRAGMA_OMP_CLAUSE_PRIVATE) \
9428 | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE) \
9429 | (1u << PRAGMA_OMP_CLAUSE_LASTPRIVATE) \
9430 | (1u << PRAGMA_OMP_CLAUSE_REDUCTION) \
9431 | (1u << PRAGMA_OMP_CLAUSE_ORDERED) \
9432 | (1u << PRAGMA_OMP_CLAUSE_SCHEDULE) \
9433 | (1u << PRAGMA_OMP_CLAUSE_COLLAPSE) \
9434 | (1u << PRAGMA_OMP_CLAUSE_NOWAIT))
9436 static tree
9437 c_parser_omp_for (location_t loc, c_parser *parser)
9439 tree block, clauses, ret;
9441 clauses = c_parser_omp_all_clauses (parser, OMP_FOR_CLAUSE_MASK,
9442 "#pragma omp for");
9444 block = c_begin_compound_stmt (true);
9445 ret = c_parser_omp_for_loop (loc, parser, clauses, NULL);
9446 block = c_end_compound_stmt (loc, block, true);
9447 add_stmt (block);
9449 return ret;
9452 /* OpenMP 2.5:
9453 # pragma omp master new-line
9454 structured-block
9456 LOC is the location of the #pragma token.
9459 static tree
9460 c_parser_omp_master (location_t loc, c_parser *parser)
9462 c_parser_skip_to_pragma_eol (parser);
9463 return c_finish_omp_master (loc, c_parser_omp_structured_block (parser));
9466 /* OpenMP 2.5:
9467 # pragma omp ordered new-line
9468 structured-block
9470 LOC is the location of the #pragma itself.
9473 static tree
9474 c_parser_omp_ordered (location_t loc, c_parser *parser)
9476 c_parser_skip_to_pragma_eol (parser);
9477 return c_finish_omp_ordered (loc, c_parser_omp_structured_block (parser));
9480 /* OpenMP 2.5:
9482 section-scope:
9483 { section-sequence }
9485 section-sequence:
9486 section-directive[opt] structured-block
9487 section-sequence section-directive structured-block
9489 SECTIONS_LOC is the location of the #pragma omp sections. */
9491 static tree
9492 c_parser_omp_sections_scope (location_t sections_loc, c_parser *parser)
9494 tree stmt, substmt;
9495 bool error_suppress = false;
9496 location_t loc;
9498 loc = c_parser_peek_token (parser)->location;
9499 if (!c_parser_require (parser, CPP_OPEN_BRACE, "expected %<{%>"))
9501 /* Avoid skipping until the end of the block. */
9502 parser->error = false;
9503 return NULL_TREE;
9506 stmt = push_stmt_list ();
9508 if (c_parser_peek_token (parser)->pragma_kind != PRAGMA_OMP_SECTION)
9510 substmt = push_stmt_list ();
9512 while (1)
9514 c_parser_statement (parser);
9516 if (c_parser_peek_token (parser)->pragma_kind == PRAGMA_OMP_SECTION)
9517 break;
9518 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
9519 break;
9520 if (c_parser_next_token_is (parser, CPP_EOF))
9521 break;
9524 substmt = pop_stmt_list (substmt);
9525 substmt = build1 (OMP_SECTION, void_type_node, substmt);
9526 SET_EXPR_LOCATION (substmt, loc);
9527 add_stmt (substmt);
9530 while (1)
9532 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
9533 break;
9534 if (c_parser_next_token_is (parser, CPP_EOF))
9535 break;
9537 loc = c_parser_peek_token (parser)->location;
9538 if (c_parser_peek_token (parser)->pragma_kind == PRAGMA_OMP_SECTION)
9540 c_parser_consume_pragma (parser);
9541 c_parser_skip_to_pragma_eol (parser);
9542 error_suppress = false;
9544 else if (!error_suppress)
9546 error_at (loc, "expected %<#pragma omp section%> or %<}%>");
9547 error_suppress = true;
9550 substmt = c_parser_omp_structured_block (parser);
9551 substmt = build1 (OMP_SECTION, void_type_node, substmt);
9552 SET_EXPR_LOCATION (substmt, loc);
9553 add_stmt (substmt);
9555 c_parser_skip_until_found (parser, CPP_CLOSE_BRACE,
9556 "expected %<#pragma omp section%> or %<}%>");
9558 substmt = pop_stmt_list (stmt);
9560 stmt = make_node (OMP_SECTIONS);
9561 SET_EXPR_LOCATION (stmt, sections_loc);
9562 TREE_TYPE (stmt) = void_type_node;
9563 OMP_SECTIONS_BODY (stmt) = substmt;
9565 return add_stmt (stmt);
9568 /* OpenMP 2.5:
9569 # pragma omp sections sections-clause[optseq] newline
9570 sections-scope
9572 LOC is the location of the #pragma token.
9575 #define OMP_SECTIONS_CLAUSE_MASK \
9576 ( (1u << PRAGMA_OMP_CLAUSE_PRIVATE) \
9577 | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE) \
9578 | (1u << PRAGMA_OMP_CLAUSE_LASTPRIVATE) \
9579 | (1u << PRAGMA_OMP_CLAUSE_REDUCTION) \
9580 | (1u << PRAGMA_OMP_CLAUSE_NOWAIT))
9582 static tree
9583 c_parser_omp_sections (location_t loc, c_parser *parser)
9585 tree block, clauses, ret;
9587 clauses = c_parser_omp_all_clauses (parser, OMP_SECTIONS_CLAUSE_MASK,
9588 "#pragma omp sections");
9590 block = c_begin_compound_stmt (true);
9591 ret = c_parser_omp_sections_scope (loc, parser);
9592 if (ret)
9593 OMP_SECTIONS_CLAUSES (ret) = clauses;
9594 block = c_end_compound_stmt (loc, block, true);
9595 add_stmt (block);
9597 return ret;
9600 /* OpenMP 2.5:
9601 # pragma parallel parallel-clause new-line
9602 # pragma parallel for parallel-for-clause new-line
9603 # pragma parallel sections parallel-sections-clause new-line
9605 LOC is the location of the #pragma token.
9608 #define OMP_PARALLEL_CLAUSE_MASK \
9609 ( (1u << PRAGMA_OMP_CLAUSE_IF) \
9610 | (1u << PRAGMA_OMP_CLAUSE_PRIVATE) \
9611 | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE) \
9612 | (1u << PRAGMA_OMP_CLAUSE_DEFAULT) \
9613 | (1u << PRAGMA_OMP_CLAUSE_SHARED) \
9614 | (1u << PRAGMA_OMP_CLAUSE_COPYIN) \
9615 | (1u << PRAGMA_OMP_CLAUSE_REDUCTION) \
9616 | (1u << PRAGMA_OMP_CLAUSE_NUM_THREADS))
9618 static tree
9619 c_parser_omp_parallel (location_t loc, c_parser *parser)
9621 enum pragma_kind p_kind = PRAGMA_OMP_PARALLEL;
9622 const char *p_name = "#pragma omp parallel";
9623 tree stmt, clauses, par_clause, ws_clause, block;
9624 unsigned int mask = OMP_PARALLEL_CLAUSE_MASK;
9626 if (c_parser_next_token_is_keyword (parser, RID_FOR))
9628 c_parser_consume_token (parser);
9629 p_kind = PRAGMA_OMP_PARALLEL_FOR;
9630 p_name = "#pragma omp parallel for";
9631 mask |= OMP_FOR_CLAUSE_MASK;
9632 mask &= ~(1u << PRAGMA_OMP_CLAUSE_NOWAIT);
9634 else if (c_parser_next_token_is (parser, CPP_NAME))
9636 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
9637 if (strcmp (p, "sections") == 0)
9639 c_parser_consume_token (parser);
9640 p_kind = PRAGMA_OMP_PARALLEL_SECTIONS;
9641 p_name = "#pragma omp parallel sections";
9642 mask |= OMP_SECTIONS_CLAUSE_MASK;
9643 mask &= ~(1u << PRAGMA_OMP_CLAUSE_NOWAIT);
9647 clauses = c_parser_omp_all_clauses (parser, mask, p_name);
9649 switch (p_kind)
9651 case PRAGMA_OMP_PARALLEL:
9652 block = c_begin_omp_parallel ();
9653 c_parser_statement (parser);
9654 stmt = c_finish_omp_parallel (loc, clauses, block);
9655 break;
9657 case PRAGMA_OMP_PARALLEL_FOR:
9658 block = c_begin_omp_parallel ();
9659 c_split_parallel_clauses (loc, clauses, &par_clause, &ws_clause);
9660 c_parser_omp_for_loop (loc, parser, ws_clause, &par_clause);
9661 stmt = c_finish_omp_parallel (loc, par_clause, block);
9662 OMP_PARALLEL_COMBINED (stmt) = 1;
9663 break;
9665 case PRAGMA_OMP_PARALLEL_SECTIONS:
9666 block = c_begin_omp_parallel ();
9667 c_split_parallel_clauses (loc, clauses, &par_clause, &ws_clause);
9668 stmt = c_parser_omp_sections_scope (loc, parser);
9669 if (stmt)
9670 OMP_SECTIONS_CLAUSES (stmt) = ws_clause;
9671 stmt = c_finish_omp_parallel (loc, par_clause, block);
9672 OMP_PARALLEL_COMBINED (stmt) = 1;
9673 break;
9675 default:
9676 gcc_unreachable ();
9679 return stmt;
9682 /* OpenMP 2.5:
9683 # pragma omp single single-clause[optseq] new-line
9684 structured-block
9686 LOC is the location of the #pragma.
9689 #define OMP_SINGLE_CLAUSE_MASK \
9690 ( (1u << PRAGMA_OMP_CLAUSE_PRIVATE) \
9691 | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE) \
9692 | (1u << PRAGMA_OMP_CLAUSE_COPYPRIVATE) \
9693 | (1u << PRAGMA_OMP_CLAUSE_NOWAIT))
9695 static tree
9696 c_parser_omp_single (location_t loc, c_parser *parser)
9698 tree stmt = make_node (OMP_SINGLE);
9699 SET_EXPR_LOCATION (stmt, loc);
9700 TREE_TYPE (stmt) = void_type_node;
9702 OMP_SINGLE_CLAUSES (stmt)
9703 = c_parser_omp_all_clauses (parser, OMP_SINGLE_CLAUSE_MASK,
9704 "#pragma omp single");
9705 OMP_SINGLE_BODY (stmt) = c_parser_omp_structured_block (parser);
9707 return add_stmt (stmt);
9710 /* OpenMP 3.0:
9711 # pragma omp task task-clause[optseq] new-line
9713 LOC is the location of the #pragma.
9716 #define OMP_TASK_CLAUSE_MASK \
9717 ( (1u << PRAGMA_OMP_CLAUSE_IF) \
9718 | (1u << PRAGMA_OMP_CLAUSE_UNTIED) \
9719 | (1u << PRAGMA_OMP_CLAUSE_DEFAULT) \
9720 | (1u << PRAGMA_OMP_CLAUSE_PRIVATE) \
9721 | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE) \
9722 | (1u << PRAGMA_OMP_CLAUSE_SHARED))
9724 static tree
9725 c_parser_omp_task (location_t loc, c_parser *parser)
9727 tree clauses, block;
9729 clauses = c_parser_omp_all_clauses (parser, OMP_TASK_CLAUSE_MASK,
9730 "#pragma omp task");
9732 block = c_begin_omp_task ();
9733 c_parser_statement (parser);
9734 return c_finish_omp_task (loc, clauses, block);
9737 /* OpenMP 3.0:
9738 # pragma omp taskwait new-line
9741 static void
9742 c_parser_omp_taskwait (c_parser *parser)
9744 location_t loc = c_parser_peek_token (parser)->location;
9745 c_parser_consume_pragma (parser);
9746 c_parser_skip_to_pragma_eol (parser);
9748 c_finish_omp_taskwait (loc);
9751 /* Main entry point to parsing most OpenMP pragmas. */
9753 static void
9754 c_parser_omp_construct (c_parser *parser)
9756 enum pragma_kind p_kind;
9757 location_t loc;
9758 tree stmt;
9760 loc = c_parser_peek_token (parser)->location;
9761 p_kind = c_parser_peek_token (parser)->pragma_kind;
9762 c_parser_consume_pragma (parser);
9764 switch (p_kind)
9766 case PRAGMA_OMP_ATOMIC:
9767 c_parser_omp_atomic (loc, parser);
9768 return;
9769 case PRAGMA_OMP_CRITICAL:
9770 stmt = c_parser_omp_critical (loc, parser);
9771 break;
9772 case PRAGMA_OMP_FOR:
9773 stmt = c_parser_omp_for (loc, parser);
9774 break;
9775 case PRAGMA_OMP_MASTER:
9776 stmt = c_parser_omp_master (loc, parser);
9777 break;
9778 case PRAGMA_OMP_ORDERED:
9779 stmt = c_parser_omp_ordered (loc, parser);
9780 break;
9781 case PRAGMA_OMP_PARALLEL:
9782 stmt = c_parser_omp_parallel (loc, parser);
9783 break;
9784 case PRAGMA_OMP_SECTIONS:
9785 stmt = c_parser_omp_sections (loc, parser);
9786 break;
9787 case PRAGMA_OMP_SINGLE:
9788 stmt = c_parser_omp_single (loc, parser);
9789 break;
9790 case PRAGMA_OMP_TASK:
9791 stmt = c_parser_omp_task (loc, parser);
9792 break;
9793 default:
9794 gcc_unreachable ();
9797 if (stmt)
9798 gcc_assert (EXPR_LOCATION (stmt) != UNKNOWN_LOCATION);
9802 /* OpenMP 2.5:
9803 # pragma omp threadprivate (variable-list) */
9805 static void
9806 c_parser_omp_threadprivate (c_parser *parser)
9808 tree vars, t;
9809 location_t loc;
9811 c_parser_consume_pragma (parser);
9812 loc = c_parser_peek_token (parser)->location;
9813 vars = c_parser_omp_var_list_parens (parser, OMP_CLAUSE_ERROR, NULL);
9815 /* Mark every variable in VARS to be assigned thread local storage. */
9816 for (t = vars; t; t = TREE_CHAIN (t))
9818 tree v = TREE_PURPOSE (t);
9820 /* FIXME diagnostics: Ideally we should keep individual
9821 locations for all the variables in the var list to make the
9822 following errors more precise. Perhaps
9823 c_parser_omp_var_list_parens() should construct a list of
9824 locations to go along with the var list. */
9826 /* If V had already been marked threadprivate, it doesn't matter
9827 whether it had been used prior to this point. */
9828 if (TREE_CODE (v) != VAR_DECL)
9829 error_at (loc, "%qD is not a variable", v);
9830 else if (TREE_USED (v) && !C_DECL_THREADPRIVATE_P (v))
9831 error_at (loc, "%qE declared %<threadprivate%> after first use", v);
9832 else if (! TREE_STATIC (v) && ! DECL_EXTERNAL (v))
9833 error_at (loc, "automatic variable %qE cannot be %<threadprivate%>", v);
9834 else if (TREE_TYPE (v) == error_mark_node)
9836 else if (! COMPLETE_TYPE_P (TREE_TYPE (v)))
9837 error_at (loc, "%<threadprivate%> %qE has incomplete type", v);
9838 else
9840 if (! DECL_THREAD_LOCAL_P (v))
9842 DECL_TLS_MODEL (v) = decl_default_tls_model (v);
9843 /* If rtl has been already set for this var, call
9844 make_decl_rtl once again, so that encode_section_info
9845 has a chance to look at the new decl flags. */
9846 if (DECL_RTL_SET_P (v))
9847 make_decl_rtl (v);
9849 C_DECL_THREADPRIVATE_P (v) = 1;
9853 c_parser_skip_to_pragma_eol (parser);
9857 /* Parse a single source file. */
9859 void
9860 c_parse_file (void)
9862 /* Use local storage to begin. If the first token is a pragma, parse it.
9863 If it is #pragma GCC pch_preprocess, then this will load a PCH file
9864 which will cause garbage collection. */
9865 c_parser tparser;
9867 memset (&tparser, 0, sizeof tparser);
9868 the_parser = &tparser;
9870 if (c_parser_peek_token (&tparser)->pragma_kind == PRAGMA_GCC_PCH_PREPROCESS)
9871 c_parser_pragma_pch_preprocess (&tparser);
9873 the_parser = ggc_alloc_c_parser ();
9874 *the_parser = tparser;
9876 /* Initialize EH, if we've been told to do so. */
9877 if (flag_exceptions)
9878 using_eh_for_cleanups ();
9880 c_parser_translation_unit (the_parser);
9881 the_parser = NULL;
9884 #include "gt-c-parser.h"