2008-07-06 Kai Tietz <kai.tietz@onevision.com>
[official-gcc.git] / gcc / c-parser.c
blob45aff80d6c04929bbe88d7b542e45ee2987ce156
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
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"
44 #include "tree.h"
45 #include "rtl.h"
46 #include "langhooks.h"
47 #include "input.h"
48 #include "cpplib.h"
49 #include "timevar.h"
50 #include "c-pragma.h"
51 #include "c-tree.h"
52 #include "flags.h"
53 #include "output.h"
54 #include "toplev.h"
55 #include "ggc.h"
56 #include "c-common.h"
57 #include "vec.h"
58 #include "target.h"
59 #include "cgraph.h"
62 /* The reserved keyword table. */
63 struct resword
65 const char *word;
66 ENUM_BITFIELD(rid) rid : 16;
67 unsigned int disable : 16;
70 /* Disable mask. Keywords are disabled if (reswords[i].disable &
71 mask) is _true_. */
72 #define D_C89 0x01 /* not in C89 */
73 #define D_EXT 0x02 /* GCC extension */
74 #define D_EXT89 0x04 /* GCC extension incorporated in C99 */
75 #define D_OBJC 0x08 /* Objective C only */
77 static const struct resword reswords[] =
79 { "_Bool", RID_BOOL, 0 },
80 { "_Complex", RID_COMPLEX, 0 },
81 { "_Decimal32", RID_DFLOAT32, D_EXT },
82 { "_Decimal64", RID_DFLOAT64, D_EXT },
83 { "_Decimal128", RID_DFLOAT128, D_EXT },
84 { "_Fract", RID_FRACT, D_EXT },
85 { "_Accum", RID_ACCUM, D_EXT },
86 { "_Sat", RID_SAT, D_EXT },
87 { "__FUNCTION__", RID_FUNCTION_NAME, 0 },
88 { "__PRETTY_FUNCTION__", RID_PRETTY_FUNCTION_NAME, 0 },
89 { "__alignof", RID_ALIGNOF, 0 },
90 { "__alignof__", RID_ALIGNOF, 0 },
91 { "__asm", RID_ASM, 0 },
92 { "__asm__", RID_ASM, 0 },
93 { "__attribute", RID_ATTRIBUTE, 0 },
94 { "__attribute__", RID_ATTRIBUTE, 0 },
95 { "__builtin_choose_expr", RID_CHOOSE_EXPR, 0 },
96 { "__builtin_offsetof", RID_OFFSETOF, 0 },
97 { "__builtin_types_compatible_p", RID_TYPES_COMPATIBLE_P, 0 },
98 { "__builtin_va_arg", RID_VA_ARG, 0 },
99 { "__complex", RID_COMPLEX, 0 },
100 { "__complex__", RID_COMPLEX, 0 },
101 { "__const", RID_CONST, 0 },
102 { "__const__", RID_CONST, 0 },
103 { "__extension__", RID_EXTENSION, 0 },
104 { "__func__", RID_C99_FUNCTION_NAME, 0 },
105 { "__imag", RID_IMAGPART, 0 },
106 { "__imag__", RID_IMAGPART, 0 },
107 { "__inline", RID_INLINE, 0 },
108 { "__inline__", RID_INLINE, 0 },
109 { "__label__", RID_LABEL, 0 },
110 { "__real", RID_REALPART, 0 },
111 { "__real__", RID_REALPART, 0 },
112 { "__restrict", RID_RESTRICT, 0 },
113 { "__restrict__", RID_RESTRICT, 0 },
114 { "__signed", RID_SIGNED, 0 },
115 { "__signed__", RID_SIGNED, 0 },
116 { "__thread", RID_THREAD, 0 },
117 { "__typeof", RID_TYPEOF, 0 },
118 { "__typeof__", RID_TYPEOF, 0 },
119 { "__volatile", RID_VOLATILE, 0 },
120 { "__volatile__", RID_VOLATILE, 0 },
121 { "asm", RID_ASM, D_EXT },
122 { "auto", RID_AUTO, 0 },
123 { "break", RID_BREAK, 0 },
124 { "case", RID_CASE, 0 },
125 { "char", RID_CHAR, 0 },
126 { "const", RID_CONST, 0 },
127 { "continue", RID_CONTINUE, 0 },
128 { "default", RID_DEFAULT, 0 },
129 { "do", RID_DO, 0 },
130 { "double", RID_DOUBLE, 0 },
131 { "else", RID_ELSE, 0 },
132 { "enum", RID_ENUM, 0 },
133 { "extern", RID_EXTERN, 0 },
134 { "float", RID_FLOAT, 0 },
135 { "for", RID_FOR, 0 },
136 { "goto", RID_GOTO, 0 },
137 { "if", RID_IF, 0 },
138 { "inline", RID_INLINE, D_EXT89 },
139 { "int", RID_INT, 0 },
140 { "long", RID_LONG, 0 },
141 { "register", RID_REGISTER, 0 },
142 { "restrict", RID_RESTRICT, D_C89 },
143 { "return", RID_RETURN, 0 },
144 { "short", RID_SHORT, 0 },
145 { "signed", RID_SIGNED, 0 },
146 { "sizeof", RID_SIZEOF, 0 },
147 { "static", RID_STATIC, 0 },
148 { "struct", RID_STRUCT, 0 },
149 { "switch", RID_SWITCH, 0 },
150 { "typedef", RID_TYPEDEF, 0 },
151 { "typeof", RID_TYPEOF, D_EXT },
152 { "union", RID_UNION, 0 },
153 { "unsigned", RID_UNSIGNED, 0 },
154 { "void", RID_VOID, 0 },
155 { "volatile", RID_VOLATILE, 0 },
156 { "while", RID_WHILE, 0 },
157 /* These Objective-C keywords are recognized only immediately after
158 an '@'. */
159 { "class", RID_AT_CLASS, D_OBJC },
160 { "compatibility_alias", RID_AT_ALIAS, D_OBJC },
161 { "defs", RID_AT_DEFS, D_OBJC },
162 { "encode", RID_AT_ENCODE, D_OBJC },
163 { "end", RID_AT_END, D_OBJC },
164 { "implementation", RID_AT_IMPLEMENTATION, D_OBJC },
165 { "interface", RID_AT_INTERFACE, D_OBJC },
166 { "private", RID_AT_PRIVATE, D_OBJC },
167 { "protected", RID_AT_PROTECTED, D_OBJC },
168 { "protocol", RID_AT_PROTOCOL, D_OBJC },
169 { "public", RID_AT_PUBLIC, D_OBJC },
170 { "selector", RID_AT_SELECTOR, D_OBJC },
171 { "throw", RID_AT_THROW, D_OBJC },
172 { "try", RID_AT_TRY, D_OBJC },
173 { "catch", RID_AT_CATCH, D_OBJC },
174 { "finally", RID_AT_FINALLY, D_OBJC },
175 { "synchronized", RID_AT_SYNCHRONIZED, D_OBJC },
176 /* These are recognized only in protocol-qualifier context
177 (see above) */
178 { "bycopy", RID_BYCOPY, D_OBJC },
179 { "byref", RID_BYREF, D_OBJC },
180 { "in", RID_IN, D_OBJC },
181 { "inout", RID_INOUT, D_OBJC },
182 { "oneway", RID_ONEWAY, D_OBJC },
183 { "out", RID_OUT, D_OBJC },
185 #define N_reswords (sizeof reswords / sizeof (struct resword))
187 /* Initialization routine for this file. */
189 void
190 c_parse_init (void)
192 /* The only initialization required is of the reserved word
193 identifiers. */
194 unsigned int i;
195 tree id;
196 int mask = (flag_isoc99 ? 0 : D_C89)
197 | (flag_no_asm ? (flag_isoc99 ? D_EXT : D_EXT|D_EXT89) : 0);
199 if (!c_dialect_objc ())
200 mask |= D_OBJC;
202 ridpointers = GGC_CNEWVEC (tree, (int) RID_MAX);
203 for (i = 0; i < N_reswords; i++)
205 /* If a keyword is disabled, do not enter it into the table
206 and so create a canonical spelling that isn't a keyword. */
207 if (reswords[i].disable & mask)
208 continue;
210 id = get_identifier (reswords[i].word);
211 C_SET_RID_CODE (id, reswords[i].rid);
212 C_IS_RESERVED_WORD (id) = 1;
213 ridpointers [(int) reswords[i].rid] = id;
217 /* The C lexer intermediates between the lexer in cpplib and c-lex.c
218 and the C parser. Unlike the C++ lexer, the parser structure
219 stores the lexer information instead of using a separate structure.
220 Identifiers are separated into ordinary identifiers, type names,
221 keywords and some other Objective-C types of identifiers, and some
222 look-ahead is maintained.
224 ??? It might be a good idea to lex the whole file up front (as for
225 C++). It would then be possible to share more of the C and C++
226 lexer code, if desired. */
228 /* The following local token type is used. */
230 /* A keyword. */
231 #define CPP_KEYWORD ((enum cpp_ttype) (N_TTYPES + 1))
233 /* More information about the type of a CPP_NAME token. */
234 typedef enum c_id_kind {
235 /* An ordinary identifier. */
236 C_ID_ID,
237 /* An identifier declared as a typedef name. */
238 C_ID_TYPENAME,
239 /* An identifier declared as an Objective-C class name. */
240 C_ID_CLASSNAME,
241 /* Not an identifier. */
242 C_ID_NONE
243 } c_id_kind;
245 /* A single C token after string literal concatenation and conversion
246 of preprocessing tokens to tokens. */
247 typedef struct c_token GTY (())
249 /* The kind of token. */
250 ENUM_BITFIELD (cpp_ttype) type : 8;
251 /* If this token is a CPP_NAME, this value indicates whether also
252 declared as some kind of type. Otherwise, it is C_ID_NONE. */
253 ENUM_BITFIELD (c_id_kind) id_kind : 8;
254 /* If this token is a keyword, this value indicates which keyword.
255 Otherwise, this value is RID_MAX. */
256 ENUM_BITFIELD (rid) keyword : 8;
257 /* If this token is a CPP_PRAGMA, this indicates the pragma that
258 was seen. Otherwise it is PRAGMA_NONE. */
259 ENUM_BITFIELD (pragma_kind) pragma_kind : 7;
260 /* True if this token is from a system header. */
261 BOOL_BITFIELD in_system_header : 1;
262 /* The value associated with this token, if any. */
263 tree value;
264 /* The location at which this token was found. */
265 location_t location;
266 } c_token;
268 /* A parser structure recording information about the state and
269 context of parsing. Includes lexer information with up to two
270 tokens of look-ahead; more are not needed for C. */
271 typedef struct c_parser GTY(())
273 /* The look-ahead tokens. */
274 c_token tokens[2];
275 /* How many look-ahead tokens are available (0, 1 or 2). */
276 short tokens_avail;
277 /* True if a syntax error is being recovered from; false otherwise.
278 c_parser_error sets this flag. It should clear this flag when
279 enough tokens have been consumed to recover from the error. */
280 BOOL_BITFIELD error : 1;
281 /* True if we're processing a pragma, and shouldn't automatically
282 consume CPP_PRAGMA_EOL. */
283 BOOL_BITFIELD in_pragma : 1;
284 /* True if we're parsing the outermost block of an if statement. */
285 BOOL_BITFIELD in_if_block : 1;
286 /* True if we want to lex an untranslated string. */
287 BOOL_BITFIELD lex_untranslated_string : 1;
288 /* Objective-C specific parser/lexer information. */
289 BOOL_BITFIELD objc_pq_context : 1;
290 /* The following flag is needed to contextualize Objective-C lexical
291 analysis. In some cases (e.g., 'int NSObject;'), it is
292 undesirable to bind an identifier to an Objective-C class, even
293 if a class with that name exists. */
294 BOOL_BITFIELD objc_need_raw_identifier : 1;
295 } c_parser;
298 /* The actual parser and external interface. ??? Does this need to be
299 garbage-collected? */
301 static GTY (()) c_parser *the_parser;
304 /* Read in and lex a single token, storing it in *TOKEN. */
306 static void
307 c_lex_one_token (c_parser *parser, c_token *token)
309 timevar_push (TV_LEX);
311 token->type = c_lex_with_flags (&token->value, &token->location, NULL,
312 (parser->lex_untranslated_string
313 ? C_LEX_STRING_NO_TRANSLATE : 0));
314 token->id_kind = C_ID_NONE;
315 token->keyword = RID_MAX;
316 token->pragma_kind = PRAGMA_NONE;
317 token->in_system_header = in_system_header;
319 switch (token->type)
321 case CPP_NAME:
323 tree decl;
325 bool objc_force_identifier = parser->objc_need_raw_identifier;
326 if (c_dialect_objc ())
327 parser->objc_need_raw_identifier = false;
329 if (C_IS_RESERVED_WORD (token->value))
331 enum rid rid_code = C_RID_CODE (token->value);
333 if (c_dialect_objc ())
335 if (!OBJC_IS_AT_KEYWORD (rid_code)
336 && (!OBJC_IS_PQ_KEYWORD (rid_code)
337 || parser->objc_pq_context))
339 /* Return the canonical spelling for this keyword. */
340 token->value = ridpointers[(int) rid_code];
341 token->type = CPP_KEYWORD;
342 token->keyword = rid_code;
343 break;
346 else
348 /* Return the canonical spelling for this keyword. */
349 token->value = ridpointers[(int) rid_code];
350 token->type = CPP_KEYWORD;
351 token->keyword = rid_code;
352 break;
356 decl = lookup_name (token->value);
357 if (decl)
359 if (TREE_CODE (decl) == TYPE_DECL)
361 token->id_kind = C_ID_TYPENAME;
362 break;
365 else if (c_dialect_objc ())
367 tree objc_interface_decl = objc_is_class_name (token->value);
368 /* Objective-C class names are in the same namespace as
369 variables and typedefs, and hence are shadowed by local
370 declarations. */
371 if (objc_interface_decl
372 && (global_bindings_p ()
373 || (!objc_force_identifier && !decl)))
375 token->value = objc_interface_decl;
376 token->id_kind = C_ID_CLASSNAME;
377 break;
380 token->id_kind = C_ID_ID;
382 break;
383 case CPP_AT_NAME:
384 /* This only happens in Objective-C; it must be a keyword. */
385 token->type = CPP_KEYWORD;
386 token->keyword = C_RID_CODE (token->value);
387 break;
388 case CPP_COLON:
389 case CPP_COMMA:
390 case CPP_CLOSE_PAREN:
391 case CPP_SEMICOLON:
392 /* These tokens may affect the interpretation of any identifiers
393 following, if doing Objective-C. */
394 if (c_dialect_objc ())
395 parser->objc_need_raw_identifier = false;
396 break;
397 case CPP_PRAGMA:
398 /* We smuggled the cpp_token->u.pragma value in an INTEGER_CST. */
399 token->pragma_kind = (enum pragma_kind) TREE_INT_CST_LOW (token->value);
400 token->value = NULL;
401 break;
402 default:
403 break;
405 timevar_pop (TV_LEX);
408 /* Return a pointer to the next token from PARSER, reading it in if
409 necessary. */
411 static inline c_token *
412 c_parser_peek_token (c_parser *parser)
414 if (parser->tokens_avail == 0)
416 c_lex_one_token (parser, &parser->tokens[0]);
417 parser->tokens_avail = 1;
419 return &parser->tokens[0];
422 /* Return true if the next token from PARSER has the indicated
423 TYPE. */
425 static inline bool
426 c_parser_next_token_is (c_parser *parser, enum cpp_ttype type)
428 return c_parser_peek_token (parser)->type == type;
431 /* Return true if the next token from PARSER does not have the
432 indicated TYPE. */
434 static inline bool
435 c_parser_next_token_is_not (c_parser *parser, enum cpp_ttype type)
437 return !c_parser_next_token_is (parser, type);
440 /* Return true if the next token from PARSER is the indicated
441 KEYWORD. */
443 static inline bool
444 c_parser_next_token_is_keyword (c_parser *parser, enum rid keyword)
446 return c_parser_peek_token (parser)->keyword == keyword;
449 /* Return true if TOKEN can start a type name,
450 false otherwise. */
451 static bool
452 c_token_starts_typename (c_token *token)
454 switch (token->type)
456 case CPP_NAME:
457 switch (token->id_kind)
459 case C_ID_ID:
460 return false;
461 case C_ID_TYPENAME:
462 return true;
463 case C_ID_CLASSNAME:
464 gcc_assert (c_dialect_objc ());
465 return true;
466 default:
467 gcc_unreachable ();
469 case CPP_KEYWORD:
470 switch (token->keyword)
472 case RID_UNSIGNED:
473 case RID_LONG:
474 case RID_SHORT:
475 case RID_SIGNED:
476 case RID_COMPLEX:
477 case RID_INT:
478 case RID_CHAR:
479 case RID_FLOAT:
480 case RID_DOUBLE:
481 case RID_VOID:
482 case RID_DFLOAT32:
483 case RID_DFLOAT64:
484 case RID_DFLOAT128:
485 case RID_BOOL:
486 case RID_ENUM:
487 case RID_STRUCT:
488 case RID_UNION:
489 case RID_TYPEOF:
490 case RID_CONST:
491 case RID_VOLATILE:
492 case RID_RESTRICT:
493 case RID_ATTRIBUTE:
494 case RID_FRACT:
495 case RID_ACCUM:
496 case RID_SAT:
497 return true;
498 default:
499 return false;
501 case CPP_LESS:
502 if (c_dialect_objc ())
503 return true;
504 return false;
505 default:
506 return false;
510 /* Return true if the next token from PARSER can start a type name,
511 false otherwise. */
512 static inline bool
513 c_parser_next_token_starts_typename (c_parser *parser)
515 c_token *token = c_parser_peek_token (parser);
516 return c_token_starts_typename (token);
519 /* Return true if TOKEN can start declaration specifiers, false
520 otherwise. */
521 static bool
522 c_token_starts_declspecs (c_token *token)
524 switch (token->type)
526 case CPP_NAME:
527 switch (token->id_kind)
529 case C_ID_ID:
530 return false;
531 case C_ID_TYPENAME:
532 return true;
533 case C_ID_CLASSNAME:
534 gcc_assert (c_dialect_objc ());
535 return true;
536 default:
537 gcc_unreachable ();
539 case CPP_KEYWORD:
540 switch (token->keyword)
542 case RID_STATIC:
543 case RID_EXTERN:
544 case RID_REGISTER:
545 case RID_TYPEDEF:
546 case RID_INLINE:
547 case RID_AUTO:
548 case RID_THREAD:
549 case RID_UNSIGNED:
550 case RID_LONG:
551 case RID_SHORT:
552 case RID_SIGNED:
553 case RID_COMPLEX:
554 case RID_INT:
555 case RID_CHAR:
556 case RID_FLOAT:
557 case RID_DOUBLE:
558 case RID_VOID:
559 case RID_DFLOAT32:
560 case RID_DFLOAT64:
561 case RID_DFLOAT128:
562 case RID_BOOL:
563 case RID_ENUM:
564 case RID_STRUCT:
565 case RID_UNION:
566 case RID_TYPEOF:
567 case RID_CONST:
568 case RID_VOLATILE:
569 case RID_RESTRICT:
570 case RID_ATTRIBUTE:
571 case RID_FRACT:
572 case RID_ACCUM:
573 case RID_SAT:
574 return true;
575 default:
576 return false;
578 case CPP_LESS:
579 if (c_dialect_objc ())
580 return true;
581 return false;
582 default:
583 return false;
587 /* Return true if the next token from PARSER can start declaration
588 specifiers, false otherwise. */
589 static inline bool
590 c_parser_next_token_starts_declspecs (c_parser *parser)
592 c_token *token = c_parser_peek_token (parser);
593 return c_token_starts_declspecs (token);
596 /* Return a pointer to the next-but-one token from PARSER, reading it
597 in if necessary. The next token is already read in. */
599 static c_token *
600 c_parser_peek_2nd_token (c_parser *parser)
602 if (parser->tokens_avail >= 2)
603 return &parser->tokens[1];
604 gcc_assert (parser->tokens_avail == 1);
605 gcc_assert (parser->tokens[0].type != CPP_EOF);
606 gcc_assert (parser->tokens[0].type != CPP_PRAGMA_EOL);
607 c_lex_one_token (parser, &parser->tokens[1]);
608 parser->tokens_avail = 2;
609 return &parser->tokens[1];
612 /* Consume the next token from PARSER. */
614 static void
615 c_parser_consume_token (c_parser *parser)
617 gcc_assert (parser->tokens_avail >= 1);
618 gcc_assert (parser->tokens[0].type != CPP_EOF);
619 gcc_assert (!parser->in_pragma || parser->tokens[0].type != CPP_PRAGMA_EOL);
620 gcc_assert (parser->error || parser->tokens[0].type != CPP_PRAGMA);
621 if (parser->tokens_avail == 2)
622 parser->tokens[0] = parser->tokens[1];
623 parser->tokens_avail--;
626 /* Expect the current token to be a #pragma. Consume it and remember
627 that we've begun parsing a pragma. */
629 static void
630 c_parser_consume_pragma (c_parser *parser)
632 gcc_assert (!parser->in_pragma);
633 gcc_assert (parser->tokens_avail >= 1);
634 gcc_assert (parser->tokens[0].type == CPP_PRAGMA);
635 if (parser->tokens_avail == 2)
636 parser->tokens[0] = parser->tokens[1];
637 parser->tokens_avail--;
638 parser->in_pragma = true;
641 /* Update the globals input_location and in_system_header from
642 TOKEN. */
643 static inline void
644 c_parser_set_source_position_from_token (c_token *token)
646 if (token->type != CPP_EOF)
648 input_location = token->location;
649 in_system_header = token->in_system_header;
653 /* Issue a diagnostic of the form
654 FILE:LINE: MESSAGE before TOKEN
655 where TOKEN is the next token in the input stream of PARSER.
656 MESSAGE (specified by the caller) is usually of the form "expected
657 OTHER-TOKEN".
659 Do not issue a diagnostic if still recovering from an error.
661 ??? This is taken from the C++ parser, but building up messages in
662 this way is not i18n-friendly and some other approach should be
663 used. */
665 static void
666 c_parser_error (c_parser *parser, const char *gmsgid)
668 c_token *token = c_parser_peek_token (parser);
669 if (parser->error)
670 return;
671 parser->error = true;
672 if (!gmsgid)
673 return;
674 /* This diagnostic makes more sense if it is tagged to the line of
675 the token we just peeked at. */
676 c_parser_set_source_position_from_token (token);
677 c_parse_error (gmsgid,
678 /* Because c_parse_error does not understand
679 CPP_KEYWORD, keywords are treated like
680 identifiers. */
681 (token->type == CPP_KEYWORD ? CPP_NAME : token->type),
682 token->value);
685 /* If the next token is of the indicated TYPE, consume it. Otherwise,
686 issue the error MSGID. If MSGID is NULL then a message has already
687 been produced and no message will be produced this time. Returns
688 true if found, false otherwise. */
690 static bool
691 c_parser_require (c_parser *parser,
692 enum cpp_ttype type,
693 const char *msgid)
695 if (c_parser_next_token_is (parser, type))
697 c_parser_consume_token (parser);
698 return true;
700 else
702 c_parser_error (parser, msgid);
703 return false;
707 /* If the next token is the indicated keyword, consume it. Otherwise,
708 issue the error MSGID. Returns true if found, false otherwise. */
710 static bool
711 c_parser_require_keyword (c_parser *parser,
712 enum rid keyword,
713 const char *msgid)
715 if (c_parser_next_token_is_keyword (parser, keyword))
717 c_parser_consume_token (parser);
718 return true;
720 else
722 c_parser_error (parser, msgid);
723 return false;
727 /* Like c_parser_require, except that tokens will be skipped until the
728 desired token is found. An error message is still produced if the
729 next token is not as expected. If MSGID is NULL then a message has
730 already been produced and no message will be produced this
731 time. */
733 static void
734 c_parser_skip_until_found (c_parser *parser,
735 enum cpp_ttype type,
736 const char *msgid)
738 unsigned nesting_depth = 0;
740 if (c_parser_require (parser, type, msgid))
741 return;
743 /* Skip tokens until the desired token is found. */
744 while (true)
746 /* Peek at the next token. */
747 c_token *token = c_parser_peek_token (parser);
748 /* If we've reached the token we want, consume it and stop. */
749 if (token->type == type && !nesting_depth)
751 c_parser_consume_token (parser);
752 break;
755 /* If we've run out of tokens, stop. */
756 if (token->type == CPP_EOF)
757 return;
758 if (token->type == CPP_PRAGMA_EOL && parser->in_pragma)
759 return;
760 if (token->type == CPP_OPEN_BRACE
761 || token->type == CPP_OPEN_PAREN
762 || token->type == CPP_OPEN_SQUARE)
763 ++nesting_depth;
764 else if (token->type == CPP_CLOSE_BRACE
765 || token->type == CPP_CLOSE_PAREN
766 || token->type == CPP_CLOSE_SQUARE)
768 if (nesting_depth-- == 0)
769 break;
771 /* Consume this token. */
772 c_parser_consume_token (parser);
774 parser->error = false;
777 /* Skip tokens until the end of a parameter is found, but do not
778 consume the comma, semicolon or closing delimiter. */
780 static void
781 c_parser_skip_to_end_of_parameter (c_parser *parser)
783 unsigned nesting_depth = 0;
785 while (true)
787 c_token *token = c_parser_peek_token (parser);
788 if ((token->type == CPP_COMMA || token->type == CPP_SEMICOLON)
789 && !nesting_depth)
790 break;
791 /* If we've run out of tokens, stop. */
792 if (token->type == CPP_EOF)
793 return;
794 if (token->type == CPP_PRAGMA_EOL && parser->in_pragma)
795 return;
796 if (token->type == CPP_OPEN_BRACE
797 || token->type == CPP_OPEN_PAREN
798 || token->type == CPP_OPEN_SQUARE)
799 ++nesting_depth;
800 else if (token->type == CPP_CLOSE_BRACE
801 || token->type == CPP_CLOSE_PAREN
802 || token->type == CPP_CLOSE_SQUARE)
804 if (nesting_depth-- == 0)
805 break;
807 /* Consume this token. */
808 c_parser_consume_token (parser);
810 parser->error = false;
813 /* Expect to be at the end of the pragma directive and consume an
814 end of line marker. */
816 static void
817 c_parser_skip_to_pragma_eol (c_parser *parser)
819 gcc_assert (parser->in_pragma);
820 parser->in_pragma = false;
822 if (!c_parser_require (parser, CPP_PRAGMA_EOL, "expected end of line"))
823 while (true)
825 c_token *token = c_parser_peek_token (parser);
826 if (token->type == CPP_EOF)
827 break;
828 if (token->type == CPP_PRAGMA_EOL)
830 c_parser_consume_token (parser);
831 break;
833 c_parser_consume_token (parser);
836 parser->error = false;
839 /* Skip tokens until we have consumed an entire block, or until we
840 have consumed a non-nested ';'. */
842 static void
843 c_parser_skip_to_end_of_block_or_statement (c_parser *parser)
845 unsigned nesting_depth = 0;
846 bool save_error = parser->error;
848 while (true)
850 c_token *token;
852 /* Peek at the next token. */
853 token = c_parser_peek_token (parser);
855 switch (token->type)
857 case CPP_EOF:
858 return;
860 case CPP_PRAGMA_EOL:
861 if (parser->in_pragma)
862 return;
863 break;
865 case CPP_SEMICOLON:
866 /* If the next token is a ';', we have reached the
867 end of the statement. */
868 if (!nesting_depth)
870 /* Consume the ';'. */
871 c_parser_consume_token (parser);
872 goto finished;
874 break;
876 case CPP_CLOSE_BRACE:
877 /* If the next token is a non-nested '}', then we have
878 reached the end of the current block. */
879 if (nesting_depth == 0 || --nesting_depth == 0)
881 c_parser_consume_token (parser);
882 goto finished;
884 break;
886 case CPP_OPEN_BRACE:
887 /* If it the next token is a '{', then we are entering a new
888 block. Consume the entire block. */
889 ++nesting_depth;
890 break;
892 case CPP_PRAGMA:
893 /* If we see a pragma, consume the whole thing at once. We
894 have some safeguards against consuming pragmas willy-nilly.
895 Normally, we'd expect to be here with parser->error set,
896 which disables these safeguards. But it's possible to get
897 here for secondary error recovery, after parser->error has
898 been cleared. */
899 c_parser_consume_pragma (parser);
900 c_parser_skip_to_pragma_eol (parser);
901 parser->error = save_error;
902 continue;
904 default:
905 break;
908 c_parser_consume_token (parser);
911 finished:
912 parser->error = false;
915 /* Save the warning flags which are controlled by __extension__. */
917 static inline int
918 disable_extension_diagnostics (void)
920 int ret = (pedantic
921 | (warn_pointer_arith << 1)
922 | (warn_traditional << 2)
923 | (flag_iso << 3));
924 pedantic = 0;
925 warn_pointer_arith = 0;
926 warn_traditional = 0;
927 flag_iso = 0;
928 return ret;
931 /* Restore the warning flags which are controlled by __extension__.
932 FLAGS is the return value from disable_extension_diagnostics. */
934 static inline void
935 restore_extension_diagnostics (int flags)
937 pedantic = flags & 1;
938 warn_pointer_arith = (flags >> 1) & 1;
939 warn_traditional = (flags >> 2) & 1;
940 flag_iso = (flags >> 3) & 1;
943 /* Possibly kinds of declarator to parse. */
944 typedef enum c_dtr_syn {
945 /* A normal declarator with an identifier. */
946 C_DTR_NORMAL,
947 /* An abstract declarator (maybe empty). */
948 C_DTR_ABSTRACT,
949 /* A parameter declarator: may be either, but after a type name does
950 not redeclare a typedef name as an identifier if it can
951 alternatively be interpreted as a typedef name; see DR#009,
952 applied in C90 TC1, omitted from C99 and reapplied in C99 TC2
953 following DR#249. For example, given a typedef T, "int T" and
954 "int *T" are valid parameter declarations redeclaring T, while
955 "int (T)" and "int * (T)" and "int (T[])" and "int (T (int))" are
956 abstract declarators rather than involving redundant parentheses;
957 the same applies with attributes inside the parentheses before
958 "T". */
959 C_DTR_PARM
960 } c_dtr_syn;
962 static void c_parser_external_declaration (c_parser *);
963 static void c_parser_asm_definition (c_parser *);
964 static void c_parser_declaration_or_fndef (c_parser *, bool, bool, bool, bool);
965 static void c_parser_declspecs (c_parser *, struct c_declspecs *, bool, bool,
966 bool);
967 static struct c_typespec c_parser_enum_specifier (c_parser *);
968 static struct c_typespec c_parser_struct_or_union_specifier (c_parser *);
969 static tree c_parser_struct_declaration (c_parser *);
970 static struct c_typespec c_parser_typeof_specifier (c_parser *);
971 static struct c_declarator *c_parser_declarator (c_parser *, bool, c_dtr_syn,
972 bool *);
973 static struct c_declarator *c_parser_direct_declarator (c_parser *, bool,
974 c_dtr_syn, bool *);
975 static struct c_declarator *c_parser_direct_declarator_inner (c_parser *,
976 bool,
977 struct c_declarator *);
978 static struct c_arg_info *c_parser_parms_declarator (c_parser *, bool, tree);
979 static struct c_arg_info *c_parser_parms_list_declarator (c_parser *, tree);
980 static struct c_parm *c_parser_parameter_declaration (c_parser *, tree);
981 static tree c_parser_simple_asm_expr (c_parser *);
982 static tree c_parser_attributes (c_parser *);
983 static struct c_type_name *c_parser_type_name (c_parser *);
984 static struct c_expr c_parser_initializer (c_parser *);
985 static struct c_expr c_parser_braced_init (c_parser *, tree, bool);
986 static void c_parser_initelt (c_parser *);
987 static void c_parser_initval (c_parser *, struct c_expr *);
988 static tree c_parser_compound_statement (c_parser *);
989 static void c_parser_compound_statement_nostart (c_parser *);
990 static void c_parser_label (c_parser *);
991 static void c_parser_statement (c_parser *);
992 static void c_parser_statement_after_labels (c_parser *);
993 static void c_parser_if_statement (c_parser *);
994 static void c_parser_switch_statement (c_parser *);
995 static void c_parser_while_statement (c_parser *);
996 static void c_parser_do_statement (c_parser *);
997 static void c_parser_for_statement (c_parser *);
998 static tree c_parser_asm_statement (c_parser *);
999 static tree c_parser_asm_operands (c_parser *, bool);
1000 static tree c_parser_asm_clobbers (c_parser *);
1001 static struct c_expr c_parser_expr_no_commas (c_parser *, struct c_expr *);
1002 static struct c_expr c_parser_conditional_expression (c_parser *,
1003 struct c_expr *);
1004 static struct c_expr c_parser_binary_expression (c_parser *, struct c_expr *);
1005 static struct c_expr c_parser_cast_expression (c_parser *, struct c_expr *);
1006 static struct c_expr c_parser_unary_expression (c_parser *);
1007 static struct c_expr c_parser_sizeof_expression (c_parser *);
1008 static struct c_expr c_parser_alignof_expression (c_parser *);
1009 static struct c_expr c_parser_postfix_expression (c_parser *);
1010 static struct c_expr c_parser_postfix_expression_after_paren_type (c_parser *,
1011 struct c_type_name *);
1012 static struct c_expr c_parser_postfix_expression_after_primary (c_parser *,
1013 struct c_expr);
1014 static struct c_expr c_parser_expression (c_parser *);
1015 static struct c_expr c_parser_expression_conv (c_parser *);
1016 static tree c_parser_expr_list (c_parser *, bool);
1017 static void c_parser_omp_construct (c_parser *);
1018 static void c_parser_omp_threadprivate (c_parser *);
1019 static void c_parser_omp_barrier (c_parser *);
1020 static void c_parser_omp_flush (c_parser *);
1021 static void c_parser_omp_taskwait (c_parser *);
1023 enum pragma_context { pragma_external, pragma_stmt, pragma_compound };
1024 static bool c_parser_pragma (c_parser *, enum pragma_context);
1026 /* These Objective-C parser functions are only ever called when
1027 compiling Objective-C. */
1028 static void c_parser_objc_class_definition (c_parser *);
1029 static void c_parser_objc_class_instance_variables (c_parser *);
1030 static void c_parser_objc_class_declaration (c_parser *);
1031 static void c_parser_objc_alias_declaration (c_parser *);
1032 static void c_parser_objc_protocol_definition (c_parser *);
1033 static enum tree_code c_parser_objc_method_type (c_parser *);
1034 static void c_parser_objc_method_definition (c_parser *);
1035 static void c_parser_objc_methodprotolist (c_parser *);
1036 static void c_parser_objc_methodproto (c_parser *);
1037 static tree c_parser_objc_method_decl (c_parser *);
1038 static tree c_parser_objc_type_name (c_parser *);
1039 static tree c_parser_objc_protocol_refs (c_parser *);
1040 static void c_parser_objc_try_catch_statement (c_parser *);
1041 static void c_parser_objc_synchronized_statement (c_parser *);
1042 static tree c_parser_objc_selector (c_parser *);
1043 static tree c_parser_objc_selector_arg (c_parser *);
1044 static tree c_parser_objc_receiver (c_parser *);
1045 static tree c_parser_objc_message_args (c_parser *);
1046 static tree c_parser_objc_keywordexpr (c_parser *);
1048 /* Parse a translation unit (C90 6.7, C99 6.9).
1050 translation-unit:
1051 external-declarations
1053 external-declarations:
1054 external-declaration
1055 external-declarations external-declaration
1057 GNU extensions:
1059 translation-unit:
1060 empty
1063 static void
1064 c_parser_translation_unit (c_parser *parser)
1066 if (c_parser_next_token_is (parser, CPP_EOF))
1068 if (pedantic)
1069 pedwarn ("%HISO C forbids an empty translation unit",
1070 &c_parser_peek_token (parser)->location);
1072 else
1074 void *obstack_position = obstack_alloc (&parser_obstack, 0);
1077 ggc_collect ();
1078 c_parser_external_declaration (parser);
1079 obstack_free (&parser_obstack, obstack_position);
1081 while (c_parser_next_token_is_not (parser, CPP_EOF));
1085 /* Parse an external declaration (C90 6.7, C99 6.9).
1087 external-declaration:
1088 function-definition
1089 declaration
1091 GNU extensions:
1093 external-declaration:
1094 asm-definition
1096 __extension__ external-declaration
1098 Objective-C:
1100 external-declaration:
1101 objc-class-definition
1102 objc-class-declaration
1103 objc-alias-declaration
1104 objc-protocol-definition
1105 objc-method-definition
1106 @end
1109 static void
1110 c_parser_external_declaration (c_parser *parser)
1112 int ext;
1113 switch (c_parser_peek_token (parser)->type)
1115 case CPP_KEYWORD:
1116 switch (c_parser_peek_token (parser)->keyword)
1118 case RID_EXTENSION:
1119 ext = disable_extension_diagnostics ();
1120 c_parser_consume_token (parser);
1121 c_parser_external_declaration (parser);
1122 restore_extension_diagnostics (ext);
1123 break;
1124 case RID_ASM:
1125 c_parser_asm_definition (parser);
1126 break;
1127 case RID_AT_INTERFACE:
1128 case RID_AT_IMPLEMENTATION:
1129 gcc_assert (c_dialect_objc ());
1130 c_parser_objc_class_definition (parser);
1131 break;
1132 case RID_AT_CLASS:
1133 gcc_assert (c_dialect_objc ());
1134 c_parser_objc_class_declaration (parser);
1135 break;
1136 case RID_AT_ALIAS:
1137 gcc_assert (c_dialect_objc ());
1138 c_parser_objc_alias_declaration (parser);
1139 break;
1140 case RID_AT_PROTOCOL:
1141 gcc_assert (c_dialect_objc ());
1142 c_parser_objc_protocol_definition (parser);
1143 break;
1144 case RID_AT_END:
1145 gcc_assert (c_dialect_objc ());
1146 c_parser_consume_token (parser);
1147 objc_finish_implementation ();
1148 break;
1149 default:
1150 goto decl_or_fndef;
1152 break;
1153 case CPP_SEMICOLON:
1154 if (pedantic)
1155 pedwarn ("%HISO C does not allow extra %<;%> outside of a function",
1156 &c_parser_peek_token (parser)->location);
1157 c_parser_consume_token (parser);
1158 break;
1159 case CPP_PRAGMA:
1160 c_parser_pragma (parser, pragma_external);
1161 break;
1162 case CPP_PLUS:
1163 case CPP_MINUS:
1164 if (c_dialect_objc ())
1166 c_parser_objc_method_definition (parser);
1167 break;
1169 /* Else fall through, and yield a syntax error trying to parse
1170 as a declaration or function definition. */
1171 default:
1172 decl_or_fndef:
1173 /* A declaration or a function definition. We can only tell
1174 which after parsing the declaration specifiers, if any, and
1175 the first declarator. */
1176 c_parser_declaration_or_fndef (parser, true, true, false, true);
1177 break;
1182 /* Parse a declaration or function definition (C90 6.5, 6.7.1, C99
1183 6.7, 6.9.1). If FNDEF_OK is true, a function definition is
1184 accepted; otherwise (old-style parameter declarations) only other
1185 declarations are accepted. If NESTED is true, we are inside a
1186 function or parsing old-style parameter declarations; any functions
1187 encountered are nested functions and declaration specifiers are
1188 required; otherwise we are at top level and functions are normal
1189 functions and declaration specifiers may be optional. If EMPTY_OK
1190 is true, empty declarations are OK (subject to all other
1191 constraints); otherwise (old-style parameter declarations) they are
1192 diagnosed. If START_ATTR_OK is true, the declaration specifiers
1193 may start with attributes; otherwise they may not.
1195 declaration:
1196 declaration-specifiers init-declarator-list[opt] ;
1198 function-definition:
1199 declaration-specifiers[opt] declarator declaration-list[opt]
1200 compound-statement
1202 declaration-list:
1203 declaration
1204 declaration-list declaration
1206 init-declarator-list:
1207 init-declarator
1208 init-declarator-list , init-declarator
1210 init-declarator:
1211 declarator simple-asm-expr[opt] attributes[opt]
1212 declarator simple-asm-expr[opt] attributes[opt] = initializer
1214 GNU extensions:
1216 nested-function-definition:
1217 declaration-specifiers declarator declaration-list[opt]
1218 compound-statement
1220 The simple-asm-expr and attributes are GNU extensions.
1222 This function does not handle __extension__; that is handled in its
1223 callers. ??? Following the old parser, __extension__ may start
1224 external declarations, declarations in functions and declarations
1225 at the start of "for" loops, but not old-style parameter
1226 declarations.
1228 C99 requires declaration specifiers in a function definition; the
1229 absence is diagnosed through the diagnosis of implicit int. In GNU
1230 C we also allow but diagnose declarations without declaration
1231 specifiers, but only at top level (elsewhere they conflict with
1232 other syntax).
1234 OpenMP:
1236 declaration:
1237 threadprivate-directive */
1239 static void
1240 c_parser_declaration_or_fndef (c_parser *parser, bool fndef_ok, bool empty_ok,
1241 bool nested, bool start_attr_ok)
1243 struct c_declspecs *specs;
1244 tree prefix_attrs;
1245 tree all_prefix_attrs;
1246 bool diagnosed_no_specs = false;
1247 location_t here = c_parser_peek_token (parser)->location;
1249 specs = build_null_declspecs ();
1250 c_parser_declspecs (parser, specs, true, true, start_attr_ok);
1251 if (parser->error)
1253 c_parser_skip_to_end_of_block_or_statement (parser);
1254 return;
1256 if (nested && !specs->declspecs_seen_p)
1258 c_parser_error (parser, "expected declaration specifiers");
1259 c_parser_skip_to_end_of_block_or_statement (parser);
1260 return;
1262 finish_declspecs (specs);
1263 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
1265 if (empty_ok)
1266 shadow_tag (specs);
1267 else
1269 shadow_tag_warned (specs, 1);
1270 pedwarn ("%Hempty declaration", &here);
1272 c_parser_consume_token (parser);
1273 return;
1275 pending_xref_error ();
1276 prefix_attrs = specs->attrs;
1277 all_prefix_attrs = prefix_attrs;
1278 specs->attrs = NULL_TREE;
1279 while (true)
1281 struct c_declarator *declarator;
1282 bool dummy = false;
1283 tree fnbody;
1284 /* Declaring either one or more declarators (in which case we
1285 should diagnose if there were no declaration specifiers) or a
1286 function definition (in which case the diagnostic for
1287 implicit int suffices). */
1288 declarator = c_parser_declarator (parser, specs->type_seen_p,
1289 C_DTR_NORMAL, &dummy);
1290 if (declarator == NULL)
1292 c_parser_skip_to_end_of_block_or_statement (parser);
1293 return;
1295 if (c_parser_next_token_is (parser, CPP_EQ)
1296 || c_parser_next_token_is (parser, CPP_COMMA)
1297 || c_parser_next_token_is (parser, CPP_SEMICOLON)
1298 || c_parser_next_token_is_keyword (parser, RID_ASM)
1299 || c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
1301 tree asm_name = NULL_TREE;
1302 tree postfix_attrs = NULL_TREE;
1303 if (!diagnosed_no_specs && !specs->declspecs_seen_p)
1305 diagnosed_no_specs = true;
1306 pedwarn ("%Hdata definition has no type or storage class",
1307 &here);
1309 /* Having seen a data definition, there cannot now be a
1310 function definition. */
1311 fndef_ok = false;
1312 if (c_parser_next_token_is_keyword (parser, RID_ASM))
1313 asm_name = c_parser_simple_asm_expr (parser);
1314 if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
1315 postfix_attrs = c_parser_attributes (parser);
1316 if (c_parser_next_token_is (parser, CPP_EQ))
1318 tree d;
1319 struct c_expr init;
1320 c_parser_consume_token (parser);
1321 /* The declaration of the variable is in effect while
1322 its initializer is parsed. */
1323 d = start_decl (declarator, specs, true,
1324 chainon (postfix_attrs, all_prefix_attrs));
1325 if (!d)
1326 d = error_mark_node;
1327 start_init (d, asm_name, global_bindings_p ());
1328 init = c_parser_initializer (parser);
1329 finish_init ();
1330 if (d != error_mark_node)
1332 maybe_warn_string_init (TREE_TYPE (d), init);
1333 finish_decl (d, init.value, asm_name);
1336 else
1338 tree d = start_decl (declarator, specs, false,
1339 chainon (postfix_attrs,
1340 all_prefix_attrs));
1341 if (d)
1342 finish_decl (d, NULL_TREE, asm_name);
1344 if (c_parser_next_token_is (parser, CPP_COMMA))
1346 c_parser_consume_token (parser);
1347 if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
1348 all_prefix_attrs = chainon (c_parser_attributes (parser),
1349 prefix_attrs);
1350 else
1351 all_prefix_attrs = prefix_attrs;
1352 continue;
1354 else if (c_parser_next_token_is (parser, CPP_SEMICOLON))
1356 c_parser_consume_token (parser);
1357 return;
1359 else
1361 c_parser_error (parser, "expected %<,%> or %<;%>");
1362 c_parser_skip_to_end_of_block_or_statement (parser);
1363 return;
1366 else if (!fndef_ok)
1368 c_parser_error (parser, "expected %<=%>, %<,%>, %<;%>, "
1369 "%<asm%> or %<__attribute__%>");
1370 c_parser_skip_to_end_of_block_or_statement (parser);
1371 return;
1373 /* Function definition (nested or otherwise). */
1374 if (nested)
1376 if (pedantic)
1377 pedwarn ("%HISO C forbids nested functions", &here);
1378 c_push_function_context ();
1380 if (!start_function (specs, declarator, all_prefix_attrs))
1382 /* This can appear in many cases looking nothing like a
1383 function definition, so we don't give a more specific
1384 error suggesting there was one. */
1385 c_parser_error (parser, "expected %<=%>, %<,%>, %<;%>, %<asm%> "
1386 "or %<__attribute__%>");
1387 if (nested)
1388 c_pop_function_context ();
1389 break;
1391 /* Parse old-style parameter declarations. ??? Attributes are
1392 not allowed to start declaration specifiers here because of a
1393 syntax conflict between a function declaration with attribute
1394 suffix and a function definition with an attribute prefix on
1395 first old-style parameter declaration. Following the old
1396 parser, they are not accepted on subsequent old-style
1397 parameter declarations either. However, there is no
1398 ambiguity after the first declaration, nor indeed on the
1399 first as long as we don't allow postfix attributes after a
1400 declarator with a nonempty identifier list in a definition;
1401 and postfix attributes have never been accepted here in
1402 function definitions either. */
1403 while (c_parser_next_token_is_not (parser, CPP_EOF)
1404 && c_parser_next_token_is_not (parser, CPP_OPEN_BRACE))
1405 c_parser_declaration_or_fndef (parser, false, false, true, false);
1406 DECL_SOURCE_LOCATION (current_function_decl)
1407 = c_parser_peek_token (parser)->location;
1408 store_parm_decls ();
1409 fnbody = c_parser_compound_statement (parser);
1410 if (nested)
1412 tree decl = current_function_decl;
1413 add_stmt (fnbody);
1414 finish_function ();
1415 c_pop_function_context ();
1416 add_stmt (build_stmt (DECL_EXPR, decl));
1418 else
1420 add_stmt (fnbody);
1421 finish_function ();
1423 break;
1427 /* Parse an asm-definition (asm() outside a function body). This is a
1428 GNU extension.
1430 asm-definition:
1431 simple-asm-expr ;
1434 static void
1435 c_parser_asm_definition (c_parser *parser)
1437 tree asm_str = c_parser_simple_asm_expr (parser);
1438 if (asm_str)
1439 cgraph_add_asm_node (asm_str);
1440 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
1443 /* Parse some declaration specifiers (possibly none) (C90 6.5, C99
1444 6.7), adding them to SPECS (which may already include some).
1445 Storage class specifiers are accepted iff SCSPEC_OK; type
1446 specifiers are accepted iff TYPESPEC_OK; attributes are accepted at
1447 the start iff START_ATTR_OK.
1449 declaration-specifiers:
1450 storage-class-specifier declaration-specifiers[opt]
1451 type-specifier declaration-specifiers[opt]
1452 type-qualifier declaration-specifiers[opt]
1453 function-specifier declaration-specifiers[opt]
1455 Function specifiers (inline) are from C99, and are currently
1456 handled as storage class specifiers, as is __thread.
1458 C90 6.5.1, C99 6.7.1:
1459 storage-class-specifier:
1460 typedef
1461 extern
1462 static
1463 auto
1464 register
1466 C99 6.7.4:
1467 function-specifier:
1468 inline
1470 C90 6.5.2, C99 6.7.2:
1471 type-specifier:
1472 void
1473 char
1474 short
1476 long
1477 float
1478 double
1479 signed
1480 unsigned
1481 _Bool
1482 _Complex
1483 [_Imaginary removed in C99 TC2]
1484 struct-or-union-specifier
1485 enum-specifier
1486 typedef-name
1488 (_Bool and _Complex are new in C99.)
1490 C90 6.5.3, C99 6.7.3:
1492 type-qualifier:
1493 const
1494 restrict
1495 volatile
1497 (restrict is new in C99.)
1499 GNU extensions:
1501 declaration-specifiers:
1502 attributes declaration-specifiers[opt]
1504 storage-class-specifier:
1505 __thread
1507 type-specifier:
1508 typeof-specifier
1509 _Decimal32
1510 _Decimal64
1511 _Decimal128
1512 _Fract
1513 _Accum
1514 _Sat
1516 (_Fract, _Accum, and _Sat are new from ISO/IEC DTR 18037:
1517 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1169.pdf)
1519 Objective-C:
1521 type-specifier:
1522 class-name objc-protocol-refs[opt]
1523 typedef-name objc-protocol-refs
1524 objc-protocol-refs
1527 static void
1528 c_parser_declspecs (c_parser *parser, struct c_declspecs *specs,
1529 bool scspec_ok, bool typespec_ok, bool start_attr_ok)
1531 bool attrs_ok = start_attr_ok;
1532 bool seen_type = specs->type_seen_p;
1533 while (c_parser_next_token_is (parser, CPP_NAME)
1534 || c_parser_next_token_is (parser, CPP_KEYWORD)
1535 || (c_dialect_objc () && c_parser_next_token_is (parser, CPP_LESS)))
1537 struct c_typespec t;
1538 tree attrs;
1539 if (c_parser_next_token_is (parser, CPP_NAME))
1541 tree value = c_parser_peek_token (parser)->value;
1542 c_id_kind kind = c_parser_peek_token (parser)->id_kind;
1543 /* This finishes the specifiers unless a type name is OK, it
1544 is declared as a type name and a type name hasn't yet
1545 been seen. */
1546 if (!typespec_ok || seen_type
1547 || (kind != C_ID_TYPENAME && kind != C_ID_CLASSNAME))
1548 break;
1549 c_parser_consume_token (parser);
1550 seen_type = true;
1551 attrs_ok = true;
1552 if (kind == C_ID_TYPENAME
1553 && (!c_dialect_objc ()
1554 || c_parser_next_token_is_not (parser, CPP_LESS)))
1556 t.kind = ctsk_typedef;
1557 /* For a typedef name, record the meaning, not the name.
1558 In case of 'foo foo, bar;'. */
1559 t.spec = lookup_name (value);
1561 else
1563 tree proto = NULL_TREE;
1564 gcc_assert (c_dialect_objc ());
1565 t.kind = ctsk_objc;
1566 if (c_parser_next_token_is (parser, CPP_LESS))
1567 proto = c_parser_objc_protocol_refs (parser);
1568 t.spec = objc_get_protocol_qualified_type (value, proto);
1570 declspecs_add_type (specs, t);
1571 continue;
1573 if (c_parser_next_token_is (parser, CPP_LESS))
1575 /* Make "<SomeProtocol>" equivalent to "id <SomeProtocol>" -
1576 nisse@lysator.liu.se. */
1577 tree proto;
1578 gcc_assert (c_dialect_objc ());
1579 if (!typespec_ok || seen_type)
1580 break;
1581 proto = c_parser_objc_protocol_refs (parser);
1582 t.kind = ctsk_objc;
1583 t.spec = objc_get_protocol_qualified_type (NULL_TREE, proto);
1584 declspecs_add_type (specs, t);
1585 continue;
1587 gcc_assert (c_parser_next_token_is (parser, CPP_KEYWORD));
1588 switch (c_parser_peek_token (parser)->keyword)
1590 case RID_STATIC:
1591 case RID_EXTERN:
1592 case RID_REGISTER:
1593 case RID_TYPEDEF:
1594 case RID_INLINE:
1595 case RID_AUTO:
1596 case RID_THREAD:
1597 if (!scspec_ok)
1598 goto out;
1599 attrs_ok = true;
1600 /* TODO: Distinguish between function specifiers (inline)
1601 and storage class specifiers, either here or in
1602 declspecs_add_scspec. */
1603 declspecs_add_scspec (specs, c_parser_peek_token (parser)->value);
1604 c_parser_consume_token (parser);
1605 break;
1606 case RID_UNSIGNED:
1607 case RID_LONG:
1608 case RID_SHORT:
1609 case RID_SIGNED:
1610 case RID_COMPLEX:
1611 case RID_INT:
1612 case RID_CHAR:
1613 case RID_FLOAT:
1614 case RID_DOUBLE:
1615 case RID_VOID:
1616 case RID_DFLOAT32:
1617 case RID_DFLOAT64:
1618 case RID_DFLOAT128:
1619 case RID_BOOL:
1620 case RID_FRACT:
1621 case RID_ACCUM:
1622 case RID_SAT:
1623 if (!typespec_ok)
1624 goto out;
1625 attrs_ok = true;
1626 seen_type = true;
1627 if (c_dialect_objc ())
1628 parser->objc_need_raw_identifier = true;
1629 t.kind = ctsk_resword;
1630 t.spec = c_parser_peek_token (parser)->value;
1631 declspecs_add_type (specs, t);
1632 c_parser_consume_token (parser);
1633 break;
1634 case RID_ENUM:
1635 if (!typespec_ok)
1636 goto out;
1637 attrs_ok = true;
1638 seen_type = true;
1639 t = c_parser_enum_specifier (parser);
1640 declspecs_add_type (specs, t);
1641 break;
1642 case RID_STRUCT:
1643 case RID_UNION:
1644 if (!typespec_ok)
1645 goto out;
1646 attrs_ok = true;
1647 seen_type = true;
1648 t = c_parser_struct_or_union_specifier (parser);
1649 declspecs_add_type (specs, t);
1650 break;
1651 case RID_TYPEOF:
1652 /* ??? The old parser rejected typeof after other type
1653 specifiers, but is a syntax error the best way of
1654 handling this? */
1655 if (!typespec_ok || seen_type)
1656 goto out;
1657 attrs_ok = true;
1658 seen_type = true;
1659 t = c_parser_typeof_specifier (parser);
1660 declspecs_add_type (specs, t);
1661 break;
1662 case RID_CONST:
1663 case RID_VOLATILE:
1664 case RID_RESTRICT:
1665 attrs_ok = true;
1666 declspecs_add_qual (specs, c_parser_peek_token (parser)->value);
1667 c_parser_consume_token (parser);
1668 break;
1669 case RID_ATTRIBUTE:
1670 if (!attrs_ok)
1671 goto out;
1672 attrs = c_parser_attributes (parser);
1673 declspecs_add_attrs (specs, attrs);
1674 break;
1675 default:
1676 goto out;
1679 out: ;
1682 /* Parse an enum specifier (C90 6.5.2.2, C99 6.7.2.2).
1684 enum-specifier:
1685 enum attributes[opt] identifier[opt] { enumerator-list } attributes[opt]
1686 enum attributes[opt] identifier[opt] { enumerator-list , } attributes[opt]
1687 enum attributes[opt] identifier
1689 The form with trailing comma is new in C99. The forms with
1690 attributes are GNU extensions. In GNU C, we accept any expression
1691 without commas in the syntax (assignment expressions, not just
1692 conditional expressions); assignment expressions will be diagnosed
1693 as non-constant.
1695 enumerator-list:
1696 enumerator
1697 enumerator-list , enumerator
1699 enumerator:
1700 enumeration-constant
1701 enumeration-constant = constant-expression
1704 static struct c_typespec
1705 c_parser_enum_specifier (c_parser *parser)
1707 struct c_typespec ret;
1708 tree attrs;
1709 tree ident = NULL_TREE;
1710 location_t ident_loc;
1711 gcc_assert (c_parser_next_token_is_keyword (parser, RID_ENUM));
1712 c_parser_consume_token (parser);
1713 attrs = c_parser_attributes (parser);
1714 /* Set the location in case we create a decl now. */
1715 c_parser_set_source_position_from_token (c_parser_peek_token (parser));
1716 if (c_parser_next_token_is (parser, CPP_NAME))
1718 ident = c_parser_peek_token (parser)->value;
1719 ident_loc = c_parser_peek_token (parser)->location;
1720 c_parser_consume_token (parser);
1722 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
1724 /* Parse an enum definition. */
1725 struct c_enum_contents the_enum;
1726 tree type = start_enum (&the_enum, ident);
1727 tree postfix_attrs;
1728 /* We chain the enumerators in reverse order, then put them in
1729 forward order at the end. */
1730 tree values = NULL_TREE;
1731 c_parser_consume_token (parser);
1732 while (true)
1734 tree enum_id;
1735 tree enum_value;
1736 tree enum_decl;
1737 bool seen_comma;
1738 c_token *token;
1739 location_t comma_loc;
1740 if (c_parser_next_token_is_not (parser, CPP_NAME))
1742 c_parser_error (parser, "expected identifier");
1743 c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL);
1744 values = error_mark_node;
1745 break;
1747 token = c_parser_peek_token (parser);
1748 enum_id = token->value;
1749 /* Set the location in case we create a decl now. */
1750 c_parser_set_source_position_from_token (token);
1751 c_parser_consume_token (parser);
1752 if (c_parser_next_token_is (parser, CPP_EQ))
1754 c_parser_consume_token (parser);
1755 enum_value = c_parser_expr_no_commas (parser, NULL).value;
1757 else
1758 enum_value = NULL_TREE;
1759 enum_decl = build_enumerator (&the_enum, enum_id, enum_value);
1760 TREE_CHAIN (enum_decl) = values;
1761 values = enum_decl;
1762 seen_comma = false;
1763 if (c_parser_next_token_is (parser, CPP_COMMA))
1765 comma_loc = c_parser_peek_token (parser)->location;
1766 seen_comma = true;
1767 c_parser_consume_token (parser);
1769 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
1771 if (seen_comma && pedantic && !flag_isoc99)
1772 pedwarn ("%Hcomma at end of enumerator list", &comma_loc);
1773 c_parser_consume_token (parser);
1774 break;
1776 if (!seen_comma)
1778 c_parser_error (parser, "expected %<,%> or %<}%>");
1779 c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL);
1780 values = error_mark_node;
1781 break;
1784 postfix_attrs = c_parser_attributes (parser);
1785 ret.spec = finish_enum (type, nreverse (values),
1786 chainon (attrs, postfix_attrs));
1787 ret.kind = ctsk_tagdef;
1788 return ret;
1790 else if (!ident)
1792 c_parser_error (parser, "expected %<{%>");
1793 ret.spec = error_mark_node;
1794 ret.kind = ctsk_tagref;
1795 return ret;
1797 ret = parser_xref_tag (ENUMERAL_TYPE, ident);
1798 /* In ISO C, enumerated types can be referred to only if already
1799 defined. */
1800 if (pedantic && !COMPLETE_TYPE_P (ret.spec))
1802 gcc_assert (ident);
1803 pedwarn ("%HISO C forbids forward references to %<enum%> types",
1804 &ident_loc);
1806 return ret;
1809 /* Parse a struct or union specifier (C90 6.5.2.1, C99 6.7.2.1).
1811 struct-or-union-specifier:
1812 struct-or-union attributes[opt] identifier[opt]
1813 { struct-contents } attributes[opt]
1814 struct-or-union attributes[opt] identifier
1816 struct-contents:
1817 struct-declaration-list
1819 struct-declaration-list:
1820 struct-declaration ;
1821 struct-declaration-list struct-declaration ;
1823 GNU extensions:
1825 struct-contents:
1826 empty
1827 struct-declaration
1828 struct-declaration-list struct-declaration
1830 struct-declaration-list:
1831 struct-declaration-list ;
1834 (Note that in the syntax here, unlike that in ISO C, the semicolons
1835 are included here rather than in struct-declaration, in order to
1836 describe the syntax with extra semicolons and missing semicolon at
1837 end.)
1839 Objective-C:
1841 struct-declaration-list:
1842 @defs ( class-name )
1844 (Note this does not include a trailing semicolon, but can be
1845 followed by further declarations, and gets a pedwarn-if-pedantic
1846 when followed by a semicolon.) */
1848 static struct c_typespec
1849 c_parser_struct_or_union_specifier (c_parser *parser)
1851 struct c_typespec ret;
1852 tree attrs;
1853 tree ident = NULL_TREE;
1854 enum tree_code code;
1855 switch (c_parser_peek_token (parser)->keyword)
1857 case RID_STRUCT:
1858 code = RECORD_TYPE;
1859 break;
1860 case RID_UNION:
1861 code = UNION_TYPE;
1862 break;
1863 default:
1864 gcc_unreachable ();
1866 c_parser_consume_token (parser);
1867 attrs = c_parser_attributes (parser);
1868 /* Set the location in case we create a decl now. */
1869 c_parser_set_source_position_from_token (c_parser_peek_token (parser));
1870 if (c_parser_next_token_is (parser, CPP_NAME))
1872 ident = c_parser_peek_token (parser)->value;
1873 c_parser_consume_token (parser);
1875 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
1877 /* Parse a struct or union definition. Start the scope of the
1878 tag before parsing components. */
1879 tree type = start_struct (code, ident);
1880 tree postfix_attrs;
1881 /* We chain the components in reverse order, then put them in
1882 forward order at the end. Each struct-declaration may
1883 declare multiple components (comma-separated), so we must use
1884 chainon to join them, although when parsing each
1885 struct-declaration we can use TREE_CHAIN directly.
1887 The theory behind all this is that there will be more
1888 semicolon separated fields than comma separated fields, and
1889 so we'll be minimizing the number of node traversals required
1890 by chainon. */
1891 tree contents = NULL_TREE;
1892 c_parser_consume_token (parser);
1893 /* Handle the Objective-C @defs construct,
1894 e.g. foo(sizeof(struct{ @defs(ClassName) }));. */
1895 if (c_parser_next_token_is_keyword (parser, RID_AT_DEFS))
1897 tree name;
1898 gcc_assert (c_dialect_objc ());
1899 c_parser_consume_token (parser);
1900 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
1901 goto end_at_defs;
1902 if (c_parser_next_token_is (parser, CPP_NAME)
1903 && c_parser_peek_token (parser)->id_kind == C_ID_CLASSNAME)
1905 name = c_parser_peek_token (parser)->value;
1906 c_parser_consume_token (parser);
1908 else
1910 c_parser_error (parser, "expected class name");
1911 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
1912 goto end_at_defs;
1914 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
1915 "expected %<)%>");
1916 contents = nreverse (objc_get_class_ivars (name));
1918 end_at_defs:
1919 /* Parse the struct-declarations and semicolons. Problems with
1920 semicolons are diagnosed here; empty structures are diagnosed
1921 elsewhere. */
1922 while (true)
1924 tree decls;
1925 /* Parse any stray semicolon. */
1926 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
1928 if (pedantic)
1929 pedwarn ("%Hextra semicolon in struct or union specified",
1930 &c_parser_peek_token (parser)->location);
1931 c_parser_consume_token (parser);
1932 continue;
1934 /* Stop if at the end of the struct or union contents. */
1935 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
1937 c_parser_consume_token (parser);
1938 break;
1940 /* Accept #pragmas at struct scope. */
1941 if (c_parser_next_token_is (parser, CPP_PRAGMA))
1943 c_parser_pragma (parser, pragma_external);
1944 continue;
1946 /* Parse some comma-separated declarations, but not the
1947 trailing semicolon if any. */
1948 decls = c_parser_struct_declaration (parser);
1949 contents = chainon (decls, contents);
1950 /* If no semicolon follows, either we have a parse error or
1951 are at the end of the struct or union and should
1952 pedwarn. */
1953 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
1954 c_parser_consume_token (parser);
1955 else
1957 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
1958 pedwarn ("%Hno semicolon at end of struct or union",
1959 &c_parser_peek_token (parser)->location);
1960 else
1962 c_parser_error (parser, "expected %<;%>");
1963 c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL);
1964 break;
1968 postfix_attrs = c_parser_attributes (parser);
1969 ret.spec = finish_struct (type, nreverse (contents),
1970 chainon (attrs, postfix_attrs));
1971 ret.kind = ctsk_tagdef;
1972 return ret;
1974 else if (!ident)
1976 c_parser_error (parser, "expected %<{%>");
1977 ret.spec = error_mark_node;
1978 ret.kind = ctsk_tagref;
1979 return ret;
1981 ret = parser_xref_tag (code, ident);
1982 return ret;
1985 /* Parse a struct-declaration (C90 6.5.2.1, C99 6.7.2.1), *without*
1986 the trailing semicolon.
1988 struct-declaration:
1989 specifier-qualifier-list struct-declarator-list
1991 specifier-qualifier-list:
1992 type-specifier specifier-qualifier-list[opt]
1993 type-qualifier specifier-qualifier-list[opt]
1994 attributes specifier-qualifier-list[opt]
1996 struct-declarator-list:
1997 struct-declarator
1998 struct-declarator-list , attributes[opt] struct-declarator
2000 struct-declarator:
2001 declarator attributes[opt]
2002 declarator[opt] : constant-expression attributes[opt]
2004 GNU extensions:
2006 struct-declaration:
2007 __extension__ struct-declaration
2008 specifier-qualifier-list
2010 Unlike the ISO C syntax, semicolons are handled elsewhere. The use
2011 of attributes where shown is a GNU extension. In GNU C, we accept
2012 any expression without commas in the syntax (assignment
2013 expressions, not just conditional expressions); assignment
2014 expressions will be diagnosed as non-constant. */
2016 static tree
2017 c_parser_struct_declaration (c_parser *parser)
2019 struct c_declspecs *specs;
2020 tree prefix_attrs;
2021 tree all_prefix_attrs;
2022 tree decls;
2023 location_t decl_loc;
2024 if (c_parser_next_token_is_keyword (parser, RID_EXTENSION))
2026 int ext;
2027 tree decl;
2028 ext = disable_extension_diagnostics ();
2029 c_parser_consume_token (parser);
2030 decl = c_parser_struct_declaration (parser);
2031 restore_extension_diagnostics (ext);
2032 return decl;
2034 specs = build_null_declspecs ();
2035 decl_loc = c_parser_peek_token (parser)->location;
2036 c_parser_declspecs (parser, specs, false, true, true);
2037 if (parser->error)
2038 return NULL_TREE;
2039 if (!specs->declspecs_seen_p)
2041 c_parser_error (parser, "expected specifier-qualifier-list");
2042 return NULL_TREE;
2044 finish_declspecs (specs);
2045 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
2047 tree ret;
2048 if (!specs->type_seen_p)
2050 if (pedantic)
2051 pedwarn ("%HISO C forbids member declarations with no members",
2052 &decl_loc);
2053 shadow_tag_warned (specs, pedantic);
2054 ret = NULL_TREE;
2056 else
2058 /* Support for unnamed structs or unions as members of
2059 structs or unions (which is [a] useful and [b] supports
2060 MS P-SDK). */
2061 tree attrs = NULL;
2062 ret = grokfield (build_id_declarator (NULL_TREE), specs,
2063 NULL_TREE, &attrs);
2064 if (ret)
2065 decl_attributes (&ret, attrs, 0);
2067 return ret;
2069 pending_xref_error ();
2070 prefix_attrs = specs->attrs;
2071 all_prefix_attrs = prefix_attrs;
2072 specs->attrs = NULL_TREE;
2073 decls = NULL_TREE;
2074 while (true)
2076 /* Declaring one or more declarators or un-named bit-fields. */
2077 struct c_declarator *declarator;
2078 bool dummy = false;
2079 if (c_parser_next_token_is (parser, CPP_COLON))
2080 declarator = build_id_declarator (NULL_TREE);
2081 else
2082 declarator = c_parser_declarator (parser, specs->type_seen_p,
2083 C_DTR_NORMAL, &dummy);
2084 if (declarator == NULL)
2086 c_parser_skip_to_end_of_block_or_statement (parser);
2087 break;
2089 if (c_parser_next_token_is (parser, CPP_COLON)
2090 || c_parser_next_token_is (parser, CPP_COMMA)
2091 || c_parser_next_token_is (parser, CPP_SEMICOLON)
2092 || c_parser_next_token_is (parser, CPP_CLOSE_BRACE)
2093 || c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
2095 tree postfix_attrs = NULL_TREE;
2096 tree width = NULL_TREE;
2097 tree d;
2098 if (c_parser_next_token_is (parser, CPP_COLON))
2100 c_parser_consume_token (parser);
2101 width = c_parser_expr_no_commas (parser, NULL).value;
2103 if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
2104 postfix_attrs = c_parser_attributes (parser);
2105 d = grokfield (declarator, specs, width, &all_prefix_attrs);
2106 decl_attributes (&d, chainon (postfix_attrs,
2107 all_prefix_attrs), 0);
2108 TREE_CHAIN (d) = decls;
2109 decls = d;
2110 if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
2111 all_prefix_attrs = chainon (c_parser_attributes (parser),
2112 prefix_attrs);
2113 else
2114 all_prefix_attrs = prefix_attrs;
2115 if (c_parser_next_token_is (parser, CPP_COMMA))
2116 c_parser_consume_token (parser);
2117 else if (c_parser_next_token_is (parser, CPP_SEMICOLON)
2118 || c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
2120 /* Semicolon consumed in caller. */
2121 break;
2123 else
2125 c_parser_error (parser, "expected %<,%>, %<;%> or %<}%>");
2126 break;
2129 else
2131 c_parser_error (parser,
2132 "expected %<:%>, %<,%>, %<;%>, %<}%> or "
2133 "%<__attribute__%>");
2134 break;
2137 return decls;
2140 /* Parse a typeof specifier (a GNU extension).
2142 typeof-specifier:
2143 typeof ( expression )
2144 typeof ( type-name )
2147 static struct c_typespec
2148 c_parser_typeof_specifier (c_parser *parser)
2150 struct c_typespec ret;
2151 ret.kind = ctsk_typeof;
2152 ret.spec = error_mark_node;
2153 gcc_assert (c_parser_next_token_is_keyword (parser, RID_TYPEOF));
2154 c_parser_consume_token (parser);
2155 skip_evaluation++;
2156 in_typeof++;
2157 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
2159 skip_evaluation--;
2160 in_typeof--;
2161 return ret;
2163 if (c_parser_next_token_starts_typename (parser))
2165 struct c_type_name *type = c_parser_type_name (parser);
2166 skip_evaluation--;
2167 in_typeof--;
2168 if (type != NULL)
2170 ret.spec = groktypename (type);
2171 pop_maybe_used (variably_modified_type_p (ret.spec, NULL_TREE));
2174 else
2176 bool was_vm;
2177 location_t here = c_parser_peek_token (parser)->location;
2178 struct c_expr expr = c_parser_expression (parser);
2179 skip_evaluation--;
2180 in_typeof--;
2181 if (TREE_CODE (expr.value) == COMPONENT_REF
2182 && DECL_C_BIT_FIELD (TREE_OPERAND (expr.value, 1)))
2183 error ("%H%<typeof%> applied to a bit-field", &here);
2184 ret.spec = TREE_TYPE (expr.value);
2185 was_vm = variably_modified_type_p (ret.spec, NULL_TREE);
2186 /* This should be returned with the type so that when the type
2187 is evaluated, this can be evaluated. For now, we avoid
2188 evaluation when the context might. */
2189 if (!skip_evaluation && was_vm)
2191 tree e = expr.value;
2193 /* If the expression is not of a type to which we cannot assign a line
2194 number, wrap the thing in a no-op NOP_EXPR. */
2195 if (DECL_P (e) || CONSTANT_CLASS_P (e))
2196 e = build1 (NOP_EXPR, void_type_node, e);
2198 if (CAN_HAVE_LOCATION_P (e))
2199 SET_EXPR_LOCATION (e, input_location);
2201 add_stmt (e);
2203 pop_maybe_used (was_vm);
2205 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
2206 return ret;
2209 /* Parse a declarator, possibly an abstract declarator (C90 6.5.4,
2210 6.5.5, C99 6.7.5, 6.7.6). If TYPE_SEEN_P then a typedef name may
2211 be redeclared; otherwise it may not. KIND indicates which kind of
2212 declarator is wanted. Returns a valid declarator except in the
2213 case of a syntax error in which case NULL is returned. *SEEN_ID is
2214 set to true if an identifier being declared is seen; this is used
2215 to diagnose bad forms of abstract array declarators and to
2216 determine whether an identifier list is syntactically permitted.
2218 declarator:
2219 pointer[opt] direct-declarator
2221 direct-declarator:
2222 identifier
2223 ( attributes[opt] declarator )
2224 direct-declarator array-declarator
2225 direct-declarator ( parameter-type-list )
2226 direct-declarator ( identifier-list[opt] )
2228 pointer:
2229 * type-qualifier-list[opt]
2230 * type-qualifier-list[opt] pointer
2232 type-qualifier-list:
2233 type-qualifier
2234 attributes
2235 type-qualifier-list type-qualifier
2236 type-qualifier-list attributes
2238 parameter-type-list:
2239 parameter-list
2240 parameter-list , ...
2242 parameter-list:
2243 parameter-declaration
2244 parameter-list , parameter-declaration
2246 parameter-declaration:
2247 declaration-specifiers declarator attributes[opt]
2248 declaration-specifiers abstract-declarator[opt] attributes[opt]
2250 identifier-list:
2251 identifier
2252 identifier-list , identifier
2254 abstract-declarator:
2255 pointer
2256 pointer[opt] direct-abstract-declarator
2258 direct-abstract-declarator:
2259 ( attributes[opt] abstract-declarator )
2260 direct-abstract-declarator[opt] array-declarator
2261 direct-abstract-declarator[opt] ( parameter-type-list[opt] )
2263 GNU extensions:
2265 direct-declarator:
2266 direct-declarator ( parameter-forward-declarations
2267 parameter-type-list[opt] )
2269 direct-abstract-declarator:
2270 direct-abstract-declarator[opt] ( parameter-forward-declarations
2271 parameter-type-list[opt] )
2273 parameter-forward-declarations:
2274 parameter-list ;
2275 parameter-forward-declarations parameter-list ;
2277 The uses of attributes shown above are GNU extensions.
2279 Some forms of array declarator are not included in C99 in the
2280 syntax for abstract declarators; these are disallowed elsewhere.
2281 This may be a defect (DR#289).
2283 This function also accepts an omitted abstract declarator as being
2284 an abstract declarator, although not part of the formal syntax. */
2286 static struct c_declarator *
2287 c_parser_declarator (c_parser *parser, bool type_seen_p, c_dtr_syn kind,
2288 bool *seen_id)
2290 /* Parse any initial pointer part. */
2291 if (c_parser_next_token_is (parser, CPP_MULT))
2293 struct c_declspecs *quals_attrs = build_null_declspecs ();
2294 struct c_declarator *inner;
2295 c_parser_consume_token (parser);
2296 c_parser_declspecs (parser, quals_attrs, false, false, true);
2297 inner = c_parser_declarator (parser, type_seen_p, kind, seen_id);
2298 if (inner == NULL)
2299 return NULL;
2300 else
2301 return make_pointer_declarator (quals_attrs, inner);
2303 /* Now we have a direct declarator, direct abstract declarator or
2304 nothing (which counts as a direct abstract declarator here). */
2305 return c_parser_direct_declarator (parser, type_seen_p, kind, seen_id);
2308 /* Parse a direct declarator or direct abstract declarator; arguments
2309 as c_parser_declarator. */
2311 static struct c_declarator *
2312 c_parser_direct_declarator (c_parser *parser, bool type_seen_p, c_dtr_syn kind,
2313 bool *seen_id)
2315 /* The direct declarator must start with an identifier (possibly
2316 omitted) or a parenthesized declarator (possibly abstract). In
2317 an ordinary declarator, initial parentheses must start a
2318 parenthesized declarator. In an abstract declarator or parameter
2319 declarator, they could start a parenthesized declarator or a
2320 parameter list. To tell which, the open parenthesis and any
2321 following attributes must be read. If a declaration specifier
2322 follows, then it is a parameter list; if the specifier is a
2323 typedef name, there might be an ambiguity about redeclaring it,
2324 which is resolved in the direction of treating it as a typedef
2325 name. If a close parenthesis follows, it is also an empty
2326 parameter list, as the syntax does not permit empty abstract
2327 declarators. Otherwise, it is a parenthesized declarator (in
2328 which case the analysis may be repeated inside it, recursively).
2330 ??? There is an ambiguity in a parameter declaration "int
2331 (__attribute__((foo)) x)", where x is not a typedef name: it
2332 could be an abstract declarator for a function, or declare x with
2333 parentheses. The proper resolution of this ambiguity needs
2334 documenting. At present we follow an accident of the old
2335 parser's implementation, whereby the first parameter must have
2336 some declaration specifiers other than just attributes. Thus as
2337 a parameter declaration it is treated as a parenthesized
2338 parameter named x, and as an abstract declarator it is
2339 rejected.
2341 ??? Also following the old parser, attributes inside an empty
2342 parameter list are ignored, making it a list not yielding a
2343 prototype, rather than giving an error or making it have one
2344 parameter with implicit type int.
2346 ??? Also following the old parser, typedef names may be
2347 redeclared in declarators, but not Objective-C class names. */
2349 if (kind != C_DTR_ABSTRACT
2350 && c_parser_next_token_is (parser, CPP_NAME)
2351 && ((type_seen_p
2352 && c_parser_peek_token (parser)->id_kind == C_ID_TYPENAME)
2353 || c_parser_peek_token (parser)->id_kind == C_ID_ID))
2355 struct c_declarator *inner
2356 = build_id_declarator (c_parser_peek_token (parser)->value);
2357 *seen_id = true;
2358 inner->id_loc = c_parser_peek_token (parser)->location;
2359 c_parser_consume_token (parser);
2360 return c_parser_direct_declarator_inner (parser, *seen_id, inner);
2363 if (kind != C_DTR_NORMAL
2364 && c_parser_next_token_is (parser, CPP_OPEN_SQUARE))
2366 struct c_declarator *inner = build_id_declarator (NULL_TREE);
2367 return c_parser_direct_declarator_inner (parser, *seen_id, inner);
2370 /* Either we are at the end of an abstract declarator, or we have
2371 parentheses. */
2373 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
2375 tree attrs;
2376 struct c_declarator *inner;
2377 c_parser_consume_token (parser);
2378 attrs = c_parser_attributes (parser);
2379 if (kind != C_DTR_NORMAL
2380 && (c_parser_next_token_starts_declspecs (parser)
2381 || c_parser_next_token_is (parser, CPP_CLOSE_PAREN)))
2383 struct c_arg_info *args
2384 = c_parser_parms_declarator (parser, kind == C_DTR_NORMAL,
2385 attrs);
2386 if (args == NULL)
2387 return NULL;
2388 else
2390 inner
2391 = build_function_declarator (args,
2392 build_id_declarator (NULL_TREE));
2393 return c_parser_direct_declarator_inner (parser, *seen_id,
2394 inner);
2397 /* A parenthesized declarator. */
2398 inner = c_parser_declarator (parser, type_seen_p, kind, seen_id);
2399 if (inner != NULL && attrs != NULL)
2400 inner = build_attrs_declarator (attrs, inner);
2401 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2403 c_parser_consume_token (parser);
2404 if (inner == NULL)
2405 return NULL;
2406 else
2407 return c_parser_direct_declarator_inner (parser, *seen_id, inner);
2409 else
2411 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2412 "expected %<)%>");
2413 return NULL;
2416 else
2418 if (kind == C_DTR_NORMAL)
2420 c_parser_error (parser, "expected identifier or %<(%>");
2421 return NULL;
2423 else
2424 return build_id_declarator (NULL_TREE);
2428 /* Parse part of a direct declarator or direct abstract declarator,
2429 given that some (in INNER) has already been parsed; ID_PRESENT is
2430 true if an identifier is present, false for an abstract
2431 declarator. */
2433 static struct c_declarator *
2434 c_parser_direct_declarator_inner (c_parser *parser, bool id_present,
2435 struct c_declarator *inner)
2437 /* Parse a sequence of array declarators and parameter lists. */
2438 if (c_parser_next_token_is (parser, CPP_OPEN_SQUARE))
2440 struct c_declarator *declarator;
2441 struct c_declspecs *quals_attrs = build_null_declspecs ();
2442 bool static_seen;
2443 bool star_seen;
2444 tree dimen;
2445 c_parser_consume_token (parser);
2446 c_parser_declspecs (parser, quals_attrs, false, false, true);
2447 static_seen = c_parser_next_token_is_keyword (parser, RID_STATIC);
2448 if (static_seen)
2449 c_parser_consume_token (parser);
2450 if (static_seen && !quals_attrs->declspecs_seen_p)
2451 c_parser_declspecs (parser, quals_attrs, false, false, true);
2452 if (!quals_attrs->declspecs_seen_p)
2453 quals_attrs = NULL;
2454 /* If "static" is present, there must be an array dimension.
2455 Otherwise, there may be a dimension, "*", or no
2456 dimension. */
2457 if (static_seen)
2459 star_seen = false;
2460 dimen = c_parser_expr_no_commas (parser, NULL).value;
2462 else
2464 if (c_parser_next_token_is (parser, CPP_CLOSE_SQUARE))
2466 dimen = NULL_TREE;
2467 star_seen = false;
2469 else if (c_parser_next_token_is (parser, CPP_MULT))
2471 if (c_parser_peek_2nd_token (parser)->type == CPP_CLOSE_SQUARE)
2473 dimen = NULL_TREE;
2474 star_seen = true;
2475 c_parser_consume_token (parser);
2477 else
2479 star_seen = false;
2480 dimen = c_parser_expr_no_commas (parser, NULL).value;
2483 else
2485 star_seen = false;
2486 dimen = c_parser_expr_no_commas (parser, NULL).value;
2489 if (c_parser_next_token_is (parser, CPP_CLOSE_SQUARE))
2490 c_parser_consume_token (parser);
2491 else
2493 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
2494 "expected %<]%>");
2495 return NULL;
2497 declarator = build_array_declarator (dimen, quals_attrs, static_seen,
2498 star_seen);
2499 if (declarator == NULL)
2500 return NULL;
2501 inner = set_array_declarator_inner (declarator, inner);
2502 return c_parser_direct_declarator_inner (parser, id_present, inner);
2504 else if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
2506 tree attrs;
2507 struct c_arg_info *args;
2508 c_parser_consume_token (parser);
2509 attrs = c_parser_attributes (parser);
2510 args = c_parser_parms_declarator (parser, id_present, attrs);
2511 if (args == NULL)
2512 return NULL;
2513 else
2515 inner = build_function_declarator (args, inner);
2516 return c_parser_direct_declarator_inner (parser, id_present, inner);
2519 return inner;
2522 /* Parse a parameter list or identifier list, including the closing
2523 parenthesis but not the opening one. ATTRS are the attributes at
2524 the start of the list. ID_LIST_OK is true if an identifier list is
2525 acceptable; such a list must not have attributes at the start. */
2527 static struct c_arg_info *
2528 c_parser_parms_declarator (c_parser *parser, bool id_list_ok, tree attrs)
2530 push_scope ();
2531 declare_parm_level ();
2532 /* If the list starts with an identifier, it is an identifier list.
2533 Otherwise, it is either a prototype list or an empty list. */
2534 if (id_list_ok
2535 && !attrs
2536 && c_parser_next_token_is (parser, CPP_NAME)
2537 && c_parser_peek_token (parser)->id_kind == C_ID_ID)
2539 tree list = NULL_TREE, *nextp = &list;
2540 while (c_parser_next_token_is (parser, CPP_NAME)
2541 && c_parser_peek_token (parser)->id_kind == C_ID_ID)
2543 *nextp = build_tree_list (NULL_TREE,
2544 c_parser_peek_token (parser)->value);
2545 nextp = & TREE_CHAIN (*nextp);
2546 c_parser_consume_token (parser);
2547 if (c_parser_next_token_is_not (parser, CPP_COMMA))
2548 break;
2549 c_parser_consume_token (parser);
2550 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2552 c_parser_error (parser, "expected identifier");
2553 break;
2556 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2558 struct c_arg_info *ret = XOBNEW (&parser_obstack, struct c_arg_info);
2559 ret->parms = 0;
2560 ret->tags = 0;
2561 ret->types = list;
2562 ret->others = 0;
2563 ret->pending_sizes = 0;
2564 ret->had_vla_unspec = 0;
2565 c_parser_consume_token (parser);
2566 pop_scope ();
2567 return ret;
2569 else
2571 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2572 "expected %<)%>");
2573 pop_scope ();
2574 return NULL;
2577 else
2579 struct c_arg_info *ret = c_parser_parms_list_declarator (parser, attrs);
2580 pop_scope ();
2581 return ret;
2585 /* Parse a parameter list (possibly empty), including the closing
2586 parenthesis but not the opening one. ATTRS are the attributes at
2587 the start of the list. */
2589 static struct c_arg_info *
2590 c_parser_parms_list_declarator (c_parser *parser, tree attrs)
2592 bool good_parm = false;
2593 /* ??? Following the old parser, forward parameter declarations may
2594 use abstract declarators, and if no real parameter declarations
2595 follow the forward declarations then this is not diagnosed. Also
2596 note as above that attributes are ignored as the only contents of
2597 the parentheses, or as the only contents after forward
2598 declarations. */
2599 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2601 struct c_arg_info *ret = XOBNEW (&parser_obstack, struct c_arg_info);
2602 ret->parms = 0;
2603 ret->tags = 0;
2604 ret->types = 0;
2605 ret->others = 0;
2606 ret->pending_sizes = 0;
2607 ret->had_vla_unspec = 0;
2608 c_parser_consume_token (parser);
2609 return ret;
2611 if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
2613 struct c_arg_info *ret = XOBNEW (&parser_obstack, struct c_arg_info);
2614 ret->parms = 0;
2615 ret->tags = 0;
2616 ret->others = 0;
2617 ret->pending_sizes = 0;
2618 ret->had_vla_unspec = 0;
2619 /* Suppress -Wold-style-definition for this case. */
2620 ret->types = error_mark_node;
2621 error ("%HISO C requires a named argument before %<...%>",
2622 &c_parser_peek_token (parser)->location);
2623 c_parser_consume_token (parser);
2624 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2626 c_parser_consume_token (parser);
2627 return ret;
2629 else
2631 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2632 "expected %<)%>");
2633 return NULL;
2636 /* Nonempty list of parameters, either terminated with semicolon
2637 (forward declarations; recurse) or with close parenthesis (normal
2638 function) or with ", ... )" (variadic function). */
2639 while (true)
2641 /* Parse a parameter. */
2642 struct c_parm *parm = c_parser_parameter_declaration (parser, attrs);
2643 attrs = NULL_TREE;
2644 if (parm != NULL)
2646 good_parm = true;
2647 push_parm_decl (parm);
2649 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
2651 tree new_attrs;
2652 c_parser_consume_token (parser);
2653 mark_forward_parm_decls ();
2654 new_attrs = c_parser_attributes (parser);
2655 return c_parser_parms_list_declarator (parser, new_attrs);
2657 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2659 c_parser_consume_token (parser);
2660 if (good_parm)
2661 return get_parm_info (false);
2662 else
2664 struct c_arg_info *ret
2665 = XOBNEW (&parser_obstack, struct c_arg_info);
2666 ret->parms = 0;
2667 ret->tags = 0;
2668 ret->types = 0;
2669 ret->others = 0;
2670 ret->pending_sizes = 0;
2671 ret->had_vla_unspec = 0;
2672 return ret;
2675 if (!c_parser_require (parser, CPP_COMMA,
2676 "expected %<;%>, %<,%> or %<)%>"))
2678 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
2679 return NULL;
2681 if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
2683 c_parser_consume_token (parser);
2684 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2686 c_parser_consume_token (parser);
2687 if (good_parm)
2688 return get_parm_info (true);
2689 else
2691 struct c_arg_info *ret
2692 = XOBNEW (&parser_obstack, struct c_arg_info);
2693 ret->parms = 0;
2694 ret->tags = 0;
2695 ret->types = 0;
2696 ret->others = 0;
2697 ret->pending_sizes = 0;
2698 ret->had_vla_unspec = 0;
2699 return ret;
2702 else
2704 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2705 "expected %<)%>");
2706 return NULL;
2712 /* Parse a parameter declaration. ATTRS are the attributes at the
2713 start of the declaration if it is the first parameter. */
2715 static struct c_parm *
2716 c_parser_parameter_declaration (c_parser *parser, tree attrs)
2718 struct c_declspecs *specs;
2719 struct c_declarator *declarator;
2720 tree prefix_attrs;
2721 tree postfix_attrs = NULL_TREE;
2722 bool dummy = false;
2723 if (!c_parser_next_token_starts_declspecs (parser))
2725 /* ??? In some Objective-C cases '...' isn't applicable so there
2726 should be a different message. */
2727 c_parser_error (parser,
2728 "expected declaration specifiers or %<...%>");
2729 c_parser_skip_to_end_of_parameter (parser);
2730 return NULL;
2732 specs = build_null_declspecs ();
2733 if (attrs)
2735 declspecs_add_attrs (specs, attrs);
2736 attrs = NULL_TREE;
2738 c_parser_declspecs (parser, specs, true, true, true);
2739 finish_declspecs (specs);
2740 pending_xref_error ();
2741 prefix_attrs = specs->attrs;
2742 specs->attrs = NULL_TREE;
2743 declarator = c_parser_declarator (parser, specs->type_seen_p,
2744 C_DTR_PARM, &dummy);
2745 if (declarator == NULL)
2747 c_parser_skip_until_found (parser, CPP_COMMA, NULL);
2748 return NULL;
2750 if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
2751 postfix_attrs = c_parser_attributes (parser);
2752 return build_c_parm (specs, chainon (postfix_attrs, prefix_attrs),
2753 declarator);
2756 /* Parse a string literal in an asm expression. It should not be
2757 translated, and wide string literals are an error although
2758 permitted by the syntax. This is a GNU extension.
2760 asm-string-literal:
2761 string-literal
2763 ??? At present, following the old parser, the caller needs to have
2764 set lex_untranslated_string to 1. It would be better to follow the
2765 C++ parser rather than using this kludge. */
2767 static tree
2768 c_parser_asm_string_literal (c_parser *parser)
2770 tree str;
2771 if (c_parser_next_token_is (parser, CPP_STRING))
2773 str = c_parser_peek_token (parser)->value;
2774 c_parser_consume_token (parser);
2776 else if (c_parser_next_token_is (parser, CPP_WSTRING))
2778 error ("%Hwide string literal in %<asm%>",
2779 &c_parser_peek_token (parser)->location);
2780 str = build_string (1, "");
2781 c_parser_consume_token (parser);
2783 else
2785 c_parser_error (parser, "expected string literal");
2786 str = NULL_TREE;
2788 return str;
2791 /* Parse a simple asm expression. This is used in restricted
2792 contexts, where a full expression with inputs and outputs does not
2793 make sense. This is a GNU extension.
2795 simple-asm-expr:
2796 asm ( asm-string-literal )
2799 static tree
2800 c_parser_simple_asm_expr (c_parser *parser)
2802 tree str;
2803 gcc_assert (c_parser_next_token_is_keyword (parser, RID_ASM));
2804 /* ??? Follow the C++ parser rather than using the
2805 lex_untranslated_string kludge. */
2806 parser->lex_untranslated_string = true;
2807 c_parser_consume_token (parser);
2808 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
2810 parser->lex_untranslated_string = false;
2811 return NULL_TREE;
2813 str = c_parser_asm_string_literal (parser);
2814 parser->lex_untranslated_string = false;
2815 if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
2817 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
2818 return NULL_TREE;
2820 return str;
2823 /* Parse (possibly empty) attributes. This is a GNU extension.
2825 attributes:
2826 empty
2827 attributes attribute
2829 attribute:
2830 __attribute__ ( ( attribute-list ) )
2832 attribute-list:
2833 attrib
2834 attribute_list , attrib
2836 attrib:
2837 empty
2838 any-word
2839 any-word ( identifier )
2840 any-word ( identifier , nonempty-expr-list )
2841 any-word ( expr-list )
2843 where the "identifier" must not be declared as a type, and
2844 "any-word" may be any identifier (including one declared as a
2845 type), a reserved word storage class specifier, type specifier or
2846 type qualifier. ??? This still leaves out most reserved keywords
2847 (following the old parser), shouldn't we include them, and why not
2848 allow identifiers declared as types to start the arguments? */
2850 static tree
2851 c_parser_attributes (c_parser *parser)
2853 tree attrs = NULL_TREE;
2854 while (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
2856 /* ??? Follow the C++ parser rather than using the
2857 lex_untranslated_string kludge. */
2858 parser->lex_untranslated_string = true;
2859 c_parser_consume_token (parser);
2860 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
2862 parser->lex_untranslated_string = false;
2863 return attrs;
2865 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
2867 parser->lex_untranslated_string = false;
2868 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
2869 return attrs;
2871 /* Parse the attribute list. */
2872 while (c_parser_next_token_is (parser, CPP_COMMA)
2873 || c_parser_next_token_is (parser, CPP_NAME)
2874 || c_parser_next_token_is (parser, CPP_KEYWORD))
2876 tree attr, attr_name, attr_args;
2877 if (c_parser_next_token_is (parser, CPP_COMMA))
2879 c_parser_consume_token (parser);
2880 continue;
2882 if (c_parser_next_token_is (parser, CPP_KEYWORD))
2884 /* ??? See comment above about what keywords are
2885 accepted here. */
2886 bool ok;
2887 switch (c_parser_peek_token (parser)->keyword)
2889 case RID_STATIC:
2890 case RID_UNSIGNED:
2891 case RID_LONG:
2892 case RID_CONST:
2893 case RID_EXTERN:
2894 case RID_REGISTER:
2895 case RID_TYPEDEF:
2896 case RID_SHORT:
2897 case RID_INLINE:
2898 case RID_VOLATILE:
2899 case RID_SIGNED:
2900 case RID_AUTO:
2901 case RID_RESTRICT:
2902 case RID_COMPLEX:
2903 case RID_THREAD:
2904 case RID_INT:
2905 case RID_CHAR:
2906 case RID_FLOAT:
2907 case RID_DOUBLE:
2908 case RID_VOID:
2909 case RID_DFLOAT32:
2910 case RID_DFLOAT64:
2911 case RID_DFLOAT128:
2912 case RID_BOOL:
2913 case RID_FRACT:
2914 case RID_ACCUM:
2915 case RID_SAT:
2916 ok = true;
2917 break;
2918 default:
2919 ok = false;
2920 break;
2922 if (!ok)
2923 break;
2925 attr_name = c_parser_peek_token (parser)->value;
2926 c_parser_consume_token (parser);
2927 if (c_parser_next_token_is_not (parser, CPP_OPEN_PAREN))
2929 attr = build_tree_list (attr_name, NULL_TREE);
2930 attrs = chainon (attrs, attr);
2931 continue;
2933 c_parser_consume_token (parser);
2934 /* Parse the attribute contents. If they start with an
2935 identifier which is followed by a comma or close
2936 parenthesis, then the arguments start with that
2937 identifier; otherwise they are an expression list. */
2938 if (c_parser_next_token_is (parser, CPP_NAME)
2939 && c_parser_peek_token (parser)->id_kind == C_ID_ID
2940 && ((c_parser_peek_2nd_token (parser)->type == CPP_COMMA)
2941 || (c_parser_peek_2nd_token (parser)->type
2942 == CPP_CLOSE_PAREN)))
2944 tree arg1 = c_parser_peek_token (parser)->value;
2945 c_parser_consume_token (parser);
2946 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2947 attr_args = build_tree_list (NULL_TREE, arg1);
2948 else
2950 c_parser_consume_token (parser);
2951 attr_args = tree_cons (NULL_TREE, arg1,
2952 c_parser_expr_list (parser, false));
2955 else
2957 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2958 attr_args = NULL_TREE;
2959 else
2960 attr_args = c_parser_expr_list (parser, false);
2962 attr = build_tree_list (attr_name, attr_args);
2963 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2964 c_parser_consume_token (parser);
2965 else
2967 parser->lex_untranslated_string = false;
2968 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2969 "expected %<)%>");
2970 return attrs;
2972 attrs = chainon (attrs, attr);
2974 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2975 c_parser_consume_token (parser);
2976 else
2978 parser->lex_untranslated_string = false;
2979 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2980 "expected %<)%>");
2981 return attrs;
2983 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2984 c_parser_consume_token (parser);
2985 else
2987 parser->lex_untranslated_string = false;
2988 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2989 "expected %<)%>");
2990 return attrs;
2992 parser->lex_untranslated_string = false;
2994 return attrs;
2997 /* Parse a type name (C90 6.5.5, C99 6.7.6).
2999 type-name:
3000 specifier-qualifier-list abstract-declarator[opt]
3003 static struct c_type_name *
3004 c_parser_type_name (c_parser *parser)
3006 struct c_declspecs *specs = build_null_declspecs ();
3007 struct c_declarator *declarator;
3008 struct c_type_name *ret;
3009 bool dummy = false;
3010 c_parser_declspecs (parser, specs, false, true, true);
3011 if (!specs->declspecs_seen_p)
3013 c_parser_error (parser, "expected specifier-qualifier-list");
3014 return NULL;
3016 pending_xref_error ();
3017 finish_declspecs (specs);
3018 declarator = c_parser_declarator (parser, specs->type_seen_p,
3019 C_DTR_ABSTRACT, &dummy);
3020 if (declarator == NULL)
3021 return NULL;
3022 ret = XOBNEW (&parser_obstack, struct c_type_name);
3023 ret->specs = specs;
3024 ret->declarator = declarator;
3025 return ret;
3028 /* Parse an initializer (C90 6.5.7, C99 6.7.8).
3030 initializer:
3031 assignment-expression
3032 { initializer-list }
3033 { initializer-list , }
3035 initializer-list:
3036 designation[opt] initializer
3037 initializer-list , designation[opt] initializer
3039 designation:
3040 designator-list =
3042 designator-list:
3043 designator
3044 designator-list designator
3046 designator:
3047 array-designator
3048 . identifier
3050 array-designator:
3051 [ constant-expression ]
3053 GNU extensions:
3055 initializer:
3058 designation:
3059 array-designator
3060 identifier :
3062 array-designator:
3063 [ constant-expression ... constant-expression ]
3065 Any expression without commas is accepted in the syntax for the
3066 constant-expressions, with non-constant expressions rejected later.
3068 This function is only used for top-level initializers; for nested
3069 ones, see c_parser_initval. */
3071 static struct c_expr
3072 c_parser_initializer (c_parser *parser)
3074 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
3075 return c_parser_braced_init (parser, NULL_TREE, false);
3076 else
3078 struct c_expr ret;
3079 ret = c_parser_expr_no_commas (parser, NULL);
3080 if (TREE_CODE (ret.value) != STRING_CST
3081 && TREE_CODE (ret.value) != COMPOUND_LITERAL_EXPR)
3082 ret = default_function_array_conversion (ret);
3083 return ret;
3087 /* Parse a braced initializer list. TYPE is the type specified for a
3088 compound literal, and NULL_TREE for other initializers and for
3089 nested braced lists. NESTED_P is true for nested braced lists,
3090 false for the list of a compound literal or the list that is the
3091 top-level initializer in a declaration. */
3093 static struct c_expr
3094 c_parser_braced_init (c_parser *parser, tree type, bool nested_p)
3096 location_t brace_loc = c_parser_peek_token (parser)->location;
3097 gcc_assert (c_parser_next_token_is (parser, CPP_OPEN_BRACE));
3098 c_parser_consume_token (parser);
3099 if (nested_p)
3100 push_init_level (0);
3101 else
3102 really_start_incremental_init (type);
3103 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
3105 if (pedantic)
3106 pedwarn ("%HISO C forbids empty initializer braces", &brace_loc);
3108 else
3110 /* Parse a non-empty initializer list, possibly with a trailing
3111 comma. */
3112 while (true)
3114 c_parser_initelt (parser);
3115 if (parser->error)
3116 break;
3117 if (c_parser_next_token_is (parser, CPP_COMMA))
3118 c_parser_consume_token (parser);
3119 else
3120 break;
3121 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
3122 break;
3125 if (c_parser_next_token_is_not (parser, CPP_CLOSE_BRACE))
3127 struct c_expr ret;
3128 ret.value = error_mark_node;
3129 ret.original_code = ERROR_MARK;
3130 c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, "expected %<}%>");
3131 return ret;
3133 c_parser_consume_token (parser);
3134 return pop_init_level (0);
3137 /* Parse a nested initializer, including designators. */
3139 static void
3140 c_parser_initelt (c_parser *parser)
3142 /* Parse any designator or designator list. A single array
3143 designator may have the subsequent "=" omitted in GNU C, but a
3144 longer list or a structure member designator may not. */
3145 if (c_parser_next_token_is (parser, CPP_NAME)
3146 && c_parser_peek_2nd_token (parser)->type == CPP_COLON)
3148 /* Old-style structure member designator. */
3149 set_init_label (c_parser_peek_token (parser)->value);
3150 if (pedantic)
3152 /* Use the colon as the error location. */
3153 pedwarn ("%Hobsolete use of designated initializer with %<:%>",
3154 &c_parser_peek_2nd_token (parser)->location);
3156 c_parser_consume_token (parser);
3157 c_parser_consume_token (parser);
3159 else
3161 /* des_seen is 0 if there have been no designators, 1 if there
3162 has been a single array designator and 2 otherwise. */
3163 int des_seen = 0;
3164 /* Location of a designator. */
3165 location_t des_loc;
3166 while (c_parser_next_token_is (parser, CPP_OPEN_SQUARE)
3167 || c_parser_next_token_is (parser, CPP_DOT))
3169 int des_prev = des_seen;
3170 if (!des_seen)
3171 des_loc = c_parser_peek_token (parser)->location;
3172 if (des_seen < 2)
3173 des_seen++;
3174 if (c_parser_next_token_is (parser, CPP_DOT))
3176 des_seen = 2;
3177 c_parser_consume_token (parser);
3178 if (c_parser_next_token_is (parser, CPP_NAME))
3180 set_init_label (c_parser_peek_token (parser)->value);
3181 c_parser_consume_token (parser);
3183 else
3185 struct c_expr init;
3186 init.value = error_mark_node;
3187 init.original_code = ERROR_MARK;
3188 c_parser_error (parser, "expected identifier");
3189 c_parser_skip_until_found (parser, CPP_COMMA, NULL);
3190 process_init_element (init);
3191 return;
3194 else
3196 tree first, second;
3197 location_t ellipsis_loc;
3198 /* ??? Following the old parser, [ objc-receiver
3199 objc-message-args ] is accepted as an initializer,
3200 being distinguished from a designator by what follows
3201 the first assignment expression inside the square
3202 brackets, but after a first array designator a
3203 subsequent square bracket is for Objective-C taken to
3204 start an expression, using the obsolete form of
3205 designated initializer without '=', rather than
3206 possibly being a second level of designation: in LALR
3207 terms, the '[' is shifted rather than reducing
3208 designator to designator-list. */
3209 if (des_prev == 1 && c_dialect_objc ())
3211 des_seen = des_prev;
3212 break;
3214 if (des_prev == 0 && c_dialect_objc ())
3216 /* This might be an array designator or an
3217 Objective-C message expression. If the former,
3218 continue parsing here; if the latter, parse the
3219 remainder of the initializer given the starting
3220 primary-expression. ??? It might make sense to
3221 distinguish when des_prev == 1 as well; see
3222 previous comment. */
3223 tree rec, args;
3224 struct c_expr mexpr;
3225 c_parser_consume_token (parser);
3226 if (c_parser_peek_token (parser)->type == CPP_NAME
3227 && ((c_parser_peek_token (parser)->id_kind
3228 == C_ID_TYPENAME)
3229 || (c_parser_peek_token (parser)->id_kind
3230 == C_ID_CLASSNAME)))
3232 /* Type name receiver. */
3233 tree id = c_parser_peek_token (parser)->value;
3234 c_parser_consume_token (parser);
3235 rec = objc_get_class_reference (id);
3236 goto parse_message_args;
3238 first = c_parser_expr_no_commas (parser, NULL).value;
3239 if (c_parser_next_token_is (parser, CPP_ELLIPSIS)
3240 || c_parser_next_token_is (parser, CPP_CLOSE_SQUARE))
3241 goto array_desig_after_first;
3242 /* Expression receiver. So far only one part
3243 without commas has been parsed; there might be
3244 more of the expression. */
3245 rec = first;
3246 while (c_parser_next_token_is (parser, CPP_COMMA))
3248 struct c_expr next;
3249 c_parser_consume_token (parser);
3250 next = c_parser_expr_no_commas (parser, NULL);
3251 next = default_function_array_conversion (next);
3252 rec = build_compound_expr (rec, next.value);
3254 parse_message_args:
3255 /* Now parse the objc-message-args. */
3256 args = c_parser_objc_message_args (parser);
3257 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
3258 "expected %<]%>");
3259 mexpr.value
3260 = objc_build_message_expr (build_tree_list (rec, args));
3261 mexpr.original_code = ERROR_MARK;
3262 /* Now parse and process the remainder of the
3263 initializer, starting with this message
3264 expression as a primary-expression. */
3265 c_parser_initval (parser, &mexpr);
3266 return;
3268 c_parser_consume_token (parser);
3269 first = c_parser_expr_no_commas (parser, NULL).value;
3270 array_desig_after_first:
3271 if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
3273 ellipsis_loc = c_parser_peek_token (parser)->location;
3274 c_parser_consume_token (parser);
3275 second = c_parser_expr_no_commas (parser, NULL).value;
3277 else
3278 second = NULL_TREE;
3279 if (c_parser_next_token_is (parser, CPP_CLOSE_SQUARE))
3281 c_parser_consume_token (parser);
3282 set_init_index (first, second);
3283 if (pedantic && second)
3284 pedwarn ("%HISO C forbids specifying range of "
3285 "elements to initialize", &ellipsis_loc);
3287 else
3288 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
3289 "expected %<]%>");
3292 if (des_seen >= 1)
3294 if (c_parser_next_token_is (parser, CPP_EQ))
3296 if (pedantic && !flag_isoc99)
3297 pedwarn ("%HISO C90 forbids specifying subobject "
3298 "to initialize", &des_loc);
3299 c_parser_consume_token (parser);
3301 else
3303 if (des_seen == 1)
3305 if (pedantic)
3306 pedwarn ("%Hobsolete use of designated initializer "
3307 "without %<=%>",
3308 &c_parser_peek_token (parser)->location);
3310 else
3312 struct c_expr init;
3313 init.value = error_mark_node;
3314 init.original_code = ERROR_MARK;
3315 c_parser_error (parser, "expected %<=%>");
3316 c_parser_skip_until_found (parser, CPP_COMMA, NULL);
3317 process_init_element (init);
3318 return;
3323 c_parser_initval (parser, NULL);
3326 /* Parse a nested initializer; as c_parser_initializer but parses
3327 initializers within braced lists, after any designators have been
3328 applied. If AFTER is not NULL then it is an Objective-C message
3329 expression which is the primary-expression starting the
3330 initializer. */
3332 static void
3333 c_parser_initval (c_parser *parser, struct c_expr *after)
3335 struct c_expr init;
3336 gcc_assert (!after || c_dialect_objc ());
3337 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE) && !after)
3338 init = c_parser_braced_init (parser, NULL_TREE, true);
3339 else
3341 init = c_parser_expr_no_commas (parser, after);
3342 if (init.value != NULL_TREE
3343 && TREE_CODE (init.value) != STRING_CST
3344 && TREE_CODE (init.value) != COMPOUND_LITERAL_EXPR)
3345 init = default_function_array_conversion (init);
3347 process_init_element (init);
3350 /* Parse a compound statement (possibly a function body) (C90 6.6.2,
3351 C99 6.8.2).
3353 compound-statement:
3354 { block-item-list[opt] }
3355 { label-declarations block-item-list }
3357 block-item-list:
3358 block-item
3359 block-item-list block-item
3361 block-item:
3362 nested-declaration
3363 statement
3365 nested-declaration:
3366 declaration
3368 GNU extensions:
3370 compound-statement:
3371 { label-declarations block-item-list }
3373 nested-declaration:
3374 __extension__ nested-declaration
3375 nested-function-definition
3377 label-declarations:
3378 label-declaration
3379 label-declarations label-declaration
3381 label-declaration:
3382 __label__ identifier-list ;
3384 Allowing the mixing of declarations and code is new in C99. The
3385 GNU syntax also permits (not shown above) labels at the end of
3386 compound statements, which yield an error. We don't allow labels
3387 on declarations; this might seem like a natural extension, but
3388 there would be a conflict between attributes on the label and
3389 prefix attributes on the declaration. ??? The syntax follows the
3390 old parser in requiring something after label declarations.
3391 Although they are erroneous if the labels declared aren't defined,
3392 is it useful for the syntax to be this way?
3394 OpenMP:
3396 block-item:
3397 openmp-directive
3399 openmp-directive:
3400 barrier-directive
3401 flush-directive */
3403 static tree
3404 c_parser_compound_statement (c_parser *parser)
3406 tree stmt;
3407 if (!c_parser_require (parser, CPP_OPEN_BRACE, "expected %<{%>"))
3408 return error_mark_node;
3409 stmt = c_begin_compound_stmt (true);
3410 c_parser_compound_statement_nostart (parser);
3411 return c_end_compound_stmt (stmt, true);
3414 /* Parse a compound statement except for the opening brace. This is
3415 used for parsing both compound statements and statement expressions
3416 (which follow different paths to handling the opening). */
3418 static void
3419 c_parser_compound_statement_nostart (c_parser *parser)
3421 bool last_stmt = false;
3422 bool last_label = false;
3423 location_t label_loc;
3424 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
3426 c_parser_consume_token (parser);
3427 return;
3429 if (c_parser_next_token_is_keyword (parser, RID_LABEL))
3431 location_t err_loc = c_parser_peek_token (parser)->location;
3432 /* Read zero or more forward-declarations for labels that nested
3433 functions can jump to. */
3434 while (c_parser_next_token_is_keyword (parser, RID_LABEL))
3436 c_parser_consume_token (parser);
3437 /* Any identifiers, including those declared as type names,
3438 are OK here. */
3439 while (true)
3441 tree label;
3442 if (c_parser_next_token_is_not (parser, CPP_NAME))
3444 c_parser_error (parser, "expected identifier");
3445 break;
3447 label
3448 = declare_label (c_parser_peek_token (parser)->value);
3449 C_DECLARED_LABEL_FLAG (label) = 1;
3450 add_stmt (build_stmt (DECL_EXPR, label));
3451 c_parser_consume_token (parser);
3452 if (c_parser_next_token_is (parser, CPP_COMMA))
3453 c_parser_consume_token (parser);
3454 else
3455 break;
3457 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
3459 if (pedantic)
3460 pedwarn ("%HISO C forbids label declarations", &err_loc);
3462 /* We must now have at least one statement, label or declaration. */
3463 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
3465 c_parser_error (parser, "expected declaration or statement");
3466 c_parser_consume_token (parser);
3467 return;
3469 while (c_parser_next_token_is_not (parser, CPP_CLOSE_BRACE))
3471 location_t loc = c_parser_peek_token (parser)->location;
3472 if (c_parser_next_token_is_keyword (parser, RID_CASE)
3473 || c_parser_next_token_is_keyword (parser, RID_DEFAULT)
3474 || (c_parser_next_token_is (parser, CPP_NAME)
3475 && c_parser_peek_2nd_token (parser)->type == CPP_COLON))
3477 if (c_parser_next_token_is_keyword (parser, RID_CASE))
3478 label_loc = c_parser_peek_2nd_token (parser)->location;
3479 else
3480 label_loc = c_parser_peek_token (parser)->location;
3481 last_label = true;
3482 last_stmt = false;
3483 c_parser_label (parser);
3485 else if (!last_label
3486 && c_parser_next_token_starts_declspecs (parser))
3488 last_label = false;
3489 c_parser_declaration_or_fndef (parser, true, true, true, true);
3490 if (last_stmt
3491 && ((pedantic && !flag_isoc99)
3492 || warn_declaration_after_statement))
3493 pedwarn_c90 ("%HISO C90 forbids mixed declarations and code",
3494 &loc);
3495 last_stmt = false;
3497 else if (!last_label
3498 && c_parser_next_token_is_keyword (parser, RID_EXTENSION))
3500 /* __extension__ can start a declaration, but is also an
3501 unary operator that can start an expression. Consume all
3502 but the last of a possible series of __extension__ to
3503 determine which. */
3504 while (c_parser_peek_2nd_token (parser)->type == CPP_KEYWORD
3505 && (c_parser_peek_2nd_token (parser)->keyword
3506 == RID_EXTENSION))
3507 c_parser_consume_token (parser);
3508 if (c_token_starts_declspecs (c_parser_peek_2nd_token (parser)))
3510 int ext;
3511 ext = disable_extension_diagnostics ();
3512 c_parser_consume_token (parser);
3513 last_label = false;
3514 c_parser_declaration_or_fndef (parser, true, true, true, true);
3515 /* Following the old parser, __extension__ does not
3516 disable this diagnostic. */
3517 restore_extension_diagnostics (ext);
3518 if (last_stmt
3519 && ((pedantic && !flag_isoc99)
3520 || warn_declaration_after_statement))
3521 pedwarn_c90 ("%HISO C90 forbids mixed declarations and code",
3522 &loc);
3523 last_stmt = false;
3525 else
3526 goto statement;
3528 else if (c_parser_next_token_is (parser, CPP_PRAGMA))
3530 /* External pragmas, and some omp pragmas, are not associated
3531 with regular c code, and so are not to be considered statements
3532 syntactically. This ensures that the user doesn't put them
3533 places that would turn into syntax errors if the directive
3534 were ignored. */
3535 if (c_parser_pragma (parser, pragma_compound))
3536 last_label = false, last_stmt = true;
3538 else if (c_parser_next_token_is (parser, CPP_EOF))
3540 c_parser_error (parser, "expected declaration or statement");
3541 return;
3543 else if (c_parser_next_token_is_keyword (parser, RID_ELSE))
3545 if (parser->in_if_block)
3547 error ("%H""expected %<}%> before %<else%>", &loc);
3548 return;
3550 else
3552 error ("%H%<else%> without a previous %<if%>", &loc);
3553 c_parser_consume_token (parser);
3554 continue;
3557 else
3559 statement:
3560 last_label = false;
3561 last_stmt = true;
3562 c_parser_statement_after_labels (parser);
3565 parser->error = false;
3567 if (last_label)
3568 error ("%Hlabel at end of compound statement", &label_loc);
3569 c_parser_consume_token (parser);
3572 /* Parse a label (C90 6.6.1, C99 6.8.1).
3574 label:
3575 identifier : attributes[opt]
3576 case constant-expression :
3577 default :
3579 GNU extensions:
3581 label:
3582 case constant-expression ... constant-expression :
3584 The use of attributes on labels is a GNU extension. The syntax in
3585 GNU C accepts any expressions without commas, non-constant
3586 expressions being rejected later. */
3588 static void
3589 c_parser_label (c_parser *parser)
3591 location_t loc1 = c_parser_peek_token (parser)->location;
3592 tree label = NULL_TREE;
3593 if (c_parser_next_token_is_keyword (parser, RID_CASE))
3595 tree exp1, exp2;
3596 c_parser_consume_token (parser);
3597 exp1 = c_parser_expr_no_commas (parser, NULL).value;
3598 if (c_parser_next_token_is (parser, CPP_COLON))
3600 c_parser_consume_token (parser);
3601 label = do_case (exp1, NULL_TREE);
3603 else if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
3605 c_parser_consume_token (parser);
3606 exp2 = c_parser_expr_no_commas (parser, NULL).value;
3607 if (c_parser_require (parser, CPP_COLON, "expected %<:%>"))
3608 label = do_case (exp1, exp2);
3610 else
3611 c_parser_error (parser, "expected %<:%> or %<...%>");
3613 else if (c_parser_next_token_is_keyword (parser, RID_DEFAULT))
3615 c_parser_consume_token (parser);
3616 if (c_parser_require (parser, CPP_COLON, "expected %<:%>"))
3617 label = do_case (NULL_TREE, NULL_TREE);
3619 else
3621 tree name = c_parser_peek_token (parser)->value;
3622 tree tlab;
3623 tree attrs;
3624 location_t loc2 = c_parser_peek_token (parser)->location;
3625 gcc_assert (c_parser_next_token_is (parser, CPP_NAME));
3626 c_parser_consume_token (parser);
3627 gcc_assert (c_parser_next_token_is (parser, CPP_COLON));
3628 c_parser_consume_token (parser);
3629 attrs = c_parser_attributes (parser);
3630 tlab = define_label (loc2, name);
3631 if (tlab)
3633 decl_attributes (&tlab, attrs, 0);
3634 label = add_stmt (build_stmt (LABEL_EXPR, tlab));
3637 if (label)
3639 SET_EXPR_LOCATION (label, loc1);
3640 if (c_parser_next_token_starts_declspecs (parser)
3641 && !(c_parser_next_token_is (parser, CPP_NAME)
3642 && c_parser_peek_2nd_token (parser)->type == CPP_COLON))
3644 error ("%Ha label can only be part of a statement and "
3645 "a declaration is not a statement",
3646 &c_parser_peek_token (parser)->location);
3647 c_parser_declaration_or_fndef (parser, /*fndef_ok*/ false,
3648 /*nested*/ true, /*empty_ok*/ false,
3649 /*start_attr_ok*/ true);
3654 /* Parse a statement (C90 6.6, C99 6.8).
3656 statement:
3657 labeled-statement
3658 compound-statement
3659 expression-statement
3660 selection-statement
3661 iteration-statement
3662 jump-statement
3664 labeled-statement:
3665 label statement
3667 expression-statement:
3668 expression[opt] ;
3670 selection-statement:
3671 if-statement
3672 switch-statement
3674 iteration-statement:
3675 while-statement
3676 do-statement
3677 for-statement
3679 jump-statement:
3680 goto identifier ;
3681 continue ;
3682 break ;
3683 return expression[opt] ;
3685 GNU extensions:
3687 statement:
3688 asm-statement
3690 jump-statement:
3691 goto * expression ;
3693 Objective-C:
3695 statement:
3696 objc-throw-statement
3697 objc-try-catch-statement
3698 objc-synchronized-statement
3700 objc-throw-statement:
3701 @throw expression ;
3702 @throw ;
3704 OpenMP:
3706 statement:
3707 openmp-construct
3709 openmp-construct:
3710 parallel-construct
3711 for-construct
3712 sections-construct
3713 single-construct
3714 parallel-for-construct
3715 parallel-sections-construct
3716 master-construct
3717 critical-construct
3718 atomic-construct
3719 ordered-construct
3721 parallel-construct:
3722 parallel-directive structured-block
3724 for-construct:
3725 for-directive iteration-statement
3727 sections-construct:
3728 sections-directive section-scope
3730 single-construct:
3731 single-directive structured-block
3733 parallel-for-construct:
3734 parallel-for-directive iteration-statement
3736 parallel-sections-construct:
3737 parallel-sections-directive section-scope
3739 master-construct:
3740 master-directive structured-block
3742 critical-construct:
3743 critical-directive structured-block
3745 atomic-construct:
3746 atomic-directive expression-statement
3748 ordered-construct:
3749 ordered-directive structured-block */
3751 static void
3752 c_parser_statement (c_parser *parser)
3754 while (c_parser_next_token_is_keyword (parser, RID_CASE)
3755 || c_parser_next_token_is_keyword (parser, RID_DEFAULT)
3756 || (c_parser_next_token_is (parser, CPP_NAME)
3757 && c_parser_peek_2nd_token (parser)->type == CPP_COLON))
3758 c_parser_label (parser);
3759 c_parser_statement_after_labels (parser);
3762 /* Parse a statement, other than a labeled statement. */
3764 static void
3765 c_parser_statement_after_labels (c_parser *parser)
3767 location_t loc = c_parser_peek_token (parser)->location;
3768 tree stmt = NULL_TREE;
3769 bool in_if_block = parser->in_if_block;
3770 parser->in_if_block = false;
3771 switch (c_parser_peek_token (parser)->type)
3773 case CPP_OPEN_BRACE:
3774 add_stmt (c_parser_compound_statement (parser));
3775 break;
3776 case CPP_KEYWORD:
3777 switch (c_parser_peek_token (parser)->keyword)
3779 case RID_IF:
3780 c_parser_if_statement (parser);
3781 break;
3782 case RID_SWITCH:
3783 c_parser_switch_statement (parser);
3784 break;
3785 case RID_WHILE:
3786 c_parser_while_statement (parser);
3787 break;
3788 case RID_DO:
3789 c_parser_do_statement (parser);
3790 break;
3791 case RID_FOR:
3792 c_parser_for_statement (parser);
3793 break;
3794 case RID_GOTO:
3795 c_parser_consume_token (parser);
3796 if (c_parser_next_token_is (parser, CPP_NAME))
3798 stmt = c_finish_goto_label (c_parser_peek_token (parser)->value);
3799 c_parser_consume_token (parser);
3801 else if (c_parser_next_token_is (parser, CPP_MULT))
3803 c_parser_consume_token (parser);
3804 stmt = c_finish_goto_ptr (c_parser_expression (parser).value);
3806 else
3807 c_parser_error (parser, "expected identifier or %<*%>");
3808 goto expect_semicolon;
3809 case RID_CONTINUE:
3810 c_parser_consume_token (parser);
3811 stmt = c_finish_bc_stmt (&c_cont_label, false);
3812 goto expect_semicolon;
3813 case RID_BREAK:
3814 c_parser_consume_token (parser);
3815 stmt = c_finish_bc_stmt (&c_break_label, true);
3816 goto expect_semicolon;
3817 case RID_RETURN:
3818 c_parser_consume_token (parser);
3819 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
3821 stmt = c_finish_return (NULL_TREE);
3822 c_parser_consume_token (parser);
3824 else
3826 stmt = c_finish_return (c_parser_expression_conv (parser).value);
3827 goto expect_semicolon;
3829 break;
3830 case RID_ASM:
3831 stmt = c_parser_asm_statement (parser);
3832 break;
3833 case RID_AT_THROW:
3834 gcc_assert (c_dialect_objc ());
3835 c_parser_consume_token (parser);
3836 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
3838 stmt = objc_build_throw_stmt (NULL_TREE);
3839 c_parser_consume_token (parser);
3841 else
3843 stmt
3844 = objc_build_throw_stmt (c_parser_expression (parser).value);
3845 goto expect_semicolon;
3847 break;
3848 case RID_AT_TRY:
3849 gcc_assert (c_dialect_objc ());
3850 c_parser_objc_try_catch_statement (parser);
3851 break;
3852 case RID_AT_SYNCHRONIZED:
3853 gcc_assert (c_dialect_objc ());
3854 c_parser_objc_synchronized_statement (parser);
3855 break;
3856 default:
3857 goto expr_stmt;
3859 break;
3860 case CPP_SEMICOLON:
3861 c_parser_consume_token (parser);
3862 break;
3863 case CPP_CLOSE_PAREN:
3864 case CPP_CLOSE_SQUARE:
3865 /* Avoid infinite loop in error recovery:
3866 c_parser_skip_until_found stops at a closing nesting
3867 delimiter without consuming it, but here we need to consume
3868 it to proceed further. */
3869 c_parser_error (parser, "expected statement");
3870 c_parser_consume_token (parser);
3871 break;
3872 case CPP_PRAGMA:
3873 c_parser_pragma (parser, pragma_stmt);
3874 break;
3875 default:
3876 expr_stmt:
3877 stmt = c_finish_expr_stmt (c_parser_expression_conv (parser).value);
3878 expect_semicolon:
3879 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
3880 break;
3882 /* Two cases cannot and do not have line numbers associated: If stmt
3883 is degenerate, such as "2;", then stmt is an INTEGER_CST, which
3884 cannot hold line numbers. But that's OK because the statement
3885 will either be changed to a MODIFY_EXPR during gimplification of
3886 the statement expr, or discarded. If stmt was compound, but
3887 without new variables, we will have skipped the creation of a
3888 BIND and will have a bare STATEMENT_LIST. But that's OK because
3889 (recursively) all of the component statements should already have
3890 line numbers assigned. ??? Can we discard no-op statements
3891 earlier? */
3892 if (stmt && CAN_HAVE_LOCATION_P (stmt))
3893 SET_EXPR_LOCATION (stmt, loc);
3895 parser->in_if_block = in_if_block;
3898 /* Parse a parenthesized condition from an if, do or while statement.
3900 condition:
3901 ( expression )
3903 static tree
3904 c_parser_paren_condition (c_parser *parser)
3906 location_t loc;
3907 tree cond;
3908 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
3909 return error_mark_node;
3910 loc = c_parser_peek_token (parser)->location;
3911 cond = c_objc_common_truthvalue_conversion
3912 (c_parser_expression_conv (parser).value);
3913 if (CAN_HAVE_LOCATION_P (cond))
3914 SET_EXPR_LOCATION (cond, loc);
3915 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
3916 return cond;
3919 /* Parse a statement which is a block in C99. */
3921 static tree
3922 c_parser_c99_block_statement (c_parser *parser)
3924 tree block = c_begin_compound_stmt (flag_isoc99);
3925 c_parser_statement (parser);
3926 return c_end_compound_stmt (block, flag_isoc99);
3929 /* Parse the body of an if statement. This is just parsing a
3930 statement but (a) it is a block in C99, (b) we track whether the
3931 body is an if statement for the sake of -Wparentheses warnings, (c)
3932 we handle an empty body specially for the sake of -Wempty-body
3933 warnings, and (d) we call parser_compound_statement directly
3934 because c_parser_statement_after_labels resets
3935 parser->in_if_block. */
3937 static tree
3938 c_parser_if_body (c_parser *parser, bool *if_p)
3940 tree block = c_begin_compound_stmt (flag_isoc99);
3941 while (c_parser_next_token_is_keyword (parser, RID_CASE)
3942 || c_parser_next_token_is_keyword (parser, RID_DEFAULT)
3943 || (c_parser_next_token_is (parser, CPP_NAME)
3944 && c_parser_peek_2nd_token (parser)->type == CPP_COLON))
3945 c_parser_label (parser);
3946 *if_p = c_parser_next_token_is_keyword (parser, RID_IF);
3947 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
3949 add_stmt (build_empty_stmt ());
3950 c_parser_consume_token (parser);
3952 else if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
3953 add_stmt (c_parser_compound_statement (parser));
3954 else
3955 c_parser_statement_after_labels (parser);
3956 return c_end_compound_stmt (block, flag_isoc99);
3959 /* Parse the else body of an if statement. This is just parsing a
3960 statement but (a) it is a block in C99, (b) we handle an empty body
3961 specially for the sake of -Wempty-body warnings. */
3963 static tree
3964 c_parser_else_body (c_parser *parser)
3966 tree block = c_begin_compound_stmt (flag_isoc99);
3967 while (c_parser_next_token_is_keyword (parser, RID_CASE)
3968 || c_parser_next_token_is_keyword (parser, RID_DEFAULT)
3969 || (c_parser_next_token_is (parser, CPP_NAME)
3970 && c_parser_peek_2nd_token (parser)->type == CPP_COLON))
3971 c_parser_label (parser);
3972 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
3974 add_stmt (build_empty_stmt ());
3975 c_parser_consume_token (parser);
3977 else
3978 c_parser_statement_after_labels (parser);
3979 return c_end_compound_stmt (block, flag_isoc99);
3982 /* Parse an if statement (C90 6.6.4, C99 6.8.4).
3984 if-statement:
3985 if ( expression ) statement
3986 if ( expression ) statement else statement
3989 static void
3990 c_parser_if_statement (c_parser *parser)
3992 tree block;
3993 location_t loc;
3994 tree cond;
3995 bool first_if = false;
3996 tree first_body, second_body;
3997 bool in_if_block;
3999 gcc_assert (c_parser_next_token_is_keyword (parser, RID_IF));
4000 c_parser_consume_token (parser);
4001 block = c_begin_compound_stmt (flag_isoc99);
4002 loc = c_parser_peek_token (parser)->location;
4003 cond = c_parser_paren_condition (parser);
4004 in_if_block = parser->in_if_block;
4005 parser->in_if_block = true;
4006 first_body = c_parser_if_body (parser, &first_if);
4007 parser->in_if_block = in_if_block;
4008 if (c_parser_next_token_is_keyword (parser, RID_ELSE))
4010 c_parser_consume_token (parser);
4011 second_body = c_parser_else_body (parser);
4013 else
4014 second_body = NULL_TREE;
4015 c_finish_if_stmt (loc, cond, first_body, second_body, first_if);
4016 add_stmt (c_end_compound_stmt (block, flag_isoc99));
4019 /* Parse a switch statement (C90 6.6.4, C99 6.8.4).
4021 switch-statement:
4022 switch (expression) statement
4025 static void
4026 c_parser_switch_statement (c_parser *parser)
4028 tree block, expr, body, save_break;
4029 gcc_assert (c_parser_next_token_is_keyword (parser, RID_SWITCH));
4030 c_parser_consume_token (parser);
4031 block = c_begin_compound_stmt (flag_isoc99);
4032 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
4034 expr = c_parser_expression (parser).value;
4035 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
4037 else
4038 expr = error_mark_node;
4039 c_start_case (expr);
4040 save_break = c_break_label;
4041 c_break_label = NULL_TREE;
4042 body = c_parser_c99_block_statement (parser);
4043 c_finish_case (body);
4044 if (c_break_label)
4045 add_stmt (build1 (LABEL_EXPR, void_type_node, c_break_label));
4046 c_break_label = save_break;
4047 add_stmt (c_end_compound_stmt (block, flag_isoc99));
4050 /* Parse a while statement (C90 6.6.5, C99 6.8.5).
4052 while-statement:
4053 while (expression) statement
4056 static void
4057 c_parser_while_statement (c_parser *parser)
4059 tree block, cond, body, save_break, save_cont;
4060 location_t loc;
4061 gcc_assert (c_parser_next_token_is_keyword (parser, RID_WHILE));
4062 c_parser_consume_token (parser);
4063 block = c_begin_compound_stmt (flag_isoc99);
4064 loc = c_parser_peek_token (parser)->location;
4065 cond = c_parser_paren_condition (parser);
4066 save_break = c_break_label;
4067 c_break_label = NULL_TREE;
4068 save_cont = c_cont_label;
4069 c_cont_label = NULL_TREE;
4070 body = c_parser_c99_block_statement (parser);
4071 c_finish_loop (loc, cond, NULL, body, c_break_label, c_cont_label, true);
4072 add_stmt (c_end_compound_stmt (block, flag_isoc99));
4073 c_break_label = save_break;
4074 c_cont_label = save_cont;
4077 /* Parse a do statement (C90 6.6.5, C99 6.8.5).
4079 do-statement:
4080 do statement while ( expression ) ;
4083 static void
4084 c_parser_do_statement (c_parser *parser)
4086 tree block, cond, body, save_break, save_cont, new_break, new_cont;
4087 location_t loc;
4088 gcc_assert (c_parser_next_token_is_keyword (parser, RID_DO));
4089 c_parser_consume_token (parser);
4090 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
4091 warning (OPT_Wempty_body,
4092 "%Hsuggest braces around empty body in %<do%> statement",
4093 &c_parser_peek_token (parser)->location);
4094 block = c_begin_compound_stmt (flag_isoc99);
4095 loc = c_parser_peek_token (parser)->location;
4096 save_break = c_break_label;
4097 c_break_label = NULL_TREE;
4098 save_cont = c_cont_label;
4099 c_cont_label = NULL_TREE;
4100 body = c_parser_c99_block_statement (parser);
4101 c_parser_require_keyword (parser, RID_WHILE, "expected %<while%>");
4102 new_break = c_break_label;
4103 c_break_label = save_break;
4104 new_cont = c_cont_label;
4105 c_cont_label = save_cont;
4106 cond = c_parser_paren_condition (parser);
4107 if (!c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>"))
4108 c_parser_skip_to_end_of_block_or_statement (parser);
4109 c_finish_loop (loc, cond, NULL, body, new_break, new_cont, false);
4110 add_stmt (c_end_compound_stmt (block, flag_isoc99));
4113 /* Parse a for statement (C90 6.6.5, C99 6.8.5).
4115 for-statement:
4116 for ( expression[opt] ; expression[opt] ; expression[opt] ) statement
4117 for ( nested-declaration expression[opt] ; expression[opt] ) statement
4119 The form with a declaration is new in C99.
4121 ??? In accordance with the old parser, the declaration may be a
4122 nested function, which is then rejected in check_for_loop_decls,
4123 but does it make any sense for this to be included in the grammar?
4124 Note in particular that the nested function does not include a
4125 trailing ';', whereas the "declaration" production includes one.
4126 Also, can we reject bad declarations earlier and cheaper than
4127 check_for_loop_decls? */
4129 static void
4130 c_parser_for_statement (c_parser *parser)
4132 tree block, cond, incr, save_break, save_cont, body;
4133 location_t loc;
4134 gcc_assert (c_parser_next_token_is_keyword (parser, RID_FOR));
4135 loc = c_parser_peek_token (parser)->location;
4136 c_parser_consume_token (parser);
4137 block = c_begin_compound_stmt (flag_isoc99);
4138 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
4140 /* Parse the initialization declaration or expression. */
4141 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
4143 c_parser_consume_token (parser);
4144 c_finish_expr_stmt (NULL_TREE);
4146 else if (c_parser_next_token_starts_declspecs (parser))
4148 c_parser_declaration_or_fndef (parser, true, true, true, true);
4149 check_for_loop_decls ();
4151 else if (c_parser_next_token_is_keyword (parser, RID_EXTENSION))
4153 /* __extension__ can start a declaration, but is also an
4154 unary operator that can start an expression. Consume all
4155 but the last of a possible series of __extension__ to
4156 determine which. */
4157 while (c_parser_peek_2nd_token (parser)->type == CPP_KEYWORD
4158 && (c_parser_peek_2nd_token (parser)->keyword
4159 == RID_EXTENSION))
4160 c_parser_consume_token (parser);
4161 if (c_token_starts_declspecs (c_parser_peek_2nd_token (parser)))
4163 int ext;
4164 ext = disable_extension_diagnostics ();
4165 c_parser_consume_token (parser);
4166 c_parser_declaration_or_fndef (parser, true, true, true, true);
4167 restore_extension_diagnostics (ext);
4168 check_for_loop_decls ();
4170 else
4171 goto init_expr;
4173 else
4175 init_expr:
4176 c_finish_expr_stmt (c_parser_expression (parser).value);
4177 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
4179 /* Parse the loop condition. */
4180 loc = c_parser_peek_token (parser)->location;
4181 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
4183 c_parser_consume_token (parser);
4184 cond = NULL_TREE;
4186 else
4188 tree ocond = c_parser_expression_conv (parser).value;
4189 cond = c_objc_common_truthvalue_conversion (ocond);
4190 if (CAN_HAVE_LOCATION_P (cond))
4191 SET_EXPR_LOCATION (cond, loc);
4192 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
4194 /* Parse the increment expression. */
4195 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
4196 incr = c_process_expr_stmt (NULL_TREE);
4197 else
4198 incr = c_process_expr_stmt (c_parser_expression (parser).value);
4199 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
4201 else
4203 cond = error_mark_node;
4204 incr = error_mark_node;
4206 save_break = c_break_label;
4207 c_break_label = NULL_TREE;
4208 save_cont = c_cont_label;
4209 c_cont_label = NULL_TREE;
4210 body = c_parser_c99_block_statement (parser);
4211 c_finish_loop (loc, cond, incr, body, c_break_label, c_cont_label, true);
4212 add_stmt (c_end_compound_stmt (block, flag_isoc99));
4213 c_break_label = save_break;
4214 c_cont_label = save_cont;
4217 /* Parse an asm statement, a GNU extension. This is a full-blown asm
4218 statement with inputs, outputs, clobbers, and volatile tag
4219 allowed.
4221 asm-statement:
4222 asm type-qualifier[opt] ( asm-argument ) ;
4224 asm-argument:
4225 asm-string-literal
4226 asm-string-literal : asm-operands[opt]
4227 asm-string-literal : asm-operands[opt] : asm-operands[opt]
4228 asm-string-literal : asm-operands[opt] : asm-operands[opt] : asm-clobbers
4230 Qualifiers other than volatile are accepted in the syntax but
4231 warned for. */
4233 static tree
4234 c_parser_asm_statement (c_parser *parser)
4236 tree quals, str, outputs, inputs, clobbers, ret;
4237 bool simple;
4238 gcc_assert (c_parser_next_token_is_keyword (parser, RID_ASM));
4239 c_parser_consume_token (parser);
4240 if (c_parser_next_token_is_keyword (parser, RID_VOLATILE))
4242 quals = c_parser_peek_token (parser)->value;
4243 c_parser_consume_token (parser);
4245 else if (c_parser_next_token_is_keyword (parser, RID_CONST)
4246 || c_parser_next_token_is_keyword (parser, RID_RESTRICT))
4248 warning (0, "%H%E qualifier ignored on asm",
4249 &c_parser_peek_token (parser)->location,
4250 c_parser_peek_token (parser)->value);
4251 quals = NULL_TREE;
4252 c_parser_consume_token (parser);
4254 else
4255 quals = NULL_TREE;
4256 /* ??? Follow the C++ parser rather than using the
4257 lex_untranslated_string kludge. */
4258 parser->lex_untranslated_string = true;
4259 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
4261 parser->lex_untranslated_string = false;
4262 return NULL_TREE;
4264 str = c_parser_asm_string_literal (parser);
4265 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
4267 simple = true;
4268 outputs = NULL_TREE;
4269 inputs = NULL_TREE;
4270 clobbers = NULL_TREE;
4271 goto done_asm;
4273 if (!c_parser_require (parser, CPP_COLON, "expected %<:%> or %<)%>"))
4275 parser->lex_untranslated_string = false;
4276 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
4277 return NULL_TREE;
4279 simple = false;
4280 /* Parse outputs. */
4281 if (c_parser_next_token_is (parser, CPP_COLON)
4282 || c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
4283 outputs = NULL_TREE;
4284 else
4285 outputs = c_parser_asm_operands (parser, false);
4286 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
4288 inputs = NULL_TREE;
4289 clobbers = NULL_TREE;
4290 goto done_asm;
4292 if (!c_parser_require (parser, CPP_COLON, "expected %<:%> or %<)%>"))
4294 parser->lex_untranslated_string = false;
4295 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
4296 return NULL_TREE;
4298 /* Parse inputs. */
4299 if (c_parser_next_token_is (parser, CPP_COLON)
4300 || c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
4301 inputs = NULL_TREE;
4302 else
4303 inputs = c_parser_asm_operands (parser, true);
4304 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
4306 clobbers = NULL_TREE;
4307 goto done_asm;
4309 if (!c_parser_require (parser, CPP_COLON, "expected %<:%> or %<)%>"))
4311 parser->lex_untranslated_string = false;
4312 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
4313 return NULL_TREE;
4315 /* Parse clobbers. */
4316 clobbers = c_parser_asm_clobbers (parser);
4317 done_asm:
4318 parser->lex_untranslated_string = false;
4319 if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
4321 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
4322 return NULL_TREE;
4324 if (!c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>"))
4325 c_parser_skip_to_end_of_block_or_statement (parser);
4326 ret = build_asm_stmt (quals, build_asm_expr (str, outputs, inputs,
4327 clobbers, simple));
4328 return ret;
4331 /* Parse asm operands, a GNU extension. If CONVERT_P (for inputs but
4332 not outputs), apply the default conversion of functions and arrays
4333 to pointers.
4335 asm-operands:
4336 asm-operand
4337 asm-operands , asm-operand
4339 asm-operand:
4340 asm-string-literal ( expression )
4341 [ identifier ] asm-string-literal ( expression )
4344 static tree
4345 c_parser_asm_operands (c_parser *parser, bool convert_p)
4347 tree list = NULL_TREE;
4348 while (true)
4350 tree name, str;
4351 struct c_expr expr;
4352 if (c_parser_next_token_is (parser, CPP_OPEN_SQUARE))
4354 c_parser_consume_token (parser);
4355 if (c_parser_next_token_is (parser, CPP_NAME))
4357 tree id = c_parser_peek_token (parser)->value;
4358 c_parser_consume_token (parser);
4359 name = build_string (IDENTIFIER_LENGTH (id),
4360 IDENTIFIER_POINTER (id));
4362 else
4364 c_parser_error (parser, "expected identifier");
4365 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, NULL);
4366 return NULL_TREE;
4368 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
4369 "expected %<]%>");
4371 else
4372 name = NULL_TREE;
4373 str = c_parser_asm_string_literal (parser);
4374 if (str == NULL_TREE)
4375 return NULL_TREE;
4376 parser->lex_untranslated_string = false;
4377 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
4379 parser->lex_untranslated_string = true;
4380 return NULL_TREE;
4382 expr = c_parser_expression (parser);
4383 if (convert_p)
4384 expr = default_function_array_conversion (expr);
4385 parser->lex_untranslated_string = true;
4386 if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
4388 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
4389 return NULL_TREE;
4391 list = chainon (list, build_tree_list (build_tree_list (name, str),
4392 expr.value));
4393 if (c_parser_next_token_is (parser, CPP_COMMA))
4394 c_parser_consume_token (parser);
4395 else
4396 break;
4398 return list;
4401 /* Parse asm clobbers, a GNU extension.
4403 asm-clobbers:
4404 asm-string-literal
4405 asm-clobbers , asm-string-literal
4408 static tree
4409 c_parser_asm_clobbers (c_parser *parser)
4411 tree list = NULL_TREE;
4412 while (true)
4414 tree str = c_parser_asm_string_literal (parser);
4415 if (str)
4416 list = tree_cons (NULL_TREE, str, list);
4417 else
4418 return NULL_TREE;
4419 if (c_parser_next_token_is (parser, CPP_COMMA))
4420 c_parser_consume_token (parser);
4421 else
4422 break;
4424 return list;
4427 /* Parse an expression other than a compound expression; that is, an
4428 assignment expression (C90 6.3.16, C99 6.5.16). If AFTER is not
4429 NULL then it is an Objective-C message expression which is the
4430 primary-expression starting the expression as an initializer.
4432 assignment-expression:
4433 conditional-expression
4434 unary-expression assignment-operator assignment-expression
4436 assignment-operator: one of
4437 = *= /= %= += -= <<= >>= &= ^= |=
4439 In GNU C we accept any conditional expression on the LHS and
4440 diagnose the invalid lvalue rather than producing a syntax
4441 error. */
4443 static struct c_expr
4444 c_parser_expr_no_commas (c_parser *parser, struct c_expr *after)
4446 struct c_expr lhs, rhs, ret;
4447 enum tree_code code;
4448 gcc_assert (!after || c_dialect_objc ());
4449 lhs = c_parser_conditional_expression (parser, after);
4450 switch (c_parser_peek_token (parser)->type)
4452 case CPP_EQ:
4453 code = NOP_EXPR;
4454 break;
4455 case CPP_MULT_EQ:
4456 code = MULT_EXPR;
4457 break;
4458 case CPP_DIV_EQ:
4459 code = TRUNC_DIV_EXPR;
4460 break;
4461 case CPP_MOD_EQ:
4462 code = TRUNC_MOD_EXPR;
4463 break;
4464 case CPP_PLUS_EQ:
4465 code = PLUS_EXPR;
4466 break;
4467 case CPP_MINUS_EQ:
4468 code = MINUS_EXPR;
4469 break;
4470 case CPP_LSHIFT_EQ:
4471 code = LSHIFT_EXPR;
4472 break;
4473 case CPP_RSHIFT_EQ:
4474 code = RSHIFT_EXPR;
4475 break;
4476 case CPP_AND_EQ:
4477 code = BIT_AND_EXPR;
4478 break;
4479 case CPP_XOR_EQ:
4480 code = BIT_XOR_EXPR;
4481 break;
4482 case CPP_OR_EQ:
4483 code = BIT_IOR_EXPR;
4484 break;
4485 default:
4486 return lhs;
4488 c_parser_consume_token (parser);
4489 rhs = c_parser_expr_no_commas (parser, NULL);
4490 rhs = default_function_array_conversion (rhs);
4491 ret.value = build_modify_expr (lhs.value, code, rhs.value);
4492 if (code == NOP_EXPR)
4493 ret.original_code = MODIFY_EXPR;
4494 else
4496 TREE_NO_WARNING (ret.value) = 1;
4497 ret.original_code = ERROR_MARK;
4499 return ret;
4502 /* Parse a conditional expression (C90 6.3.15, C99 6.5.15). If AFTER
4503 is not NULL then it is an Objective-C message expression which is
4504 the primary-expression starting the expression as an initializer.
4506 conditional-expression:
4507 logical-OR-expression
4508 logical-OR-expression ? expression : conditional-expression
4510 GNU extensions:
4512 conditional-expression:
4513 logical-OR-expression ? : conditional-expression
4516 static struct c_expr
4517 c_parser_conditional_expression (c_parser *parser, struct c_expr *after)
4519 struct c_expr cond, exp1, exp2, ret;
4520 gcc_assert (!after || c_dialect_objc ());
4521 cond = c_parser_binary_expression (parser, after);
4522 if (c_parser_next_token_is_not (parser, CPP_QUERY))
4523 return cond;
4524 cond = default_function_array_conversion (cond);
4525 c_parser_consume_token (parser);
4526 if (c_parser_next_token_is (parser, CPP_COLON))
4528 if (pedantic)
4529 pedwarn ("%HISO C forbids omitting the middle term of a ?: expression",
4530 &c_parser_peek_token (parser)->location);
4531 /* Make sure first operand is calculated only once. */
4532 exp1.value = save_expr (default_conversion (cond.value));
4533 cond.value = c_objc_common_truthvalue_conversion (exp1.value);
4534 skip_evaluation += cond.value == truthvalue_true_node;
4536 else
4538 cond.value
4539 = c_objc_common_truthvalue_conversion
4540 (default_conversion (cond.value));
4541 skip_evaluation += cond.value == truthvalue_false_node;
4542 exp1 = c_parser_expression_conv (parser);
4543 skip_evaluation += ((cond.value == truthvalue_true_node)
4544 - (cond.value == truthvalue_false_node));
4546 if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
4548 skip_evaluation -= cond.value == truthvalue_true_node;
4549 ret.value = error_mark_node;
4550 ret.original_code = ERROR_MARK;
4551 return ret;
4553 exp2 = c_parser_conditional_expression (parser, NULL);
4554 exp2 = default_function_array_conversion (exp2);
4555 skip_evaluation -= cond.value == truthvalue_true_node;
4556 ret.value = build_conditional_expr (cond.value, exp1.value, exp2.value);
4557 ret.original_code = ERROR_MARK;
4558 return ret;
4561 /* Parse a binary expression; that is, a logical-OR-expression (C90
4562 6.3.5-6.3.14, C99 6.5.5-6.5.14). If AFTER is not NULL then it is
4563 an Objective-C message expression which is the primary-expression
4564 starting the expression as an initializer.
4566 multiplicative-expression:
4567 cast-expression
4568 multiplicative-expression * cast-expression
4569 multiplicative-expression / cast-expression
4570 multiplicative-expression % cast-expression
4572 additive-expression:
4573 multiplicative-expression
4574 additive-expression + multiplicative-expression
4575 additive-expression - multiplicative-expression
4577 shift-expression:
4578 additive-expression
4579 shift-expression << additive-expression
4580 shift-expression >> additive-expression
4582 relational-expression:
4583 shift-expression
4584 relational-expression < shift-expression
4585 relational-expression > shift-expression
4586 relational-expression <= shift-expression
4587 relational-expression >= shift-expression
4589 equality-expression:
4590 relational-expression
4591 equality-expression == relational-expression
4592 equality-expression != relational-expression
4594 AND-expression:
4595 equality-expression
4596 AND-expression & equality-expression
4598 exclusive-OR-expression:
4599 AND-expression
4600 exclusive-OR-expression ^ AND-expression
4602 inclusive-OR-expression:
4603 exclusive-OR-expression
4604 inclusive-OR-expression | exclusive-OR-expression
4606 logical-AND-expression:
4607 inclusive-OR-expression
4608 logical-AND-expression && inclusive-OR-expression
4610 logical-OR-expression:
4611 logical-AND-expression
4612 logical-OR-expression || logical-AND-expression
4615 static struct c_expr
4616 c_parser_binary_expression (c_parser *parser, struct c_expr *after)
4618 /* A binary expression is parsed using operator-precedence parsing,
4619 with the operands being cast expressions. All the binary
4620 operators are left-associative. Thus a binary expression is of
4621 form:
4623 E0 op1 E1 op2 E2 ...
4625 which we represent on a stack. On the stack, the precedence
4626 levels are strictly increasing. When a new operator is
4627 encountered of higher precedence than that at the top of the
4628 stack, it is pushed; its LHS is the top expression, and its RHS
4629 is everything parsed until it is popped. When a new operator is
4630 encountered with precedence less than or equal to that at the top
4631 of the stack, triples E[i-1] op[i] E[i] are popped and replaced
4632 by the result of the operation until the operator at the top of
4633 the stack has lower precedence than the new operator or there is
4634 only one element on the stack; then the top expression is the LHS
4635 of the new operator. In the case of logical AND and OR
4636 expressions, we also need to adjust skip_evaluation as
4637 appropriate when the operators are pushed and popped. */
4639 /* The precedence levels, where 0 is a dummy lowest level used for
4640 the bottom of the stack. */
4641 enum prec {
4642 PREC_NONE,
4643 PREC_LOGOR,
4644 PREC_LOGAND,
4645 PREC_BITOR,
4646 PREC_BITXOR,
4647 PREC_BITAND,
4648 PREC_EQ,
4649 PREC_REL,
4650 PREC_SHIFT,
4651 PREC_ADD,
4652 PREC_MULT,
4653 NUM_PRECS
4655 struct {
4656 /* The expression at this stack level. */
4657 struct c_expr expr;
4658 /* The precedence of the operator on its left, PREC_NONE at the
4659 bottom of the stack. */
4660 enum prec prec;
4661 /* The operation on its left. */
4662 enum tree_code op;
4663 } stack[NUM_PRECS];
4664 int sp;
4665 #define POP \
4666 do { \
4667 switch (stack[sp].op) \
4669 case TRUTH_ANDIF_EXPR: \
4670 skip_evaluation -= stack[sp - 1].expr.value == truthvalue_false_node; \
4671 break; \
4672 case TRUTH_ORIF_EXPR: \
4673 skip_evaluation -= stack[sp - 1].expr.value == truthvalue_true_node; \
4674 break; \
4675 default: \
4676 break; \
4678 stack[sp - 1].expr \
4679 = default_function_array_conversion (stack[sp - 1].expr); \
4680 stack[sp].expr \
4681 = default_function_array_conversion (stack[sp].expr); \
4682 stack[sp - 1].expr = parser_build_binary_op (stack[sp].op, \
4683 stack[sp - 1].expr, \
4684 stack[sp].expr); \
4685 sp--; \
4686 } while (0)
4687 gcc_assert (!after || c_dialect_objc ());
4688 stack[0].expr = c_parser_cast_expression (parser, after);
4689 stack[0].prec = PREC_NONE;
4690 sp = 0;
4691 while (true)
4693 enum prec oprec;
4694 enum tree_code ocode;
4695 if (parser->error)
4696 goto out;
4697 switch (c_parser_peek_token (parser)->type)
4699 case CPP_MULT:
4700 oprec = PREC_MULT;
4701 ocode = MULT_EXPR;
4702 break;
4703 case CPP_DIV:
4704 oprec = PREC_MULT;
4705 ocode = TRUNC_DIV_EXPR;
4706 break;
4707 case CPP_MOD:
4708 oprec = PREC_MULT;
4709 ocode = TRUNC_MOD_EXPR;
4710 break;
4711 case CPP_PLUS:
4712 oprec = PREC_ADD;
4713 ocode = PLUS_EXPR;
4714 break;
4715 case CPP_MINUS:
4716 oprec = PREC_ADD;
4717 ocode = MINUS_EXPR;
4718 break;
4719 case CPP_LSHIFT:
4720 oprec = PREC_SHIFT;
4721 ocode = LSHIFT_EXPR;
4722 break;
4723 case CPP_RSHIFT:
4724 oprec = PREC_SHIFT;
4725 ocode = RSHIFT_EXPR;
4726 break;
4727 case CPP_LESS:
4728 oprec = PREC_REL;
4729 ocode = LT_EXPR;
4730 break;
4731 case CPP_GREATER:
4732 oprec = PREC_REL;
4733 ocode = GT_EXPR;
4734 break;
4735 case CPP_LESS_EQ:
4736 oprec = PREC_REL;
4737 ocode = LE_EXPR;
4738 break;
4739 case CPP_GREATER_EQ:
4740 oprec = PREC_REL;
4741 ocode = GE_EXPR;
4742 break;
4743 case CPP_EQ_EQ:
4744 oprec = PREC_EQ;
4745 ocode = EQ_EXPR;
4746 break;
4747 case CPP_NOT_EQ:
4748 oprec = PREC_EQ;
4749 ocode = NE_EXPR;
4750 break;
4751 case CPP_AND:
4752 oprec = PREC_BITAND;
4753 ocode = BIT_AND_EXPR;
4754 break;
4755 case CPP_XOR:
4756 oprec = PREC_BITXOR;
4757 ocode = BIT_XOR_EXPR;
4758 break;
4759 case CPP_OR:
4760 oprec = PREC_BITOR;
4761 ocode = BIT_IOR_EXPR;
4762 break;
4763 case CPP_AND_AND:
4764 oprec = PREC_LOGAND;
4765 ocode = TRUTH_ANDIF_EXPR;
4766 break;
4767 case CPP_OR_OR:
4768 oprec = PREC_LOGOR;
4769 ocode = TRUTH_ORIF_EXPR;
4770 break;
4771 default:
4772 /* Not a binary operator, so end of the binary
4773 expression. */
4774 goto out;
4776 c_parser_consume_token (parser);
4777 while (oprec <= stack[sp].prec)
4778 POP;
4779 switch (ocode)
4781 case TRUTH_ANDIF_EXPR:
4782 stack[sp].expr
4783 = default_function_array_conversion (stack[sp].expr);
4784 stack[sp].expr.value = c_objc_common_truthvalue_conversion
4785 (default_conversion (stack[sp].expr.value));
4786 skip_evaluation += stack[sp].expr.value == truthvalue_false_node;
4787 break;
4788 case TRUTH_ORIF_EXPR:
4789 stack[sp].expr
4790 = default_function_array_conversion (stack[sp].expr);
4791 stack[sp].expr.value = c_objc_common_truthvalue_conversion
4792 (default_conversion (stack[sp].expr.value));
4793 skip_evaluation += stack[sp].expr.value == truthvalue_true_node;
4794 break;
4795 default:
4796 break;
4798 sp++;
4799 stack[sp].expr = c_parser_cast_expression (parser, NULL);
4800 stack[sp].prec = oprec;
4801 stack[sp].op = ocode;
4803 out:
4804 while (sp > 0)
4805 POP;
4806 return stack[0].expr;
4807 #undef POP
4810 /* Parse a cast expression (C90 6.3.4, C99 6.5.4). If AFTER is not
4811 NULL then it is an Objective-C message expression which is the
4812 primary-expression starting the expression as an initializer.
4814 cast-expression:
4815 unary-expression
4816 ( type-name ) unary-expression
4819 static struct c_expr
4820 c_parser_cast_expression (c_parser *parser, struct c_expr *after)
4822 gcc_assert (!after || c_dialect_objc ());
4823 if (after)
4824 return c_parser_postfix_expression_after_primary (parser, *after);
4825 /* If the expression begins with a parenthesized type name, it may
4826 be either a cast or a compound literal; we need to see whether
4827 the next character is '{' to tell the difference. If not, it is
4828 an unary expression. */
4829 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)
4830 && c_token_starts_typename (c_parser_peek_2nd_token (parser)))
4832 struct c_type_name *type_name;
4833 struct c_expr ret;
4834 struct c_expr expr;
4835 c_parser_consume_token (parser);
4836 type_name = c_parser_type_name (parser);
4837 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
4838 if (type_name == NULL)
4840 ret.value = error_mark_node;
4841 ret.original_code = ERROR_MARK;
4842 return ret;
4845 /* Save casted types in the function's used types hash table. */
4846 used_types_insert (type_name->specs->type);
4848 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
4849 return c_parser_postfix_expression_after_paren_type (parser,
4850 type_name);
4851 expr = c_parser_cast_expression (parser, NULL);
4852 expr = default_function_array_conversion (expr);
4853 ret.value = c_cast_expr (type_name, expr.value);
4854 ret.original_code = ERROR_MARK;
4855 return ret;
4857 else
4858 return c_parser_unary_expression (parser);
4861 /* Parse an unary expression (C90 6.3.3, C99 6.5.3).
4863 unary-expression:
4864 postfix-expression
4865 ++ unary-expression
4866 -- unary-expression
4867 unary-operator cast-expression
4868 sizeof unary-expression
4869 sizeof ( type-name )
4871 unary-operator: one of
4872 & * + - ~ !
4874 GNU extensions:
4876 unary-expression:
4877 __alignof__ unary-expression
4878 __alignof__ ( type-name )
4879 && identifier
4881 unary-operator: one of
4882 __extension__ __real__ __imag__
4884 In addition, the GNU syntax treats ++ and -- as unary operators, so
4885 they may be applied to cast expressions with errors for non-lvalues
4886 given later. */
4888 static struct c_expr
4889 c_parser_unary_expression (c_parser *parser)
4891 int ext;
4892 struct c_expr ret, op;
4893 switch (c_parser_peek_token (parser)->type)
4895 case CPP_PLUS_PLUS:
4896 c_parser_consume_token (parser);
4897 op = c_parser_cast_expression (parser, NULL);
4898 op = default_function_array_conversion (op);
4899 return parser_build_unary_op (PREINCREMENT_EXPR, op);
4900 case CPP_MINUS_MINUS:
4901 c_parser_consume_token (parser);
4902 op = c_parser_cast_expression (parser, NULL);
4903 op = default_function_array_conversion (op);
4904 return parser_build_unary_op (PREDECREMENT_EXPR, op);
4905 case CPP_AND:
4906 c_parser_consume_token (parser);
4907 return parser_build_unary_op (ADDR_EXPR,
4908 c_parser_cast_expression (parser, NULL));
4909 case CPP_MULT:
4910 c_parser_consume_token (parser);
4911 op = c_parser_cast_expression (parser, NULL);
4912 op = default_function_array_conversion (op);
4913 ret.value = build_indirect_ref (op.value, "unary *");
4914 ret.original_code = ERROR_MARK;
4915 return ret;
4916 case CPP_PLUS:
4917 if (!c_dialect_objc () && !in_system_header)
4918 warning (OPT_Wtraditional,
4919 "%Htraditional C rejects the unary plus operator",
4920 &c_parser_peek_token (parser)->location);
4921 c_parser_consume_token (parser);
4922 op = c_parser_cast_expression (parser, NULL);
4923 op = default_function_array_conversion (op);
4924 return parser_build_unary_op (CONVERT_EXPR, op);
4925 case CPP_MINUS:
4926 c_parser_consume_token (parser);
4927 op = c_parser_cast_expression (parser, NULL);
4928 op = default_function_array_conversion (op);
4929 return parser_build_unary_op (NEGATE_EXPR, op);
4930 case CPP_COMPL:
4931 c_parser_consume_token (parser);
4932 op = c_parser_cast_expression (parser, NULL);
4933 op = default_function_array_conversion (op);
4934 return parser_build_unary_op (BIT_NOT_EXPR, op);
4935 case CPP_NOT:
4936 c_parser_consume_token (parser);
4937 op = c_parser_cast_expression (parser, NULL);
4938 op = default_function_array_conversion (op);
4939 return parser_build_unary_op (TRUTH_NOT_EXPR, op);
4940 case CPP_AND_AND:
4941 /* Refer to the address of a label as a pointer. */
4942 c_parser_consume_token (parser);
4943 if (c_parser_next_token_is (parser, CPP_NAME))
4945 ret.value = finish_label_address_expr
4946 (c_parser_peek_token (parser)->value);
4947 c_parser_consume_token (parser);
4949 else
4951 c_parser_error (parser, "expected identifier");
4952 ret.value = error_mark_node;
4954 ret.original_code = ERROR_MARK;
4955 return ret;
4956 case CPP_KEYWORD:
4957 switch (c_parser_peek_token (parser)->keyword)
4959 case RID_SIZEOF:
4960 return c_parser_sizeof_expression (parser);
4961 case RID_ALIGNOF:
4962 return c_parser_alignof_expression (parser);
4963 case RID_EXTENSION:
4964 c_parser_consume_token (parser);
4965 ext = disable_extension_diagnostics ();
4966 ret = c_parser_cast_expression (parser, NULL);
4967 restore_extension_diagnostics (ext);
4968 return ret;
4969 case RID_REALPART:
4970 c_parser_consume_token (parser);
4971 op = c_parser_cast_expression (parser, NULL);
4972 op = default_function_array_conversion (op);
4973 return parser_build_unary_op (REALPART_EXPR, op);
4974 case RID_IMAGPART:
4975 c_parser_consume_token (parser);
4976 op = c_parser_cast_expression (parser, NULL);
4977 op = default_function_array_conversion (op);
4978 return parser_build_unary_op (IMAGPART_EXPR, op);
4979 default:
4980 return c_parser_postfix_expression (parser);
4982 default:
4983 return c_parser_postfix_expression (parser);
4987 /* Parse a sizeof expression. */
4989 static struct c_expr
4990 c_parser_sizeof_expression (c_parser *parser)
4992 struct c_expr expr;
4993 location_t expr_loc;
4994 gcc_assert (c_parser_next_token_is_keyword (parser, RID_SIZEOF));
4995 c_parser_consume_token (parser);
4996 skip_evaluation++;
4997 in_sizeof++;
4998 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)
4999 && c_token_starts_typename (c_parser_peek_2nd_token (parser)))
5001 /* Either sizeof ( type-name ) or sizeof unary-expression
5002 starting with a compound literal. */
5003 struct c_type_name *type_name;
5004 c_parser_consume_token (parser);
5005 expr_loc = c_parser_peek_token (parser)->location;
5006 type_name = c_parser_type_name (parser);
5007 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
5008 if (type_name == NULL)
5010 struct c_expr ret;
5011 skip_evaluation--;
5012 in_sizeof--;
5013 ret.value = error_mark_node;
5014 ret.original_code = ERROR_MARK;
5015 return ret;
5017 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
5019 expr = c_parser_postfix_expression_after_paren_type (parser,
5020 type_name);
5021 goto sizeof_expr;
5023 /* sizeof ( type-name ). */
5024 skip_evaluation--;
5025 in_sizeof--;
5026 if (type_name->declarator->kind == cdk_array
5027 && type_name->declarator->u.array.vla_unspec_p)
5029 /* C99 6.7.5.2p4 */
5030 error ("%H%<[*]%> not allowed in other than a declaration",
5031 &expr_loc);
5033 return c_expr_sizeof_type (type_name);
5035 else
5037 expr_loc = c_parser_peek_token (parser)->location;
5038 expr = c_parser_unary_expression (parser);
5039 sizeof_expr:
5040 skip_evaluation--;
5041 in_sizeof--;
5042 if (TREE_CODE (expr.value) == COMPONENT_REF
5043 && DECL_C_BIT_FIELD (TREE_OPERAND (expr.value, 1)))
5044 error ("%H%<sizeof%> applied to a bit-field", &expr_loc);
5045 return c_expr_sizeof_expr (expr);
5049 /* Parse an alignof expression. */
5051 static struct c_expr
5052 c_parser_alignof_expression (c_parser *parser)
5054 struct c_expr expr;
5055 gcc_assert (c_parser_next_token_is_keyword (parser, RID_ALIGNOF));
5056 c_parser_consume_token (parser);
5057 skip_evaluation++;
5058 in_alignof++;
5059 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)
5060 && c_token_starts_typename (c_parser_peek_2nd_token (parser)))
5062 /* Either __alignof__ ( type-name ) or __alignof__
5063 unary-expression starting with a compound literal. */
5064 struct c_type_name *type_name;
5065 struct c_expr ret;
5066 c_parser_consume_token (parser);
5067 type_name = c_parser_type_name (parser);
5068 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
5069 if (type_name == NULL)
5071 struct c_expr ret;
5072 skip_evaluation--;
5073 in_alignof--;
5074 ret.value = error_mark_node;
5075 ret.original_code = ERROR_MARK;
5076 return ret;
5078 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
5080 expr = c_parser_postfix_expression_after_paren_type (parser,
5081 type_name);
5082 goto alignof_expr;
5084 /* alignof ( type-name ). */
5085 skip_evaluation--;
5086 in_alignof--;
5087 ret.value = c_alignof (groktypename (type_name));
5088 ret.original_code = ERROR_MARK;
5089 return ret;
5091 else
5093 struct c_expr ret;
5094 expr = c_parser_unary_expression (parser);
5095 alignof_expr:
5096 skip_evaluation--;
5097 in_alignof--;
5098 ret.value = c_alignof_expr (expr.value);
5099 ret.original_code = ERROR_MARK;
5100 return ret;
5104 /* Parse a postfix expression (C90 6.3.1-6.3.2, C99 6.5.1-6.5.2).
5106 postfix-expression:
5107 primary-expression
5108 postfix-expression [ expression ]
5109 postfix-expression ( argument-expression-list[opt] )
5110 postfix-expression . identifier
5111 postfix-expression -> identifier
5112 postfix-expression ++
5113 postfix-expression --
5114 ( type-name ) { initializer-list }
5115 ( type-name ) { initializer-list , }
5117 argument-expression-list:
5118 argument-expression
5119 argument-expression-list , argument-expression
5121 primary-expression:
5122 identifier
5123 constant
5124 string-literal
5125 ( expression )
5127 GNU extensions:
5129 primary-expression:
5130 __func__
5131 (treated as a keyword in GNU C)
5132 __FUNCTION__
5133 __PRETTY_FUNCTION__
5134 ( compound-statement )
5135 __builtin_va_arg ( assignment-expression , type-name )
5136 __builtin_offsetof ( type-name , offsetof-member-designator )
5137 __builtin_choose_expr ( assignment-expression ,
5138 assignment-expression ,
5139 assignment-expression )
5140 __builtin_types_compatible_p ( type-name , type-name )
5142 offsetof-member-designator:
5143 identifier
5144 offsetof-member-designator . identifier
5145 offsetof-member-designator [ expression ]
5147 Objective-C:
5149 primary-expression:
5150 [ objc-receiver objc-message-args ]
5151 @selector ( objc-selector-arg )
5152 @protocol ( identifier )
5153 @encode ( type-name )
5154 objc-string-literal
5157 static struct c_expr
5158 c_parser_postfix_expression (c_parser *parser)
5160 struct c_expr expr, e1, e2, e3;
5161 struct c_type_name *t1, *t2;
5162 location_t loc;
5163 switch (c_parser_peek_token (parser)->type)
5165 case CPP_NUMBER:
5166 case CPP_CHAR:
5167 case CPP_CHAR16:
5168 case CPP_CHAR32:
5169 case CPP_WCHAR:
5170 expr.value = c_parser_peek_token (parser)->value;
5171 expr.original_code = ERROR_MARK;
5172 c_parser_consume_token (parser);
5173 break;
5174 case CPP_STRING:
5175 case CPP_STRING16:
5176 case CPP_STRING32:
5177 case CPP_WSTRING:
5178 expr.value = c_parser_peek_token (parser)->value;
5179 expr.original_code = STRING_CST;
5180 c_parser_consume_token (parser);
5181 break;
5182 case CPP_OBJC_STRING:
5183 gcc_assert (c_dialect_objc ());
5184 expr.value
5185 = objc_build_string_object (c_parser_peek_token (parser)->value);
5186 expr.original_code = ERROR_MARK;
5187 c_parser_consume_token (parser);
5188 break;
5189 case CPP_NAME:
5190 if (c_parser_peek_token (parser)->id_kind != C_ID_ID)
5192 c_parser_error (parser, "expected expression");
5193 expr.value = error_mark_node;
5194 expr.original_code = ERROR_MARK;
5195 break;
5198 tree id = c_parser_peek_token (parser)->value;
5199 location_t loc = c_parser_peek_token (parser)->location;
5200 c_parser_consume_token (parser);
5201 expr.value = build_external_ref (id,
5202 (c_parser_peek_token (parser)->type
5203 == CPP_OPEN_PAREN), loc);
5204 expr.original_code = ERROR_MARK;
5206 break;
5207 case CPP_OPEN_PAREN:
5208 /* A parenthesized expression, statement expression or compound
5209 literal. */
5210 if (c_parser_peek_2nd_token (parser)->type == CPP_OPEN_BRACE)
5212 /* A statement expression. */
5213 tree stmt;
5214 location_t here = c_parser_peek_token (parser)->location;
5215 c_parser_consume_token (parser);
5216 c_parser_consume_token (parser);
5217 if (cur_stmt_list == NULL)
5219 error ("%Hbraced-group within expression allowed "
5220 "only inside a function", &here);
5221 parser->error = true;
5222 c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL);
5223 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5224 expr.value = error_mark_node;
5225 expr.original_code = ERROR_MARK;
5226 break;
5228 stmt = c_begin_stmt_expr ();
5229 c_parser_compound_statement_nostart (parser);
5230 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5231 "expected %<)%>");
5232 if (pedantic)
5233 pedwarn ("%HISO C forbids braced-groups within expressions",
5234 &here);
5235 expr.value = c_finish_stmt_expr (stmt);
5236 expr.original_code = ERROR_MARK;
5238 else if (c_token_starts_typename (c_parser_peek_2nd_token (parser)))
5240 /* A compound literal. ??? Can we actually get here rather
5241 than going directly to
5242 c_parser_postfix_expression_after_paren_type from
5243 elsewhere? */
5244 struct c_type_name *type_name;
5245 c_parser_consume_token (parser);
5246 type_name = c_parser_type_name (parser);
5247 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5248 "expected %<)%>");
5249 if (type_name == NULL)
5251 expr.value = error_mark_node;
5252 expr.original_code = ERROR_MARK;
5254 else
5255 expr = c_parser_postfix_expression_after_paren_type (parser,
5256 type_name);
5258 else
5260 /* A parenthesized expression. */
5261 c_parser_consume_token (parser);
5262 expr = c_parser_expression (parser);
5263 if (TREE_CODE (expr.value) == MODIFY_EXPR)
5264 TREE_NO_WARNING (expr.value) = 1;
5265 expr.original_code = ERROR_MARK;
5266 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5267 "expected %<)%>");
5269 break;
5270 case CPP_KEYWORD:
5271 switch (c_parser_peek_token (parser)->keyword)
5273 case RID_FUNCTION_NAME:
5274 case RID_PRETTY_FUNCTION_NAME:
5275 case RID_C99_FUNCTION_NAME:
5276 expr.value = fname_decl (c_parser_peek_token (parser)->keyword,
5277 c_parser_peek_token (parser)->value);
5278 expr.original_code = ERROR_MARK;
5279 c_parser_consume_token (parser);
5280 break;
5281 case RID_VA_ARG:
5282 c_parser_consume_token (parser);
5283 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5285 expr.value = error_mark_node;
5286 expr.original_code = ERROR_MARK;
5287 break;
5289 e1 = c_parser_expr_no_commas (parser, NULL);
5290 if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
5292 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5293 expr.value = error_mark_node;
5294 expr.original_code = ERROR_MARK;
5295 break;
5297 t1 = c_parser_type_name (parser);
5298 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5299 "expected %<)%>");
5300 if (t1 == NULL)
5302 expr.value = error_mark_node;
5303 expr.original_code = ERROR_MARK;
5305 else
5307 expr.value = build_va_arg (e1.value, groktypename (t1));
5308 expr.original_code = ERROR_MARK;
5310 break;
5311 case RID_OFFSETOF:
5312 c_parser_consume_token (parser);
5313 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5315 expr.value = error_mark_node;
5316 expr.original_code = ERROR_MARK;
5317 break;
5319 t1 = c_parser_type_name (parser);
5320 if (t1 == NULL)
5322 expr.value = error_mark_node;
5323 expr.original_code = ERROR_MARK;
5324 break;
5326 if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
5328 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5329 expr.value = error_mark_node;
5330 expr.original_code = ERROR_MARK;
5331 break;
5334 tree type = groktypename (t1);
5335 tree offsetof_ref;
5336 if (type == error_mark_node)
5337 offsetof_ref = error_mark_node;
5338 else
5339 offsetof_ref = build1 (INDIRECT_REF, type, null_pointer_node);
5340 /* Parse the second argument to __builtin_offsetof. We
5341 must have one identifier, and beyond that we want to
5342 accept sub structure and sub array references. */
5343 if (c_parser_next_token_is (parser, CPP_NAME))
5345 offsetof_ref = build_component_ref
5346 (offsetof_ref, c_parser_peek_token (parser)->value);
5347 c_parser_consume_token (parser);
5348 while (c_parser_next_token_is (parser, CPP_DOT)
5349 || c_parser_next_token_is (parser,
5350 CPP_OPEN_SQUARE))
5352 if (c_parser_next_token_is (parser, CPP_DOT))
5354 c_parser_consume_token (parser);
5355 if (c_parser_next_token_is_not (parser,
5356 CPP_NAME))
5358 c_parser_error (parser, "expected identifier");
5359 break;
5361 offsetof_ref = build_component_ref
5362 (offsetof_ref,
5363 c_parser_peek_token (parser)->value);
5364 c_parser_consume_token (parser);
5366 else
5368 tree idx;
5369 c_parser_consume_token (parser);
5370 idx = c_parser_expression (parser).value;
5371 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
5372 "expected %<]%>");
5373 offsetof_ref = build_array_ref (offsetof_ref, idx);
5377 else
5378 c_parser_error (parser, "expected identifier");
5379 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5380 "expected %<)%>");
5381 expr.value = fold_offsetof (offsetof_ref, NULL_TREE);
5382 expr.original_code = ERROR_MARK;
5384 break;
5385 case RID_CHOOSE_EXPR:
5386 c_parser_consume_token (parser);
5387 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5389 expr.value = error_mark_node;
5390 expr.original_code = ERROR_MARK;
5391 break;
5393 loc = c_parser_peek_token (parser)->location;
5394 e1 = c_parser_expr_no_commas (parser, NULL);
5395 if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
5397 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5398 expr.value = error_mark_node;
5399 expr.original_code = ERROR_MARK;
5400 break;
5402 e2 = c_parser_expr_no_commas (parser, NULL);
5403 if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
5405 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5406 expr.value = error_mark_node;
5407 expr.original_code = ERROR_MARK;
5408 break;
5410 e3 = c_parser_expr_no_commas (parser, NULL);
5411 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5412 "expected %<)%>");
5414 tree c;
5416 c = fold (e1.value);
5417 if (TREE_CODE (c) != INTEGER_CST)
5418 error ("%Hfirst argument to %<__builtin_choose_expr%> not"
5419 " a constant", &loc);
5420 expr = integer_zerop (c) ? e3 : e2;
5422 break;
5423 case RID_TYPES_COMPATIBLE_P:
5424 c_parser_consume_token (parser);
5425 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5427 expr.value = error_mark_node;
5428 expr.original_code = ERROR_MARK;
5429 break;
5431 t1 = c_parser_type_name (parser);
5432 if (t1 == NULL)
5434 expr.value = error_mark_node;
5435 expr.original_code = ERROR_MARK;
5436 break;
5438 if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
5440 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5441 expr.value = error_mark_node;
5442 expr.original_code = ERROR_MARK;
5443 break;
5445 t2 = c_parser_type_name (parser);
5446 if (t2 == NULL)
5448 expr.value = error_mark_node;
5449 expr.original_code = ERROR_MARK;
5450 break;
5452 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5453 "expected %<)%>");
5455 tree e1, e2;
5457 e1 = TYPE_MAIN_VARIANT (groktypename (t1));
5458 e2 = TYPE_MAIN_VARIANT (groktypename (t2));
5460 expr.value = comptypes (e1, e2)
5461 ? build_int_cst (NULL_TREE, 1)
5462 : build_int_cst (NULL_TREE, 0);
5463 expr.original_code = ERROR_MARK;
5465 break;
5466 case RID_AT_SELECTOR:
5467 gcc_assert (c_dialect_objc ());
5468 c_parser_consume_token (parser);
5469 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5471 expr.value = error_mark_node;
5472 expr.original_code = ERROR_MARK;
5473 break;
5476 tree sel = c_parser_objc_selector_arg (parser);
5477 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5478 "expected %<)%>");
5479 expr.value = objc_build_selector_expr (sel);
5480 expr.original_code = ERROR_MARK;
5482 break;
5483 case RID_AT_PROTOCOL:
5484 gcc_assert (c_dialect_objc ());
5485 c_parser_consume_token (parser);
5486 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5488 expr.value = error_mark_node;
5489 expr.original_code = ERROR_MARK;
5490 break;
5492 if (c_parser_next_token_is_not (parser, CPP_NAME))
5494 c_parser_error (parser, "expected identifier");
5495 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5496 expr.value = error_mark_node;
5497 expr.original_code = ERROR_MARK;
5498 break;
5501 tree id = c_parser_peek_token (parser)->value;
5502 c_parser_consume_token (parser);
5503 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5504 "expected %<)%>");
5505 expr.value = objc_build_protocol_expr (id);
5506 expr.original_code = ERROR_MARK;
5508 break;
5509 case RID_AT_ENCODE:
5510 /* Extension to support C-structures in the archiver. */
5511 gcc_assert (c_dialect_objc ());
5512 c_parser_consume_token (parser);
5513 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5515 expr.value = error_mark_node;
5516 expr.original_code = ERROR_MARK;
5517 break;
5519 t1 = c_parser_type_name (parser);
5520 if (t1 == NULL)
5522 expr.value = error_mark_node;
5523 expr.original_code = ERROR_MARK;
5524 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5525 break;
5527 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5528 "expected %<)%>");
5530 tree type = groktypename (t1);
5531 expr.value = objc_build_encode_expr (type);
5532 expr.original_code = ERROR_MARK;
5534 break;
5535 default:
5536 c_parser_error (parser, "expected expression");
5537 expr.value = error_mark_node;
5538 expr.original_code = ERROR_MARK;
5539 break;
5541 break;
5542 case CPP_OPEN_SQUARE:
5543 if (c_dialect_objc ())
5545 tree receiver, args;
5546 c_parser_consume_token (parser);
5547 receiver = c_parser_objc_receiver (parser);
5548 args = c_parser_objc_message_args (parser);
5549 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
5550 "expected %<]%>");
5551 expr.value = objc_build_message_expr (build_tree_list (receiver,
5552 args));
5553 expr.original_code = ERROR_MARK;
5554 break;
5556 /* Else fall through to report error. */
5557 default:
5558 c_parser_error (parser, "expected expression");
5559 expr.value = error_mark_node;
5560 expr.original_code = ERROR_MARK;
5561 break;
5563 return c_parser_postfix_expression_after_primary (parser, expr);
5566 /* Parse a postfix expression after a parenthesized type name: the
5567 brace-enclosed initializer of a compound literal, possibly followed
5568 by some postfix operators. This is separate because it is not
5569 possible to tell until after the type name whether a cast
5570 expression has a cast or a compound literal, or whether the operand
5571 of sizeof is a parenthesized type name or starts with a compound
5572 literal. */
5574 static struct c_expr
5575 c_parser_postfix_expression_after_paren_type (c_parser *parser,
5576 struct c_type_name *type_name)
5578 tree type;
5579 struct c_expr init;
5580 struct c_expr expr;
5581 location_t start_loc;
5582 start_init (NULL_TREE, NULL, 0);
5583 type = groktypename (type_name);
5584 start_loc = c_parser_peek_token (parser)->location;
5585 if (type != error_mark_node && C_TYPE_VARIABLE_SIZE (type))
5587 error ("%Hcompound literal has variable size", &start_loc);
5588 type = error_mark_node;
5590 init = c_parser_braced_init (parser, type, false);
5591 finish_init ();
5592 maybe_warn_string_init (type, init);
5594 if (pedantic && !flag_isoc99)
5595 pedwarn ("%HISO C90 forbids compound literals", &start_loc);
5596 expr.value = build_compound_literal (type, init.value);
5597 expr.original_code = ERROR_MARK;
5598 return c_parser_postfix_expression_after_primary (parser, expr);
5601 /* Parse a postfix expression after the initial primary or compound
5602 literal; that is, parse a series of postfix operators. */
5604 static struct c_expr
5605 c_parser_postfix_expression_after_primary (c_parser *parser,
5606 struct c_expr expr)
5608 tree ident, idx, exprlist;
5609 while (true)
5611 switch (c_parser_peek_token (parser)->type)
5613 case CPP_OPEN_SQUARE:
5614 /* Array reference. */
5615 c_parser_consume_token (parser);
5616 idx = c_parser_expression (parser).value;
5617 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
5618 "expected %<]%>");
5619 expr.value = build_array_ref (expr.value, idx);
5620 expr.original_code = ERROR_MARK;
5621 break;
5622 case CPP_OPEN_PAREN:
5623 /* Function call. */
5624 c_parser_consume_token (parser);
5625 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
5626 exprlist = NULL_TREE;
5627 else
5628 exprlist = c_parser_expr_list (parser, true);
5629 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5630 "expected %<)%>");
5631 expr.value = build_function_call (expr.value, exprlist);
5632 expr.original_code = ERROR_MARK;
5633 break;
5634 case CPP_DOT:
5635 /* Structure element reference. */
5636 c_parser_consume_token (parser);
5637 expr = default_function_array_conversion (expr);
5638 if (c_parser_next_token_is (parser, CPP_NAME))
5639 ident = c_parser_peek_token (parser)->value;
5640 else
5642 c_parser_error (parser, "expected identifier");
5643 expr.value = error_mark_node;
5644 expr.original_code = ERROR_MARK;
5645 return expr;
5647 c_parser_consume_token (parser);
5648 expr.value = build_component_ref (expr.value, ident);
5649 expr.original_code = ERROR_MARK;
5650 break;
5651 case CPP_DEREF:
5652 /* Structure element reference. */
5653 c_parser_consume_token (parser);
5654 expr = default_function_array_conversion (expr);
5655 if (c_parser_next_token_is (parser, CPP_NAME))
5656 ident = c_parser_peek_token (parser)->value;
5657 else
5659 c_parser_error (parser, "expected identifier");
5660 expr.value = error_mark_node;
5661 expr.original_code = ERROR_MARK;
5662 return expr;
5664 c_parser_consume_token (parser);
5665 expr.value = build_component_ref (build_indirect_ref (expr.value,
5666 "->"), ident);
5667 expr.original_code = ERROR_MARK;
5668 break;
5669 case CPP_PLUS_PLUS:
5670 /* Postincrement. */
5671 c_parser_consume_token (parser);
5672 expr = default_function_array_conversion (expr);
5673 expr.value = build_unary_op (POSTINCREMENT_EXPR, expr.value, 0);
5674 expr.original_code = ERROR_MARK;
5675 break;
5676 case CPP_MINUS_MINUS:
5677 /* Postdecrement. */
5678 c_parser_consume_token (parser);
5679 expr = default_function_array_conversion (expr);
5680 expr.value = build_unary_op (POSTDECREMENT_EXPR, expr.value, 0);
5681 expr.original_code = ERROR_MARK;
5682 break;
5683 default:
5684 return expr;
5689 /* Parse an expression (C90 6.3.17, C99 6.5.17).
5691 expression:
5692 assignment-expression
5693 expression , assignment-expression
5696 static struct c_expr
5697 c_parser_expression (c_parser *parser)
5699 struct c_expr expr;
5700 expr = c_parser_expr_no_commas (parser, NULL);
5701 while (c_parser_next_token_is (parser, CPP_COMMA))
5703 struct c_expr next;
5704 c_parser_consume_token (parser);
5705 next = c_parser_expr_no_commas (parser, NULL);
5706 next = default_function_array_conversion (next);
5707 expr.value = build_compound_expr (expr.value, next.value);
5708 expr.original_code = COMPOUND_EXPR;
5710 return expr;
5713 /* Parse an expression and convert functions or arrays to
5714 pointers. */
5716 static struct c_expr
5717 c_parser_expression_conv (c_parser *parser)
5719 struct c_expr expr;
5720 expr = c_parser_expression (parser);
5721 expr = default_function_array_conversion (expr);
5722 return expr;
5725 /* Parse a non-empty list of expressions. If CONVERT_P, convert
5726 functions and arrays to pointers.
5728 nonempty-expr-list:
5729 assignment-expression
5730 nonempty-expr-list , assignment-expression
5733 static tree
5734 c_parser_expr_list (c_parser *parser, bool convert_p)
5736 struct c_expr expr;
5737 tree ret, cur;
5738 expr = c_parser_expr_no_commas (parser, NULL);
5739 if (convert_p)
5740 expr = default_function_array_conversion (expr);
5741 ret = cur = build_tree_list (NULL_TREE, expr.value);
5742 while (c_parser_next_token_is (parser, CPP_COMMA))
5744 c_parser_consume_token (parser);
5745 expr = c_parser_expr_no_commas (parser, NULL);
5746 if (convert_p)
5747 expr = default_function_array_conversion (expr);
5748 cur = TREE_CHAIN (cur) = build_tree_list (NULL_TREE, expr.value);
5750 return ret;
5754 /* Parse Objective-C-specific constructs. */
5756 /* Parse an objc-class-definition.
5758 objc-class-definition:
5759 @interface identifier objc-superclass[opt] objc-protocol-refs[opt]
5760 objc-class-instance-variables[opt] objc-methodprotolist @end
5761 @implementation identifier objc-superclass[opt]
5762 objc-class-instance-variables[opt]
5763 @interface identifier ( identifier ) objc-protocol-refs[opt]
5764 objc-methodprotolist @end
5765 @implementation identifier ( identifier )
5767 objc-superclass:
5768 : identifier
5770 "@interface identifier (" must start "@interface identifier (
5771 identifier ) ...": objc-methodprotolist in the first production may
5772 not start with a parenthesized identifier as a declarator of a data
5773 definition with no declaration specifiers if the objc-superclass,
5774 objc-protocol-refs and objc-class-instance-variables are omitted. */
5776 static void
5777 c_parser_objc_class_definition (c_parser *parser)
5779 bool iface_p;
5780 tree id1;
5781 tree superclass;
5782 if (c_parser_next_token_is_keyword (parser, RID_AT_INTERFACE))
5783 iface_p = true;
5784 else if (c_parser_next_token_is_keyword (parser, RID_AT_IMPLEMENTATION))
5785 iface_p = false;
5786 else
5787 gcc_unreachable ();
5788 c_parser_consume_token (parser);
5789 if (c_parser_next_token_is_not (parser, CPP_NAME))
5791 c_parser_error (parser, "expected identifier");
5792 return;
5794 id1 = c_parser_peek_token (parser)->value;
5795 c_parser_consume_token (parser);
5796 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
5798 tree id2;
5799 tree proto = NULL_TREE;
5800 c_parser_consume_token (parser);
5801 if (c_parser_next_token_is_not (parser, CPP_NAME))
5803 c_parser_error (parser, "expected identifier");
5804 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5805 return;
5807 id2 = c_parser_peek_token (parser)->value;
5808 c_parser_consume_token (parser);
5809 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
5810 if (!iface_p)
5812 objc_start_category_implementation (id1, id2);
5813 return;
5815 if (c_parser_next_token_is (parser, CPP_LESS))
5816 proto = c_parser_objc_protocol_refs (parser);
5817 objc_start_category_interface (id1, id2, proto);
5818 c_parser_objc_methodprotolist (parser);
5819 c_parser_require_keyword (parser, RID_AT_END, "expected %<@end%>");
5820 objc_finish_interface ();
5821 return;
5823 if (c_parser_next_token_is (parser, CPP_COLON))
5825 c_parser_consume_token (parser);
5826 if (c_parser_next_token_is_not (parser, CPP_NAME))
5828 c_parser_error (parser, "expected identifier");
5829 return;
5831 superclass = c_parser_peek_token (parser)->value;
5832 c_parser_consume_token (parser);
5834 else
5835 superclass = NULL_TREE;
5836 if (iface_p)
5838 tree proto = NULL_TREE;
5839 if (c_parser_next_token_is (parser, CPP_LESS))
5840 proto = c_parser_objc_protocol_refs (parser);
5841 objc_start_class_interface (id1, superclass, proto);
5843 else
5844 objc_start_class_implementation (id1, superclass);
5845 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
5846 c_parser_objc_class_instance_variables (parser);
5847 if (iface_p)
5849 objc_continue_interface ();
5850 c_parser_objc_methodprotolist (parser);
5851 c_parser_require_keyword (parser, RID_AT_END, "expected %<@end%>");
5852 objc_finish_interface ();
5854 else
5856 objc_continue_implementation ();
5857 return;
5861 /* Parse objc-class-instance-variables.
5863 objc-class-instance-variables:
5864 { objc-instance-variable-decl-list[opt] }
5866 objc-instance-variable-decl-list:
5867 objc-visibility-spec
5868 objc-instance-variable-decl ;
5870 objc-instance-variable-decl-list objc-visibility-spec
5871 objc-instance-variable-decl-list objc-instance-variable-decl ;
5872 objc-instance-variable-decl-list ;
5874 objc-visibility-spec:
5875 @private
5876 @protected
5877 @public
5879 objc-instance-variable-decl:
5880 struct-declaration
5883 static void
5884 c_parser_objc_class_instance_variables (c_parser *parser)
5886 gcc_assert (c_parser_next_token_is (parser, CPP_OPEN_BRACE));
5887 c_parser_consume_token (parser);
5888 while (c_parser_next_token_is_not (parser, CPP_EOF))
5890 tree decls;
5891 /* Parse any stray semicolon. */
5892 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
5894 if (pedantic)
5895 pedwarn ("%Hextra semicolon in struct or union specified",
5896 &c_parser_peek_token (parser)->location);
5897 c_parser_consume_token (parser);
5898 continue;
5900 /* Stop if at the end of the instance variables. */
5901 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
5903 c_parser_consume_token (parser);
5904 break;
5906 /* Parse any objc-visibility-spec. */
5907 if (c_parser_next_token_is_keyword (parser, RID_AT_PRIVATE))
5909 c_parser_consume_token (parser);
5910 objc_set_visibility (2);
5911 continue;
5913 else if (c_parser_next_token_is_keyword (parser, RID_AT_PROTECTED))
5915 c_parser_consume_token (parser);
5916 objc_set_visibility (0);
5917 continue;
5919 else if (c_parser_next_token_is_keyword (parser, RID_AT_PUBLIC))
5921 c_parser_consume_token (parser);
5922 objc_set_visibility (1);
5923 continue;
5925 else if (c_parser_next_token_is (parser, CPP_PRAGMA))
5927 c_parser_pragma (parser, pragma_external);
5928 continue;
5931 /* Parse some comma-separated declarations. */
5932 decls = c_parser_struct_declaration (parser);
5934 /* Comma-separated instance variables are chained together in
5935 reverse order; add them one by one. */
5936 tree ivar = nreverse (decls);
5937 for (; ivar; ivar = TREE_CHAIN (ivar))
5938 objc_add_instance_variable (copy_node (ivar));
5940 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
5944 /* Parse an objc-class-declaration.
5946 objc-class-declaration:
5947 @class identifier-list ;
5950 static void
5951 c_parser_objc_class_declaration (c_parser *parser)
5953 tree list = NULL_TREE;
5954 gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_CLASS));
5955 c_parser_consume_token (parser);
5956 /* Any identifiers, including those declared as type names, are OK
5957 here. */
5958 while (true)
5960 tree id;
5961 if (c_parser_next_token_is_not (parser, CPP_NAME))
5963 c_parser_error (parser, "expected identifier");
5964 break;
5966 id = c_parser_peek_token (parser)->value;
5967 list = chainon (list, build_tree_list (NULL_TREE, id));
5968 c_parser_consume_token (parser);
5969 if (c_parser_next_token_is (parser, CPP_COMMA))
5970 c_parser_consume_token (parser);
5971 else
5972 break;
5974 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
5975 objc_declare_class (list);
5978 /* Parse an objc-alias-declaration.
5980 objc-alias-declaration:
5981 @compatibility_alias identifier identifier ;
5984 static void
5985 c_parser_objc_alias_declaration (c_parser *parser)
5987 tree id1, id2;
5988 gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_ALIAS));
5989 c_parser_consume_token (parser);
5990 if (c_parser_next_token_is_not (parser, CPP_NAME))
5992 c_parser_error (parser, "expected identifier");
5993 c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
5994 return;
5996 id1 = c_parser_peek_token (parser)->value;
5997 c_parser_consume_token (parser);
5998 if (c_parser_next_token_is_not (parser, CPP_NAME))
6000 c_parser_error (parser, "expected identifier");
6001 c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
6002 return;
6004 id2 = c_parser_peek_token (parser)->value;
6005 c_parser_consume_token (parser);
6006 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
6007 objc_declare_alias (id1, id2);
6010 /* Parse an objc-protocol-definition.
6012 objc-protocol-definition:
6013 @protocol identifier objc-protocol-refs[opt] objc-methodprotolist @end
6014 @protocol identifier-list ;
6016 "@protocol identifier ;" should be resolved as "@protocol
6017 identifier-list ;": objc-methodprotolist may not start with a
6018 semicolon in the first alternative if objc-protocol-refs are
6019 omitted. */
6021 static void
6022 c_parser_objc_protocol_definition (c_parser *parser)
6024 gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_PROTOCOL));
6025 c_parser_consume_token (parser);
6026 if (c_parser_next_token_is_not (parser, CPP_NAME))
6028 c_parser_error (parser, "expected identifier");
6029 return;
6031 if (c_parser_peek_2nd_token (parser)->type == CPP_COMMA
6032 || c_parser_peek_2nd_token (parser)->type == CPP_SEMICOLON)
6034 tree list = NULL_TREE;
6035 /* Any identifiers, including those declared as type names, are
6036 OK here. */
6037 while (true)
6039 tree id;
6040 if (c_parser_next_token_is_not (parser, CPP_NAME))
6042 c_parser_error (parser, "expected identifier");
6043 break;
6045 id = c_parser_peek_token (parser)->value;
6046 list = chainon (list, build_tree_list (NULL_TREE, id));
6047 c_parser_consume_token (parser);
6048 if (c_parser_next_token_is (parser, CPP_COMMA))
6049 c_parser_consume_token (parser);
6050 else
6051 break;
6053 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
6054 objc_declare_protocols (list);
6056 else
6058 tree id = c_parser_peek_token (parser)->value;
6059 tree proto = NULL_TREE;
6060 c_parser_consume_token (parser);
6061 if (c_parser_next_token_is (parser, CPP_LESS))
6062 proto = c_parser_objc_protocol_refs (parser);
6063 parser->objc_pq_context = true;
6064 objc_start_protocol (id, proto);
6065 c_parser_objc_methodprotolist (parser);
6066 c_parser_require_keyword (parser, RID_AT_END, "expected %<@end%>");
6067 parser->objc_pq_context = false;
6068 objc_finish_interface ();
6072 /* Parse an objc-method-type.
6074 objc-method-type:
6079 static enum tree_code
6080 c_parser_objc_method_type (c_parser *parser)
6082 switch (c_parser_peek_token (parser)->type)
6084 case CPP_PLUS:
6085 c_parser_consume_token (parser);
6086 return PLUS_EXPR;
6087 case CPP_MINUS:
6088 c_parser_consume_token (parser);
6089 return MINUS_EXPR;
6090 default:
6091 gcc_unreachable ();
6095 /* Parse an objc-method-definition.
6097 objc-method-definition:
6098 objc-method-type objc-method-decl ;[opt] compound-statement
6101 static void
6102 c_parser_objc_method_definition (c_parser *parser)
6104 enum tree_code type = c_parser_objc_method_type (parser);
6105 tree decl;
6106 objc_set_method_type (type);
6107 parser->objc_pq_context = true;
6108 decl = c_parser_objc_method_decl (parser);
6109 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
6111 c_parser_consume_token (parser);
6112 if (pedantic)
6113 pedwarn ("%Hextra semicolon in method definition specified",
6114 &c_parser_peek_token (parser)->location);
6116 if (!c_parser_next_token_is (parser, CPP_OPEN_BRACE))
6118 c_parser_error (parser, "expected %<{%>");
6119 return;
6121 parser->objc_pq_context = false;
6122 objc_start_method_definition (decl);
6123 add_stmt (c_parser_compound_statement (parser));
6124 objc_finish_method_definition (current_function_decl);
6127 /* Parse an objc-methodprotolist.
6129 objc-methodprotolist:
6130 empty
6131 objc-methodprotolist objc-methodproto
6132 objc-methodprotolist declaration
6133 objc-methodprotolist ;
6135 The declaration is a data definition, which may be missing
6136 declaration specifiers under the same rules and diagnostics as
6137 other data definitions outside functions, and the stray semicolon
6138 is diagnosed the same way as a stray semicolon outside a
6139 function. */
6141 static void
6142 c_parser_objc_methodprotolist (c_parser *parser)
6144 while (true)
6146 /* The list is terminated by @end. */
6147 switch (c_parser_peek_token (parser)->type)
6149 case CPP_SEMICOLON:
6150 if (pedantic)
6151 pedwarn ("%HISO C does not allow extra %<;%> "
6152 "outside of a function",
6153 &c_parser_peek_token (parser)->location);
6154 c_parser_consume_token (parser);
6155 break;
6156 case CPP_PLUS:
6157 case CPP_MINUS:
6158 c_parser_objc_methodproto (parser);
6159 break;
6160 case CPP_PRAGMA:
6161 c_parser_pragma (parser, pragma_external);
6162 break;
6163 case CPP_EOF:
6164 return;
6165 default:
6166 if (c_parser_next_token_is_keyword (parser, RID_AT_END))
6167 return;
6168 c_parser_declaration_or_fndef (parser, false, true, false, true);
6169 break;
6174 /* Parse an objc-methodproto.
6176 objc-methodproto:
6177 objc-method-type objc-method-decl ;
6180 static void
6181 c_parser_objc_methodproto (c_parser *parser)
6183 enum tree_code type = c_parser_objc_method_type (parser);
6184 tree decl;
6185 objc_set_method_type (type);
6186 /* Remember protocol qualifiers in prototypes. */
6187 parser->objc_pq_context = true;
6188 decl = c_parser_objc_method_decl (parser);
6189 /* Forget protocol qualifiers here. */
6190 parser->objc_pq_context = false;
6191 objc_add_method_declaration (decl);
6192 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
6195 /* Parse an objc-method-decl.
6197 objc-method-decl:
6198 ( objc-type-name ) objc-selector
6199 objc-selector
6200 ( objc-type-name ) objc-keyword-selector objc-optparmlist
6201 objc-keyword-selector objc-optparmlist
6203 objc-keyword-selector:
6204 objc-keyword-decl
6205 objc-keyword-selector objc-keyword-decl
6207 objc-keyword-decl:
6208 objc-selector : ( objc-type-name ) identifier
6209 objc-selector : identifier
6210 : ( objc-type-name ) identifier
6211 : identifier
6213 objc-optparmlist:
6214 objc-optparms objc-optellipsis
6216 objc-optparms:
6217 empty
6218 objc-opt-parms , parameter-declaration
6220 objc-optellipsis:
6221 empty
6222 , ...
6225 static tree
6226 c_parser_objc_method_decl (c_parser *parser)
6228 tree type = NULL_TREE;
6229 tree sel;
6230 tree parms = NULL_TREE;
6231 bool ellipsis = false;
6233 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
6235 c_parser_consume_token (parser);
6236 type = c_parser_objc_type_name (parser);
6237 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
6239 sel = c_parser_objc_selector (parser);
6240 /* If there is no selector, or a colon follows, we have an
6241 objc-keyword-selector. If there is a selector, and a colon does
6242 not follow, that selector ends the objc-method-decl. */
6243 if (!sel || c_parser_next_token_is (parser, CPP_COLON))
6245 tree tsel = sel;
6246 tree list = NULL_TREE;
6247 while (true)
6249 tree atype = NULL_TREE, id, keyworddecl;
6250 if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
6251 break;
6252 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
6254 c_parser_consume_token (parser);
6255 atype = c_parser_objc_type_name (parser);
6256 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
6257 "expected %<)%>");
6259 if (c_parser_next_token_is_not (parser, CPP_NAME))
6261 c_parser_error (parser, "expected identifier");
6262 return error_mark_node;
6264 id = c_parser_peek_token (parser)->value;
6265 c_parser_consume_token (parser);
6266 keyworddecl = objc_build_keyword_decl (tsel, atype, id);
6267 list = chainon (list, keyworddecl);
6268 tsel = c_parser_objc_selector (parser);
6269 if (!tsel && c_parser_next_token_is_not (parser, CPP_COLON))
6270 break;
6272 /* Parse the optional parameter list. Optional Objective-C
6273 method parameters follow the C syntax, and may include '...'
6274 to denote a variable number of arguments. */
6275 parms = make_node (TREE_LIST);
6276 while (c_parser_next_token_is (parser, CPP_COMMA))
6278 struct c_parm *parm;
6279 c_parser_consume_token (parser);
6280 if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
6282 ellipsis = true;
6283 c_parser_consume_token (parser);
6284 break;
6286 parm = c_parser_parameter_declaration (parser, NULL_TREE);
6287 if (parm == NULL)
6288 break;
6289 parms = chainon (parms,
6290 build_tree_list (NULL_TREE, grokparm (parm)));
6292 sel = list;
6294 return objc_build_method_signature (type, sel, parms, ellipsis);
6297 /* Parse an objc-type-name.
6299 objc-type-name:
6300 objc-type-qualifiers[opt] type-name
6301 objc-type-qualifiers[opt]
6303 objc-type-qualifiers:
6304 objc-type-qualifier
6305 objc-type-qualifiers objc-type-qualifier
6307 objc-type-qualifier: one of
6308 in out inout bycopy byref oneway
6311 static tree
6312 c_parser_objc_type_name (c_parser *parser)
6314 tree quals = NULL_TREE;
6315 struct c_type_name *type_name = NULL;
6316 tree type = NULL_TREE;
6317 while (true)
6319 c_token *token = c_parser_peek_token (parser);
6320 if (token->type == CPP_KEYWORD
6321 && (token->keyword == RID_IN
6322 || token->keyword == RID_OUT
6323 || token->keyword == RID_INOUT
6324 || token->keyword == RID_BYCOPY
6325 || token->keyword == RID_BYREF
6326 || token->keyword == RID_ONEWAY))
6328 quals = chainon (quals, build_tree_list (NULL_TREE, token->value));
6329 c_parser_consume_token (parser);
6331 else
6332 break;
6334 if (c_parser_next_token_starts_typename (parser))
6335 type_name = c_parser_type_name (parser);
6336 if (type_name)
6337 type = groktypename (type_name);
6338 return build_tree_list (quals, type);
6341 /* Parse objc-protocol-refs.
6343 objc-protocol-refs:
6344 < identifier-list >
6347 static tree
6348 c_parser_objc_protocol_refs (c_parser *parser)
6350 tree list = NULL_TREE;
6351 gcc_assert (c_parser_next_token_is (parser, CPP_LESS));
6352 c_parser_consume_token (parser);
6353 /* Any identifiers, including those declared as type names, are OK
6354 here. */
6355 while (true)
6357 tree id;
6358 if (c_parser_next_token_is_not (parser, CPP_NAME))
6360 c_parser_error (parser, "expected identifier");
6361 break;
6363 id = c_parser_peek_token (parser)->value;
6364 list = chainon (list, build_tree_list (NULL_TREE, id));
6365 c_parser_consume_token (parser);
6366 if (c_parser_next_token_is (parser, CPP_COMMA))
6367 c_parser_consume_token (parser);
6368 else
6369 break;
6371 c_parser_require (parser, CPP_GREATER, "expected %<>%>");
6372 return list;
6375 /* Parse an objc-try-catch-statement.
6377 objc-try-catch-statement:
6378 @try compound-statement objc-catch-list[opt]
6379 @try compound-statement objc-catch-list[opt] @finally compound-statement
6381 objc-catch-list:
6382 @catch ( parameter-declaration ) compound-statement
6383 objc-catch-list @catch ( parameter-declaration ) compound-statement
6386 static void
6387 c_parser_objc_try_catch_statement (c_parser *parser)
6389 location_t loc;
6390 tree stmt;
6391 gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_TRY));
6392 c_parser_consume_token (parser);
6393 loc = c_parser_peek_token (parser)->location;
6394 stmt = c_parser_compound_statement (parser);
6395 objc_begin_try_stmt (loc, stmt);
6396 while (c_parser_next_token_is_keyword (parser, RID_AT_CATCH))
6398 struct c_parm *parm;
6399 c_parser_consume_token (parser);
6400 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
6401 break;
6402 parm = c_parser_parameter_declaration (parser, NULL_TREE);
6403 if (parm == NULL)
6405 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
6406 break;
6408 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
6409 objc_begin_catch_clause (grokparm (parm));
6410 if (c_parser_require (parser, CPP_OPEN_BRACE, "expected %<{%>"))
6411 c_parser_compound_statement_nostart (parser);
6412 objc_finish_catch_clause ();
6414 if (c_parser_next_token_is_keyword (parser, RID_AT_FINALLY))
6416 location_t finloc;
6417 tree finstmt;
6418 c_parser_consume_token (parser);
6419 finloc = c_parser_peek_token (parser)->location;
6420 finstmt = c_parser_compound_statement (parser);
6421 objc_build_finally_clause (finloc, finstmt);
6423 objc_finish_try_stmt ();
6426 /* Parse an objc-synchronized-statement.
6428 objc-synchronized-statement:
6429 @synchronized ( expression ) compound-statement
6432 static void
6433 c_parser_objc_synchronized_statement (c_parser *parser)
6435 location_t loc;
6436 tree expr, stmt;
6437 gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_SYNCHRONIZED));
6438 c_parser_consume_token (parser);
6439 loc = c_parser_peek_token (parser)->location;
6440 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
6442 expr = c_parser_expression (parser).value;
6443 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
6445 else
6446 expr = error_mark_node;
6447 stmt = c_parser_compound_statement (parser);
6448 objc_build_synchronized (loc, expr, stmt);
6451 /* Parse an objc-selector; return NULL_TREE without an error if the
6452 next token is not an objc-selector.
6454 objc-selector:
6455 identifier
6456 one of
6457 enum struct union if else while do for switch case default
6458 break continue return goto asm sizeof typeof __alignof
6459 unsigned long const short volatile signed restrict _Complex
6460 in out inout bycopy byref oneway int char float double void _Bool
6462 ??? Why this selection of keywords but not, for example, storage
6463 class specifiers? */
6465 static tree
6466 c_parser_objc_selector (c_parser *parser)
6468 c_token *token = c_parser_peek_token (parser);
6469 tree value = token->value;
6470 if (token->type == CPP_NAME)
6472 c_parser_consume_token (parser);
6473 return value;
6475 if (token->type != CPP_KEYWORD)
6476 return NULL_TREE;
6477 switch (token->keyword)
6479 case RID_ENUM:
6480 case RID_STRUCT:
6481 case RID_UNION:
6482 case RID_IF:
6483 case RID_ELSE:
6484 case RID_WHILE:
6485 case RID_DO:
6486 case RID_FOR:
6487 case RID_SWITCH:
6488 case RID_CASE:
6489 case RID_DEFAULT:
6490 case RID_BREAK:
6491 case RID_CONTINUE:
6492 case RID_RETURN:
6493 case RID_GOTO:
6494 case RID_ASM:
6495 case RID_SIZEOF:
6496 case RID_TYPEOF:
6497 case RID_ALIGNOF:
6498 case RID_UNSIGNED:
6499 case RID_LONG:
6500 case RID_CONST:
6501 case RID_SHORT:
6502 case RID_VOLATILE:
6503 case RID_SIGNED:
6504 case RID_RESTRICT:
6505 case RID_COMPLEX:
6506 case RID_IN:
6507 case RID_OUT:
6508 case RID_INOUT:
6509 case RID_BYCOPY:
6510 case RID_BYREF:
6511 case RID_ONEWAY:
6512 case RID_INT:
6513 case RID_CHAR:
6514 case RID_FLOAT:
6515 case RID_DOUBLE:
6516 case RID_VOID:
6517 case RID_BOOL:
6518 c_parser_consume_token (parser);
6519 return value;
6520 default:
6521 return NULL_TREE;
6525 /* Parse an objc-selector-arg.
6527 objc-selector-arg:
6528 objc-selector
6529 objc-keywordname-list
6531 objc-keywordname-list:
6532 objc-keywordname
6533 objc-keywordname-list objc-keywordname
6535 objc-keywordname:
6536 objc-selector :
6540 static tree
6541 c_parser_objc_selector_arg (c_parser *parser)
6543 tree sel = c_parser_objc_selector (parser);
6544 tree list = NULL_TREE;
6545 if (sel && c_parser_next_token_is_not (parser, CPP_COLON))
6546 return sel;
6547 while (true)
6549 if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
6550 return list;
6551 list = chainon (list, build_tree_list (sel, NULL_TREE));
6552 sel = c_parser_objc_selector (parser);
6553 if (!sel && c_parser_next_token_is_not (parser, CPP_COLON))
6554 break;
6556 return list;
6559 /* Parse an objc-receiver.
6561 objc-receiver:
6562 expression
6563 class-name
6564 type-name
6567 static tree
6568 c_parser_objc_receiver (c_parser *parser)
6570 if (c_parser_peek_token (parser)->type == CPP_NAME
6571 && (c_parser_peek_token (parser)->id_kind == C_ID_TYPENAME
6572 || c_parser_peek_token (parser)->id_kind == C_ID_CLASSNAME))
6574 tree id = c_parser_peek_token (parser)->value;
6575 c_parser_consume_token (parser);
6576 return objc_get_class_reference (id);
6578 return c_parser_expression (parser).value;
6581 /* Parse objc-message-args.
6583 objc-message-args:
6584 objc-selector
6585 objc-keywordarg-list
6587 objc-keywordarg-list:
6588 objc-keywordarg
6589 objc-keywordarg-list objc-keywordarg
6591 objc-keywordarg:
6592 objc-selector : objc-keywordexpr
6593 : objc-keywordexpr
6596 static tree
6597 c_parser_objc_message_args (c_parser *parser)
6599 tree sel = c_parser_objc_selector (parser);
6600 tree list = NULL_TREE;
6601 if (sel && c_parser_next_token_is_not (parser, CPP_COLON))
6602 return sel;
6603 while (true)
6605 tree keywordexpr;
6606 if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
6607 return list;
6608 keywordexpr = c_parser_objc_keywordexpr (parser);
6609 list = chainon (list, build_tree_list (sel, keywordexpr));
6610 sel = c_parser_objc_selector (parser);
6611 if (!sel && c_parser_next_token_is_not (parser, CPP_COLON))
6612 break;
6614 return list;
6617 /* Parse an objc-keywordexpr.
6619 objc-keywordexpr:
6620 nonempty-expr-list
6623 static tree
6624 c_parser_objc_keywordexpr (c_parser *parser)
6626 tree list = c_parser_expr_list (parser, true);
6627 if (TREE_CHAIN (list) == NULL_TREE)
6629 /* Just return the expression, remove a level of
6630 indirection. */
6631 return TREE_VALUE (list);
6633 else
6635 /* We have a comma expression, we will collapse later. */
6636 return list;
6641 /* Handle pragmas. Some OpenMP pragmas are associated with, and therefore
6642 should be considered, statements. ALLOW_STMT is true if we're within
6643 the context of a function and such pragmas are to be allowed. Returns
6644 true if we actually parsed such a pragma. */
6646 static bool
6647 c_parser_pragma (c_parser *parser, enum pragma_context context)
6649 unsigned int id;
6651 id = c_parser_peek_token (parser)->pragma_kind;
6652 gcc_assert (id != PRAGMA_NONE);
6654 switch (id)
6656 case PRAGMA_OMP_BARRIER:
6657 if (context != pragma_compound)
6659 if (context == pragma_stmt)
6660 c_parser_error (parser, "%<#pragma omp barrier%> may only be "
6661 "used in compound statements");
6662 goto bad_stmt;
6664 c_parser_omp_barrier (parser);
6665 return false;
6667 case PRAGMA_OMP_FLUSH:
6668 if (context != pragma_compound)
6670 if (context == pragma_stmt)
6671 c_parser_error (parser, "%<#pragma omp flush%> may only be "
6672 "used in compound statements");
6673 goto bad_stmt;
6675 c_parser_omp_flush (parser);
6676 return false;
6678 case PRAGMA_OMP_TASKWAIT:
6679 if (context != pragma_compound)
6681 if (context == pragma_stmt)
6682 c_parser_error (parser, "%<#pragma omp taskwait%> may only be "
6683 "used in compound statements");
6684 goto bad_stmt;
6686 c_parser_omp_taskwait (parser);
6687 return false;
6689 case PRAGMA_OMP_THREADPRIVATE:
6690 c_parser_omp_threadprivate (parser);
6691 return false;
6693 case PRAGMA_OMP_SECTION:
6694 error ("%H%<#pragma omp section%> may only be used in "
6695 "%<#pragma omp sections%> construct",
6696 &c_parser_peek_token (parser)->location);
6697 c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL);
6698 return false;
6700 case PRAGMA_GCC_PCH_PREPROCESS:
6701 c_parser_error (parser, "%<#pragma GCC pch_preprocess%> must be first");
6702 c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL);
6703 return false;
6705 default:
6706 if (id < PRAGMA_FIRST_EXTERNAL)
6708 if (context == pragma_external)
6710 bad_stmt:
6711 c_parser_error (parser, "expected declaration specifiers");
6712 c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL);
6713 return false;
6715 c_parser_omp_construct (parser);
6716 return true;
6718 break;
6721 c_parser_consume_pragma (parser);
6722 c_invoke_pragma_handler (id);
6724 /* Skip to EOL, but suppress any error message. Those will have been
6725 generated by the handler routine through calling error, as opposed
6726 to calling c_parser_error. */
6727 parser->error = true;
6728 c_parser_skip_to_pragma_eol (parser);
6730 return false;
6733 /* The interface the pragma parsers have to the lexer. */
6735 enum cpp_ttype
6736 pragma_lex (tree *value)
6738 c_token *tok = c_parser_peek_token (the_parser);
6739 enum cpp_ttype ret = tok->type;
6741 *value = tok->value;
6742 if (ret == CPP_PRAGMA_EOL || ret == CPP_EOF)
6743 ret = CPP_EOF;
6744 else
6746 if (ret == CPP_KEYWORD)
6747 ret = CPP_NAME;
6748 c_parser_consume_token (the_parser);
6751 return ret;
6754 static void
6755 c_parser_pragma_pch_preprocess (c_parser *parser)
6757 tree name = NULL;
6759 c_parser_consume_pragma (parser);
6760 if (c_parser_next_token_is (parser, CPP_STRING))
6762 name = c_parser_peek_token (parser)->value;
6763 c_parser_consume_token (parser);
6765 else
6766 c_parser_error (parser, "expected string literal");
6767 c_parser_skip_to_pragma_eol (parser);
6769 if (name)
6770 c_common_pch_pragma (parse_in, TREE_STRING_POINTER (name));
6773 /* OpenMP 2.5 parsing routines. */
6775 /* Returns name of the next clause.
6776 If the clause is not recognized PRAGMA_OMP_CLAUSE_NONE is returned and
6777 the token is not consumed. Otherwise appropriate pragma_omp_clause is
6778 returned and the token is consumed. */
6780 static pragma_omp_clause
6781 c_parser_omp_clause_name (c_parser *parser)
6783 pragma_omp_clause result = PRAGMA_OMP_CLAUSE_NONE;
6785 if (c_parser_next_token_is_keyword (parser, RID_IF))
6786 result = PRAGMA_OMP_CLAUSE_IF;
6787 else if (c_parser_next_token_is_keyword (parser, RID_DEFAULT))
6788 result = PRAGMA_OMP_CLAUSE_DEFAULT;
6789 else if (c_parser_next_token_is (parser, CPP_NAME))
6791 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
6793 switch (p[0])
6795 case 'c':
6796 if (!strcmp ("collapse", p))
6797 result = PRAGMA_OMP_CLAUSE_COLLAPSE;
6798 else if (!strcmp ("copyin", p))
6799 result = PRAGMA_OMP_CLAUSE_COPYIN;
6800 else if (!strcmp ("copyprivate", p))
6801 result = PRAGMA_OMP_CLAUSE_COPYPRIVATE;
6802 break;
6803 case 'f':
6804 if (!strcmp ("firstprivate", p))
6805 result = PRAGMA_OMP_CLAUSE_FIRSTPRIVATE;
6806 break;
6807 case 'l':
6808 if (!strcmp ("lastprivate", p))
6809 result = PRAGMA_OMP_CLAUSE_LASTPRIVATE;
6810 break;
6811 case 'n':
6812 if (!strcmp ("nowait", p))
6813 result = PRAGMA_OMP_CLAUSE_NOWAIT;
6814 else if (!strcmp ("num_threads", p))
6815 result = PRAGMA_OMP_CLAUSE_NUM_THREADS;
6816 break;
6817 case 'o':
6818 if (!strcmp ("ordered", p))
6819 result = PRAGMA_OMP_CLAUSE_ORDERED;
6820 break;
6821 case 'p':
6822 if (!strcmp ("private", p))
6823 result = PRAGMA_OMP_CLAUSE_PRIVATE;
6824 break;
6825 case 'r':
6826 if (!strcmp ("reduction", p))
6827 result = PRAGMA_OMP_CLAUSE_REDUCTION;
6828 break;
6829 case 's':
6830 if (!strcmp ("schedule", p))
6831 result = PRAGMA_OMP_CLAUSE_SCHEDULE;
6832 else if (!strcmp ("shared", p))
6833 result = PRAGMA_OMP_CLAUSE_SHARED;
6834 break;
6835 case 'u':
6836 if (!strcmp ("untied", p))
6837 result = PRAGMA_OMP_CLAUSE_UNTIED;
6838 break;
6842 if (result != PRAGMA_OMP_CLAUSE_NONE)
6843 c_parser_consume_token (parser);
6845 return result;
6848 /* Validate that a clause of the given type does not already exist. */
6850 static void
6851 check_no_duplicate_clause (tree clauses, enum omp_clause_code code,
6852 const char *name)
6854 tree c;
6856 for (c = clauses; c ; c = OMP_CLAUSE_CHAIN (c))
6857 if (OMP_CLAUSE_CODE (c) == code)
6859 error ("too many %qs clauses", name);
6860 break;
6864 /* OpenMP 2.5:
6865 variable-list:
6866 identifier
6867 variable-list , identifier
6869 If KIND is nonzero, create the appropriate node and install the decl
6870 in OMP_CLAUSE_DECL and add the node to the head of the list.
6872 If KIND is zero, create a TREE_LIST with the decl in TREE_PURPOSE;
6873 return the list created. */
6875 static tree
6876 c_parser_omp_variable_list (c_parser *parser, enum omp_clause_code kind,
6877 tree list)
6879 if (c_parser_next_token_is_not (parser, CPP_NAME)
6880 || c_parser_peek_token (parser)->id_kind != C_ID_ID)
6881 c_parser_error (parser, "expected identifier");
6883 while (c_parser_next_token_is (parser, CPP_NAME)
6884 && c_parser_peek_token (parser)->id_kind == C_ID_ID)
6886 tree t = lookup_name (c_parser_peek_token (parser)->value);
6888 if (t == NULL_TREE)
6889 undeclared_variable (c_parser_peek_token (parser)->value,
6890 c_parser_peek_token (parser)->location);
6891 else if (t == error_mark_node)
6893 else if (kind != 0)
6895 tree u = build_omp_clause (kind);
6896 OMP_CLAUSE_DECL (u) = t;
6897 OMP_CLAUSE_CHAIN (u) = list;
6898 list = u;
6900 else
6901 list = tree_cons (t, NULL_TREE, list);
6903 c_parser_consume_token (parser);
6905 if (c_parser_next_token_is_not (parser, CPP_COMMA))
6906 break;
6908 c_parser_consume_token (parser);
6911 return list;
6914 /* Similarly, but expect leading and trailing parenthesis. This is a very
6915 common case for omp clauses. */
6917 static tree
6918 c_parser_omp_var_list_parens (c_parser *parser, enum omp_clause_code kind,
6919 tree list)
6921 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
6923 list = c_parser_omp_variable_list (parser, kind, list);
6924 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
6926 return list;
6929 /* OpenMP 3.0:
6930 collapse ( constant-expression ) */
6932 static tree
6933 c_parser_omp_clause_collapse (c_parser *parser, tree list)
6935 tree c, num = error_mark_node;
6936 HOST_WIDE_INT n;
6937 location_t loc;
6939 check_no_duplicate_clause (list, OMP_CLAUSE_COLLAPSE, "collapse");
6941 loc = c_parser_peek_token (parser)->location;
6942 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
6944 num = c_parser_expr_no_commas (parser, NULL).value;
6945 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
6947 if (num == error_mark_node)
6948 return list;
6949 if (!INTEGRAL_TYPE_P (TREE_TYPE (num))
6950 || !host_integerp (num, 0)
6951 || (n = tree_low_cst (num, 0)) <= 0
6952 || (int) n != n)
6954 error ("%Hcollapse argument needs positive constant integer expression",
6955 &loc);
6956 return list;
6958 c = build_omp_clause (OMP_CLAUSE_COLLAPSE);
6959 OMP_CLAUSE_COLLAPSE_EXPR (c) = num;
6960 OMP_CLAUSE_CHAIN (c) = list;
6961 return c;
6964 /* OpenMP 2.5:
6965 copyin ( variable-list ) */
6967 static tree
6968 c_parser_omp_clause_copyin (c_parser *parser, tree list)
6970 return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_COPYIN, list);
6973 /* OpenMP 2.5:
6974 copyprivate ( variable-list ) */
6976 static tree
6977 c_parser_omp_clause_copyprivate (c_parser *parser, tree list)
6979 return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_COPYPRIVATE, list);
6982 /* OpenMP 2.5:
6983 default ( shared | none ) */
6985 static tree
6986 c_parser_omp_clause_default (c_parser *parser, tree list)
6988 enum omp_clause_default_kind kind = OMP_CLAUSE_DEFAULT_UNSPECIFIED;
6989 tree c;
6991 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
6992 return list;
6993 if (c_parser_next_token_is (parser, CPP_NAME))
6995 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
6997 switch (p[0])
6999 case 'n':
7000 if (strcmp ("none", p) != 0)
7001 goto invalid_kind;
7002 kind = OMP_CLAUSE_DEFAULT_NONE;
7003 break;
7005 case 's':
7006 if (strcmp ("shared", p) != 0)
7007 goto invalid_kind;
7008 kind = OMP_CLAUSE_DEFAULT_SHARED;
7009 break;
7011 default:
7012 goto invalid_kind;
7015 c_parser_consume_token (parser);
7017 else
7019 invalid_kind:
7020 c_parser_error (parser, "expected %<none%> or %<shared%>");
7022 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
7024 if (kind == OMP_CLAUSE_DEFAULT_UNSPECIFIED)
7025 return list;
7027 check_no_duplicate_clause (list, OMP_CLAUSE_DEFAULT, "default");
7028 c = build_omp_clause (OMP_CLAUSE_DEFAULT);
7029 OMP_CLAUSE_CHAIN (c) = list;
7030 OMP_CLAUSE_DEFAULT_KIND (c) = kind;
7032 return c;
7035 /* OpenMP 2.5:
7036 firstprivate ( variable-list ) */
7038 static tree
7039 c_parser_omp_clause_firstprivate (c_parser *parser, tree list)
7041 return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_FIRSTPRIVATE, list);
7044 /* OpenMP 2.5:
7045 if ( expression ) */
7047 static tree
7048 c_parser_omp_clause_if (c_parser *parser, tree list)
7050 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
7052 tree t = c_parser_paren_condition (parser);
7053 tree c;
7055 check_no_duplicate_clause (list, OMP_CLAUSE_IF, "if");
7057 c = build_omp_clause (OMP_CLAUSE_IF);
7058 OMP_CLAUSE_IF_EXPR (c) = t;
7059 OMP_CLAUSE_CHAIN (c) = list;
7060 list = c;
7062 else
7063 c_parser_error (parser, "expected %<(%>");
7065 return list;
7068 /* OpenMP 2.5:
7069 lastprivate ( variable-list ) */
7071 static tree
7072 c_parser_omp_clause_lastprivate (c_parser *parser, tree list)
7074 return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_LASTPRIVATE, list);
7077 /* OpenMP 2.5:
7078 nowait */
7080 static tree
7081 c_parser_omp_clause_nowait (c_parser *parser ATTRIBUTE_UNUSED, tree list)
7083 tree c;
7085 check_no_duplicate_clause (list, OMP_CLAUSE_NOWAIT, "nowait");
7087 c = build_omp_clause (OMP_CLAUSE_NOWAIT);
7088 OMP_CLAUSE_CHAIN (c) = list;
7089 return c;
7092 /* OpenMP 2.5:
7093 num_threads ( expression ) */
7095 static tree
7096 c_parser_omp_clause_num_threads (c_parser *parser, tree list)
7098 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
7100 location_t expr_loc = c_parser_peek_token (parser)->location;
7101 tree c, t = c_parser_expression (parser).value;
7103 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
7105 if (!INTEGRAL_TYPE_P (TREE_TYPE (t)))
7107 c_parser_error (parser, "expected integer expression");
7108 return list;
7111 /* Attempt to statically determine when the number isn't positive. */
7112 c = fold_build2 (LE_EXPR, boolean_type_node, t,
7113 build_int_cst (TREE_TYPE (t), 0));
7114 if (c == boolean_true_node)
7116 warning (0, "%H%<num_threads%> value must be positive", &expr_loc);
7117 t = integer_one_node;
7120 check_no_duplicate_clause (list, OMP_CLAUSE_NUM_THREADS, "num_threads");
7122 c = build_omp_clause (OMP_CLAUSE_NUM_THREADS);
7123 OMP_CLAUSE_NUM_THREADS_EXPR (c) = t;
7124 OMP_CLAUSE_CHAIN (c) = list;
7125 list = c;
7128 return list;
7131 /* OpenMP 2.5:
7132 ordered */
7134 static tree
7135 c_parser_omp_clause_ordered (c_parser *parser ATTRIBUTE_UNUSED, tree list)
7137 tree c;
7139 check_no_duplicate_clause (list, OMP_CLAUSE_ORDERED, "ordered");
7141 c = build_omp_clause (OMP_CLAUSE_ORDERED);
7142 OMP_CLAUSE_CHAIN (c) = list;
7143 return c;
7146 /* OpenMP 2.5:
7147 private ( variable-list ) */
7149 static tree
7150 c_parser_omp_clause_private (c_parser *parser, tree list)
7152 return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_PRIVATE, list);
7155 /* OpenMP 2.5:
7156 reduction ( reduction-operator : variable-list )
7158 reduction-operator:
7159 One of: + * - & ^ | && || */
7161 static tree
7162 c_parser_omp_clause_reduction (c_parser *parser, tree list)
7164 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
7166 enum tree_code code;
7168 switch (c_parser_peek_token (parser)->type)
7170 case CPP_PLUS:
7171 code = PLUS_EXPR;
7172 break;
7173 case CPP_MULT:
7174 code = MULT_EXPR;
7175 break;
7176 case CPP_MINUS:
7177 code = MINUS_EXPR;
7178 break;
7179 case CPP_AND:
7180 code = BIT_AND_EXPR;
7181 break;
7182 case CPP_XOR:
7183 code = BIT_XOR_EXPR;
7184 break;
7185 case CPP_OR:
7186 code = BIT_IOR_EXPR;
7187 break;
7188 case CPP_AND_AND:
7189 code = TRUTH_ANDIF_EXPR;
7190 break;
7191 case CPP_OR_OR:
7192 code = TRUTH_ORIF_EXPR;
7193 break;
7194 default:
7195 c_parser_error (parser,
7196 "expected %<+%>, %<*%>, %<-%>, %<&%>, "
7197 "%<^%>, %<|%>, %<&&%>, or %<||%>");
7198 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 0);
7199 return list;
7201 c_parser_consume_token (parser);
7202 if (c_parser_require (parser, CPP_COLON, "expected %<:%>"))
7204 tree nl, c;
7206 nl = c_parser_omp_variable_list (parser, OMP_CLAUSE_REDUCTION, list);
7207 for (c = nl; c != list; c = OMP_CLAUSE_CHAIN (c))
7208 OMP_CLAUSE_REDUCTION_CODE (c) = code;
7210 list = nl;
7212 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
7214 return list;
7217 /* OpenMP 2.5:
7218 schedule ( schedule-kind )
7219 schedule ( schedule-kind , expression )
7221 schedule-kind:
7222 static | dynamic | guided | runtime | auto
7225 static tree
7226 c_parser_omp_clause_schedule (c_parser *parser, tree list)
7228 tree c, t;
7230 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
7231 return list;
7233 c = build_omp_clause (OMP_CLAUSE_SCHEDULE);
7235 if (c_parser_next_token_is (parser, CPP_NAME))
7237 tree kind = c_parser_peek_token (parser)->value;
7238 const char *p = IDENTIFIER_POINTER (kind);
7240 switch (p[0])
7242 case 'd':
7243 if (strcmp ("dynamic", p) != 0)
7244 goto invalid_kind;
7245 OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_DYNAMIC;
7246 break;
7248 case 'g':
7249 if (strcmp ("guided", p) != 0)
7250 goto invalid_kind;
7251 OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_GUIDED;
7252 break;
7254 case 'r':
7255 if (strcmp ("runtime", p) != 0)
7256 goto invalid_kind;
7257 OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_RUNTIME;
7258 break;
7260 default:
7261 goto invalid_kind;
7264 else if (c_parser_next_token_is_keyword (parser, RID_STATIC))
7265 OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_STATIC;
7266 else if (c_parser_next_token_is_keyword (parser, RID_AUTO))
7267 OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_AUTO;
7268 else
7269 goto invalid_kind;
7271 c_parser_consume_token (parser);
7272 if (c_parser_next_token_is (parser, CPP_COMMA))
7274 location_t here;
7275 c_parser_consume_token (parser);
7277 here = c_parser_peek_token (parser)->location;
7278 t = c_parser_expr_no_commas (parser, NULL).value;
7280 if (OMP_CLAUSE_SCHEDULE_KIND (c) == OMP_CLAUSE_SCHEDULE_RUNTIME)
7281 error ("%Hschedule %<runtime%> does not take "
7282 "a %<chunk_size%> parameter", &here);
7283 else if (OMP_CLAUSE_SCHEDULE_KIND (c) == OMP_CLAUSE_SCHEDULE_AUTO)
7284 error ("%Hschedule %<auto%> does not take "
7285 "a %<chunk_size%> parameter", &here);
7286 else if (TREE_CODE (TREE_TYPE (t)) == INTEGER_TYPE)
7287 OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (c) = t;
7288 else
7289 c_parser_error (parser, "expected integer expression");
7291 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
7293 else
7294 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
7295 "expected %<,%> or %<)%>");
7297 check_no_duplicate_clause (list, OMP_CLAUSE_SCHEDULE, "schedule");
7298 OMP_CLAUSE_CHAIN (c) = list;
7299 return c;
7301 invalid_kind:
7302 c_parser_error (parser, "invalid schedule kind");
7303 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 0);
7304 return list;
7307 /* OpenMP 2.5:
7308 shared ( variable-list ) */
7310 static tree
7311 c_parser_omp_clause_shared (c_parser *parser, tree list)
7313 return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_SHARED, list);
7316 /* OpenMP 3.0:
7317 untied */
7319 static tree
7320 c_parser_omp_clause_untied (c_parser *parser ATTRIBUTE_UNUSED, tree list)
7322 tree c;
7324 /* FIXME: Should we allow duplicates? */
7325 check_no_duplicate_clause (list, OMP_CLAUSE_UNTIED, "untied");
7327 c = build_omp_clause (OMP_CLAUSE_UNTIED);
7328 OMP_CLAUSE_CHAIN (c) = list;
7329 return c;
7332 /* Parse all OpenMP clauses. The set clauses allowed by the directive
7333 is a bitmask in MASK. Return the list of clauses found; the result
7334 of clause default goes in *pdefault. */
7336 static tree
7337 c_parser_omp_all_clauses (c_parser *parser, unsigned int mask,
7338 const char *where)
7340 tree clauses = NULL;
7341 bool first = true;
7343 while (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL))
7345 location_t here;
7346 pragma_omp_clause c_kind;
7347 const char *c_name;
7348 tree prev = clauses;
7350 if (!first && c_parser_next_token_is (parser, CPP_COMMA))
7351 c_parser_consume_token (parser);
7353 first = false;
7354 here = c_parser_peek_token (parser)->location;
7355 c_kind = c_parser_omp_clause_name (parser);
7357 switch (c_kind)
7359 case PRAGMA_OMP_CLAUSE_COLLAPSE:
7360 clauses = c_parser_omp_clause_collapse (parser, clauses);
7361 c_name = "collapse";
7362 break;
7363 case PRAGMA_OMP_CLAUSE_COPYIN:
7364 clauses = c_parser_omp_clause_copyin (parser, clauses);
7365 c_name = "copyin";
7366 break;
7367 case PRAGMA_OMP_CLAUSE_COPYPRIVATE:
7368 clauses = c_parser_omp_clause_copyprivate (parser, clauses);
7369 c_name = "copyprivate";
7370 break;
7371 case PRAGMA_OMP_CLAUSE_DEFAULT:
7372 clauses = c_parser_omp_clause_default (parser, clauses);
7373 c_name = "default";
7374 break;
7375 case PRAGMA_OMP_CLAUSE_FIRSTPRIVATE:
7376 clauses = c_parser_omp_clause_firstprivate (parser, clauses);
7377 c_name = "firstprivate";
7378 break;
7379 case PRAGMA_OMP_CLAUSE_IF:
7380 clauses = c_parser_omp_clause_if (parser, clauses);
7381 c_name = "if";
7382 break;
7383 case PRAGMA_OMP_CLAUSE_LASTPRIVATE:
7384 clauses = c_parser_omp_clause_lastprivate (parser, clauses);
7385 c_name = "lastprivate";
7386 break;
7387 case PRAGMA_OMP_CLAUSE_NOWAIT:
7388 clauses = c_parser_omp_clause_nowait (parser, clauses);
7389 c_name = "nowait";
7390 break;
7391 case PRAGMA_OMP_CLAUSE_NUM_THREADS:
7392 clauses = c_parser_omp_clause_num_threads (parser, clauses);
7393 c_name = "num_threads";
7394 break;
7395 case PRAGMA_OMP_CLAUSE_ORDERED:
7396 clauses = c_parser_omp_clause_ordered (parser, clauses);
7397 c_name = "ordered";
7398 break;
7399 case PRAGMA_OMP_CLAUSE_PRIVATE:
7400 clauses = c_parser_omp_clause_private (parser, clauses);
7401 c_name = "private";
7402 break;
7403 case PRAGMA_OMP_CLAUSE_REDUCTION:
7404 clauses = c_parser_omp_clause_reduction (parser, clauses);
7405 c_name = "reduction";
7406 break;
7407 case PRAGMA_OMP_CLAUSE_SCHEDULE:
7408 clauses = c_parser_omp_clause_schedule (parser, clauses);
7409 c_name = "schedule";
7410 break;
7411 case PRAGMA_OMP_CLAUSE_SHARED:
7412 clauses = c_parser_omp_clause_shared (parser, clauses);
7413 c_name = "shared";
7414 break;
7415 case PRAGMA_OMP_CLAUSE_UNTIED:
7416 clauses = c_parser_omp_clause_untied (parser, clauses);
7417 c_name = "untied";
7418 break;
7419 default:
7420 c_parser_error (parser, "expected %<#pragma omp%> clause");
7421 goto saw_error;
7424 if (((mask >> c_kind) & 1) == 0 && !parser->error)
7426 /* Remove the invalid clause(s) from the list to avoid
7427 confusing the rest of the compiler. */
7428 clauses = prev;
7429 error ("%H%qs is not valid for %qs", &here, c_name, where);
7433 saw_error:
7434 c_parser_skip_to_pragma_eol (parser);
7436 return c_finish_omp_clauses (clauses);
7439 /* OpenMP 2.5:
7440 structured-block:
7441 statement
7443 In practice, we're also interested in adding the statement to an
7444 outer node. So it is convenient if we work around the fact that
7445 c_parser_statement calls add_stmt. */
7447 static tree
7448 c_parser_omp_structured_block (c_parser *parser)
7450 tree stmt = push_stmt_list ();
7451 c_parser_statement (parser);
7452 return pop_stmt_list (stmt);
7455 /* OpenMP 2.5:
7456 # pragma omp atomic new-line
7457 expression-stmt
7459 expression-stmt:
7460 x binop= expr | x++ | ++x | x-- | --x
7461 binop:
7462 +, *, -, /, &, ^, |, <<, >>
7464 where x is an lvalue expression with scalar type. */
7466 static void
7467 c_parser_omp_atomic (c_parser *parser)
7469 tree lhs, rhs;
7470 tree stmt;
7471 enum tree_code code;
7472 struct c_expr rhs_expr;
7474 c_parser_skip_to_pragma_eol (parser);
7476 lhs = c_parser_unary_expression (parser).value;
7477 switch (TREE_CODE (lhs))
7479 case ERROR_MARK:
7480 saw_error:
7481 c_parser_skip_to_end_of_block_or_statement (parser);
7482 return;
7484 case PREINCREMENT_EXPR:
7485 case POSTINCREMENT_EXPR:
7486 lhs = TREE_OPERAND (lhs, 0);
7487 code = PLUS_EXPR;
7488 rhs = integer_one_node;
7489 break;
7491 case PREDECREMENT_EXPR:
7492 case POSTDECREMENT_EXPR:
7493 lhs = TREE_OPERAND (lhs, 0);
7494 code = MINUS_EXPR;
7495 rhs = integer_one_node;
7496 break;
7498 default:
7499 switch (c_parser_peek_token (parser)->type)
7501 case CPP_MULT_EQ:
7502 code = MULT_EXPR;
7503 break;
7504 case CPP_DIV_EQ:
7505 code = TRUNC_DIV_EXPR;
7506 break;
7507 case CPP_PLUS_EQ:
7508 code = PLUS_EXPR;
7509 break;
7510 case CPP_MINUS_EQ:
7511 code = MINUS_EXPR;
7512 break;
7513 case CPP_LSHIFT_EQ:
7514 code = LSHIFT_EXPR;
7515 break;
7516 case CPP_RSHIFT_EQ:
7517 code = RSHIFT_EXPR;
7518 break;
7519 case CPP_AND_EQ:
7520 code = BIT_AND_EXPR;
7521 break;
7522 case CPP_OR_EQ:
7523 code = BIT_IOR_EXPR;
7524 break;
7525 case CPP_XOR_EQ:
7526 code = BIT_XOR_EXPR;
7527 break;
7528 default:
7529 c_parser_error (parser,
7530 "invalid operator for %<#pragma omp atomic%>");
7531 goto saw_error;
7534 c_parser_consume_token (parser);
7535 rhs_expr = c_parser_expression (parser);
7536 rhs_expr = default_function_array_conversion (rhs_expr);
7537 rhs = rhs_expr.value;
7538 break;
7540 stmt = c_finish_omp_atomic (code, lhs, rhs);
7541 if (stmt != error_mark_node)
7542 add_stmt (stmt);
7543 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
7547 /* OpenMP 2.5:
7548 # pragma omp barrier new-line
7551 static void
7552 c_parser_omp_barrier (c_parser *parser)
7554 c_parser_consume_pragma (parser);
7555 c_parser_skip_to_pragma_eol (parser);
7557 c_finish_omp_barrier ();
7560 /* OpenMP 2.5:
7561 # pragma omp critical [(name)] new-line
7562 structured-block
7565 static tree
7566 c_parser_omp_critical (c_parser *parser)
7568 tree stmt, name = NULL;
7570 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
7572 c_parser_consume_token (parser);
7573 if (c_parser_next_token_is (parser, CPP_NAME))
7575 name = c_parser_peek_token (parser)->value;
7576 c_parser_consume_token (parser);
7577 c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>");
7579 else
7580 c_parser_error (parser, "expected identifier");
7582 else if (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL))
7583 c_parser_error (parser, "expected %<(%> or end of line");
7584 c_parser_skip_to_pragma_eol (parser);
7586 stmt = c_parser_omp_structured_block (parser);
7587 return c_finish_omp_critical (stmt, name);
7590 /* OpenMP 2.5:
7591 # pragma omp flush flush-vars[opt] new-line
7593 flush-vars:
7594 ( variable-list ) */
7596 static void
7597 c_parser_omp_flush (c_parser *parser)
7599 c_parser_consume_pragma (parser);
7600 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
7601 c_parser_omp_var_list_parens (parser, OMP_CLAUSE_ERROR, NULL);
7602 else if (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL))
7603 c_parser_error (parser, "expected %<(%> or end of line");
7604 c_parser_skip_to_pragma_eol (parser);
7606 c_finish_omp_flush ();
7609 /* Parse the restricted form of the for statement allowed by OpenMP.
7610 The real trick here is to determine the loop control variable early
7611 so that we can push a new decl if necessary to make it private. */
7613 static tree
7614 c_parser_omp_for_loop (c_parser *parser, tree clauses, tree *par_clauses)
7616 tree decl, cond, incr, save_break, save_cont, body, init, stmt, cl;
7617 tree declv, condv, incrv, initv, for_block = NULL, ret = NULL;
7618 location_t loc;
7619 bool fail = false, open_brace_parsed = false;
7620 int i, collapse = 1, nbraces = 0;
7622 for (cl = clauses; cl; cl = OMP_CLAUSE_CHAIN (cl))
7623 if (OMP_CLAUSE_CODE (cl) == OMP_CLAUSE_COLLAPSE)
7624 collapse = tree_low_cst (OMP_CLAUSE_COLLAPSE_EXPR (cl), 0);
7626 gcc_assert (collapse >= 1);
7628 declv = make_tree_vec (collapse);
7629 initv = make_tree_vec (collapse);
7630 condv = make_tree_vec (collapse);
7631 incrv = make_tree_vec (collapse);
7633 if (!c_parser_next_token_is_keyword (parser, RID_FOR))
7635 c_parser_error (parser, "for statement expected");
7636 return NULL;
7638 loc = c_parser_peek_token (parser)->location;
7639 c_parser_consume_token (parser);
7641 for (i = 0; i < collapse; i++)
7643 int bracecount = 0;
7645 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
7646 goto pop_scopes;
7648 /* Parse the initialization declaration or expression. */
7649 if (c_parser_next_token_starts_declspecs (parser))
7651 if (i > 0)
7652 for_block
7653 = tree_cons (NULL, c_begin_compound_stmt (true), for_block);
7654 c_parser_declaration_or_fndef (parser, true, true, true, true);
7655 decl = check_for_loop_decls ();
7656 if (decl == NULL)
7657 goto error_init;
7658 if (DECL_INITIAL (decl) == error_mark_node)
7659 decl = error_mark_node;
7660 init = decl;
7662 else if (c_parser_next_token_is (parser, CPP_NAME)
7663 && c_parser_peek_2nd_token (parser)->type == CPP_EQ)
7665 struct c_expr init_exp;
7667 decl = c_parser_postfix_expression (parser).value;
7669 c_parser_require (parser, CPP_EQ, "expected %<=%>");
7671 init_exp = c_parser_expr_no_commas (parser, NULL);
7672 init_exp = default_function_array_conversion (init_exp);
7673 init = build_modify_expr (decl, NOP_EXPR, init_exp.value);
7674 init = c_process_expr_stmt (init);
7676 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
7678 else
7680 error_init:
7681 c_parser_error (parser,
7682 "expected iteration declaration or initialization");
7683 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
7684 "expected %<)%>");
7685 fail = true;
7686 goto parse_next;
7689 /* Parse the loop condition. */
7690 cond = NULL_TREE;
7691 if (c_parser_next_token_is_not (parser, CPP_SEMICOLON))
7693 cond = c_parser_expression_conv (parser).value;
7694 cond = c_objc_common_truthvalue_conversion (cond);
7695 if (CAN_HAVE_LOCATION_P (cond))
7696 SET_EXPR_LOCATION (cond, input_location);
7698 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
7700 /* Parse the increment expression. */
7701 incr = NULL_TREE;
7702 if (c_parser_next_token_is_not (parser, CPP_CLOSE_PAREN))
7703 incr = c_process_expr_stmt (c_parser_expression (parser).value);
7704 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
7706 if (decl == NULL || decl == error_mark_node || init == error_mark_node)
7707 fail = true;
7708 else
7710 TREE_VEC_ELT (declv, i) = decl;
7711 TREE_VEC_ELT (initv, i) = init;
7712 TREE_VEC_ELT (condv, i) = cond;
7713 TREE_VEC_ELT (incrv, i) = incr;
7716 parse_next:
7717 if (i == collapse - 1)
7718 break;
7720 /* FIXME: OpenMP 3.0 draft isn't very clear on what exactly is allowed
7721 in between the collapsed for loops to be still considered perfectly
7722 nested. Hopefully the final version clarifies this.
7723 For now handle (multiple) {'s and empty statements. */
7726 if (c_parser_next_token_is_keyword (parser, RID_FOR))
7728 c_parser_consume_token (parser);
7729 break;
7731 else if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
7733 c_parser_consume_token (parser);
7734 bracecount++;
7736 else if (bracecount
7737 && c_parser_next_token_is (parser, CPP_SEMICOLON))
7738 c_parser_consume_token (parser);
7739 else
7741 c_parser_error (parser, "not enough perfectly nested loops");
7742 if (bracecount)
7744 open_brace_parsed = true;
7745 bracecount--;
7747 fail = true;
7748 collapse = 0;
7749 break;
7752 while (1);
7754 nbraces += bracecount;
7757 save_break = c_break_label;
7758 c_break_label = size_one_node;
7759 save_cont = c_cont_label;
7760 c_cont_label = NULL_TREE;
7761 body = push_stmt_list ();
7763 if (open_brace_parsed)
7765 stmt = c_begin_compound_stmt (true);
7766 c_parser_compound_statement_nostart (parser);
7767 add_stmt (c_end_compound_stmt (stmt, true));
7769 else
7770 add_stmt (c_parser_c99_block_statement (parser));
7771 if (c_cont_label)
7772 add_stmt (build1 (LABEL_EXPR, void_type_node, c_cont_label));
7774 body = pop_stmt_list (body);
7775 c_break_label = save_break;
7776 c_cont_label = save_cont;
7778 while (nbraces)
7780 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
7782 c_parser_consume_token (parser);
7783 nbraces--;
7785 else if (c_parser_next_token_is (parser, CPP_SEMICOLON))
7786 c_parser_consume_token (parser);
7787 else
7789 c_parser_error (parser, "collapsed loops not perfectly nested");
7790 while (nbraces)
7792 stmt = c_begin_compound_stmt (true);
7793 add_stmt (body);
7794 c_parser_compound_statement_nostart (parser);
7795 body = c_end_compound_stmt (stmt, true);
7796 nbraces--;
7798 goto pop_scopes;
7802 /* Only bother calling c_finish_omp_for if we haven't already generated
7803 an error from the initialization parsing. */
7804 if (!fail)
7806 stmt = c_finish_omp_for (loc, declv, initv, condv, incrv, body, NULL);
7807 if (stmt)
7809 if (par_clauses != NULL)
7811 tree *c;
7812 for (c = par_clauses; *c ; )
7813 if (OMP_CLAUSE_CODE (*c) != OMP_CLAUSE_FIRSTPRIVATE
7814 && OMP_CLAUSE_CODE (*c) != OMP_CLAUSE_LASTPRIVATE)
7815 c = &OMP_CLAUSE_CHAIN (*c);
7816 else
7818 for (i = 0; i < collapse; i++)
7819 if (TREE_VEC_ELT (declv, i) == OMP_CLAUSE_DECL (*c))
7820 break;
7821 if (i == collapse)
7822 c = &OMP_CLAUSE_CHAIN (*c);
7823 else if (OMP_CLAUSE_CODE (*c) == OMP_CLAUSE_FIRSTPRIVATE)
7825 error ("%Hiteration variable %qD should not be firstprivate",
7826 &loc, OMP_CLAUSE_DECL (*c));
7827 *c = OMP_CLAUSE_CHAIN (*c);
7829 else
7831 /* Copy lastprivate (decl) clause to OMP_FOR_CLAUSES,
7832 change it to shared (decl) in
7833 OMP_PARALLEL_CLAUSES. */
7834 tree l = build_omp_clause (OMP_CLAUSE_LASTPRIVATE);
7835 OMP_CLAUSE_DECL (l) = OMP_CLAUSE_DECL (*c);
7836 OMP_CLAUSE_CHAIN (l) = clauses;
7837 clauses = l;
7838 OMP_CLAUSE_SET_CODE (*c, OMP_CLAUSE_SHARED);
7842 OMP_FOR_CLAUSES (stmt) = clauses;
7844 ret = stmt;
7846 pop_scopes:
7847 while (for_block)
7849 stmt = c_end_compound_stmt (TREE_VALUE (for_block), true);
7850 add_stmt (stmt);
7851 for_block = TREE_CHAIN (for_block);
7853 return ret;
7856 /* OpenMP 2.5:
7857 #pragma omp for for-clause[optseq] new-line
7858 for-loop
7861 #define OMP_FOR_CLAUSE_MASK \
7862 ( (1u << PRAGMA_OMP_CLAUSE_PRIVATE) \
7863 | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE) \
7864 | (1u << PRAGMA_OMP_CLAUSE_LASTPRIVATE) \
7865 | (1u << PRAGMA_OMP_CLAUSE_REDUCTION) \
7866 | (1u << PRAGMA_OMP_CLAUSE_ORDERED) \
7867 | (1u << PRAGMA_OMP_CLAUSE_SCHEDULE) \
7868 | (1u << PRAGMA_OMP_CLAUSE_COLLAPSE) \
7869 | (1u << PRAGMA_OMP_CLAUSE_NOWAIT))
7871 static tree
7872 c_parser_omp_for (c_parser *parser)
7874 tree block, clauses, ret;
7876 clauses = c_parser_omp_all_clauses (parser, OMP_FOR_CLAUSE_MASK,
7877 "#pragma omp for");
7879 block = c_begin_compound_stmt (true);
7880 ret = c_parser_omp_for_loop (parser, clauses, NULL);
7881 block = c_end_compound_stmt (block, true);
7882 add_stmt (block);
7884 return ret;
7887 /* OpenMP 2.5:
7888 # pragma omp master new-line
7889 structured-block
7892 static tree
7893 c_parser_omp_master (c_parser *parser)
7895 c_parser_skip_to_pragma_eol (parser);
7896 return c_finish_omp_master (c_parser_omp_structured_block (parser));
7899 /* OpenMP 2.5:
7900 # pragma omp ordered new-line
7901 structured-block
7904 static tree
7905 c_parser_omp_ordered (c_parser *parser)
7907 c_parser_skip_to_pragma_eol (parser);
7908 return c_finish_omp_ordered (c_parser_omp_structured_block (parser));
7911 /* OpenMP 2.5:
7913 section-scope:
7914 { section-sequence }
7916 section-sequence:
7917 section-directive[opt] structured-block
7918 section-sequence section-directive structured-block */
7920 static tree
7921 c_parser_omp_sections_scope (c_parser *parser)
7923 tree stmt, substmt;
7924 bool error_suppress = false;
7925 location_t loc;
7927 if (!c_parser_require (parser, CPP_OPEN_BRACE, "expected %<{%>"))
7929 /* Avoid skipping until the end of the block. */
7930 parser->error = false;
7931 return NULL_TREE;
7934 stmt = push_stmt_list ();
7936 loc = c_parser_peek_token (parser)->location;
7937 if (c_parser_peek_token (parser)->pragma_kind != PRAGMA_OMP_SECTION)
7939 substmt = push_stmt_list ();
7941 while (1)
7943 c_parser_statement (parser);
7945 if (c_parser_peek_token (parser)->pragma_kind == PRAGMA_OMP_SECTION)
7946 break;
7947 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
7948 break;
7949 if (c_parser_next_token_is (parser, CPP_EOF))
7950 break;
7953 substmt = pop_stmt_list (substmt);
7954 substmt = build1 (OMP_SECTION, void_type_node, substmt);
7955 SET_EXPR_LOCATION (substmt, loc);
7956 add_stmt (substmt);
7959 while (1)
7961 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
7962 break;
7963 if (c_parser_next_token_is (parser, CPP_EOF))
7964 break;
7966 loc = c_parser_peek_token (parser)->location;
7967 if (c_parser_peek_token (parser)->pragma_kind == PRAGMA_OMP_SECTION)
7969 c_parser_consume_pragma (parser);
7970 c_parser_skip_to_pragma_eol (parser);
7971 error_suppress = false;
7973 else if (!error_suppress)
7975 error ("%Hexpected %<#pragma omp section%> or %<}%>",
7976 &loc);
7977 error_suppress = true;
7980 substmt = c_parser_omp_structured_block (parser);
7981 substmt = build1 (OMP_SECTION, void_type_node, substmt);
7982 SET_EXPR_LOCATION (substmt, loc);
7983 add_stmt (substmt);
7985 c_parser_skip_until_found (parser, CPP_CLOSE_BRACE,
7986 "expected %<#pragma omp section%> or %<}%>");
7988 substmt = pop_stmt_list (stmt);
7990 stmt = make_node (OMP_SECTIONS);
7991 TREE_TYPE (stmt) = void_type_node;
7992 OMP_SECTIONS_BODY (stmt) = substmt;
7994 return add_stmt (stmt);
7997 /* OpenMP 2.5:
7998 # pragma omp sections sections-clause[optseq] newline
7999 sections-scope
8002 #define OMP_SECTIONS_CLAUSE_MASK \
8003 ( (1u << PRAGMA_OMP_CLAUSE_PRIVATE) \
8004 | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE) \
8005 | (1u << PRAGMA_OMP_CLAUSE_LASTPRIVATE) \
8006 | (1u << PRAGMA_OMP_CLAUSE_REDUCTION) \
8007 | (1u << PRAGMA_OMP_CLAUSE_NOWAIT))
8009 static tree
8010 c_parser_omp_sections (c_parser *parser)
8012 tree block, clauses, ret;
8014 clauses = c_parser_omp_all_clauses (parser, OMP_SECTIONS_CLAUSE_MASK,
8015 "#pragma omp sections");
8017 block = c_begin_compound_stmt (true);
8018 ret = c_parser_omp_sections_scope (parser);
8019 if (ret)
8020 OMP_SECTIONS_CLAUSES (ret) = clauses;
8021 block = c_end_compound_stmt (block, true);
8022 add_stmt (block);
8024 return ret;
8027 /* OpenMP 2.5:
8028 # pragma parallel parallel-clause new-line
8029 # pragma parallel for parallel-for-clause new-line
8030 # pragma parallel sections parallel-sections-clause new-line
8033 #define OMP_PARALLEL_CLAUSE_MASK \
8034 ( (1u << PRAGMA_OMP_CLAUSE_IF) \
8035 | (1u << PRAGMA_OMP_CLAUSE_PRIVATE) \
8036 | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE) \
8037 | (1u << PRAGMA_OMP_CLAUSE_DEFAULT) \
8038 | (1u << PRAGMA_OMP_CLAUSE_SHARED) \
8039 | (1u << PRAGMA_OMP_CLAUSE_COPYIN) \
8040 | (1u << PRAGMA_OMP_CLAUSE_REDUCTION) \
8041 | (1u << PRAGMA_OMP_CLAUSE_NUM_THREADS))
8043 static tree
8044 c_parser_omp_parallel (c_parser *parser)
8046 enum pragma_kind p_kind = PRAGMA_OMP_PARALLEL;
8047 const char *p_name = "#pragma omp parallel";
8048 tree stmt, clauses, par_clause, ws_clause, block;
8049 unsigned int mask = OMP_PARALLEL_CLAUSE_MASK;
8051 if (c_parser_next_token_is_keyword (parser, RID_FOR))
8053 c_parser_consume_token (parser);
8054 p_kind = PRAGMA_OMP_PARALLEL_FOR;
8055 p_name = "#pragma omp parallel for";
8056 mask |= OMP_FOR_CLAUSE_MASK;
8057 mask &= ~(1u << PRAGMA_OMP_CLAUSE_NOWAIT);
8059 else if (c_parser_next_token_is (parser, CPP_NAME))
8061 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
8062 if (strcmp (p, "sections") == 0)
8064 c_parser_consume_token (parser);
8065 p_kind = PRAGMA_OMP_PARALLEL_SECTIONS;
8066 p_name = "#pragma omp parallel sections";
8067 mask |= OMP_SECTIONS_CLAUSE_MASK;
8068 mask &= ~(1u << PRAGMA_OMP_CLAUSE_NOWAIT);
8072 clauses = c_parser_omp_all_clauses (parser, mask, p_name);
8074 switch (p_kind)
8076 case PRAGMA_OMP_PARALLEL:
8077 block = c_begin_omp_parallel ();
8078 c_parser_statement (parser);
8079 stmt = c_finish_omp_parallel (clauses, block);
8080 break;
8082 case PRAGMA_OMP_PARALLEL_FOR:
8083 block = c_begin_omp_parallel ();
8084 c_split_parallel_clauses (clauses, &par_clause, &ws_clause);
8085 c_parser_omp_for_loop (parser, ws_clause, &par_clause);
8086 stmt = c_finish_omp_parallel (par_clause, block);
8087 OMP_PARALLEL_COMBINED (stmt) = 1;
8088 break;
8090 case PRAGMA_OMP_PARALLEL_SECTIONS:
8091 block = c_begin_omp_parallel ();
8092 c_split_parallel_clauses (clauses, &par_clause, &ws_clause);
8093 stmt = c_parser_omp_sections_scope (parser);
8094 if (stmt)
8095 OMP_SECTIONS_CLAUSES (stmt) = ws_clause;
8096 stmt = c_finish_omp_parallel (par_clause, block);
8097 OMP_PARALLEL_COMBINED (stmt) = 1;
8098 break;
8100 default:
8101 gcc_unreachable ();
8104 return stmt;
8107 /* OpenMP 2.5:
8108 # pragma omp single single-clause[optseq] new-line
8109 structured-block
8112 #define OMP_SINGLE_CLAUSE_MASK \
8113 ( (1u << PRAGMA_OMP_CLAUSE_PRIVATE) \
8114 | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE) \
8115 | (1u << PRAGMA_OMP_CLAUSE_COPYPRIVATE) \
8116 | (1u << PRAGMA_OMP_CLAUSE_NOWAIT))
8118 static tree
8119 c_parser_omp_single (c_parser *parser)
8121 tree stmt = make_node (OMP_SINGLE);
8122 TREE_TYPE (stmt) = void_type_node;
8124 OMP_SINGLE_CLAUSES (stmt)
8125 = c_parser_omp_all_clauses (parser, OMP_SINGLE_CLAUSE_MASK,
8126 "#pragma omp single");
8127 OMP_SINGLE_BODY (stmt) = c_parser_omp_structured_block (parser);
8129 return add_stmt (stmt);
8132 /* OpenMP 3.0:
8133 # pragma omp task task-clause[optseq] new-line
8136 #define OMP_TASK_CLAUSE_MASK \
8137 ( (1u << PRAGMA_OMP_CLAUSE_IF) \
8138 | (1u << PRAGMA_OMP_CLAUSE_UNTIED) \
8139 | (1u << PRAGMA_OMP_CLAUSE_DEFAULT) \
8140 | (1u << PRAGMA_OMP_CLAUSE_PRIVATE) \
8141 | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE) \
8142 | (1u << PRAGMA_OMP_CLAUSE_SHARED))
8144 static tree
8145 c_parser_omp_task (c_parser *parser)
8147 tree clauses, block;
8149 clauses = c_parser_omp_all_clauses (parser, OMP_TASK_CLAUSE_MASK,
8150 "#pragma omp task");
8152 block = c_begin_omp_task ();
8153 c_parser_statement (parser);
8154 return c_finish_omp_task (clauses, block);
8157 /* OpenMP 3.0:
8158 # pragma omp taskwait new-line
8161 static void
8162 c_parser_omp_taskwait (c_parser *parser)
8164 c_parser_consume_pragma (parser);
8165 c_parser_skip_to_pragma_eol (parser);
8167 c_finish_omp_taskwait ();
8170 /* Main entry point to parsing most OpenMP pragmas. */
8172 static void
8173 c_parser_omp_construct (c_parser *parser)
8175 enum pragma_kind p_kind;
8176 location_t loc;
8177 tree stmt;
8179 loc = c_parser_peek_token (parser)->location;
8180 p_kind = c_parser_peek_token (parser)->pragma_kind;
8181 c_parser_consume_pragma (parser);
8183 /* For all constructs below except #pragma omp atomic
8184 MUST_NOT_THROW catch handlers are needed when exceptions
8185 are enabled. */
8186 if (p_kind != PRAGMA_OMP_ATOMIC)
8187 c_maybe_initialize_eh ();
8189 switch (p_kind)
8191 case PRAGMA_OMP_ATOMIC:
8192 c_parser_omp_atomic (parser);
8193 return;
8194 case PRAGMA_OMP_CRITICAL:
8195 stmt = c_parser_omp_critical (parser);
8196 break;
8197 case PRAGMA_OMP_FOR:
8198 stmt = c_parser_omp_for (parser);
8199 break;
8200 case PRAGMA_OMP_MASTER:
8201 stmt = c_parser_omp_master (parser);
8202 break;
8203 case PRAGMA_OMP_ORDERED:
8204 stmt = c_parser_omp_ordered (parser);
8205 break;
8206 case PRAGMA_OMP_PARALLEL:
8207 stmt = c_parser_omp_parallel (parser);
8208 break;
8209 case PRAGMA_OMP_SECTIONS:
8210 stmt = c_parser_omp_sections (parser);
8211 break;
8212 case PRAGMA_OMP_SINGLE:
8213 stmt = c_parser_omp_single (parser);
8214 break;
8215 case PRAGMA_OMP_TASK:
8216 stmt = c_parser_omp_task (parser);
8217 break;
8218 default:
8219 gcc_unreachable ();
8222 if (stmt)
8223 SET_EXPR_LOCATION (stmt, loc);
8227 /* OpenMP 2.5:
8228 # pragma omp threadprivate (variable-list) */
8230 static void
8231 c_parser_omp_threadprivate (c_parser *parser)
8233 tree vars, t;
8235 c_parser_consume_pragma (parser);
8236 vars = c_parser_omp_var_list_parens (parser, OMP_CLAUSE_ERROR, NULL);
8238 /* Mark every variable in VARS to be assigned thread local storage. */
8239 for (t = vars; t; t = TREE_CHAIN (t))
8241 tree v = TREE_PURPOSE (t);
8243 /* If V had already been marked threadprivate, it doesn't matter
8244 whether it had been used prior to this point. */
8245 if (TREE_CODE (v) != VAR_DECL)
8246 error ("%qD is not a variable", v);
8247 else if (TREE_USED (v) && !C_DECL_THREADPRIVATE_P (v))
8248 error ("%qE declared %<threadprivate%> after first use", v);
8249 else if (! TREE_STATIC (v) && ! DECL_EXTERNAL (v))
8250 error ("automatic variable %qE cannot be %<threadprivate%>", v);
8251 else if (TREE_TYPE (v) == error_mark_node)
8253 else if (! COMPLETE_TYPE_P (TREE_TYPE (v)))
8254 error ("%<threadprivate%> %qE has incomplete type", v);
8255 else
8257 if (! DECL_THREAD_LOCAL_P (v))
8259 DECL_TLS_MODEL (v) = decl_default_tls_model (v);
8260 /* If rtl has been already set for this var, call
8261 make_decl_rtl once again, so that encode_section_info
8262 has a chance to look at the new decl flags. */
8263 if (DECL_RTL_SET_P (v))
8264 make_decl_rtl (v);
8266 C_DECL_THREADPRIVATE_P (v) = 1;
8270 c_parser_skip_to_pragma_eol (parser);
8274 /* Parse a single source file. */
8276 void
8277 c_parse_file (void)
8279 /* Use local storage to begin. If the first token is a pragma, parse it.
8280 If it is #pragma GCC pch_preprocess, then this will load a PCH file
8281 which will cause garbage collection. */
8282 c_parser tparser;
8284 memset (&tparser, 0, sizeof tparser);
8285 the_parser = &tparser;
8287 if (c_parser_peek_token (&tparser)->pragma_kind == PRAGMA_GCC_PCH_PREPROCESS)
8288 c_parser_pragma_pch_preprocess (&tparser);
8290 the_parser = GGC_NEW (c_parser);
8291 *the_parser = tparser;
8293 c_parser_translation_unit (the_parser);
8294 the_parser = NULL;
8297 #include "gt-c-parser.h"