Add forgotten entry for r133418.
[official-gcc.git] / gcc / c-parser.c
blob831f95ac1e2465a86249b1e1204238c1bfa7a84a
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_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 = 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 c_token *token;
448 /* Peek at the next token. */
449 token = c_parser_peek_token (parser);
450 /* Check to see if it is the indicated keyword. */
451 return token->keyword == keyword;
454 /* Return true if TOKEN can start a type name,
455 false otherwise. */
456 static bool
457 c_token_starts_typename (c_token *token)
459 switch (token->type)
461 case CPP_NAME:
462 switch (token->id_kind)
464 case C_ID_ID:
465 return false;
466 case C_ID_TYPENAME:
467 return true;
468 case C_ID_CLASSNAME:
469 gcc_assert (c_dialect_objc ());
470 return true;
471 default:
472 gcc_unreachable ();
474 case CPP_KEYWORD:
475 switch (token->keyword)
477 case RID_UNSIGNED:
478 case RID_LONG:
479 case RID_SHORT:
480 case RID_SIGNED:
481 case RID_COMPLEX:
482 case RID_INT:
483 case RID_CHAR:
484 case RID_FLOAT:
485 case RID_DOUBLE:
486 case RID_VOID:
487 case RID_DFLOAT32:
488 case RID_DFLOAT64:
489 case RID_DFLOAT128:
490 case RID_BOOL:
491 case RID_ENUM:
492 case RID_STRUCT:
493 case RID_UNION:
494 case RID_TYPEOF:
495 case RID_CONST:
496 case RID_VOLATILE:
497 case RID_RESTRICT:
498 case RID_ATTRIBUTE:
499 case RID_FRACT:
500 case RID_ACCUM:
501 case RID_SAT:
502 return true;
503 default:
504 return false;
506 case CPP_LESS:
507 if (c_dialect_objc ())
508 return true;
509 return false;
510 default:
511 return false;
515 /* Return true if the next token from PARSER can start a type name,
516 false otherwise. */
517 static inline bool
518 c_parser_next_token_starts_typename (c_parser *parser)
520 c_token *token = c_parser_peek_token (parser);
521 return c_token_starts_typename (token);
524 /* Return true if TOKEN can start declaration specifiers, false
525 otherwise. */
526 static bool
527 c_token_starts_declspecs (c_token *token)
529 switch (token->type)
531 case CPP_NAME:
532 switch (token->id_kind)
534 case C_ID_ID:
535 return false;
536 case C_ID_TYPENAME:
537 return true;
538 case C_ID_CLASSNAME:
539 gcc_assert (c_dialect_objc ());
540 return true;
541 default:
542 gcc_unreachable ();
544 case CPP_KEYWORD:
545 switch (token->keyword)
547 case RID_STATIC:
548 case RID_EXTERN:
549 case RID_REGISTER:
550 case RID_TYPEDEF:
551 case RID_INLINE:
552 case RID_AUTO:
553 case RID_THREAD:
554 case RID_UNSIGNED:
555 case RID_LONG:
556 case RID_SHORT:
557 case RID_SIGNED:
558 case RID_COMPLEX:
559 case RID_INT:
560 case RID_CHAR:
561 case RID_FLOAT:
562 case RID_DOUBLE:
563 case RID_VOID:
564 case RID_DFLOAT32:
565 case RID_DFLOAT64:
566 case RID_DFLOAT128:
567 case RID_BOOL:
568 case RID_ENUM:
569 case RID_STRUCT:
570 case RID_UNION:
571 case RID_TYPEOF:
572 case RID_CONST:
573 case RID_VOLATILE:
574 case RID_RESTRICT:
575 case RID_ATTRIBUTE:
576 case RID_FRACT:
577 case RID_ACCUM:
578 case RID_SAT:
579 return true;
580 default:
581 return false;
583 case CPP_LESS:
584 if (c_dialect_objc ())
585 return true;
586 return false;
587 default:
588 return false;
592 /* Return true if the next token from PARSER can start declaration
593 specifiers, false otherwise. */
594 static inline bool
595 c_parser_next_token_starts_declspecs (c_parser *parser)
597 c_token *token = c_parser_peek_token (parser);
598 return c_token_starts_declspecs (token);
601 /* Return a pointer to the next-but-one token from PARSER, reading it
602 in if necessary. The next token is already read in. */
604 static c_token *
605 c_parser_peek_2nd_token (c_parser *parser)
607 if (parser->tokens_avail >= 2)
608 return &parser->tokens[1];
609 gcc_assert (parser->tokens_avail == 1);
610 gcc_assert (parser->tokens[0].type != CPP_EOF);
611 gcc_assert (parser->tokens[0].type != CPP_PRAGMA_EOL);
612 c_lex_one_token (parser, &parser->tokens[1]);
613 parser->tokens_avail = 2;
614 return &parser->tokens[1];
617 /* Consume the next token from PARSER. */
619 static void
620 c_parser_consume_token (c_parser *parser)
622 gcc_assert (parser->tokens_avail >= 1);
623 gcc_assert (parser->tokens[0].type != CPP_EOF);
624 gcc_assert (!parser->in_pragma || parser->tokens[0].type != CPP_PRAGMA_EOL);
625 gcc_assert (parser->error || parser->tokens[0].type != CPP_PRAGMA);
626 if (parser->tokens_avail == 2)
627 parser->tokens[0] = parser->tokens[1];
628 parser->tokens_avail--;
631 /* Expect the current token to be a #pragma. Consume it and remember
632 that we've begun parsing a pragma. */
634 static void
635 c_parser_consume_pragma (c_parser *parser)
637 gcc_assert (!parser->in_pragma);
638 gcc_assert (parser->tokens_avail >= 1);
639 gcc_assert (parser->tokens[0].type == CPP_PRAGMA);
640 if (parser->tokens_avail == 2)
641 parser->tokens[0] = parser->tokens[1];
642 parser->tokens_avail--;
643 parser->in_pragma = true;
646 /* Update the globals input_location and in_system_header from
647 TOKEN. */
648 static inline void
649 c_parser_set_source_position_from_token (c_token *token)
651 if (token->type != CPP_EOF)
653 input_location = token->location;
654 in_system_header = token->in_system_header;
658 /* Issue a diagnostic of the form
659 FILE:LINE: MESSAGE before TOKEN
660 where TOKEN is the next token in the input stream of PARSER.
661 MESSAGE (specified by the caller) is usually of the form "expected
662 OTHER-TOKEN".
664 Do not issue a diagnostic if still recovering from an error.
666 ??? This is taken from the C++ parser, but building up messages in
667 this way is not i18n-friendly and some other approach should be
668 used. */
670 static void
671 c_parser_error (c_parser *parser, const char *gmsgid)
673 c_token *token = c_parser_peek_token (parser);
674 if (parser->error)
675 return;
676 parser->error = true;
677 if (!gmsgid)
678 return;
679 /* This diagnostic makes more sense if it is tagged to the line of
680 the token we just peeked at. */
681 c_parser_set_source_position_from_token (token);
682 c_parse_error (gmsgid,
683 /* Because c_parse_error does not understand
684 CPP_KEYWORD, keywords are treated like
685 identifiers. */
686 (token->type == CPP_KEYWORD ? CPP_NAME : token->type),
687 token->value);
690 /* If the next token is of the indicated TYPE, consume it. Otherwise,
691 issue the error MSGID. If MSGID is NULL then a message has already
692 been produced and no message will be produced this time. Returns
693 true if found, false otherwise. */
695 static bool
696 c_parser_require (c_parser *parser,
697 enum cpp_ttype type,
698 const char *msgid)
700 if (c_parser_next_token_is (parser, type))
702 c_parser_consume_token (parser);
703 return true;
705 else
707 c_parser_error (parser, msgid);
708 return false;
712 /* If the next token is the indicated keyword, consume it. Otherwise,
713 issue the error MSGID. Returns true if found, false otherwise. */
715 static bool
716 c_parser_require_keyword (c_parser *parser,
717 enum rid keyword,
718 const char *msgid)
720 if (c_parser_next_token_is_keyword (parser, keyword))
722 c_parser_consume_token (parser);
723 return true;
725 else
727 c_parser_error (parser, msgid);
728 return false;
732 /* Like c_parser_require, except that tokens will be skipped until the
733 desired token is found. An error message is still produced if the
734 next token is not as expected. If MSGID is NULL then a message has
735 already been produced and no message will be produced this
736 time. */
738 static void
739 c_parser_skip_until_found (c_parser *parser,
740 enum cpp_ttype type,
741 const char *msgid)
743 unsigned nesting_depth = 0;
745 if (c_parser_require (parser, type, msgid))
746 return;
748 /* Skip tokens until the desired token is found. */
749 while (true)
751 /* Peek at the next token. */
752 c_token *token = c_parser_peek_token (parser);
753 /* If we've reached the token we want, consume it and stop. */
754 if (token->type == type && !nesting_depth)
756 c_parser_consume_token (parser);
757 break;
760 /* If we've run out of tokens, stop. */
761 if (token->type == CPP_EOF)
762 return;
763 if (token->type == CPP_PRAGMA_EOL && parser->in_pragma)
764 return;
765 if (token->type == CPP_OPEN_BRACE
766 || token->type == CPP_OPEN_PAREN
767 || token->type == CPP_OPEN_SQUARE)
768 ++nesting_depth;
769 else if (token->type == CPP_CLOSE_BRACE
770 || token->type == CPP_CLOSE_PAREN
771 || token->type == CPP_CLOSE_SQUARE)
773 if (nesting_depth-- == 0)
774 break;
776 /* Consume this token. */
777 c_parser_consume_token (parser);
779 parser->error = false;
782 /* Skip tokens until the end of a parameter is found, but do not
783 consume the comma, semicolon or closing delimiter. */
785 static void
786 c_parser_skip_to_end_of_parameter (c_parser *parser)
788 unsigned nesting_depth = 0;
790 while (true)
792 c_token *token = c_parser_peek_token (parser);
793 if ((token->type == CPP_COMMA || token->type == CPP_SEMICOLON)
794 && !nesting_depth)
795 break;
796 /* If we've run out of tokens, stop. */
797 if (token->type == CPP_EOF)
798 return;
799 if (token->type == CPP_PRAGMA_EOL && parser->in_pragma)
800 return;
801 if (token->type == CPP_OPEN_BRACE
802 || token->type == CPP_OPEN_PAREN
803 || token->type == CPP_OPEN_SQUARE)
804 ++nesting_depth;
805 else if (token->type == CPP_CLOSE_BRACE
806 || token->type == CPP_CLOSE_PAREN
807 || token->type == CPP_CLOSE_SQUARE)
809 if (nesting_depth-- == 0)
810 break;
812 /* Consume this token. */
813 c_parser_consume_token (parser);
815 parser->error = false;
818 /* Expect to be at the end of the pragma directive and consume an
819 end of line marker. */
821 static void
822 c_parser_skip_to_pragma_eol (c_parser *parser)
824 gcc_assert (parser->in_pragma);
825 parser->in_pragma = false;
827 if (!c_parser_require (parser, CPP_PRAGMA_EOL, "expected end of line"))
828 while (true)
830 c_token *token = c_parser_peek_token (parser);
831 if (token->type == CPP_EOF)
832 break;
833 if (token->type == CPP_PRAGMA_EOL)
835 c_parser_consume_token (parser);
836 break;
838 c_parser_consume_token (parser);
841 parser->error = false;
844 /* Skip tokens until we have consumed an entire block, or until we
845 have consumed a non-nested ';'. */
847 static void
848 c_parser_skip_to_end_of_block_or_statement (c_parser *parser)
850 unsigned nesting_depth = 0;
851 bool save_error = parser->error;
853 while (true)
855 c_token *token;
857 /* Peek at the next token. */
858 token = c_parser_peek_token (parser);
860 switch (token->type)
862 case CPP_EOF:
863 return;
865 case CPP_PRAGMA_EOL:
866 if (parser->in_pragma)
867 return;
868 break;
870 case CPP_SEMICOLON:
871 /* If the next token is a ';', we have reached the
872 end of the statement. */
873 if (!nesting_depth)
875 /* Consume the ';'. */
876 c_parser_consume_token (parser);
877 goto finished;
879 break;
881 case CPP_CLOSE_BRACE:
882 /* If the next token is a non-nested '}', then we have
883 reached the end of the current block. */
884 if (nesting_depth == 0 || --nesting_depth == 0)
886 c_parser_consume_token (parser);
887 goto finished;
889 break;
891 case CPP_OPEN_BRACE:
892 /* If it the next token is a '{', then we are entering a new
893 block. Consume the entire block. */
894 ++nesting_depth;
895 break;
897 case CPP_PRAGMA:
898 /* If we see a pragma, consume the whole thing at once. We
899 have some safeguards against consuming pragmas willy-nilly.
900 Normally, we'd expect to be here with parser->error set,
901 which disables these safeguards. But it's possible to get
902 here for secondary error recovery, after parser->error has
903 been cleared. */
904 c_parser_consume_pragma (parser);
905 c_parser_skip_to_pragma_eol (parser);
906 parser->error = save_error;
907 continue;
909 default:
910 break;
913 c_parser_consume_token (parser);
916 finished:
917 parser->error = false;
920 /* Save the warning flags which are controlled by __extension__. */
922 static inline int
923 disable_extension_diagnostics (void)
925 int ret = (pedantic
926 | (warn_pointer_arith << 1)
927 | (warn_traditional << 2)
928 | (flag_iso << 3));
929 pedantic = 0;
930 warn_pointer_arith = 0;
931 warn_traditional = 0;
932 flag_iso = 0;
933 return ret;
936 /* Restore the warning flags which are controlled by __extension__.
937 FLAGS is the return value from disable_extension_diagnostics. */
939 static inline void
940 restore_extension_diagnostics (int flags)
942 pedantic = flags & 1;
943 warn_pointer_arith = (flags >> 1) & 1;
944 warn_traditional = (flags >> 2) & 1;
945 flag_iso = (flags >> 3) & 1;
948 /* Possibly kinds of declarator to parse. */
949 typedef enum c_dtr_syn {
950 /* A normal declarator with an identifier. */
951 C_DTR_NORMAL,
952 /* An abstract declarator (maybe empty). */
953 C_DTR_ABSTRACT,
954 /* A parameter declarator: may be either, but after a type name does
955 not redeclare a typedef name as an identifier if it can
956 alternatively be interpreted as a typedef name; see DR#009,
957 applied in C90 TC1, omitted from C99 and reapplied in C99 TC2
958 following DR#249. For example, given a typedef T, "int T" and
959 "int *T" are valid parameter declarations redeclaring T, while
960 "int (T)" and "int * (T)" and "int (T[])" and "int (T (int))" are
961 abstract declarators rather than involving redundant parentheses;
962 the same applies with attributes inside the parentheses before
963 "T". */
964 C_DTR_PARM
965 } c_dtr_syn;
967 static void c_parser_external_declaration (c_parser *);
968 static void c_parser_asm_definition (c_parser *);
969 static void c_parser_declaration_or_fndef (c_parser *, bool, bool, bool, bool);
970 static void c_parser_declspecs (c_parser *, struct c_declspecs *, bool, bool,
971 bool);
972 static struct c_typespec c_parser_enum_specifier (c_parser *);
973 static struct c_typespec c_parser_struct_or_union_specifier (c_parser *);
974 static tree c_parser_struct_declaration (c_parser *);
975 static struct c_typespec c_parser_typeof_specifier (c_parser *);
976 static struct c_declarator *c_parser_declarator (c_parser *, bool, c_dtr_syn,
977 bool *);
978 static struct c_declarator *c_parser_direct_declarator (c_parser *, bool,
979 c_dtr_syn, bool *);
980 static struct c_declarator *c_parser_direct_declarator_inner (c_parser *,
981 bool,
982 struct c_declarator *);
983 static struct c_arg_info *c_parser_parms_declarator (c_parser *, bool, tree);
984 static struct c_arg_info *c_parser_parms_list_declarator (c_parser *, tree);
985 static struct c_parm *c_parser_parameter_declaration (c_parser *, tree);
986 static tree c_parser_simple_asm_expr (c_parser *);
987 static tree c_parser_attributes (c_parser *);
988 static struct c_type_name *c_parser_type_name (c_parser *);
989 static struct c_expr c_parser_initializer (c_parser *);
990 static struct c_expr c_parser_braced_init (c_parser *, tree, bool);
991 static void c_parser_initelt (c_parser *);
992 static void c_parser_initval (c_parser *, struct c_expr *);
993 static tree c_parser_compound_statement (c_parser *);
994 static void c_parser_compound_statement_nostart (c_parser *);
995 static void c_parser_label (c_parser *);
996 static void c_parser_statement (c_parser *);
997 static void c_parser_statement_after_labels (c_parser *);
998 static void c_parser_if_statement (c_parser *);
999 static void c_parser_switch_statement (c_parser *);
1000 static void c_parser_while_statement (c_parser *);
1001 static void c_parser_do_statement (c_parser *);
1002 static void c_parser_for_statement (c_parser *);
1003 static tree c_parser_asm_statement (c_parser *);
1004 static tree c_parser_asm_operands (c_parser *, bool);
1005 static tree c_parser_asm_clobbers (c_parser *);
1006 static struct c_expr c_parser_expr_no_commas (c_parser *, struct c_expr *);
1007 static struct c_expr c_parser_conditional_expression (c_parser *,
1008 struct c_expr *);
1009 static struct c_expr c_parser_binary_expression (c_parser *, struct c_expr *);
1010 static struct c_expr c_parser_cast_expression (c_parser *, struct c_expr *);
1011 static struct c_expr c_parser_unary_expression (c_parser *);
1012 static struct c_expr c_parser_sizeof_expression (c_parser *);
1013 static struct c_expr c_parser_alignof_expression (c_parser *);
1014 static struct c_expr c_parser_postfix_expression (c_parser *);
1015 static struct c_expr c_parser_postfix_expression_after_paren_type (c_parser *,
1016 struct c_type_name *);
1017 static struct c_expr c_parser_postfix_expression_after_primary (c_parser *,
1018 struct c_expr);
1019 static struct c_expr c_parser_expression (c_parser *);
1020 static struct c_expr c_parser_expression_conv (c_parser *);
1021 static tree c_parser_expr_list (c_parser *, bool);
1022 static void c_parser_omp_construct (c_parser *);
1023 static void c_parser_omp_threadprivate (c_parser *);
1024 static void c_parser_omp_barrier (c_parser *);
1025 static void c_parser_omp_flush (c_parser *);
1027 enum pragma_context { pragma_external, pragma_stmt, pragma_compound };
1028 static bool c_parser_pragma (c_parser *, enum pragma_context);
1030 /* These Objective-C parser functions are only ever called when
1031 compiling Objective-C. */
1032 static void c_parser_objc_class_definition (c_parser *);
1033 static void c_parser_objc_class_instance_variables (c_parser *);
1034 static void c_parser_objc_class_declaration (c_parser *);
1035 static void c_parser_objc_alias_declaration (c_parser *);
1036 static void c_parser_objc_protocol_definition (c_parser *);
1037 static enum tree_code c_parser_objc_method_type (c_parser *);
1038 static void c_parser_objc_method_definition (c_parser *);
1039 static void c_parser_objc_methodprotolist (c_parser *);
1040 static void c_parser_objc_methodproto (c_parser *);
1041 static tree c_parser_objc_method_decl (c_parser *);
1042 static tree c_parser_objc_type_name (c_parser *);
1043 static tree c_parser_objc_protocol_refs (c_parser *);
1044 static void c_parser_objc_try_catch_statement (c_parser *);
1045 static void c_parser_objc_synchronized_statement (c_parser *);
1046 static tree c_parser_objc_selector (c_parser *);
1047 static tree c_parser_objc_selector_arg (c_parser *);
1048 static tree c_parser_objc_receiver (c_parser *);
1049 static tree c_parser_objc_message_args (c_parser *);
1050 static tree c_parser_objc_keywordexpr (c_parser *);
1052 /* Parse a translation unit (C90 6.7, C99 6.9).
1054 translation-unit:
1055 external-declarations
1057 external-declarations:
1058 external-declaration
1059 external-declarations external-declaration
1061 GNU extensions:
1063 translation-unit:
1064 empty
1067 static void
1068 c_parser_translation_unit (c_parser *parser)
1070 if (c_parser_next_token_is (parser, CPP_EOF))
1072 if (pedantic)
1073 pedwarn ("%HISO C forbids an empty translation unit",
1074 &c_parser_peek_token (parser)->location);
1076 else
1078 void *obstack_position = obstack_alloc (&parser_obstack, 0);
1081 ggc_collect ();
1082 c_parser_external_declaration (parser);
1083 obstack_free (&parser_obstack, obstack_position);
1085 while (c_parser_next_token_is_not (parser, CPP_EOF));
1089 /* Parse an external declaration (C90 6.7, C99 6.9).
1091 external-declaration:
1092 function-definition
1093 declaration
1095 GNU extensions:
1097 external-declaration:
1098 asm-definition
1100 __extension__ external-declaration
1102 Objective-C:
1104 external-declaration:
1105 objc-class-definition
1106 objc-class-declaration
1107 objc-alias-declaration
1108 objc-protocol-definition
1109 objc-method-definition
1110 @end
1113 static void
1114 c_parser_external_declaration (c_parser *parser)
1116 int ext;
1117 switch (c_parser_peek_token (parser)->type)
1119 case CPP_KEYWORD:
1120 switch (c_parser_peek_token (parser)->keyword)
1122 case RID_EXTENSION:
1123 ext = disable_extension_diagnostics ();
1124 c_parser_consume_token (parser);
1125 c_parser_external_declaration (parser);
1126 restore_extension_diagnostics (ext);
1127 break;
1128 case RID_ASM:
1129 c_parser_asm_definition (parser);
1130 break;
1131 case RID_AT_INTERFACE:
1132 case RID_AT_IMPLEMENTATION:
1133 gcc_assert (c_dialect_objc ());
1134 c_parser_objc_class_definition (parser);
1135 break;
1136 case RID_AT_CLASS:
1137 gcc_assert (c_dialect_objc ());
1138 c_parser_objc_class_declaration (parser);
1139 break;
1140 case RID_AT_ALIAS:
1141 gcc_assert (c_dialect_objc ());
1142 c_parser_objc_alias_declaration (parser);
1143 break;
1144 case RID_AT_PROTOCOL:
1145 gcc_assert (c_dialect_objc ());
1146 c_parser_objc_protocol_definition (parser);
1147 break;
1148 case RID_AT_END:
1149 gcc_assert (c_dialect_objc ());
1150 c_parser_consume_token (parser);
1151 objc_finish_implementation ();
1152 break;
1153 default:
1154 goto decl_or_fndef;
1156 break;
1157 case CPP_SEMICOLON:
1158 if (pedantic)
1159 pedwarn ("%HISO C does not allow extra %<;%> outside of a function",
1160 &c_parser_peek_token (parser)->location);
1161 c_parser_consume_token (parser);
1162 break;
1163 case CPP_PRAGMA:
1164 c_parser_pragma (parser, pragma_external);
1165 break;
1166 case CPP_PLUS:
1167 case CPP_MINUS:
1168 if (c_dialect_objc ())
1170 c_parser_objc_method_definition (parser);
1171 break;
1173 /* Else fall through, and yield a syntax error trying to parse
1174 as a declaration or function definition. */
1175 default:
1176 decl_or_fndef:
1177 /* A declaration or a function definition. We can only tell
1178 which after parsing the declaration specifiers, if any, and
1179 the first declarator. */
1180 c_parser_declaration_or_fndef (parser, true, true, false, true);
1181 break;
1186 /* Parse a declaration or function definition (C90 6.5, 6.7.1, C99
1187 6.7, 6.9.1). If FNDEF_OK is true, a function definition is
1188 accepted; otherwise (old-style parameter declarations) only other
1189 declarations are accepted. If NESTED is true, we are inside a
1190 function or parsing old-style parameter declarations; any functions
1191 encountered are nested functions and declaration specifiers are
1192 required; otherwise we are at top level and functions are normal
1193 functions and declaration specifiers may be optional. If EMPTY_OK
1194 is true, empty declarations are OK (subject to all other
1195 constraints); otherwise (old-style parameter declarations) they are
1196 diagnosed. If START_ATTR_OK is true, the declaration specifiers
1197 may start with attributes; otherwise they may not.
1199 declaration:
1200 declaration-specifiers init-declarator-list[opt] ;
1202 function-definition:
1203 declaration-specifiers[opt] declarator declaration-list[opt]
1204 compound-statement
1206 declaration-list:
1207 declaration
1208 declaration-list declaration
1210 init-declarator-list:
1211 init-declarator
1212 init-declarator-list , init-declarator
1214 init-declarator:
1215 declarator simple-asm-expr[opt] attributes[opt]
1216 declarator simple-asm-expr[opt] attributes[opt] = initializer
1218 GNU extensions:
1220 nested-function-definition:
1221 declaration-specifiers declarator declaration-list[opt]
1222 compound-statement
1224 The simple-asm-expr and attributes are GNU extensions.
1226 This function does not handle __extension__; that is handled in its
1227 callers. ??? Following the old parser, __extension__ may start
1228 external declarations, declarations in functions and declarations
1229 at the start of "for" loops, but not old-style parameter
1230 declarations.
1232 C99 requires declaration specifiers in a function definition; the
1233 absence is diagnosed through the diagnosis of implicit int. In GNU
1234 C we also allow but diagnose declarations without declaration
1235 specifiers, but only at top level (elsewhere they conflict with
1236 other syntax).
1238 OpenMP:
1240 declaration:
1241 threadprivate-directive */
1243 static void
1244 c_parser_declaration_or_fndef (c_parser *parser, bool fndef_ok, bool empty_ok,
1245 bool nested, bool start_attr_ok)
1247 struct c_declspecs *specs;
1248 tree prefix_attrs;
1249 tree all_prefix_attrs;
1250 bool diagnosed_no_specs = false;
1251 location_t here = c_parser_peek_token (parser)->location;
1253 specs = build_null_declspecs ();
1254 c_parser_declspecs (parser, specs, true, true, start_attr_ok);
1255 if (parser->error)
1257 c_parser_skip_to_end_of_block_or_statement (parser);
1258 return;
1260 if (nested && !specs->declspecs_seen_p)
1262 c_parser_error (parser, "expected declaration specifiers");
1263 c_parser_skip_to_end_of_block_or_statement (parser);
1264 return;
1266 finish_declspecs (specs);
1267 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
1269 if (empty_ok)
1270 shadow_tag (specs);
1271 else
1273 shadow_tag_warned (specs, 1);
1274 pedwarn ("%Hempty declaration", &here);
1276 c_parser_consume_token (parser);
1277 return;
1279 pending_xref_error ();
1280 prefix_attrs = specs->attrs;
1281 all_prefix_attrs = prefix_attrs;
1282 specs->attrs = NULL_TREE;
1283 while (true)
1285 struct c_declarator *declarator;
1286 bool dummy = false;
1287 tree fnbody;
1288 /* Declaring either one or more declarators (in which case we
1289 should diagnose if there were no declaration specifiers) or a
1290 function definition (in which case the diagnostic for
1291 implicit int suffices). */
1292 declarator = c_parser_declarator (parser, specs->type_seen_p,
1293 C_DTR_NORMAL, &dummy);
1294 if (declarator == NULL)
1296 c_parser_skip_to_end_of_block_or_statement (parser);
1297 return;
1299 if (c_parser_next_token_is (parser, CPP_EQ)
1300 || c_parser_next_token_is (parser, CPP_COMMA)
1301 || c_parser_next_token_is (parser, CPP_SEMICOLON)
1302 || c_parser_next_token_is_keyword (parser, RID_ASM)
1303 || c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
1305 tree asm_name = NULL_TREE;
1306 tree postfix_attrs = NULL_TREE;
1307 if (!diagnosed_no_specs && !specs->declspecs_seen_p)
1309 diagnosed_no_specs = true;
1310 pedwarn ("%Hdata definition has no type or storage class",
1311 &here);
1313 /* Having seen a data definition, there cannot now be a
1314 function definition. */
1315 fndef_ok = false;
1316 if (c_parser_next_token_is_keyword (parser, RID_ASM))
1317 asm_name = c_parser_simple_asm_expr (parser);
1318 if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
1319 postfix_attrs = c_parser_attributes (parser);
1320 if (c_parser_next_token_is (parser, CPP_EQ))
1322 tree d;
1323 struct c_expr init;
1324 c_parser_consume_token (parser);
1325 /* The declaration of the variable is in effect while
1326 its initializer is parsed. */
1327 d = start_decl (declarator, specs, true,
1328 chainon (postfix_attrs, all_prefix_attrs));
1329 if (!d)
1330 d = error_mark_node;
1331 start_init (d, asm_name, global_bindings_p ());
1332 init = c_parser_initializer (parser);
1333 finish_init ();
1334 if (d != error_mark_node)
1336 maybe_warn_string_init (TREE_TYPE (d), init);
1337 finish_decl (d, init.value, asm_name);
1340 else
1342 tree d = start_decl (declarator, specs, false,
1343 chainon (postfix_attrs,
1344 all_prefix_attrs));
1345 if (d)
1346 finish_decl (d, NULL_TREE, asm_name);
1348 if (c_parser_next_token_is (parser, CPP_COMMA))
1350 c_parser_consume_token (parser);
1351 if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
1352 all_prefix_attrs = chainon (c_parser_attributes (parser),
1353 prefix_attrs);
1354 else
1355 all_prefix_attrs = prefix_attrs;
1356 continue;
1358 else if (c_parser_next_token_is (parser, CPP_SEMICOLON))
1360 c_parser_consume_token (parser);
1361 return;
1363 else
1365 c_parser_error (parser, "expected %<,%> or %<;%>");
1366 c_parser_skip_to_end_of_block_or_statement (parser);
1367 return;
1370 else if (!fndef_ok)
1372 c_parser_error (parser, "expected %<=%>, %<,%>, %<;%>, "
1373 "%<asm%> or %<__attribute__%>");
1374 c_parser_skip_to_end_of_block_or_statement (parser);
1375 return;
1377 /* Function definition (nested or otherwise). */
1378 if (nested)
1380 if (pedantic)
1381 pedwarn ("%HISO C forbids nested functions", &here);
1382 push_function_context ();
1384 if (!start_function (specs, declarator, all_prefix_attrs))
1386 /* This can appear in many cases looking nothing like a
1387 function definition, so we don't give a more specific
1388 error suggesting there was one. */
1389 c_parser_error (parser, "expected %<=%>, %<,%>, %<;%>, %<asm%> "
1390 "or %<__attribute__%>");
1391 if (nested)
1392 pop_function_context ();
1393 break;
1395 /* Parse old-style parameter declarations. ??? Attributes are
1396 not allowed to start declaration specifiers here because of a
1397 syntax conflict between a function declaration with attribute
1398 suffix and a function definition with an attribute prefix on
1399 first old-style parameter declaration. Following the old
1400 parser, they are not accepted on subsequent old-style
1401 parameter declarations either. However, there is no
1402 ambiguity after the first declaration, nor indeed on the
1403 first as long as we don't allow postfix attributes after a
1404 declarator with a nonempty identifier list in a definition;
1405 and postfix attributes have never been accepted here in
1406 function definitions either. */
1407 while (c_parser_next_token_is_not (parser, CPP_EOF)
1408 && c_parser_next_token_is_not (parser, CPP_OPEN_BRACE))
1409 c_parser_declaration_or_fndef (parser, false, false, true, false);
1410 DECL_SOURCE_LOCATION (current_function_decl)
1411 = c_parser_peek_token (parser)->location;
1412 store_parm_decls ();
1413 fnbody = c_parser_compound_statement (parser);
1414 if (nested)
1416 tree decl = current_function_decl;
1417 add_stmt (fnbody);
1418 finish_function ();
1419 pop_function_context ();
1420 add_stmt (build_stmt (DECL_EXPR, decl));
1422 else
1424 add_stmt (fnbody);
1425 finish_function ();
1427 break;
1431 /* Parse an asm-definition (asm() outside a function body). This is a
1432 GNU extension.
1434 asm-definition:
1435 simple-asm-expr ;
1438 static void
1439 c_parser_asm_definition (c_parser *parser)
1441 tree asm_str = c_parser_simple_asm_expr (parser);
1442 if (asm_str)
1443 cgraph_add_asm_node (asm_str);
1444 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
1447 /* Parse some declaration specifiers (possibly none) (C90 6.5, C99
1448 6.7), adding them to SPECS (which may already include some).
1449 Storage class specifiers are accepted iff SCSPEC_OK; type
1450 specifiers are accepted iff TYPESPEC_OK; attributes are accepted at
1451 the start iff START_ATTR_OK.
1453 declaration-specifiers:
1454 storage-class-specifier declaration-specifiers[opt]
1455 type-specifier declaration-specifiers[opt]
1456 type-qualifier declaration-specifiers[opt]
1457 function-specifier declaration-specifiers[opt]
1459 Function specifiers (inline) are from C99, and are currently
1460 handled as storage class specifiers, as is __thread.
1462 C90 6.5.1, C99 6.7.1:
1463 storage-class-specifier:
1464 typedef
1465 extern
1466 static
1467 auto
1468 register
1470 C99 6.7.4:
1471 function-specifier:
1472 inline
1474 C90 6.5.2, C99 6.7.2:
1475 type-specifier:
1476 void
1477 char
1478 short
1480 long
1481 float
1482 double
1483 signed
1484 unsigned
1485 _Bool
1486 _Complex
1487 [_Imaginary removed in C99 TC2]
1488 struct-or-union-specifier
1489 enum-specifier
1490 typedef-name
1492 (_Bool and _Complex are new in C99.)
1494 C90 6.5.3, C99 6.7.3:
1496 type-qualifier:
1497 const
1498 restrict
1499 volatile
1501 (restrict is new in C99.)
1503 GNU extensions:
1505 declaration-specifiers:
1506 attributes declaration-specifiers[opt]
1508 storage-class-specifier:
1509 __thread
1511 type-specifier:
1512 typeof-specifier
1513 _Decimal32
1514 _Decimal64
1515 _Decimal128
1516 _Fract
1517 _Accum
1518 _Sat
1520 (_Fract, _Accum, and _Sat are new from ISO/IEC DTR 18037:
1521 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1169.pdf)
1523 Objective-C:
1525 type-specifier:
1526 class-name objc-protocol-refs[opt]
1527 typedef-name objc-protocol-refs
1528 objc-protocol-refs
1531 static void
1532 c_parser_declspecs (c_parser *parser, struct c_declspecs *specs,
1533 bool scspec_ok, bool typespec_ok, bool start_attr_ok)
1535 bool attrs_ok = start_attr_ok;
1536 bool seen_type = specs->type_seen_p;
1537 while (c_parser_next_token_is (parser, CPP_NAME)
1538 || c_parser_next_token_is (parser, CPP_KEYWORD)
1539 || (c_dialect_objc () && c_parser_next_token_is (parser, CPP_LESS)))
1541 struct c_typespec t;
1542 tree attrs;
1543 if (c_parser_next_token_is (parser, CPP_NAME))
1545 tree value = c_parser_peek_token (parser)->value;
1546 c_id_kind kind = c_parser_peek_token (parser)->id_kind;
1547 /* This finishes the specifiers unless a type name is OK, it
1548 is declared as a type name and a type name hasn't yet
1549 been seen. */
1550 if (!typespec_ok || seen_type
1551 || (kind != C_ID_TYPENAME && kind != C_ID_CLASSNAME))
1552 break;
1553 c_parser_consume_token (parser);
1554 seen_type = true;
1555 attrs_ok = true;
1556 if (kind == C_ID_TYPENAME
1557 && (!c_dialect_objc ()
1558 || c_parser_next_token_is_not (parser, CPP_LESS)))
1560 t.kind = ctsk_typedef;
1561 /* For a typedef name, record the meaning, not the name.
1562 In case of 'foo foo, bar;'. */
1563 t.spec = lookup_name (value);
1565 else
1567 tree proto = NULL_TREE;
1568 gcc_assert (c_dialect_objc ());
1569 t.kind = ctsk_objc;
1570 if (c_parser_next_token_is (parser, CPP_LESS))
1571 proto = c_parser_objc_protocol_refs (parser);
1572 t.spec = objc_get_protocol_qualified_type (value, proto);
1574 declspecs_add_type (specs, t);
1575 continue;
1577 if (c_parser_next_token_is (parser, CPP_LESS))
1579 /* Make "<SomeProtocol>" equivalent to "id <SomeProtocol>" -
1580 nisse@lysator.liu.se. */
1581 tree proto;
1582 gcc_assert (c_dialect_objc ());
1583 if (!typespec_ok || seen_type)
1584 break;
1585 proto = c_parser_objc_protocol_refs (parser);
1586 t.kind = ctsk_objc;
1587 t.spec = objc_get_protocol_qualified_type (NULL_TREE, proto);
1588 declspecs_add_type (specs, t);
1589 continue;
1591 gcc_assert (c_parser_next_token_is (parser, CPP_KEYWORD));
1592 switch (c_parser_peek_token (parser)->keyword)
1594 case RID_STATIC:
1595 case RID_EXTERN:
1596 case RID_REGISTER:
1597 case RID_TYPEDEF:
1598 case RID_INLINE:
1599 case RID_AUTO:
1600 case RID_THREAD:
1601 if (!scspec_ok)
1602 goto out;
1603 attrs_ok = true;
1604 /* TODO: Distinguish between function specifiers (inline)
1605 and storage class specifiers, either here or in
1606 declspecs_add_scspec. */
1607 declspecs_add_scspec (specs, c_parser_peek_token (parser)->value);
1608 c_parser_consume_token (parser);
1609 break;
1610 case RID_UNSIGNED:
1611 case RID_LONG:
1612 case RID_SHORT:
1613 case RID_SIGNED:
1614 case RID_COMPLEX:
1615 case RID_INT:
1616 case RID_CHAR:
1617 case RID_FLOAT:
1618 case RID_DOUBLE:
1619 case RID_VOID:
1620 case RID_DFLOAT32:
1621 case RID_DFLOAT64:
1622 case RID_DFLOAT128:
1623 case RID_BOOL:
1624 case RID_FRACT:
1625 case RID_ACCUM:
1626 case RID_SAT:
1627 if (!typespec_ok)
1628 goto out;
1629 attrs_ok = true;
1630 seen_type = true;
1631 if (c_dialect_objc ())
1632 parser->objc_need_raw_identifier = true;
1633 t.kind = ctsk_resword;
1634 t.spec = c_parser_peek_token (parser)->value;
1635 declspecs_add_type (specs, t);
1636 c_parser_consume_token (parser);
1637 break;
1638 case RID_ENUM:
1639 if (!typespec_ok)
1640 goto out;
1641 attrs_ok = true;
1642 seen_type = true;
1643 t = c_parser_enum_specifier (parser);
1644 declspecs_add_type (specs, t);
1645 break;
1646 case RID_STRUCT:
1647 case RID_UNION:
1648 if (!typespec_ok)
1649 goto out;
1650 attrs_ok = true;
1651 seen_type = true;
1652 t = c_parser_struct_or_union_specifier (parser);
1653 declspecs_add_type (specs, t);
1654 break;
1655 case RID_TYPEOF:
1656 /* ??? The old parser rejected typeof after other type
1657 specifiers, but is a syntax error the best way of
1658 handling this? */
1659 if (!typespec_ok || seen_type)
1660 goto out;
1661 attrs_ok = true;
1662 seen_type = true;
1663 t = c_parser_typeof_specifier (parser);
1664 declspecs_add_type (specs, t);
1665 break;
1666 case RID_CONST:
1667 case RID_VOLATILE:
1668 case RID_RESTRICT:
1669 attrs_ok = true;
1670 declspecs_add_qual (specs, c_parser_peek_token (parser)->value);
1671 c_parser_consume_token (parser);
1672 break;
1673 case RID_ATTRIBUTE:
1674 if (!attrs_ok)
1675 goto out;
1676 attrs = c_parser_attributes (parser);
1677 declspecs_add_attrs (specs, attrs);
1678 break;
1679 default:
1680 goto out;
1683 out: ;
1686 /* Parse an enum specifier (C90 6.5.2.2, C99 6.7.2.2).
1688 enum-specifier:
1689 enum attributes[opt] identifier[opt] { enumerator-list } attributes[opt]
1690 enum attributes[opt] identifier[opt] { enumerator-list , } attributes[opt]
1691 enum attributes[opt] identifier
1693 The form with trailing comma is new in C99. The forms with
1694 attributes are GNU extensions. In GNU C, we accept any expression
1695 without commas in the syntax (assignment expressions, not just
1696 conditional expressions); assignment expressions will be diagnosed
1697 as non-constant.
1699 enumerator-list:
1700 enumerator
1701 enumerator-list , enumerator
1703 enumerator:
1704 enumeration-constant
1705 enumeration-constant = constant-expression
1708 static struct c_typespec
1709 c_parser_enum_specifier (c_parser *parser)
1711 struct c_typespec ret;
1712 tree attrs;
1713 tree ident = NULL_TREE;
1714 location_t ident_loc;
1715 gcc_assert (c_parser_next_token_is_keyword (parser, RID_ENUM));
1716 c_parser_consume_token (parser);
1717 attrs = c_parser_attributes (parser);
1718 /* Set the location in case we create a decl now. */
1719 c_parser_set_source_position_from_token (c_parser_peek_token (parser));
1720 if (c_parser_next_token_is (parser, CPP_NAME))
1722 ident = c_parser_peek_token (parser)->value;
1723 ident_loc = c_parser_peek_token (parser)->location;
1724 c_parser_consume_token (parser);
1726 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
1728 /* Parse an enum definition. */
1729 struct c_enum_contents the_enum;
1730 tree type = start_enum (&the_enum, ident);
1731 tree postfix_attrs;
1732 /* We chain the enumerators in reverse order, then put them in
1733 forward order at the end. */
1734 tree values = NULL_TREE;
1735 c_parser_consume_token (parser);
1736 while (true)
1738 tree enum_id;
1739 tree enum_value;
1740 tree enum_decl;
1741 bool seen_comma;
1742 c_token *token;
1743 location_t comma_loc;
1744 if (c_parser_next_token_is_not (parser, CPP_NAME))
1746 c_parser_error (parser, "expected identifier");
1747 c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL);
1748 values = error_mark_node;
1749 break;
1751 token = c_parser_peek_token (parser);
1752 enum_id = token->value;
1753 /* Set the location in case we create a decl now. */
1754 c_parser_set_source_position_from_token (token);
1755 c_parser_consume_token (parser);
1756 if (c_parser_next_token_is (parser, CPP_EQ))
1758 c_parser_consume_token (parser);
1759 enum_value = c_parser_expr_no_commas (parser, NULL).value;
1761 else
1762 enum_value = NULL_TREE;
1763 enum_decl = build_enumerator (&the_enum, enum_id, enum_value);
1764 TREE_CHAIN (enum_decl) = values;
1765 values = enum_decl;
1766 seen_comma = false;
1767 if (c_parser_next_token_is (parser, CPP_COMMA))
1769 comma_loc = c_parser_peek_token (parser)->location;
1770 seen_comma = true;
1771 c_parser_consume_token (parser);
1773 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
1775 if (seen_comma && pedantic && !flag_isoc99)
1776 pedwarn ("%Hcomma at end of enumerator list", &comma_loc);
1777 c_parser_consume_token (parser);
1778 break;
1780 if (!seen_comma)
1782 c_parser_error (parser, "expected %<,%> or %<}%>");
1783 c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL);
1784 values = error_mark_node;
1785 break;
1788 postfix_attrs = c_parser_attributes (parser);
1789 ret.spec = finish_enum (type, nreverse (values),
1790 chainon (attrs, postfix_attrs));
1791 ret.kind = ctsk_tagdef;
1792 return ret;
1794 else if (!ident)
1796 c_parser_error (parser, "expected %<{%>");
1797 ret.spec = error_mark_node;
1798 ret.kind = ctsk_tagref;
1799 return ret;
1801 ret = parser_xref_tag (ENUMERAL_TYPE, ident);
1802 /* In ISO C, enumerated types can be referred to only if already
1803 defined. */
1804 if (pedantic && !COMPLETE_TYPE_P (ret.spec))
1806 gcc_assert (ident);
1807 pedwarn ("%HISO C forbids forward references to %<enum%> types",
1808 &ident_loc);
1810 return ret;
1813 /* Parse a struct or union specifier (C90 6.5.2.1, C99 6.7.2.1).
1815 struct-or-union-specifier:
1816 struct-or-union attributes[opt] identifier[opt]
1817 { struct-contents } attributes[opt]
1818 struct-or-union attributes[opt] identifier
1820 struct-contents:
1821 struct-declaration-list
1823 struct-declaration-list:
1824 struct-declaration ;
1825 struct-declaration-list struct-declaration ;
1827 GNU extensions:
1829 struct-contents:
1830 empty
1831 struct-declaration
1832 struct-declaration-list struct-declaration
1834 struct-declaration-list:
1835 struct-declaration-list ;
1838 (Note that in the syntax here, unlike that in ISO C, the semicolons
1839 are included here rather than in struct-declaration, in order to
1840 describe the syntax with extra semicolons and missing semicolon at
1841 end.)
1843 Objective-C:
1845 struct-declaration-list:
1846 @defs ( class-name )
1848 (Note this does not include a trailing semicolon, but can be
1849 followed by further declarations, and gets a pedwarn-if-pedantic
1850 when followed by a semicolon.) */
1852 static struct c_typespec
1853 c_parser_struct_or_union_specifier (c_parser *parser)
1855 struct c_typespec ret;
1856 tree attrs;
1857 tree ident = NULL_TREE;
1858 enum tree_code code;
1859 switch (c_parser_peek_token (parser)->keyword)
1861 case RID_STRUCT:
1862 code = RECORD_TYPE;
1863 break;
1864 case RID_UNION:
1865 code = UNION_TYPE;
1866 break;
1867 default:
1868 gcc_unreachable ();
1870 c_parser_consume_token (parser);
1871 attrs = c_parser_attributes (parser);
1872 /* Set the location in case we create a decl now. */
1873 c_parser_set_source_position_from_token (c_parser_peek_token (parser));
1874 if (c_parser_next_token_is (parser, CPP_NAME))
1876 ident = c_parser_peek_token (parser)->value;
1877 c_parser_consume_token (parser);
1879 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
1881 /* Parse a struct or union definition. Start the scope of the
1882 tag before parsing components. */
1883 tree type = start_struct (code, ident);
1884 tree postfix_attrs;
1885 /* We chain the components in reverse order, then put them in
1886 forward order at the end. Each struct-declaration may
1887 declare multiple components (comma-separated), so we must use
1888 chainon to join them, although when parsing each
1889 struct-declaration we can use TREE_CHAIN directly.
1891 The theory behind all this is that there will be more
1892 semicolon separated fields than comma separated fields, and
1893 so we'll be minimizing the number of node traversals required
1894 by chainon. */
1895 tree contents = NULL_TREE;
1896 c_parser_consume_token (parser);
1897 /* Handle the Objective-C @defs construct,
1898 e.g. foo(sizeof(struct{ @defs(ClassName) }));. */
1899 if (c_parser_next_token_is_keyword (parser, RID_AT_DEFS))
1901 tree name;
1902 gcc_assert (c_dialect_objc ());
1903 c_parser_consume_token (parser);
1904 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
1905 goto end_at_defs;
1906 if (c_parser_next_token_is (parser, CPP_NAME)
1907 && c_parser_peek_token (parser)->id_kind == C_ID_CLASSNAME)
1909 name = c_parser_peek_token (parser)->value;
1910 c_parser_consume_token (parser);
1912 else
1914 c_parser_error (parser, "expected class name");
1915 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
1916 goto end_at_defs;
1918 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
1919 "expected %<)%>");
1920 contents = nreverse (objc_get_class_ivars (name));
1922 end_at_defs:
1923 /* Parse the struct-declarations and semicolons. Problems with
1924 semicolons are diagnosed here; empty structures are diagnosed
1925 elsewhere. */
1926 while (true)
1928 tree decls;
1929 /* Parse any stray semicolon. */
1930 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
1932 if (pedantic)
1933 pedwarn ("%Hextra semicolon in struct or union specified",
1934 &c_parser_peek_token (parser)->location);
1935 c_parser_consume_token (parser);
1936 continue;
1938 /* Stop if at the end of the struct or union contents. */
1939 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
1941 c_parser_consume_token (parser);
1942 break;
1944 /* Accept #pragmas at struct scope. */
1945 if (c_parser_next_token_is (parser, CPP_PRAGMA))
1947 c_parser_pragma (parser, pragma_external);
1948 continue;
1950 /* Parse some comma-separated declarations, but not the
1951 trailing semicolon if any. */
1952 decls = c_parser_struct_declaration (parser);
1953 contents = chainon (decls, contents);
1954 /* If no semicolon follows, either we have a parse error or
1955 are at the end of the struct or union and should
1956 pedwarn. */
1957 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
1958 c_parser_consume_token (parser);
1959 else
1961 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
1962 pedwarn ("%Hno semicolon at end of struct or union",
1963 &c_parser_peek_token (parser)->location);
1964 else
1966 c_parser_error (parser, "expected %<;%>");
1967 c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL);
1968 break;
1972 postfix_attrs = c_parser_attributes (parser);
1973 ret.spec = finish_struct (type, nreverse (contents),
1974 chainon (attrs, postfix_attrs));
1975 ret.kind = ctsk_tagdef;
1976 return ret;
1978 else if (!ident)
1980 c_parser_error (parser, "expected %<{%>");
1981 ret.spec = error_mark_node;
1982 ret.kind = ctsk_tagref;
1983 return ret;
1985 ret = parser_xref_tag (code, ident);
1986 return ret;
1989 /* Parse a struct-declaration (C90 6.5.2.1, C99 6.7.2.1), *without*
1990 the trailing semicolon.
1992 struct-declaration:
1993 specifier-qualifier-list struct-declarator-list
1995 specifier-qualifier-list:
1996 type-specifier specifier-qualifier-list[opt]
1997 type-qualifier specifier-qualifier-list[opt]
1998 attributes specifier-qualifier-list[opt]
2000 struct-declarator-list:
2001 struct-declarator
2002 struct-declarator-list , attributes[opt] struct-declarator
2004 struct-declarator:
2005 declarator attributes[opt]
2006 declarator[opt] : constant-expression attributes[opt]
2008 GNU extensions:
2010 struct-declaration:
2011 __extension__ struct-declaration
2012 specifier-qualifier-list
2014 Unlike the ISO C syntax, semicolons are handled elsewhere. The use
2015 of attributes where shown is a GNU extension. In GNU C, we accept
2016 any expression without commas in the syntax (assignment
2017 expressions, not just conditional expressions); assignment
2018 expressions will be diagnosed as non-constant. */
2020 static tree
2021 c_parser_struct_declaration (c_parser *parser)
2023 struct c_declspecs *specs;
2024 tree prefix_attrs;
2025 tree all_prefix_attrs;
2026 tree decls;
2027 location_t decl_loc;
2028 if (c_parser_next_token_is_keyword (parser, RID_EXTENSION))
2030 int ext;
2031 tree decl;
2032 ext = disable_extension_diagnostics ();
2033 c_parser_consume_token (parser);
2034 decl = c_parser_struct_declaration (parser);
2035 restore_extension_diagnostics (ext);
2036 return decl;
2038 specs = build_null_declspecs ();
2039 decl_loc = c_parser_peek_token (parser)->location;
2040 c_parser_declspecs (parser, specs, false, true, true);
2041 if (parser->error)
2042 return NULL_TREE;
2043 if (!specs->declspecs_seen_p)
2045 c_parser_error (parser, "expected specifier-qualifier-list");
2046 return NULL_TREE;
2048 finish_declspecs (specs);
2049 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
2051 tree ret;
2052 if (!specs->type_seen_p)
2054 if (pedantic)
2055 pedwarn ("%HISO C forbids member declarations with no members",
2056 &decl_loc);
2057 shadow_tag_warned (specs, pedantic);
2058 ret = NULL_TREE;
2060 else
2062 /* Support for unnamed structs or unions as members of
2063 structs or unions (which is [a] useful and [b] supports
2064 MS P-SDK). */
2065 tree attrs = NULL;
2066 ret = grokfield (build_id_declarator (NULL_TREE), specs,
2067 NULL_TREE, &attrs);
2068 if (ret)
2069 decl_attributes (&ret, attrs, 0);
2071 return ret;
2073 pending_xref_error ();
2074 prefix_attrs = specs->attrs;
2075 all_prefix_attrs = prefix_attrs;
2076 specs->attrs = NULL_TREE;
2077 decls = NULL_TREE;
2078 while (true)
2080 /* Declaring one or more declarators or un-named bit-fields. */
2081 struct c_declarator *declarator;
2082 bool dummy = false;
2083 if (c_parser_next_token_is (parser, CPP_COLON))
2084 declarator = build_id_declarator (NULL_TREE);
2085 else
2086 declarator = c_parser_declarator (parser, specs->type_seen_p,
2087 C_DTR_NORMAL, &dummy);
2088 if (declarator == NULL)
2090 c_parser_skip_to_end_of_block_or_statement (parser);
2091 break;
2093 if (c_parser_next_token_is (parser, CPP_COLON)
2094 || c_parser_next_token_is (parser, CPP_COMMA)
2095 || c_parser_next_token_is (parser, CPP_SEMICOLON)
2096 || c_parser_next_token_is (parser, CPP_CLOSE_BRACE)
2097 || c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
2099 tree postfix_attrs = NULL_TREE;
2100 tree width = NULL_TREE;
2101 tree d;
2102 if (c_parser_next_token_is (parser, CPP_COLON))
2104 c_parser_consume_token (parser);
2105 width = c_parser_expr_no_commas (parser, NULL).value;
2107 if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
2108 postfix_attrs = c_parser_attributes (parser);
2109 d = grokfield (declarator, specs, width, &all_prefix_attrs);
2110 decl_attributes (&d, chainon (postfix_attrs,
2111 all_prefix_attrs), 0);
2112 TREE_CHAIN (d) = decls;
2113 decls = d;
2114 if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
2115 all_prefix_attrs = chainon (c_parser_attributes (parser),
2116 prefix_attrs);
2117 else
2118 all_prefix_attrs = prefix_attrs;
2119 if (c_parser_next_token_is (parser, CPP_COMMA))
2120 c_parser_consume_token (parser);
2121 else if (c_parser_next_token_is (parser, CPP_SEMICOLON)
2122 || c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
2124 /* Semicolon consumed in caller. */
2125 break;
2127 else
2129 c_parser_error (parser, "expected %<,%>, %<;%> or %<}%>");
2130 break;
2133 else
2135 c_parser_error (parser,
2136 "expected %<:%>, %<,%>, %<;%>, %<}%> or "
2137 "%<__attribute__%>");
2138 break;
2141 return decls;
2144 /* Parse a typeof specifier (a GNU extension).
2146 typeof-specifier:
2147 typeof ( expression )
2148 typeof ( type-name )
2151 static struct c_typespec
2152 c_parser_typeof_specifier (c_parser *parser)
2154 struct c_typespec ret;
2155 ret.kind = ctsk_typeof;
2156 ret.spec = error_mark_node;
2157 gcc_assert (c_parser_next_token_is_keyword (parser, RID_TYPEOF));
2158 c_parser_consume_token (parser);
2159 skip_evaluation++;
2160 in_typeof++;
2161 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
2163 skip_evaluation--;
2164 in_typeof--;
2165 return ret;
2167 if (c_parser_next_token_starts_typename (parser))
2169 struct c_type_name *type = c_parser_type_name (parser);
2170 skip_evaluation--;
2171 in_typeof--;
2172 if (type != NULL)
2174 ret.spec = groktypename (type);
2175 pop_maybe_used (variably_modified_type_p (ret.spec, NULL_TREE));
2178 else
2180 bool was_vm;
2181 location_t here = c_parser_peek_token (parser)->location;
2182 struct c_expr expr = c_parser_expression (parser);
2183 skip_evaluation--;
2184 in_typeof--;
2185 if (TREE_CODE (expr.value) == COMPONENT_REF
2186 && DECL_C_BIT_FIELD (TREE_OPERAND (expr.value, 1)))
2187 error ("%H%<typeof%> applied to a bit-field", &here);
2188 ret.spec = TREE_TYPE (expr.value);
2189 was_vm = variably_modified_type_p (ret.spec, NULL_TREE);
2190 /* This should be returned with the type so that when the type
2191 is evaluated, this can be evaluated. For now, we avoid
2192 evaluation when the context might. */
2193 if (!skip_evaluation && was_vm)
2195 tree e = expr.value;
2197 /* If the expression is not of a type to which we cannot assign a line
2198 number, wrap the thing in a no-op NOP_EXPR. */
2199 if (DECL_P (e) || CONSTANT_CLASS_P (e))
2200 e = build1 (NOP_EXPR, void_type_node, e);
2202 if (CAN_HAVE_LOCATION_P (e))
2203 SET_EXPR_LOCATION (e, input_location);
2205 add_stmt (e);
2207 pop_maybe_used (was_vm);
2209 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
2210 return ret;
2213 /* Parse a declarator, possibly an abstract declarator (C90 6.5.4,
2214 6.5.5, C99 6.7.5, 6.7.6). If TYPE_SEEN_P then a typedef name may
2215 be redeclared; otherwise it may not. KIND indicates which kind of
2216 declarator is wanted. Returns a valid declarator except in the
2217 case of a syntax error in which case NULL is returned. *SEEN_ID is
2218 set to true if an identifier being declared is seen; this is used
2219 to diagnose bad forms of abstract array declarators and to
2220 determine whether an identifier list is syntactically permitted.
2222 declarator:
2223 pointer[opt] direct-declarator
2225 direct-declarator:
2226 identifier
2227 ( attributes[opt] declarator )
2228 direct-declarator array-declarator
2229 direct-declarator ( parameter-type-list )
2230 direct-declarator ( identifier-list[opt] )
2232 pointer:
2233 * type-qualifier-list[opt]
2234 * type-qualifier-list[opt] pointer
2236 type-qualifier-list:
2237 type-qualifier
2238 attributes
2239 type-qualifier-list type-qualifier
2240 type-qualifier-list attributes
2242 parameter-type-list:
2243 parameter-list
2244 parameter-list , ...
2246 parameter-list:
2247 parameter-declaration
2248 parameter-list , parameter-declaration
2250 parameter-declaration:
2251 declaration-specifiers declarator attributes[opt]
2252 declaration-specifiers abstract-declarator[opt] attributes[opt]
2254 identifier-list:
2255 identifier
2256 identifier-list , identifier
2258 abstract-declarator:
2259 pointer
2260 pointer[opt] direct-abstract-declarator
2262 direct-abstract-declarator:
2263 ( attributes[opt] abstract-declarator )
2264 direct-abstract-declarator[opt] array-declarator
2265 direct-abstract-declarator[opt] ( parameter-type-list[opt] )
2267 GNU extensions:
2269 direct-declarator:
2270 direct-declarator ( parameter-forward-declarations
2271 parameter-type-list[opt] )
2273 direct-abstract-declarator:
2274 direct-abstract-declarator[opt] ( parameter-forward-declarations
2275 parameter-type-list[opt] )
2277 parameter-forward-declarations:
2278 parameter-list ;
2279 parameter-forward-declarations parameter-list ;
2281 The uses of attributes shown above are GNU extensions.
2283 Some forms of array declarator are not included in C99 in the
2284 syntax for abstract declarators; these are disallowed elsewhere.
2285 This may be a defect (DR#289).
2287 This function also accepts an omitted abstract declarator as being
2288 an abstract declarator, although not part of the formal syntax. */
2290 static struct c_declarator *
2291 c_parser_declarator (c_parser *parser, bool type_seen_p, c_dtr_syn kind,
2292 bool *seen_id)
2294 /* Parse any initial pointer part. */
2295 if (c_parser_next_token_is (parser, CPP_MULT))
2297 struct c_declspecs *quals_attrs = build_null_declspecs ();
2298 struct c_declarator *inner;
2299 c_parser_consume_token (parser);
2300 c_parser_declspecs (parser, quals_attrs, false, false, true);
2301 inner = c_parser_declarator (parser, type_seen_p, kind, seen_id);
2302 if (inner == NULL)
2303 return NULL;
2304 else
2305 return make_pointer_declarator (quals_attrs, inner);
2307 /* Now we have a direct declarator, direct abstract declarator or
2308 nothing (which counts as a direct abstract declarator here). */
2309 return c_parser_direct_declarator (parser, type_seen_p, kind, seen_id);
2312 /* Parse a direct declarator or direct abstract declarator; arguments
2313 as c_parser_declarator. */
2315 static struct c_declarator *
2316 c_parser_direct_declarator (c_parser *parser, bool type_seen_p, c_dtr_syn kind,
2317 bool *seen_id)
2319 /* The direct declarator must start with an identifier (possibly
2320 omitted) or a parenthesized declarator (possibly abstract). In
2321 an ordinary declarator, initial parentheses must start a
2322 parenthesized declarator. In an abstract declarator or parameter
2323 declarator, they could start a parenthesized declarator or a
2324 parameter list. To tell which, the open parenthesis and any
2325 following attributes must be read. If a declaration specifier
2326 follows, then it is a parameter list; if the specifier is a
2327 typedef name, there might be an ambiguity about redeclaring it,
2328 which is resolved in the direction of treating it as a typedef
2329 name. If a close parenthesis follows, it is also an empty
2330 parameter list, as the syntax does not permit empty abstract
2331 declarators. Otherwise, it is a parenthesized declarator (in
2332 which case the analysis may be repeated inside it, recursively).
2334 ??? There is an ambiguity in a parameter declaration "int
2335 (__attribute__((foo)) x)", where x is not a typedef name: it
2336 could be an abstract declarator for a function, or declare x with
2337 parentheses. The proper resolution of this ambiguity needs
2338 documenting. At present we follow an accident of the old
2339 parser's implementation, whereby the first parameter must have
2340 some declaration specifiers other than just attributes. Thus as
2341 a parameter declaration it is treated as a parenthesized
2342 parameter named x, and as an abstract declarator it is
2343 rejected.
2345 ??? Also following the old parser, attributes inside an empty
2346 parameter list are ignored, making it a list not yielding a
2347 prototype, rather than giving an error or making it have one
2348 parameter with implicit type int.
2350 ??? Also following the old parser, typedef names may be
2351 redeclared in declarators, but not Objective-C class names. */
2353 if (kind != C_DTR_ABSTRACT
2354 && c_parser_next_token_is (parser, CPP_NAME)
2355 && ((type_seen_p
2356 && c_parser_peek_token (parser)->id_kind == C_ID_TYPENAME)
2357 || c_parser_peek_token (parser)->id_kind == C_ID_ID))
2359 struct c_declarator *inner
2360 = build_id_declarator (c_parser_peek_token (parser)->value);
2361 *seen_id = true;
2362 inner->id_loc = c_parser_peek_token (parser)->location;
2363 c_parser_consume_token (parser);
2364 return c_parser_direct_declarator_inner (parser, *seen_id, inner);
2367 if (kind != C_DTR_NORMAL
2368 && c_parser_next_token_is (parser, CPP_OPEN_SQUARE))
2370 struct c_declarator *inner = build_id_declarator (NULL_TREE);
2371 return c_parser_direct_declarator_inner (parser, *seen_id, inner);
2374 /* Either we are at the end of an abstract declarator, or we have
2375 parentheses. */
2377 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
2379 tree attrs;
2380 struct c_declarator *inner;
2381 c_parser_consume_token (parser);
2382 attrs = c_parser_attributes (parser);
2383 if (kind != C_DTR_NORMAL
2384 && (c_parser_next_token_starts_declspecs (parser)
2385 || c_parser_next_token_is (parser, CPP_CLOSE_PAREN)))
2387 struct c_arg_info *args
2388 = c_parser_parms_declarator (parser, kind == C_DTR_NORMAL,
2389 attrs);
2390 if (args == NULL)
2391 return NULL;
2392 else
2394 inner
2395 = build_function_declarator (args,
2396 build_id_declarator (NULL_TREE));
2397 return c_parser_direct_declarator_inner (parser, *seen_id,
2398 inner);
2401 /* A parenthesized declarator. */
2402 inner = c_parser_declarator (parser, type_seen_p, kind, seen_id);
2403 if (inner != NULL && attrs != NULL)
2404 inner = build_attrs_declarator (attrs, inner);
2405 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2407 c_parser_consume_token (parser);
2408 if (inner == NULL)
2409 return NULL;
2410 else
2411 return c_parser_direct_declarator_inner (parser, *seen_id, inner);
2413 else
2415 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2416 "expected %<)%>");
2417 return NULL;
2420 else
2422 if (kind == C_DTR_NORMAL)
2424 c_parser_error (parser, "expected identifier or %<(%>");
2425 return NULL;
2427 else
2428 return build_id_declarator (NULL_TREE);
2432 /* Parse part of a direct declarator or direct abstract declarator,
2433 given that some (in INNER) has already been parsed; ID_PRESENT is
2434 true if an identifier is present, false for an abstract
2435 declarator. */
2437 static struct c_declarator *
2438 c_parser_direct_declarator_inner (c_parser *parser, bool id_present,
2439 struct c_declarator *inner)
2441 /* Parse a sequence of array declarators and parameter lists. */
2442 if (c_parser_next_token_is (parser, CPP_OPEN_SQUARE))
2444 struct c_declarator *declarator;
2445 struct c_declspecs *quals_attrs = build_null_declspecs ();
2446 bool static_seen;
2447 bool star_seen;
2448 tree dimen;
2449 c_parser_consume_token (parser);
2450 c_parser_declspecs (parser, quals_attrs, false, false, true);
2451 static_seen = c_parser_next_token_is_keyword (parser, RID_STATIC);
2452 if (static_seen)
2453 c_parser_consume_token (parser);
2454 if (static_seen && !quals_attrs->declspecs_seen_p)
2455 c_parser_declspecs (parser, quals_attrs, false, false, true);
2456 if (!quals_attrs->declspecs_seen_p)
2457 quals_attrs = NULL;
2458 /* If "static" is present, there must be an array dimension.
2459 Otherwise, there may be a dimension, "*", or no
2460 dimension. */
2461 if (static_seen)
2463 star_seen = false;
2464 dimen = c_parser_expr_no_commas (parser, NULL).value;
2466 else
2468 if (c_parser_next_token_is (parser, CPP_CLOSE_SQUARE))
2470 dimen = NULL_TREE;
2471 star_seen = false;
2473 else if (c_parser_next_token_is (parser, CPP_MULT))
2475 if (c_parser_peek_2nd_token (parser)->type == CPP_CLOSE_SQUARE)
2477 dimen = NULL_TREE;
2478 star_seen = true;
2479 c_parser_consume_token (parser);
2481 else
2483 star_seen = false;
2484 dimen = c_parser_expr_no_commas (parser, NULL).value;
2487 else
2489 star_seen = false;
2490 dimen = c_parser_expr_no_commas (parser, NULL).value;
2493 if (c_parser_next_token_is (parser, CPP_CLOSE_SQUARE))
2494 c_parser_consume_token (parser);
2495 else
2497 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
2498 "expected %<]%>");
2499 return NULL;
2501 declarator = build_array_declarator (dimen, quals_attrs, static_seen,
2502 star_seen);
2503 if (declarator == NULL)
2504 return NULL;
2505 inner = set_array_declarator_inner (declarator, inner);
2506 return c_parser_direct_declarator_inner (parser, id_present, inner);
2508 else if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
2510 tree attrs;
2511 struct c_arg_info *args;
2512 c_parser_consume_token (parser);
2513 attrs = c_parser_attributes (parser);
2514 args = c_parser_parms_declarator (parser, id_present, attrs);
2515 if (args == NULL)
2516 return NULL;
2517 else
2519 inner = build_function_declarator (args, inner);
2520 return c_parser_direct_declarator_inner (parser, id_present, inner);
2523 return inner;
2526 /* Parse a parameter list or identifier list, including the closing
2527 parenthesis but not the opening one. ATTRS are the attributes at
2528 the start of the list. ID_LIST_OK is true if an identifier list is
2529 acceptable; such a list must not have attributes at the start. */
2531 static struct c_arg_info *
2532 c_parser_parms_declarator (c_parser *parser, bool id_list_ok, tree attrs)
2534 push_scope ();
2535 declare_parm_level ();
2536 /* If the list starts with an identifier, it is an identifier list.
2537 Otherwise, it is either a prototype list or an empty list. */
2538 if (id_list_ok
2539 && !attrs
2540 && c_parser_next_token_is (parser, CPP_NAME)
2541 && c_parser_peek_token (parser)->id_kind == C_ID_ID)
2543 tree list = NULL_TREE, *nextp = &list;
2544 while (c_parser_next_token_is (parser, CPP_NAME)
2545 && c_parser_peek_token (parser)->id_kind == C_ID_ID)
2547 *nextp = build_tree_list (NULL_TREE,
2548 c_parser_peek_token (parser)->value);
2549 nextp = & TREE_CHAIN (*nextp);
2550 c_parser_consume_token (parser);
2551 if (c_parser_next_token_is_not (parser, CPP_COMMA))
2552 break;
2553 c_parser_consume_token (parser);
2554 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2556 c_parser_error (parser, "expected identifier");
2557 break;
2560 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2562 struct c_arg_info *ret = XOBNEW (&parser_obstack, struct c_arg_info);
2563 ret->parms = 0;
2564 ret->tags = 0;
2565 ret->types = list;
2566 ret->others = 0;
2567 ret->pending_sizes = 0;
2568 ret->had_vla_unspec = 0;
2569 c_parser_consume_token (parser);
2570 pop_scope ();
2571 return ret;
2573 else
2575 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2576 "expected %<)%>");
2577 pop_scope ();
2578 return NULL;
2581 else
2583 struct c_arg_info *ret = c_parser_parms_list_declarator (parser, attrs);
2584 pop_scope ();
2585 return ret;
2589 /* Parse a parameter list (possibly empty), including the closing
2590 parenthesis but not the opening one. ATTRS are the attributes at
2591 the start of the list. */
2593 static struct c_arg_info *
2594 c_parser_parms_list_declarator (c_parser *parser, tree attrs)
2596 bool good_parm = false;
2597 /* ??? Following the old parser, forward parameter declarations may
2598 use abstract declarators, and if no real parameter declarations
2599 follow the forward declarations then this is not diagnosed. Also
2600 note as above that attributes are ignored as the only contents of
2601 the parentheses, or as the only contents after forward
2602 declarations. */
2603 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2605 struct c_arg_info *ret = XOBNEW (&parser_obstack, struct c_arg_info);
2606 ret->parms = 0;
2607 ret->tags = 0;
2608 ret->types = 0;
2609 ret->others = 0;
2610 ret->pending_sizes = 0;
2611 ret->had_vla_unspec = 0;
2612 c_parser_consume_token (parser);
2613 return ret;
2615 if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
2617 struct c_arg_info *ret = XOBNEW (&parser_obstack, struct c_arg_info);
2618 ret->parms = 0;
2619 ret->tags = 0;
2620 ret->others = 0;
2621 ret->pending_sizes = 0;
2622 ret->had_vla_unspec = 0;
2623 /* Suppress -Wold-style-definition for this case. */
2624 ret->types = error_mark_node;
2625 error ("%HISO C requires a named argument before %<...%>",
2626 &c_parser_peek_token (parser)->location);
2627 c_parser_consume_token (parser);
2628 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2630 c_parser_consume_token (parser);
2631 return ret;
2633 else
2635 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2636 "expected %<)%>");
2637 return NULL;
2640 /* Nonempty list of parameters, either terminated with semicolon
2641 (forward declarations; recurse) or with close parenthesis (normal
2642 function) or with ", ... )" (variadic function). */
2643 while (true)
2645 /* Parse a parameter. */
2646 struct c_parm *parm = c_parser_parameter_declaration (parser, attrs);
2647 attrs = NULL_TREE;
2648 if (parm != NULL)
2650 good_parm = true;
2651 push_parm_decl (parm);
2653 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
2655 tree new_attrs;
2656 c_parser_consume_token (parser);
2657 mark_forward_parm_decls ();
2658 new_attrs = c_parser_attributes (parser);
2659 return c_parser_parms_list_declarator (parser, new_attrs);
2661 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2663 c_parser_consume_token (parser);
2664 if (good_parm)
2665 return get_parm_info (false);
2666 else
2668 struct c_arg_info *ret
2669 = XOBNEW (&parser_obstack, struct c_arg_info);
2670 ret->parms = 0;
2671 ret->tags = 0;
2672 ret->types = 0;
2673 ret->others = 0;
2674 ret->pending_sizes = 0;
2675 ret->had_vla_unspec = 0;
2676 return ret;
2679 if (!c_parser_require (parser, CPP_COMMA,
2680 "expected %<;%>, %<,%> or %<)%>"))
2682 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
2683 return NULL;
2685 if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
2687 c_parser_consume_token (parser);
2688 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2690 c_parser_consume_token (parser);
2691 if (good_parm)
2692 return get_parm_info (true);
2693 else
2695 struct c_arg_info *ret
2696 = XOBNEW (&parser_obstack, struct c_arg_info);
2697 ret->parms = 0;
2698 ret->tags = 0;
2699 ret->types = 0;
2700 ret->others = 0;
2701 ret->pending_sizes = 0;
2702 ret->had_vla_unspec = 0;
2703 return ret;
2706 else
2708 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2709 "expected %<)%>");
2710 return NULL;
2716 /* Parse a parameter declaration. ATTRS are the attributes at the
2717 start of the declaration if it is the first parameter. */
2719 static struct c_parm *
2720 c_parser_parameter_declaration (c_parser *parser, tree attrs)
2722 struct c_declspecs *specs;
2723 struct c_declarator *declarator;
2724 tree prefix_attrs;
2725 tree postfix_attrs = NULL_TREE;
2726 bool dummy = false;
2727 if (!c_parser_next_token_starts_declspecs (parser))
2729 /* ??? In some Objective-C cases '...' isn't applicable so there
2730 should be a different message. */
2731 c_parser_error (parser,
2732 "expected declaration specifiers or %<...%>");
2733 c_parser_skip_to_end_of_parameter (parser);
2734 return NULL;
2736 specs = build_null_declspecs ();
2737 if (attrs)
2739 declspecs_add_attrs (specs, attrs);
2740 attrs = NULL_TREE;
2742 c_parser_declspecs (parser, specs, true, true, true);
2743 finish_declspecs (specs);
2744 pending_xref_error ();
2745 prefix_attrs = specs->attrs;
2746 specs->attrs = NULL_TREE;
2747 declarator = c_parser_declarator (parser, specs->type_seen_p,
2748 C_DTR_PARM, &dummy);
2749 if (declarator == NULL)
2751 c_parser_skip_until_found (parser, CPP_COMMA, NULL);
2752 return NULL;
2754 if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
2755 postfix_attrs = c_parser_attributes (parser);
2756 return build_c_parm (specs, chainon (postfix_attrs, prefix_attrs),
2757 declarator);
2760 /* Parse a string literal in an asm expression. It should not be
2761 translated, and wide string literals are an error although
2762 permitted by the syntax. This is a GNU extension.
2764 asm-string-literal:
2765 string-literal
2767 ??? At present, following the old parser, the caller needs to have
2768 set lex_untranslated_string to 1. It would be better to follow the
2769 C++ parser rather than using this kludge. */
2771 static tree
2772 c_parser_asm_string_literal (c_parser *parser)
2774 tree str;
2775 if (c_parser_next_token_is (parser, CPP_STRING))
2777 str = c_parser_peek_token (parser)->value;
2778 c_parser_consume_token (parser);
2780 else if (c_parser_next_token_is (parser, CPP_WSTRING))
2782 error ("%Hwide string literal in %<asm%>",
2783 &c_parser_peek_token (parser)->location);
2784 str = build_string (1, "");
2785 c_parser_consume_token (parser);
2787 else
2789 c_parser_error (parser, "expected string literal");
2790 str = NULL_TREE;
2792 return str;
2795 /* Parse a simple asm expression. This is used in restricted
2796 contexts, where a full expression with inputs and outputs does not
2797 make sense. This is a GNU extension.
2799 simple-asm-expr:
2800 asm ( asm-string-literal )
2803 static tree
2804 c_parser_simple_asm_expr (c_parser *parser)
2806 tree str;
2807 gcc_assert (c_parser_next_token_is_keyword (parser, RID_ASM));
2808 /* ??? Follow the C++ parser rather than using the
2809 lex_untranslated_string kludge. */
2810 parser->lex_untranslated_string = true;
2811 c_parser_consume_token (parser);
2812 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
2814 parser->lex_untranslated_string = false;
2815 return NULL_TREE;
2817 str = c_parser_asm_string_literal (parser);
2818 parser->lex_untranslated_string = false;
2819 if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
2821 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
2822 return NULL_TREE;
2824 return str;
2827 /* Parse (possibly empty) attributes. This is a GNU extension.
2829 attributes:
2830 empty
2831 attributes attribute
2833 attribute:
2834 __attribute__ ( ( attribute-list ) )
2836 attribute-list:
2837 attrib
2838 attribute_list , attrib
2840 attrib:
2841 empty
2842 any-word
2843 any-word ( identifier )
2844 any-word ( identifier , nonempty-expr-list )
2845 any-word ( expr-list )
2847 where the "identifier" must not be declared as a type, and
2848 "any-word" may be any identifier (including one declared as a
2849 type), a reserved word storage class specifier, type specifier or
2850 type qualifier. ??? This still leaves out most reserved keywords
2851 (following the old parser), shouldn't we include them, and why not
2852 allow identifiers declared as types to start the arguments? */
2854 static tree
2855 c_parser_attributes (c_parser *parser)
2857 tree attrs = NULL_TREE;
2858 while (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
2860 /* ??? Follow the C++ parser rather than using the
2861 lex_untranslated_string kludge. */
2862 parser->lex_untranslated_string = true;
2863 c_parser_consume_token (parser);
2864 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
2866 parser->lex_untranslated_string = false;
2867 return attrs;
2869 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
2871 parser->lex_untranslated_string = false;
2872 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
2873 return attrs;
2875 /* Parse the attribute list. */
2876 while (c_parser_next_token_is (parser, CPP_COMMA)
2877 || c_parser_next_token_is (parser, CPP_NAME)
2878 || c_parser_next_token_is (parser, CPP_KEYWORD))
2880 tree attr, attr_name, attr_args;
2881 if (c_parser_next_token_is (parser, CPP_COMMA))
2883 c_parser_consume_token (parser);
2884 continue;
2886 if (c_parser_next_token_is (parser, CPP_KEYWORD))
2888 /* ??? See comment above about what keywords are
2889 accepted here. */
2890 bool ok;
2891 switch (c_parser_peek_token (parser)->keyword)
2893 case RID_STATIC:
2894 case RID_UNSIGNED:
2895 case RID_LONG:
2896 case RID_CONST:
2897 case RID_EXTERN:
2898 case RID_REGISTER:
2899 case RID_TYPEDEF:
2900 case RID_SHORT:
2901 case RID_INLINE:
2902 case RID_VOLATILE:
2903 case RID_SIGNED:
2904 case RID_AUTO:
2905 case RID_RESTRICT:
2906 case RID_COMPLEX:
2907 case RID_THREAD:
2908 case RID_INT:
2909 case RID_CHAR:
2910 case RID_FLOAT:
2911 case RID_DOUBLE:
2912 case RID_VOID:
2913 case RID_DFLOAT32:
2914 case RID_DFLOAT64:
2915 case RID_DFLOAT128:
2916 case RID_BOOL:
2917 case RID_FRACT:
2918 case RID_ACCUM:
2919 case RID_SAT:
2920 ok = true;
2921 break;
2922 default:
2923 ok = false;
2924 break;
2926 if (!ok)
2927 break;
2929 attr_name = c_parser_peek_token (parser)->value;
2930 c_parser_consume_token (parser);
2931 if (c_parser_next_token_is_not (parser, CPP_OPEN_PAREN))
2933 attr = build_tree_list (attr_name, NULL_TREE);
2934 attrs = chainon (attrs, attr);
2935 continue;
2937 c_parser_consume_token (parser);
2938 /* Parse the attribute contents. If they start with an
2939 identifier which is followed by a comma or close
2940 parenthesis, then the arguments start with that
2941 identifier; otherwise they are an expression list. */
2942 if (c_parser_next_token_is (parser, CPP_NAME)
2943 && c_parser_peek_token (parser)->id_kind == C_ID_ID
2944 && ((c_parser_peek_2nd_token (parser)->type == CPP_COMMA)
2945 || (c_parser_peek_2nd_token (parser)->type
2946 == CPP_CLOSE_PAREN)))
2948 tree arg1 = c_parser_peek_token (parser)->value;
2949 c_parser_consume_token (parser);
2950 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2951 attr_args = build_tree_list (NULL_TREE, arg1);
2952 else
2954 c_parser_consume_token (parser);
2955 attr_args = tree_cons (NULL_TREE, arg1,
2956 c_parser_expr_list (parser, false));
2959 else
2961 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2962 attr_args = NULL_TREE;
2963 else
2964 attr_args = c_parser_expr_list (parser, false);
2966 attr = build_tree_list (attr_name, attr_args);
2967 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2968 c_parser_consume_token (parser);
2969 else
2971 parser->lex_untranslated_string = false;
2972 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2973 "expected %<)%>");
2974 return attrs;
2976 attrs = chainon (attrs, attr);
2978 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2979 c_parser_consume_token (parser);
2980 else
2982 parser->lex_untranslated_string = false;
2983 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2984 "expected %<)%>");
2985 return attrs;
2987 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2988 c_parser_consume_token (parser);
2989 else
2991 parser->lex_untranslated_string = false;
2992 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2993 "expected %<)%>");
2994 return attrs;
2996 parser->lex_untranslated_string = false;
2998 return attrs;
3001 /* Parse a type name (C90 6.5.5, C99 6.7.6).
3003 type-name:
3004 specifier-qualifier-list abstract-declarator[opt]
3007 static struct c_type_name *
3008 c_parser_type_name (c_parser *parser)
3010 struct c_declspecs *specs = build_null_declspecs ();
3011 struct c_declarator *declarator;
3012 struct c_type_name *ret;
3013 bool dummy = false;
3014 c_parser_declspecs (parser, specs, false, true, true);
3015 if (!specs->declspecs_seen_p)
3017 c_parser_error (parser, "expected specifier-qualifier-list");
3018 return NULL;
3020 pending_xref_error ();
3021 finish_declspecs (specs);
3022 declarator = c_parser_declarator (parser, specs->type_seen_p,
3023 C_DTR_ABSTRACT, &dummy);
3024 if (declarator == NULL)
3025 return NULL;
3026 ret = XOBNEW (&parser_obstack, struct c_type_name);
3027 ret->specs = specs;
3028 ret->declarator = declarator;
3029 return ret;
3032 /* Parse an initializer (C90 6.5.7, C99 6.7.8).
3034 initializer:
3035 assignment-expression
3036 { initializer-list }
3037 { initializer-list , }
3039 initializer-list:
3040 designation[opt] initializer
3041 initializer-list , designation[opt] initializer
3043 designation:
3044 designator-list =
3046 designator-list:
3047 designator
3048 designator-list designator
3050 designator:
3051 array-designator
3052 . identifier
3054 array-designator:
3055 [ constant-expression ]
3057 GNU extensions:
3059 initializer:
3062 designation:
3063 array-designator
3064 identifier :
3066 array-designator:
3067 [ constant-expression ... constant-expression ]
3069 Any expression without commas is accepted in the syntax for the
3070 constant-expressions, with non-constant expressions rejected later.
3072 This function is only used for top-level initializers; for nested
3073 ones, see c_parser_initval. */
3075 static struct c_expr
3076 c_parser_initializer (c_parser *parser)
3078 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
3079 return c_parser_braced_init (parser, NULL_TREE, false);
3080 else
3082 struct c_expr ret;
3083 ret = c_parser_expr_no_commas (parser, NULL);
3084 if (TREE_CODE (ret.value) != STRING_CST
3085 && TREE_CODE (ret.value) != COMPOUND_LITERAL_EXPR)
3086 ret = default_function_array_conversion (ret);
3087 return ret;
3091 /* Parse a braced initializer list. TYPE is the type specified for a
3092 compound literal, and NULL_TREE for other initializers and for
3093 nested braced lists. NESTED_P is true for nested braced lists,
3094 false for the list of a compound literal or the list that is the
3095 top-level initializer in a declaration. */
3097 static struct c_expr
3098 c_parser_braced_init (c_parser *parser, tree type, bool nested_p)
3100 location_t brace_loc = c_parser_peek_token (parser)->location;
3101 gcc_assert (c_parser_next_token_is (parser, CPP_OPEN_BRACE));
3102 c_parser_consume_token (parser);
3103 if (nested_p)
3104 push_init_level (0);
3105 else
3106 really_start_incremental_init (type);
3107 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
3109 if (pedantic)
3110 pedwarn ("%HISO C forbids empty initializer braces", &brace_loc);
3112 else
3114 /* Parse a non-empty initializer list, possibly with a trailing
3115 comma. */
3116 while (true)
3118 c_parser_initelt (parser);
3119 if (parser->error)
3120 break;
3121 if (c_parser_next_token_is (parser, CPP_COMMA))
3122 c_parser_consume_token (parser);
3123 else
3124 break;
3125 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
3126 break;
3129 if (c_parser_next_token_is_not (parser, CPP_CLOSE_BRACE))
3131 struct c_expr ret;
3132 ret.value = error_mark_node;
3133 ret.original_code = ERROR_MARK;
3134 c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, "expected %<}%>");
3135 return ret;
3137 c_parser_consume_token (parser);
3138 return pop_init_level (0);
3141 /* Parse a nested initializer, including designators. */
3143 static void
3144 c_parser_initelt (c_parser *parser)
3146 /* Parse any designator or designator list. A single array
3147 designator may have the subsequent "=" omitted in GNU C, but a
3148 longer list or a structure member designator may not. */
3149 if (c_parser_next_token_is (parser, CPP_NAME)
3150 && c_parser_peek_2nd_token (parser)->type == CPP_COLON)
3152 /* Old-style structure member designator. */
3153 set_init_label (c_parser_peek_token (parser)->value);
3154 if (pedantic)
3156 /* Use the colon as the error location. */
3157 pedwarn ("%Hobsolete use of designated initializer with %<:%>",
3158 &c_parser_peek_2nd_token (parser)->location);
3160 c_parser_consume_token (parser);
3161 c_parser_consume_token (parser);
3163 else
3165 /* des_seen is 0 if there have been no designators, 1 if there
3166 has been a single array designator and 2 otherwise. */
3167 int des_seen = 0;
3168 /* Location of a designator. */
3169 location_t des_loc;
3170 while (c_parser_next_token_is (parser, CPP_OPEN_SQUARE)
3171 || c_parser_next_token_is (parser, CPP_DOT))
3173 int des_prev = des_seen;
3174 if (!des_seen)
3175 des_loc = c_parser_peek_token (parser)->location;
3176 if (des_seen < 2)
3177 des_seen++;
3178 if (c_parser_next_token_is (parser, CPP_DOT))
3180 des_seen = 2;
3181 c_parser_consume_token (parser);
3182 if (c_parser_next_token_is (parser, CPP_NAME))
3184 set_init_label (c_parser_peek_token (parser)->value);
3185 c_parser_consume_token (parser);
3187 else
3189 struct c_expr init;
3190 init.value = error_mark_node;
3191 init.original_code = ERROR_MARK;
3192 c_parser_error (parser, "expected identifier");
3193 c_parser_skip_until_found (parser, CPP_COMMA, NULL);
3194 process_init_element (init);
3195 return;
3198 else
3200 tree first, second;
3201 location_t ellipsis_loc;
3202 /* ??? Following the old parser, [ objc-receiver
3203 objc-message-args ] is accepted as an initializer,
3204 being distinguished from a designator by what follows
3205 the first assignment expression inside the square
3206 brackets, but after a first array designator a
3207 subsequent square bracket is for Objective-C taken to
3208 start an expression, using the obsolete form of
3209 designated initializer without '=', rather than
3210 possibly being a second level of designation: in LALR
3211 terms, the '[' is shifted rather than reducing
3212 designator to designator-list. */
3213 if (des_prev == 1 && c_dialect_objc ())
3215 des_seen = des_prev;
3216 break;
3218 if (des_prev == 0 && c_dialect_objc ())
3220 /* This might be an array designator or an
3221 Objective-C message expression. If the former,
3222 continue parsing here; if the latter, parse the
3223 remainder of the initializer given the starting
3224 primary-expression. ??? It might make sense to
3225 distinguish when des_prev == 1 as well; see
3226 previous comment. */
3227 tree rec, args;
3228 struct c_expr mexpr;
3229 c_parser_consume_token (parser);
3230 if (c_parser_peek_token (parser)->type == CPP_NAME
3231 && ((c_parser_peek_token (parser)->id_kind
3232 == C_ID_TYPENAME)
3233 || (c_parser_peek_token (parser)->id_kind
3234 == C_ID_CLASSNAME)))
3236 /* Type name receiver. */
3237 tree id = c_parser_peek_token (parser)->value;
3238 c_parser_consume_token (parser);
3239 rec = objc_get_class_reference (id);
3240 goto parse_message_args;
3242 first = c_parser_expr_no_commas (parser, NULL).value;
3243 if (c_parser_next_token_is (parser, CPP_ELLIPSIS)
3244 || c_parser_next_token_is (parser, CPP_CLOSE_SQUARE))
3245 goto array_desig_after_first;
3246 /* Expression receiver. So far only one part
3247 without commas has been parsed; there might be
3248 more of the expression. */
3249 rec = first;
3250 while (c_parser_next_token_is (parser, CPP_COMMA))
3252 struct c_expr next;
3253 c_parser_consume_token (parser);
3254 next = c_parser_expr_no_commas (parser, NULL);
3255 next = default_function_array_conversion (next);
3256 rec = build_compound_expr (rec, next.value);
3258 parse_message_args:
3259 /* Now parse the objc-message-args. */
3260 args = c_parser_objc_message_args (parser);
3261 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
3262 "expected %<]%>");
3263 mexpr.value
3264 = objc_build_message_expr (build_tree_list (rec, args));
3265 mexpr.original_code = ERROR_MARK;
3266 /* Now parse and process the remainder of the
3267 initializer, starting with this message
3268 expression as a primary-expression. */
3269 c_parser_initval (parser, &mexpr);
3270 return;
3272 c_parser_consume_token (parser);
3273 first = c_parser_expr_no_commas (parser, NULL).value;
3274 array_desig_after_first:
3275 if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
3277 ellipsis_loc = c_parser_peek_token (parser)->location;
3278 c_parser_consume_token (parser);
3279 second = c_parser_expr_no_commas (parser, NULL).value;
3281 else
3282 second = NULL_TREE;
3283 if (c_parser_next_token_is (parser, CPP_CLOSE_SQUARE))
3285 c_parser_consume_token (parser);
3286 set_init_index (first, second);
3287 if (pedantic && second)
3288 pedwarn ("%HISO C forbids specifying range of "
3289 "elements to initialize", &ellipsis_loc);
3291 else
3292 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
3293 "expected %<]%>");
3296 if (des_seen >= 1)
3298 if (c_parser_next_token_is (parser, CPP_EQ))
3300 if (pedantic && !flag_isoc99)
3301 pedwarn ("%HISO C90 forbids specifying subobject "
3302 "to initialize", &des_loc);
3303 c_parser_consume_token (parser);
3305 else
3307 if (des_seen == 1)
3309 if (pedantic)
3310 pedwarn ("%Hobsolete use of designated initializer "
3311 "without %<=%>",
3312 &c_parser_peek_token (parser)->location);
3314 else
3316 struct c_expr init;
3317 init.value = error_mark_node;
3318 init.original_code = ERROR_MARK;
3319 c_parser_error (parser, "expected %<=%>");
3320 c_parser_skip_until_found (parser, CPP_COMMA, NULL);
3321 process_init_element (init);
3322 return;
3327 c_parser_initval (parser, NULL);
3330 /* Parse a nested initializer; as c_parser_initializer but parses
3331 initializers within braced lists, after any designators have been
3332 applied. If AFTER is not NULL then it is an Objective-C message
3333 expression which is the primary-expression starting the
3334 initializer. */
3336 static void
3337 c_parser_initval (c_parser *parser, struct c_expr *after)
3339 struct c_expr init;
3340 gcc_assert (!after || c_dialect_objc ());
3341 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE) && !after)
3342 init = c_parser_braced_init (parser, NULL_TREE, true);
3343 else
3345 init = c_parser_expr_no_commas (parser, after);
3346 if (init.value != NULL_TREE
3347 && TREE_CODE (init.value) != STRING_CST
3348 && TREE_CODE (init.value) != COMPOUND_LITERAL_EXPR)
3349 init = default_function_array_conversion (init);
3351 process_init_element (init);
3354 /* Parse a compound statement (possibly a function body) (C90 6.6.2,
3355 C99 6.8.2).
3357 compound-statement:
3358 { block-item-list[opt] }
3359 { label-declarations block-item-list }
3361 block-item-list:
3362 block-item
3363 block-item-list block-item
3365 block-item:
3366 nested-declaration
3367 statement
3369 nested-declaration:
3370 declaration
3372 GNU extensions:
3374 compound-statement:
3375 { label-declarations block-item-list }
3377 nested-declaration:
3378 __extension__ nested-declaration
3379 nested-function-definition
3381 label-declarations:
3382 label-declaration
3383 label-declarations label-declaration
3385 label-declaration:
3386 __label__ identifier-list ;
3388 Allowing the mixing of declarations and code is new in C99. The
3389 GNU syntax also permits (not shown above) labels at the end of
3390 compound statements, which yield an error. We don't allow labels
3391 on declarations; this might seem like a natural extension, but
3392 there would be a conflict between attributes on the label and
3393 prefix attributes on the declaration. ??? The syntax follows the
3394 old parser in requiring something after label declarations.
3395 Although they are erroneous if the labels declared aren't defined,
3396 is it useful for the syntax to be this way?
3398 OpenMP:
3400 block-item:
3401 openmp-directive
3403 openmp-directive:
3404 barrier-directive
3405 flush-directive */
3407 static tree
3408 c_parser_compound_statement (c_parser *parser)
3410 tree stmt;
3411 if (!c_parser_require (parser, CPP_OPEN_BRACE, "expected %<{%>"))
3412 return error_mark_node;
3413 stmt = c_begin_compound_stmt (true);
3414 c_parser_compound_statement_nostart (parser);
3415 return c_end_compound_stmt (stmt, true);
3418 /* Parse a compound statement except for the opening brace. This is
3419 used for parsing both compound statements and statement expressions
3420 (which follow different paths to handling the opening). */
3422 static void
3423 c_parser_compound_statement_nostart (c_parser *parser)
3425 bool last_stmt = false;
3426 bool last_label = false;
3427 location_t label_loc;
3428 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
3430 c_parser_consume_token (parser);
3431 return;
3433 if (c_parser_next_token_is_keyword (parser, RID_LABEL))
3435 location_t err_loc = c_parser_peek_token (parser)->location;
3436 /* Read zero or more forward-declarations for labels that nested
3437 functions can jump to. */
3438 while (c_parser_next_token_is_keyword (parser, RID_LABEL))
3440 c_parser_consume_token (parser);
3441 /* Any identifiers, including those declared as type names,
3442 are OK here. */
3443 while (true)
3445 tree label;
3446 if (c_parser_next_token_is_not (parser, CPP_NAME))
3448 c_parser_error (parser, "expected identifier");
3449 break;
3451 label
3452 = declare_label (c_parser_peek_token (parser)->value);
3453 C_DECLARED_LABEL_FLAG (label) = 1;
3454 add_stmt (build_stmt (DECL_EXPR, label));
3455 c_parser_consume_token (parser);
3456 if (c_parser_next_token_is (parser, CPP_COMMA))
3457 c_parser_consume_token (parser);
3458 else
3459 break;
3461 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
3463 if (pedantic)
3464 pedwarn ("%HISO C forbids label declarations", &err_loc);
3466 /* We must now have at least one statement, label or declaration. */
3467 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
3469 c_parser_error (parser, "expected declaration or statement");
3470 c_parser_consume_token (parser);
3471 return;
3473 while (c_parser_next_token_is_not (parser, CPP_CLOSE_BRACE))
3475 location_t loc = c_parser_peek_token (parser)->location;
3476 if (c_parser_next_token_is_keyword (parser, RID_CASE)
3477 || c_parser_next_token_is_keyword (parser, RID_DEFAULT)
3478 || (c_parser_next_token_is (parser, CPP_NAME)
3479 && c_parser_peek_2nd_token (parser)->type == CPP_COLON))
3481 if (c_parser_next_token_is_keyword (parser, RID_CASE))
3482 label_loc = c_parser_peek_2nd_token (parser)->location;
3483 else
3484 label_loc = c_parser_peek_token (parser)->location;
3485 last_label = true;
3486 last_stmt = false;
3487 c_parser_label (parser);
3489 else if (!last_label
3490 && c_parser_next_token_starts_declspecs (parser))
3492 last_label = false;
3493 c_parser_declaration_or_fndef (parser, true, true, true, true);
3494 if (last_stmt
3495 && ((pedantic && !flag_isoc99)
3496 || warn_declaration_after_statement))
3497 pedwarn_c90 ("%HISO C90 forbids mixed declarations and code",
3498 &loc);
3499 last_stmt = false;
3501 else if (!last_label
3502 && c_parser_next_token_is_keyword (parser, RID_EXTENSION))
3504 /* __extension__ can start a declaration, but is also an
3505 unary operator that can start an expression. Consume all
3506 but the last of a possible series of __extension__ to
3507 determine which. */
3508 while (c_parser_peek_2nd_token (parser)->type == CPP_KEYWORD
3509 && (c_parser_peek_2nd_token (parser)->keyword
3510 == RID_EXTENSION))
3511 c_parser_consume_token (parser);
3512 if (c_token_starts_declspecs (c_parser_peek_2nd_token (parser)))
3514 int ext;
3515 ext = disable_extension_diagnostics ();
3516 c_parser_consume_token (parser);
3517 last_label = false;
3518 c_parser_declaration_or_fndef (parser, true, true, true, true);
3519 /* Following the old parser, __extension__ does not
3520 disable this diagnostic. */
3521 restore_extension_diagnostics (ext);
3522 if (last_stmt
3523 && ((pedantic && !flag_isoc99)
3524 || warn_declaration_after_statement))
3525 pedwarn_c90 ("%HISO C90 forbids mixed declarations and code",
3526 &loc);
3527 last_stmt = false;
3529 else
3530 goto statement;
3532 else if (c_parser_next_token_is (parser, CPP_PRAGMA))
3534 /* External pragmas, and some omp pragmas, are not associated
3535 with regular c code, and so are not to be considered statements
3536 syntactically. This ensures that the user doesn't put them
3537 places that would turn into syntax errors if the directive
3538 were ignored. */
3539 if (c_parser_pragma (parser, pragma_compound))
3540 last_label = false, last_stmt = true;
3542 else if (c_parser_next_token_is (parser, CPP_EOF))
3544 c_parser_error (parser, "expected declaration or statement");
3545 return;
3547 else if (c_parser_next_token_is_keyword (parser, RID_ELSE))
3549 if (parser->in_if_block)
3551 error ("%H""expected %<}%> before %<else%>", &loc);
3552 return;
3554 else
3556 error ("%H%<else%> without a previous %<if%>", &loc);
3557 c_parser_consume_token (parser);
3558 continue;
3561 else
3563 statement:
3564 last_label = false;
3565 last_stmt = true;
3566 c_parser_statement_after_labels (parser);
3569 parser->error = false;
3571 if (last_label)
3572 error ("%Hlabel at end of compound statement", &label_loc);
3573 c_parser_consume_token (parser);
3576 /* Parse a label (C90 6.6.1, C99 6.8.1).
3578 label:
3579 identifier : attributes[opt]
3580 case constant-expression :
3581 default :
3583 GNU extensions:
3585 label:
3586 case constant-expression ... constant-expression :
3588 The use of attributes on labels is a GNU extension. The syntax in
3589 GNU C accepts any expressions without commas, non-constant
3590 expressions being rejected later. */
3592 static void
3593 c_parser_label (c_parser *parser)
3595 location_t loc1 = c_parser_peek_token (parser)->location;
3596 tree label = NULL_TREE;
3597 if (c_parser_next_token_is_keyword (parser, RID_CASE))
3599 tree exp1, exp2;
3600 c_parser_consume_token (parser);
3601 exp1 = c_parser_expr_no_commas (parser, NULL).value;
3602 if (c_parser_next_token_is (parser, CPP_COLON))
3604 c_parser_consume_token (parser);
3605 label = do_case (exp1, NULL_TREE);
3607 else if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
3609 c_parser_consume_token (parser);
3610 exp2 = c_parser_expr_no_commas (parser, NULL).value;
3611 if (c_parser_require (parser, CPP_COLON, "expected %<:%>"))
3612 label = do_case (exp1, exp2);
3614 else
3615 c_parser_error (parser, "expected %<:%> or %<...%>");
3617 else if (c_parser_next_token_is_keyword (parser, RID_DEFAULT))
3619 c_parser_consume_token (parser);
3620 if (c_parser_require (parser, CPP_COLON, "expected %<:%>"))
3621 label = do_case (NULL_TREE, NULL_TREE);
3623 else
3625 tree name = c_parser_peek_token (parser)->value;
3626 tree tlab;
3627 tree attrs;
3628 location_t loc2 = c_parser_peek_token (parser)->location;
3629 gcc_assert (c_parser_next_token_is (parser, CPP_NAME));
3630 c_parser_consume_token (parser);
3631 gcc_assert (c_parser_next_token_is (parser, CPP_COLON));
3632 c_parser_consume_token (parser);
3633 attrs = c_parser_attributes (parser);
3634 tlab = define_label (loc2, name);
3635 if (tlab)
3637 decl_attributes (&tlab, attrs, 0);
3638 label = add_stmt (build_stmt (LABEL_EXPR, tlab));
3641 if (label)
3643 SET_EXPR_LOCATION (label, loc1);
3644 if (c_parser_next_token_starts_declspecs (parser)
3645 && !(c_parser_next_token_is (parser, CPP_NAME)
3646 && c_parser_peek_2nd_token (parser)->type == CPP_COLON))
3648 error ("%Ha label can only be part of a statement and "
3649 "a declaration is not a statement",
3650 &c_parser_peek_token (parser)->location);
3651 c_parser_declaration_or_fndef (parser, /*fndef_ok*/ false,
3652 /*nested*/ true, /*empty_ok*/ false,
3653 /*start_attr_ok*/ true);
3658 /* Parse a statement (C90 6.6, C99 6.8).
3660 statement:
3661 labeled-statement
3662 compound-statement
3663 expression-statement
3664 selection-statement
3665 iteration-statement
3666 jump-statement
3668 labeled-statement:
3669 label statement
3671 expression-statement:
3672 expression[opt] ;
3674 selection-statement:
3675 if-statement
3676 switch-statement
3678 iteration-statement:
3679 while-statement
3680 do-statement
3681 for-statement
3683 jump-statement:
3684 goto identifier ;
3685 continue ;
3686 break ;
3687 return expression[opt] ;
3689 GNU extensions:
3691 statement:
3692 asm-statement
3694 jump-statement:
3695 goto * expression ;
3697 Objective-C:
3699 statement:
3700 objc-throw-statement
3701 objc-try-catch-statement
3702 objc-synchronized-statement
3704 objc-throw-statement:
3705 @throw expression ;
3706 @throw ;
3708 OpenMP:
3710 statement:
3711 openmp-construct
3713 openmp-construct:
3714 parallel-construct
3715 for-construct
3716 sections-construct
3717 single-construct
3718 parallel-for-construct
3719 parallel-sections-construct
3720 master-construct
3721 critical-construct
3722 atomic-construct
3723 ordered-construct
3725 parallel-construct:
3726 parallel-directive structured-block
3728 for-construct:
3729 for-directive iteration-statement
3731 sections-construct:
3732 sections-directive section-scope
3734 single-construct:
3735 single-directive structured-block
3737 parallel-for-construct:
3738 parallel-for-directive iteration-statement
3740 parallel-sections-construct:
3741 parallel-sections-directive section-scope
3743 master-construct:
3744 master-directive structured-block
3746 critical-construct:
3747 critical-directive structured-block
3749 atomic-construct:
3750 atomic-directive expression-statement
3752 ordered-construct:
3753 ordered-directive structured-block */
3755 static void
3756 c_parser_statement (c_parser *parser)
3758 while (c_parser_next_token_is_keyword (parser, RID_CASE)
3759 || c_parser_next_token_is_keyword (parser, RID_DEFAULT)
3760 || (c_parser_next_token_is (parser, CPP_NAME)
3761 && c_parser_peek_2nd_token (parser)->type == CPP_COLON))
3762 c_parser_label (parser);
3763 c_parser_statement_after_labels (parser);
3766 /* Parse a statement, other than a labeled statement. */
3768 static void
3769 c_parser_statement_after_labels (c_parser *parser)
3771 location_t loc = c_parser_peek_token (parser)->location;
3772 tree stmt = NULL_TREE;
3773 bool in_if_block = parser->in_if_block;
3774 parser->in_if_block = false;
3775 switch (c_parser_peek_token (parser)->type)
3777 case CPP_OPEN_BRACE:
3778 add_stmt (c_parser_compound_statement (parser));
3779 break;
3780 case CPP_KEYWORD:
3781 switch (c_parser_peek_token (parser)->keyword)
3783 case RID_IF:
3784 c_parser_if_statement (parser);
3785 break;
3786 case RID_SWITCH:
3787 c_parser_switch_statement (parser);
3788 break;
3789 case RID_WHILE:
3790 c_parser_while_statement (parser);
3791 break;
3792 case RID_DO:
3793 c_parser_do_statement (parser);
3794 break;
3795 case RID_FOR:
3796 c_parser_for_statement (parser);
3797 break;
3798 case RID_GOTO:
3799 c_parser_consume_token (parser);
3800 if (c_parser_next_token_is (parser, CPP_NAME))
3802 stmt = c_finish_goto_label (c_parser_peek_token (parser)->value);
3803 c_parser_consume_token (parser);
3805 else if (c_parser_next_token_is (parser, CPP_MULT))
3807 c_parser_consume_token (parser);
3808 stmt = c_finish_goto_ptr (c_parser_expression (parser).value);
3810 else
3811 c_parser_error (parser, "expected identifier or %<*%>");
3812 goto expect_semicolon;
3813 case RID_CONTINUE:
3814 c_parser_consume_token (parser);
3815 stmt = c_finish_bc_stmt (&c_cont_label, false);
3816 goto expect_semicolon;
3817 case RID_BREAK:
3818 c_parser_consume_token (parser);
3819 stmt = c_finish_bc_stmt (&c_break_label, true);
3820 goto expect_semicolon;
3821 case RID_RETURN:
3822 c_parser_consume_token (parser);
3823 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
3825 stmt = c_finish_return (NULL_TREE);
3826 c_parser_consume_token (parser);
3828 else
3830 stmt = c_finish_return (c_parser_expression_conv (parser).value);
3831 goto expect_semicolon;
3833 break;
3834 case RID_ASM:
3835 stmt = c_parser_asm_statement (parser);
3836 break;
3837 case RID_AT_THROW:
3838 gcc_assert (c_dialect_objc ());
3839 c_parser_consume_token (parser);
3840 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
3842 stmt = objc_build_throw_stmt (NULL_TREE);
3843 c_parser_consume_token (parser);
3845 else
3847 stmt
3848 = objc_build_throw_stmt (c_parser_expression (parser).value);
3849 goto expect_semicolon;
3851 break;
3852 case RID_AT_TRY:
3853 gcc_assert (c_dialect_objc ());
3854 c_parser_objc_try_catch_statement (parser);
3855 break;
3856 case RID_AT_SYNCHRONIZED:
3857 gcc_assert (c_dialect_objc ());
3858 c_parser_objc_synchronized_statement (parser);
3859 break;
3860 default:
3861 goto expr_stmt;
3863 break;
3864 case CPP_SEMICOLON:
3865 c_parser_consume_token (parser);
3866 break;
3867 case CPP_CLOSE_PAREN:
3868 case CPP_CLOSE_SQUARE:
3869 /* Avoid infinite loop in error recovery:
3870 c_parser_skip_until_found stops at a closing nesting
3871 delimiter without consuming it, but here we need to consume
3872 it to proceed further. */
3873 c_parser_error (parser, "expected statement");
3874 c_parser_consume_token (parser);
3875 break;
3876 case CPP_PRAGMA:
3877 c_parser_pragma (parser, pragma_stmt);
3878 break;
3879 default:
3880 expr_stmt:
3881 stmt = c_finish_expr_stmt (c_parser_expression_conv (parser).value);
3882 expect_semicolon:
3883 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
3884 break;
3886 /* Two cases cannot and do not have line numbers associated: If stmt
3887 is degenerate, such as "2;", then stmt is an INTEGER_CST, which
3888 cannot hold line numbers. But that's OK because the statement
3889 will either be changed to a MODIFY_EXPR during gimplification of
3890 the statement expr, or discarded. If stmt was compound, but
3891 without new variables, we will have skipped the creation of a
3892 BIND and will have a bare STATEMENT_LIST. But that's OK because
3893 (recursively) all of the component statements should already have
3894 line numbers assigned. ??? Can we discard no-op statements
3895 earlier? */
3896 if (stmt && CAN_HAVE_LOCATION_P (stmt))
3897 SET_EXPR_LOCATION (stmt, loc);
3899 parser->in_if_block = in_if_block;
3902 /* Parse a parenthesized condition from an if, do or while statement.
3904 condition:
3905 ( expression )
3907 static tree
3908 c_parser_paren_condition (c_parser *parser)
3910 location_t loc;
3911 tree cond;
3912 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
3913 return error_mark_node;
3914 loc = c_parser_peek_token (parser)->location;
3915 cond = c_objc_common_truthvalue_conversion
3916 (c_parser_expression_conv (parser).value);
3917 if (CAN_HAVE_LOCATION_P (cond))
3918 SET_EXPR_LOCATION (cond, loc);
3919 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
3920 return cond;
3923 /* Parse a statement which is a block in C99. */
3925 static tree
3926 c_parser_c99_block_statement (c_parser *parser)
3928 tree block = c_begin_compound_stmt (flag_isoc99);
3929 c_parser_statement (parser);
3930 return c_end_compound_stmt (block, flag_isoc99);
3933 /* Parse the body of an if statement. This is just parsing a
3934 statement but (a) it is a block in C99, (b) we track whether the
3935 body is an if statement for the sake of -Wparentheses warnings, (c)
3936 we handle an empty body specially for the sake of -Wempty-body
3937 warnings, and (d) we call parser_compound_statement directly
3938 because c_parser_statement_after_labels resets
3939 parser->in_if_block. */
3941 static tree
3942 c_parser_if_body (c_parser *parser, bool *if_p)
3944 tree block = c_begin_compound_stmt (flag_isoc99);
3945 while (c_parser_next_token_is_keyword (parser, RID_CASE)
3946 || c_parser_next_token_is_keyword (parser, RID_DEFAULT)
3947 || (c_parser_next_token_is (parser, CPP_NAME)
3948 && c_parser_peek_2nd_token (parser)->type == CPP_COLON))
3949 c_parser_label (parser);
3950 *if_p = c_parser_next_token_is_keyword (parser, RID_IF);
3951 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
3953 add_stmt (build_empty_stmt ());
3954 c_parser_consume_token (parser);
3956 else if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
3957 add_stmt (c_parser_compound_statement (parser));
3958 else
3959 c_parser_statement_after_labels (parser);
3960 return c_end_compound_stmt (block, flag_isoc99);
3963 /* Parse the else body of an if statement. This is just parsing a
3964 statement but (a) it is a block in C99, (b) we handle an empty body
3965 specially for the sake of -Wempty-body warnings. */
3967 static tree
3968 c_parser_else_body (c_parser *parser)
3970 tree block = c_begin_compound_stmt (flag_isoc99);
3971 while (c_parser_next_token_is_keyword (parser, RID_CASE)
3972 || c_parser_next_token_is_keyword (parser, RID_DEFAULT)
3973 || (c_parser_next_token_is (parser, CPP_NAME)
3974 && c_parser_peek_2nd_token (parser)->type == CPP_COLON))
3975 c_parser_label (parser);
3976 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
3978 add_stmt (build_empty_stmt ());
3979 c_parser_consume_token (parser);
3981 else
3982 c_parser_statement_after_labels (parser);
3983 return c_end_compound_stmt (block, flag_isoc99);
3986 /* Parse an if statement (C90 6.6.4, C99 6.8.4).
3988 if-statement:
3989 if ( expression ) statement
3990 if ( expression ) statement else statement
3993 static void
3994 c_parser_if_statement (c_parser *parser)
3996 tree block;
3997 location_t loc;
3998 tree cond;
3999 bool first_if = false;
4000 tree first_body, second_body;
4001 bool in_if_block;
4003 gcc_assert (c_parser_next_token_is_keyword (parser, RID_IF));
4004 c_parser_consume_token (parser);
4005 block = c_begin_compound_stmt (flag_isoc99);
4006 loc = c_parser_peek_token (parser)->location;
4007 cond = c_parser_paren_condition (parser);
4008 in_if_block = parser->in_if_block;
4009 parser->in_if_block = true;
4010 first_body = c_parser_if_body (parser, &first_if);
4011 parser->in_if_block = in_if_block;
4012 if (c_parser_next_token_is_keyword (parser, RID_ELSE))
4014 c_parser_consume_token (parser);
4015 second_body = c_parser_else_body (parser);
4017 else
4018 second_body = NULL_TREE;
4019 c_finish_if_stmt (loc, cond, first_body, second_body, first_if);
4020 add_stmt (c_end_compound_stmt (block, flag_isoc99));
4023 /* Parse a switch statement (C90 6.6.4, C99 6.8.4).
4025 switch-statement:
4026 switch (expression) statement
4029 static void
4030 c_parser_switch_statement (c_parser *parser)
4032 tree block, expr, body, save_break;
4033 gcc_assert (c_parser_next_token_is_keyword (parser, RID_SWITCH));
4034 c_parser_consume_token (parser);
4035 block = c_begin_compound_stmt (flag_isoc99);
4036 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
4038 expr = c_parser_expression (parser).value;
4039 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
4041 else
4042 expr = error_mark_node;
4043 c_start_case (expr);
4044 save_break = c_break_label;
4045 c_break_label = NULL_TREE;
4046 body = c_parser_c99_block_statement (parser);
4047 c_finish_case (body);
4048 if (c_break_label)
4049 add_stmt (build1 (LABEL_EXPR, void_type_node, c_break_label));
4050 c_break_label = save_break;
4051 add_stmt (c_end_compound_stmt (block, flag_isoc99));
4054 /* Parse a while statement (C90 6.6.5, C99 6.8.5).
4056 while-statement:
4057 while (expression) statement
4060 static void
4061 c_parser_while_statement (c_parser *parser)
4063 tree block, cond, body, save_break, save_cont;
4064 location_t loc;
4065 gcc_assert (c_parser_next_token_is_keyword (parser, RID_WHILE));
4066 c_parser_consume_token (parser);
4067 block = c_begin_compound_stmt (flag_isoc99);
4068 loc = c_parser_peek_token (parser)->location;
4069 cond = c_parser_paren_condition (parser);
4070 save_break = c_break_label;
4071 c_break_label = NULL_TREE;
4072 save_cont = c_cont_label;
4073 c_cont_label = NULL_TREE;
4074 body = c_parser_c99_block_statement (parser);
4075 c_finish_loop (loc, cond, NULL, body, c_break_label, c_cont_label, true);
4076 add_stmt (c_end_compound_stmt (block, flag_isoc99));
4077 c_break_label = save_break;
4078 c_cont_label = save_cont;
4081 /* Parse a do statement (C90 6.6.5, C99 6.8.5).
4083 do-statement:
4084 do statement while ( expression ) ;
4087 static void
4088 c_parser_do_statement (c_parser *parser)
4090 tree block, cond, body, save_break, save_cont, new_break, new_cont;
4091 location_t loc;
4092 gcc_assert (c_parser_next_token_is_keyword (parser, RID_DO));
4093 c_parser_consume_token (parser);
4094 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
4095 warning (OPT_Wempty_body,
4096 "%Hsuggest braces around empty body in %<do%> statement",
4097 &c_parser_peek_token (parser)->location);
4098 block = c_begin_compound_stmt (flag_isoc99);
4099 loc = c_parser_peek_token (parser)->location;
4100 save_break = c_break_label;
4101 c_break_label = NULL_TREE;
4102 save_cont = c_cont_label;
4103 c_cont_label = NULL_TREE;
4104 body = c_parser_c99_block_statement (parser);
4105 c_parser_require_keyword (parser, RID_WHILE, "expected %<while%>");
4106 new_break = c_break_label;
4107 c_break_label = save_break;
4108 new_cont = c_cont_label;
4109 c_cont_label = save_cont;
4110 cond = c_parser_paren_condition (parser);
4111 if (!c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>"))
4112 c_parser_skip_to_end_of_block_or_statement (parser);
4113 c_finish_loop (loc, cond, NULL, body, new_break, new_cont, false);
4114 add_stmt (c_end_compound_stmt (block, flag_isoc99));
4117 /* Parse a for statement (C90 6.6.5, C99 6.8.5).
4119 for-statement:
4120 for ( expression[opt] ; expression[opt] ; expression[opt] ) statement
4121 for ( nested-declaration expression[opt] ; expression[opt] ) statement
4123 The form with a declaration is new in C99.
4125 ??? In accordance with the old parser, the declaration may be a
4126 nested function, which is then rejected in check_for_loop_decls,
4127 but does it make any sense for this to be included in the grammar?
4128 Note in particular that the nested function does not include a
4129 trailing ';', whereas the "declaration" production includes one.
4130 Also, can we reject bad declarations earlier and cheaper than
4131 check_for_loop_decls? */
4133 static void
4134 c_parser_for_statement (c_parser *parser)
4136 tree block, cond, incr, save_break, save_cont, body;
4137 location_t loc;
4138 gcc_assert (c_parser_next_token_is_keyword (parser, RID_FOR));
4139 loc = c_parser_peek_token (parser)->location;
4140 c_parser_consume_token (parser);
4141 block = c_begin_compound_stmt (flag_isoc99);
4142 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
4144 /* Parse the initialization declaration or expression. */
4145 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
4147 c_parser_consume_token (parser);
4148 c_finish_expr_stmt (NULL_TREE);
4150 else if (c_parser_next_token_starts_declspecs (parser))
4152 c_parser_declaration_or_fndef (parser, true, true, true, true);
4153 check_for_loop_decls ();
4155 else if (c_parser_next_token_is_keyword (parser, RID_EXTENSION))
4157 /* __extension__ can start a declaration, but is also an
4158 unary operator that can start an expression. Consume all
4159 but the last of a possible series of __extension__ to
4160 determine which. */
4161 while (c_parser_peek_2nd_token (parser)->type == CPP_KEYWORD
4162 && (c_parser_peek_2nd_token (parser)->keyword
4163 == RID_EXTENSION))
4164 c_parser_consume_token (parser);
4165 if (c_token_starts_declspecs (c_parser_peek_2nd_token (parser)))
4167 int ext;
4168 ext = disable_extension_diagnostics ();
4169 c_parser_consume_token (parser);
4170 c_parser_declaration_or_fndef (parser, true, true, true, true);
4171 restore_extension_diagnostics (ext);
4172 check_for_loop_decls ();
4174 else
4175 goto init_expr;
4177 else
4179 init_expr:
4180 c_finish_expr_stmt (c_parser_expression (parser).value);
4181 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
4183 /* Parse the loop condition. */
4184 loc = c_parser_peek_token (parser)->location;
4185 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
4187 c_parser_consume_token (parser);
4188 cond = NULL_TREE;
4190 else
4192 tree ocond = c_parser_expression_conv (parser).value;
4193 cond = c_objc_common_truthvalue_conversion (ocond);
4194 if (CAN_HAVE_LOCATION_P (cond))
4195 SET_EXPR_LOCATION (cond, loc);
4196 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
4198 /* Parse the increment expression. */
4199 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
4200 incr = c_process_expr_stmt (NULL_TREE);
4201 else
4202 incr = c_process_expr_stmt (c_parser_expression (parser).value);
4203 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
4205 else
4207 cond = error_mark_node;
4208 incr = error_mark_node;
4210 save_break = c_break_label;
4211 c_break_label = NULL_TREE;
4212 save_cont = c_cont_label;
4213 c_cont_label = NULL_TREE;
4214 body = c_parser_c99_block_statement (parser);
4215 c_finish_loop (loc, cond, incr, body, c_break_label, c_cont_label, true);
4216 add_stmt (c_end_compound_stmt (block, flag_isoc99));
4217 c_break_label = save_break;
4218 c_cont_label = save_cont;
4221 /* Parse an asm statement, a GNU extension. This is a full-blown asm
4222 statement with inputs, outputs, clobbers, and volatile tag
4223 allowed.
4225 asm-statement:
4226 asm type-qualifier[opt] ( asm-argument ) ;
4228 asm-argument:
4229 asm-string-literal
4230 asm-string-literal : asm-operands[opt]
4231 asm-string-literal : asm-operands[opt] : asm-operands[opt]
4232 asm-string-literal : asm-operands[opt] : asm-operands[opt] : asm-clobbers
4234 Qualifiers other than volatile are accepted in the syntax but
4235 warned for. */
4237 static tree
4238 c_parser_asm_statement (c_parser *parser)
4240 tree quals, str, outputs, inputs, clobbers, ret;
4241 bool simple;
4242 gcc_assert (c_parser_next_token_is_keyword (parser, RID_ASM));
4243 c_parser_consume_token (parser);
4244 if (c_parser_next_token_is_keyword (parser, RID_VOLATILE))
4246 quals = c_parser_peek_token (parser)->value;
4247 c_parser_consume_token (parser);
4249 else if (c_parser_next_token_is_keyword (parser, RID_CONST)
4250 || c_parser_next_token_is_keyword (parser, RID_RESTRICT))
4252 warning (0, "%H%E qualifier ignored on asm",
4253 &c_parser_peek_token (parser)->location,
4254 c_parser_peek_token (parser)->value);
4255 quals = NULL_TREE;
4256 c_parser_consume_token (parser);
4258 else
4259 quals = NULL_TREE;
4260 /* ??? Follow the C++ parser rather than using the
4261 lex_untranslated_string kludge. */
4262 parser->lex_untranslated_string = true;
4263 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
4265 parser->lex_untranslated_string = false;
4266 return NULL_TREE;
4268 str = c_parser_asm_string_literal (parser);
4269 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
4271 simple = true;
4272 outputs = NULL_TREE;
4273 inputs = NULL_TREE;
4274 clobbers = NULL_TREE;
4275 goto done_asm;
4277 if (!c_parser_require (parser, CPP_COLON, "expected %<:%> or %<)%>"))
4279 parser->lex_untranslated_string = false;
4280 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
4281 return NULL_TREE;
4283 simple = false;
4284 /* Parse outputs. */
4285 if (c_parser_next_token_is (parser, CPP_COLON)
4286 || c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
4287 outputs = NULL_TREE;
4288 else
4289 outputs = c_parser_asm_operands (parser, false);
4290 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
4292 inputs = NULL_TREE;
4293 clobbers = NULL_TREE;
4294 goto done_asm;
4296 if (!c_parser_require (parser, CPP_COLON, "expected %<:%> or %<)%>"))
4298 parser->lex_untranslated_string = false;
4299 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
4300 return NULL_TREE;
4302 /* Parse inputs. */
4303 if (c_parser_next_token_is (parser, CPP_COLON)
4304 || c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
4305 inputs = NULL_TREE;
4306 else
4307 inputs = c_parser_asm_operands (parser, true);
4308 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
4310 clobbers = NULL_TREE;
4311 goto done_asm;
4313 if (!c_parser_require (parser, CPP_COLON, "expected %<:%> or %<)%>"))
4315 parser->lex_untranslated_string = false;
4316 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
4317 return NULL_TREE;
4319 /* Parse clobbers. */
4320 clobbers = c_parser_asm_clobbers (parser);
4321 done_asm:
4322 parser->lex_untranslated_string = false;
4323 if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
4325 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
4326 return NULL_TREE;
4328 if (!c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>"))
4329 c_parser_skip_to_end_of_block_or_statement (parser);
4330 ret = build_asm_stmt (quals, build_asm_expr (str, outputs, inputs,
4331 clobbers, simple));
4332 return ret;
4335 /* Parse asm operands, a GNU extension. If CONVERT_P (for inputs but
4336 not outputs), apply the default conversion of functions and arrays
4337 to pointers.
4339 asm-operands:
4340 asm-operand
4341 asm-operands , asm-operand
4343 asm-operand:
4344 asm-string-literal ( expression )
4345 [ identifier ] asm-string-literal ( expression )
4348 static tree
4349 c_parser_asm_operands (c_parser *parser, bool convert_p)
4351 tree list = NULL_TREE;
4352 while (true)
4354 tree name, str;
4355 struct c_expr expr;
4356 if (c_parser_next_token_is (parser, CPP_OPEN_SQUARE))
4358 c_parser_consume_token (parser);
4359 if (c_parser_next_token_is (parser, CPP_NAME))
4361 tree id = c_parser_peek_token (parser)->value;
4362 c_parser_consume_token (parser);
4363 name = build_string (IDENTIFIER_LENGTH (id),
4364 IDENTIFIER_POINTER (id));
4366 else
4368 c_parser_error (parser, "expected identifier");
4369 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, NULL);
4370 return NULL_TREE;
4372 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
4373 "expected %<]%>");
4375 else
4376 name = NULL_TREE;
4377 str = c_parser_asm_string_literal (parser);
4378 if (str == NULL_TREE)
4379 return NULL_TREE;
4380 parser->lex_untranslated_string = false;
4381 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
4383 parser->lex_untranslated_string = true;
4384 return NULL_TREE;
4386 expr = c_parser_expression (parser);
4387 if (convert_p)
4388 expr = default_function_array_conversion (expr);
4389 parser->lex_untranslated_string = true;
4390 if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
4392 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
4393 return NULL_TREE;
4395 list = chainon (list, build_tree_list (build_tree_list (name, str),
4396 expr.value));
4397 if (c_parser_next_token_is (parser, CPP_COMMA))
4398 c_parser_consume_token (parser);
4399 else
4400 break;
4402 return list;
4405 /* Parse asm clobbers, a GNU extension.
4407 asm-clobbers:
4408 asm-string-literal
4409 asm-clobbers , asm-string-literal
4412 static tree
4413 c_parser_asm_clobbers (c_parser *parser)
4415 tree list = NULL_TREE;
4416 while (true)
4418 tree str = c_parser_asm_string_literal (parser);
4419 if (str)
4420 list = tree_cons (NULL_TREE, str, list);
4421 else
4422 return NULL_TREE;
4423 if (c_parser_next_token_is (parser, CPP_COMMA))
4424 c_parser_consume_token (parser);
4425 else
4426 break;
4428 return list;
4431 /* Parse an expression other than a compound expression; that is, an
4432 assignment expression (C90 6.3.16, C99 6.5.16). If AFTER is not
4433 NULL then it is an Objective-C message expression which is the
4434 primary-expression starting the expression as an initializer.
4436 assignment-expression:
4437 conditional-expression
4438 unary-expression assignment-operator assignment-expression
4440 assignment-operator: one of
4441 = *= /= %= += -= <<= >>= &= ^= |=
4443 In GNU C we accept any conditional expression on the LHS and
4444 diagnose the invalid lvalue rather than producing a syntax
4445 error. */
4447 static struct c_expr
4448 c_parser_expr_no_commas (c_parser *parser, struct c_expr *after)
4450 struct c_expr lhs, rhs, ret;
4451 enum tree_code code;
4452 gcc_assert (!after || c_dialect_objc ());
4453 lhs = c_parser_conditional_expression (parser, after);
4454 switch (c_parser_peek_token (parser)->type)
4456 case CPP_EQ:
4457 code = NOP_EXPR;
4458 break;
4459 case CPP_MULT_EQ:
4460 code = MULT_EXPR;
4461 break;
4462 case CPP_DIV_EQ:
4463 code = TRUNC_DIV_EXPR;
4464 break;
4465 case CPP_MOD_EQ:
4466 code = TRUNC_MOD_EXPR;
4467 break;
4468 case CPP_PLUS_EQ:
4469 code = PLUS_EXPR;
4470 break;
4471 case CPP_MINUS_EQ:
4472 code = MINUS_EXPR;
4473 break;
4474 case CPP_LSHIFT_EQ:
4475 code = LSHIFT_EXPR;
4476 break;
4477 case CPP_RSHIFT_EQ:
4478 code = RSHIFT_EXPR;
4479 break;
4480 case CPP_AND_EQ:
4481 code = BIT_AND_EXPR;
4482 break;
4483 case CPP_XOR_EQ:
4484 code = BIT_XOR_EXPR;
4485 break;
4486 case CPP_OR_EQ:
4487 code = BIT_IOR_EXPR;
4488 break;
4489 default:
4490 return lhs;
4492 c_parser_consume_token (parser);
4493 rhs = c_parser_expr_no_commas (parser, NULL);
4494 rhs = default_function_array_conversion (rhs);
4495 ret.value = build_modify_expr (lhs.value, code, rhs.value);
4496 if (code == NOP_EXPR)
4497 ret.original_code = MODIFY_EXPR;
4498 else
4500 TREE_NO_WARNING (ret.value) = 1;
4501 ret.original_code = ERROR_MARK;
4503 return ret;
4506 /* Parse a conditional expression (C90 6.3.15, C99 6.5.15). If AFTER
4507 is not NULL then it is an Objective-C message expression which is
4508 the primary-expression starting the expression as an initializer.
4510 conditional-expression:
4511 logical-OR-expression
4512 logical-OR-expression ? expression : conditional-expression
4514 GNU extensions:
4516 conditional-expression:
4517 logical-OR-expression ? : conditional-expression
4520 static struct c_expr
4521 c_parser_conditional_expression (c_parser *parser, struct c_expr *after)
4523 struct c_expr cond, exp1, exp2, ret;
4524 gcc_assert (!after || c_dialect_objc ());
4525 cond = c_parser_binary_expression (parser, after);
4526 if (c_parser_next_token_is_not (parser, CPP_QUERY))
4527 return cond;
4528 cond = default_function_array_conversion (cond);
4529 c_parser_consume_token (parser);
4530 if (c_parser_next_token_is (parser, CPP_COLON))
4532 if (pedantic)
4533 pedwarn ("%HISO C forbids omitting the middle term of a ?: expression",
4534 &c_parser_peek_token (parser)->location);
4535 /* Make sure first operand is calculated only once. */
4536 exp1.value = save_expr (default_conversion (cond.value));
4537 cond.value = c_objc_common_truthvalue_conversion (exp1.value);
4538 skip_evaluation += cond.value == truthvalue_true_node;
4540 else
4542 cond.value
4543 = c_objc_common_truthvalue_conversion
4544 (default_conversion (cond.value));
4545 skip_evaluation += cond.value == truthvalue_false_node;
4546 exp1 = c_parser_expression_conv (parser);
4547 skip_evaluation += ((cond.value == truthvalue_true_node)
4548 - (cond.value == truthvalue_false_node));
4550 if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
4552 skip_evaluation -= cond.value == truthvalue_true_node;
4553 ret.value = error_mark_node;
4554 ret.original_code = ERROR_MARK;
4555 return ret;
4557 exp2 = c_parser_conditional_expression (parser, NULL);
4558 exp2 = default_function_array_conversion (exp2);
4559 skip_evaluation -= cond.value == truthvalue_true_node;
4560 ret.value = build_conditional_expr (cond.value, exp1.value, exp2.value);
4561 ret.original_code = ERROR_MARK;
4562 return ret;
4565 /* Parse a binary expression; that is, a logical-OR-expression (C90
4566 6.3.5-6.3.14, C99 6.5.5-6.5.14). If AFTER is not NULL then it is
4567 an Objective-C message expression which is the primary-expression
4568 starting the expression as an initializer.
4570 multiplicative-expression:
4571 cast-expression
4572 multiplicative-expression * cast-expression
4573 multiplicative-expression / cast-expression
4574 multiplicative-expression % cast-expression
4576 additive-expression:
4577 multiplicative-expression
4578 additive-expression + multiplicative-expression
4579 additive-expression - multiplicative-expression
4581 shift-expression:
4582 additive-expression
4583 shift-expression << additive-expression
4584 shift-expression >> additive-expression
4586 relational-expression:
4587 shift-expression
4588 relational-expression < shift-expression
4589 relational-expression > shift-expression
4590 relational-expression <= shift-expression
4591 relational-expression >= shift-expression
4593 equality-expression:
4594 relational-expression
4595 equality-expression == relational-expression
4596 equality-expression != relational-expression
4598 AND-expression:
4599 equality-expression
4600 AND-expression & equality-expression
4602 exclusive-OR-expression:
4603 AND-expression
4604 exclusive-OR-expression ^ AND-expression
4606 inclusive-OR-expression:
4607 exclusive-OR-expression
4608 inclusive-OR-expression | exclusive-OR-expression
4610 logical-AND-expression:
4611 inclusive-OR-expression
4612 logical-AND-expression && inclusive-OR-expression
4614 logical-OR-expression:
4615 logical-AND-expression
4616 logical-OR-expression || logical-AND-expression
4619 static struct c_expr
4620 c_parser_binary_expression (c_parser *parser, struct c_expr *after)
4622 /* A binary expression is parsed using operator-precedence parsing,
4623 with the operands being cast expressions. All the binary
4624 operators are left-associative. Thus a binary expression is of
4625 form:
4627 E0 op1 E1 op2 E2 ...
4629 which we represent on a stack. On the stack, the precedence
4630 levels are strictly increasing. When a new operator is
4631 encountered of higher precedence than that at the top of the
4632 stack, it is pushed; its LHS is the top expression, and its RHS
4633 is everything parsed until it is popped. When a new operator is
4634 encountered with precedence less than or equal to that at the top
4635 of the stack, triples E[i-1] op[i] E[i] are popped and replaced
4636 by the result of the operation until the operator at the top of
4637 the stack has lower precedence than the new operator or there is
4638 only one element on the stack; then the top expression is the LHS
4639 of the new operator. In the case of logical AND and OR
4640 expressions, we also need to adjust skip_evaluation as
4641 appropriate when the operators are pushed and popped. */
4643 /* The precedence levels, where 0 is a dummy lowest level used for
4644 the bottom of the stack. */
4645 enum prec {
4646 PREC_NONE,
4647 PREC_LOGOR,
4648 PREC_LOGAND,
4649 PREC_BITOR,
4650 PREC_BITXOR,
4651 PREC_BITAND,
4652 PREC_EQ,
4653 PREC_REL,
4654 PREC_SHIFT,
4655 PREC_ADD,
4656 PREC_MULT,
4657 NUM_PRECS
4659 struct {
4660 /* The expression at this stack level. */
4661 struct c_expr expr;
4662 /* The precedence of the operator on its left, PREC_NONE at the
4663 bottom of the stack. */
4664 enum prec prec;
4665 /* The operation on its left. */
4666 enum tree_code op;
4667 } stack[NUM_PRECS];
4668 int sp;
4669 #define POP \
4670 do { \
4671 switch (stack[sp].op) \
4673 case TRUTH_ANDIF_EXPR: \
4674 skip_evaluation -= stack[sp - 1].expr.value == truthvalue_false_node; \
4675 break; \
4676 case TRUTH_ORIF_EXPR: \
4677 skip_evaluation -= stack[sp - 1].expr.value == truthvalue_true_node; \
4678 break; \
4679 default: \
4680 break; \
4682 stack[sp - 1].expr \
4683 = default_function_array_conversion (stack[sp - 1].expr); \
4684 stack[sp].expr \
4685 = default_function_array_conversion (stack[sp].expr); \
4686 stack[sp - 1].expr = parser_build_binary_op (stack[sp].op, \
4687 stack[sp - 1].expr, \
4688 stack[sp].expr); \
4689 sp--; \
4690 } while (0)
4691 gcc_assert (!after || c_dialect_objc ());
4692 stack[0].expr = c_parser_cast_expression (parser, after);
4693 stack[0].prec = PREC_NONE;
4694 sp = 0;
4695 while (true)
4697 enum prec oprec;
4698 enum tree_code ocode;
4699 if (parser->error)
4700 goto out;
4701 switch (c_parser_peek_token (parser)->type)
4703 case CPP_MULT:
4704 oprec = PREC_MULT;
4705 ocode = MULT_EXPR;
4706 break;
4707 case CPP_DIV:
4708 oprec = PREC_MULT;
4709 ocode = TRUNC_DIV_EXPR;
4710 break;
4711 case CPP_MOD:
4712 oprec = PREC_MULT;
4713 ocode = TRUNC_MOD_EXPR;
4714 break;
4715 case CPP_PLUS:
4716 oprec = PREC_ADD;
4717 ocode = PLUS_EXPR;
4718 break;
4719 case CPP_MINUS:
4720 oprec = PREC_ADD;
4721 ocode = MINUS_EXPR;
4722 break;
4723 case CPP_LSHIFT:
4724 oprec = PREC_SHIFT;
4725 ocode = LSHIFT_EXPR;
4726 break;
4727 case CPP_RSHIFT:
4728 oprec = PREC_SHIFT;
4729 ocode = RSHIFT_EXPR;
4730 break;
4731 case CPP_LESS:
4732 oprec = PREC_REL;
4733 ocode = LT_EXPR;
4734 break;
4735 case CPP_GREATER:
4736 oprec = PREC_REL;
4737 ocode = GT_EXPR;
4738 break;
4739 case CPP_LESS_EQ:
4740 oprec = PREC_REL;
4741 ocode = LE_EXPR;
4742 break;
4743 case CPP_GREATER_EQ:
4744 oprec = PREC_REL;
4745 ocode = GE_EXPR;
4746 break;
4747 case CPP_EQ_EQ:
4748 oprec = PREC_EQ;
4749 ocode = EQ_EXPR;
4750 break;
4751 case CPP_NOT_EQ:
4752 oprec = PREC_EQ;
4753 ocode = NE_EXPR;
4754 break;
4755 case CPP_AND:
4756 oprec = PREC_BITAND;
4757 ocode = BIT_AND_EXPR;
4758 break;
4759 case CPP_XOR:
4760 oprec = PREC_BITXOR;
4761 ocode = BIT_XOR_EXPR;
4762 break;
4763 case CPP_OR:
4764 oprec = PREC_BITOR;
4765 ocode = BIT_IOR_EXPR;
4766 break;
4767 case CPP_AND_AND:
4768 oprec = PREC_LOGAND;
4769 ocode = TRUTH_ANDIF_EXPR;
4770 break;
4771 case CPP_OR_OR:
4772 oprec = PREC_LOGOR;
4773 ocode = TRUTH_ORIF_EXPR;
4774 break;
4775 default:
4776 /* Not a binary operator, so end of the binary
4777 expression. */
4778 goto out;
4780 c_parser_consume_token (parser);
4781 while (oprec <= stack[sp].prec)
4782 POP;
4783 switch (ocode)
4785 case TRUTH_ANDIF_EXPR:
4786 stack[sp].expr
4787 = default_function_array_conversion (stack[sp].expr);
4788 stack[sp].expr.value = c_objc_common_truthvalue_conversion
4789 (default_conversion (stack[sp].expr.value));
4790 skip_evaluation += stack[sp].expr.value == truthvalue_false_node;
4791 break;
4792 case TRUTH_ORIF_EXPR:
4793 stack[sp].expr
4794 = default_function_array_conversion (stack[sp].expr);
4795 stack[sp].expr.value = c_objc_common_truthvalue_conversion
4796 (default_conversion (stack[sp].expr.value));
4797 skip_evaluation += stack[sp].expr.value == truthvalue_true_node;
4798 break;
4799 default:
4800 break;
4802 sp++;
4803 stack[sp].expr = c_parser_cast_expression (parser, NULL);
4804 stack[sp].prec = oprec;
4805 stack[sp].op = ocode;
4807 out:
4808 while (sp > 0)
4809 POP;
4810 return stack[0].expr;
4811 #undef POP
4814 /* Parse a cast expression (C90 6.3.4, C99 6.5.4). If AFTER is not
4815 NULL then it is an Objective-C message expression which is the
4816 primary-expression starting the expression as an initializer.
4818 cast-expression:
4819 unary-expression
4820 ( type-name ) unary-expression
4823 static struct c_expr
4824 c_parser_cast_expression (c_parser *parser, struct c_expr *after)
4826 gcc_assert (!after || c_dialect_objc ());
4827 if (after)
4828 return c_parser_postfix_expression_after_primary (parser, *after);
4829 /* If the expression begins with a parenthesized type name, it may
4830 be either a cast or a compound literal; we need to see whether
4831 the next character is '{' to tell the difference. If not, it is
4832 an unary expression. */
4833 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)
4834 && c_token_starts_typename (c_parser_peek_2nd_token (parser)))
4836 struct c_type_name *type_name;
4837 struct c_expr ret;
4838 struct c_expr expr;
4839 c_parser_consume_token (parser);
4840 type_name = c_parser_type_name (parser);
4841 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
4842 if (type_name == NULL)
4844 ret.value = error_mark_node;
4845 ret.original_code = ERROR_MARK;
4846 return ret;
4849 /* Save casted types in the function's used types hash table. */
4850 used_types_insert (type_name->specs->type);
4852 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
4853 return c_parser_postfix_expression_after_paren_type (parser,
4854 type_name);
4855 expr = c_parser_cast_expression (parser, NULL);
4856 expr = default_function_array_conversion (expr);
4857 ret.value = c_cast_expr (type_name, expr.value);
4858 ret.original_code = ERROR_MARK;
4859 return ret;
4861 else
4862 return c_parser_unary_expression (parser);
4865 /* Parse an unary expression (C90 6.3.3, C99 6.5.3).
4867 unary-expression:
4868 postfix-expression
4869 ++ unary-expression
4870 -- unary-expression
4871 unary-operator cast-expression
4872 sizeof unary-expression
4873 sizeof ( type-name )
4875 unary-operator: one of
4876 & * + - ~ !
4878 GNU extensions:
4880 unary-expression:
4881 __alignof__ unary-expression
4882 __alignof__ ( type-name )
4883 && identifier
4885 unary-operator: one of
4886 __extension__ __real__ __imag__
4888 In addition, the GNU syntax treats ++ and -- as unary operators, so
4889 they may be applied to cast expressions with errors for non-lvalues
4890 given later. */
4892 static struct c_expr
4893 c_parser_unary_expression (c_parser *parser)
4895 int ext;
4896 struct c_expr ret, op;
4897 switch (c_parser_peek_token (parser)->type)
4899 case CPP_PLUS_PLUS:
4900 c_parser_consume_token (parser);
4901 op = c_parser_cast_expression (parser, NULL);
4902 op = default_function_array_conversion (op);
4903 return parser_build_unary_op (PREINCREMENT_EXPR, op);
4904 case CPP_MINUS_MINUS:
4905 c_parser_consume_token (parser);
4906 op = c_parser_cast_expression (parser, NULL);
4907 op = default_function_array_conversion (op);
4908 return parser_build_unary_op (PREDECREMENT_EXPR, op);
4909 case CPP_AND:
4910 c_parser_consume_token (parser);
4911 return parser_build_unary_op (ADDR_EXPR,
4912 c_parser_cast_expression (parser, NULL));
4913 case CPP_MULT:
4914 c_parser_consume_token (parser);
4915 op = c_parser_cast_expression (parser, NULL);
4916 op = default_function_array_conversion (op);
4917 ret.value = build_indirect_ref (op.value, "unary *");
4918 ret.original_code = ERROR_MARK;
4919 return ret;
4920 case CPP_PLUS:
4921 if (!c_dialect_objc () && !in_system_header)
4922 warning (OPT_Wtraditional,
4923 "%Htraditional C rejects the unary plus operator",
4924 &c_parser_peek_token (parser)->location);
4925 c_parser_consume_token (parser);
4926 op = c_parser_cast_expression (parser, NULL);
4927 op = default_function_array_conversion (op);
4928 return parser_build_unary_op (CONVERT_EXPR, op);
4929 case CPP_MINUS:
4930 c_parser_consume_token (parser);
4931 op = c_parser_cast_expression (parser, NULL);
4932 op = default_function_array_conversion (op);
4933 return parser_build_unary_op (NEGATE_EXPR, op);
4934 case CPP_COMPL:
4935 c_parser_consume_token (parser);
4936 op = c_parser_cast_expression (parser, NULL);
4937 op = default_function_array_conversion (op);
4938 return parser_build_unary_op (BIT_NOT_EXPR, op);
4939 case CPP_NOT:
4940 c_parser_consume_token (parser);
4941 op = c_parser_cast_expression (parser, NULL);
4942 op = default_function_array_conversion (op);
4943 return parser_build_unary_op (TRUTH_NOT_EXPR, op);
4944 case CPP_AND_AND:
4945 /* Refer to the address of a label as a pointer. */
4946 c_parser_consume_token (parser);
4947 if (c_parser_next_token_is (parser, CPP_NAME))
4949 ret.value = finish_label_address_expr
4950 (c_parser_peek_token (parser)->value);
4951 c_parser_consume_token (parser);
4953 else
4955 c_parser_error (parser, "expected identifier");
4956 ret.value = error_mark_node;
4958 ret.original_code = ERROR_MARK;
4959 return ret;
4960 case CPP_KEYWORD:
4961 switch (c_parser_peek_token (parser)->keyword)
4963 case RID_SIZEOF:
4964 return c_parser_sizeof_expression (parser);
4965 case RID_ALIGNOF:
4966 return c_parser_alignof_expression (parser);
4967 case RID_EXTENSION:
4968 c_parser_consume_token (parser);
4969 ext = disable_extension_diagnostics ();
4970 ret = c_parser_cast_expression (parser, NULL);
4971 restore_extension_diagnostics (ext);
4972 return ret;
4973 case RID_REALPART:
4974 c_parser_consume_token (parser);
4975 op = c_parser_cast_expression (parser, NULL);
4976 op = default_function_array_conversion (op);
4977 return parser_build_unary_op (REALPART_EXPR, op);
4978 case RID_IMAGPART:
4979 c_parser_consume_token (parser);
4980 op = c_parser_cast_expression (parser, NULL);
4981 op = default_function_array_conversion (op);
4982 return parser_build_unary_op (IMAGPART_EXPR, op);
4983 default:
4984 return c_parser_postfix_expression (parser);
4986 default:
4987 return c_parser_postfix_expression (parser);
4991 /* Parse a sizeof expression. */
4993 static struct c_expr
4994 c_parser_sizeof_expression (c_parser *parser)
4996 struct c_expr expr;
4997 location_t expr_loc;
4998 gcc_assert (c_parser_next_token_is_keyword (parser, RID_SIZEOF));
4999 c_parser_consume_token (parser);
5000 skip_evaluation++;
5001 in_sizeof++;
5002 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)
5003 && c_token_starts_typename (c_parser_peek_2nd_token (parser)))
5005 /* Either sizeof ( type-name ) or sizeof unary-expression
5006 starting with a compound literal. */
5007 struct c_type_name *type_name;
5008 c_parser_consume_token (parser);
5009 expr_loc = c_parser_peek_token (parser)->location;
5010 type_name = c_parser_type_name (parser);
5011 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
5012 if (type_name == NULL)
5014 struct c_expr ret;
5015 skip_evaluation--;
5016 in_sizeof--;
5017 ret.value = error_mark_node;
5018 ret.original_code = ERROR_MARK;
5019 return ret;
5021 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
5023 expr = c_parser_postfix_expression_after_paren_type (parser,
5024 type_name);
5025 goto sizeof_expr;
5027 /* sizeof ( type-name ). */
5028 skip_evaluation--;
5029 in_sizeof--;
5030 if (type_name->declarator->kind == cdk_array
5031 && type_name->declarator->u.array.vla_unspec_p)
5033 /* C99 6.7.5.2p4 */
5034 error ("%H%<[*]%> not allowed in other than a declaration",
5035 &expr_loc);
5037 return c_expr_sizeof_type (type_name);
5039 else
5041 expr_loc = c_parser_peek_token (parser)->location;
5042 expr = c_parser_unary_expression (parser);
5043 sizeof_expr:
5044 skip_evaluation--;
5045 in_sizeof--;
5046 if (TREE_CODE (expr.value) == COMPONENT_REF
5047 && DECL_C_BIT_FIELD (TREE_OPERAND (expr.value, 1)))
5048 error ("%H%<sizeof%> applied to a bit-field", &expr_loc);
5049 return c_expr_sizeof_expr (expr);
5053 /* Parse an alignof expression. */
5055 static struct c_expr
5056 c_parser_alignof_expression (c_parser *parser)
5058 struct c_expr expr;
5059 gcc_assert (c_parser_next_token_is_keyword (parser, RID_ALIGNOF));
5060 c_parser_consume_token (parser);
5061 skip_evaluation++;
5062 in_alignof++;
5063 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)
5064 && c_token_starts_typename (c_parser_peek_2nd_token (parser)))
5066 /* Either __alignof__ ( type-name ) or __alignof__
5067 unary-expression starting with a compound literal. */
5068 struct c_type_name *type_name;
5069 struct c_expr ret;
5070 c_parser_consume_token (parser);
5071 type_name = c_parser_type_name (parser);
5072 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
5073 if (type_name == NULL)
5075 struct c_expr ret;
5076 skip_evaluation--;
5077 in_alignof--;
5078 ret.value = error_mark_node;
5079 ret.original_code = ERROR_MARK;
5080 return ret;
5082 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
5084 expr = c_parser_postfix_expression_after_paren_type (parser,
5085 type_name);
5086 goto alignof_expr;
5088 /* alignof ( type-name ). */
5089 skip_evaluation--;
5090 in_alignof--;
5091 ret.value = c_alignof (groktypename (type_name));
5092 ret.original_code = ERROR_MARK;
5093 return ret;
5095 else
5097 struct c_expr ret;
5098 expr = c_parser_unary_expression (parser);
5099 alignof_expr:
5100 skip_evaluation--;
5101 in_alignof--;
5102 ret.value = c_alignof_expr (expr.value);
5103 ret.original_code = ERROR_MARK;
5104 return ret;
5108 /* Parse a postfix expression (C90 6.3.1-6.3.2, C99 6.5.1-6.5.2).
5110 postfix-expression:
5111 primary-expression
5112 postfix-expression [ expression ]
5113 postfix-expression ( argument-expression-list[opt] )
5114 postfix-expression . identifier
5115 postfix-expression -> identifier
5116 postfix-expression ++
5117 postfix-expression --
5118 ( type-name ) { initializer-list }
5119 ( type-name ) { initializer-list , }
5121 argument-expression-list:
5122 argument-expression
5123 argument-expression-list , argument-expression
5125 primary-expression:
5126 identifier
5127 constant
5128 string-literal
5129 ( expression )
5131 GNU extensions:
5133 primary-expression:
5134 __func__
5135 (treated as a keyword in GNU C)
5136 __FUNCTION__
5137 __PRETTY_FUNCTION__
5138 ( compound-statement )
5139 __builtin_va_arg ( assignment-expression , type-name )
5140 __builtin_offsetof ( type-name , offsetof-member-designator )
5141 __builtin_choose_expr ( assignment-expression ,
5142 assignment-expression ,
5143 assignment-expression )
5144 __builtin_types_compatible_p ( type-name , type-name )
5146 offsetof-member-designator:
5147 identifier
5148 offsetof-member-designator . identifier
5149 offsetof-member-designator [ expression ]
5151 Objective-C:
5153 primary-expression:
5154 [ objc-receiver objc-message-args ]
5155 @selector ( objc-selector-arg )
5156 @protocol ( identifier )
5157 @encode ( type-name )
5158 objc-string-literal
5161 static struct c_expr
5162 c_parser_postfix_expression (c_parser *parser)
5164 struct c_expr expr, e1, e2, e3;
5165 struct c_type_name *t1, *t2;
5166 location_t loc;
5167 switch (c_parser_peek_token (parser)->type)
5169 case CPP_NUMBER:
5170 case CPP_CHAR:
5171 case CPP_WCHAR:
5172 expr.value = c_parser_peek_token (parser)->value;
5173 expr.original_code = ERROR_MARK;
5174 c_parser_consume_token (parser);
5175 break;
5176 case CPP_STRING:
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 *typename = 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 typename = c_parser_type_name (parser);
6336 if (typename)
6337 type = groktypename (typename);
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_THREADPRIVATE:
6679 c_parser_omp_threadprivate (parser);
6680 return false;
6682 case PRAGMA_OMP_SECTION:
6683 error ("%H%<#pragma omp section%> may only be used in "
6684 "%<#pragma omp sections%> construct",
6685 &c_parser_peek_token (parser)->location);
6686 c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL);
6687 return false;
6689 case PRAGMA_GCC_PCH_PREPROCESS:
6690 c_parser_error (parser, "%<#pragma GCC pch_preprocess%> must be first");
6691 c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL);
6692 return false;
6694 default:
6695 if (id < PRAGMA_FIRST_EXTERNAL)
6697 if (context == pragma_external)
6699 bad_stmt:
6700 c_parser_error (parser, "expected declaration specifiers");
6701 c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL);
6702 return false;
6704 c_parser_omp_construct (parser);
6705 return true;
6707 break;
6710 c_parser_consume_pragma (parser);
6711 c_invoke_pragma_handler (id);
6713 /* Skip to EOL, but suppress any error message. Those will have been
6714 generated by the handler routine through calling error, as opposed
6715 to calling c_parser_error. */
6716 parser->error = true;
6717 c_parser_skip_to_pragma_eol (parser);
6719 return false;
6722 /* The interface the pragma parsers have to the lexer. */
6724 enum cpp_ttype
6725 pragma_lex (tree *value)
6727 c_token *tok = c_parser_peek_token (the_parser);
6728 enum cpp_ttype ret = tok->type;
6730 *value = tok->value;
6731 if (ret == CPP_PRAGMA_EOL || ret == CPP_EOF)
6732 ret = CPP_EOF;
6733 else
6735 if (ret == CPP_KEYWORD)
6736 ret = CPP_NAME;
6737 c_parser_consume_token (the_parser);
6740 return ret;
6743 static void
6744 c_parser_pragma_pch_preprocess (c_parser *parser)
6746 tree name = NULL;
6748 c_parser_consume_pragma (parser);
6749 if (c_parser_next_token_is (parser, CPP_STRING))
6751 name = c_parser_peek_token (parser)->value;
6752 c_parser_consume_token (parser);
6754 else
6755 c_parser_error (parser, "expected string literal");
6756 c_parser_skip_to_pragma_eol (parser);
6758 if (name)
6759 c_common_pch_pragma (parse_in, TREE_STRING_POINTER (name));
6762 /* OpenMP 2.5 parsing routines. */
6764 /* Returns name of the next clause.
6765 If the clause is not recognized PRAGMA_OMP_CLAUSE_NONE is returned and
6766 the token is not consumed. Otherwise appropriate pragma_omp_clause is
6767 returned and the token is consumed. */
6769 static pragma_omp_clause
6770 c_parser_omp_clause_name (c_parser *parser)
6772 pragma_omp_clause result = PRAGMA_OMP_CLAUSE_NONE;
6774 if (c_parser_next_token_is_keyword (parser, RID_IF))
6775 result = PRAGMA_OMP_CLAUSE_IF;
6776 else if (c_parser_next_token_is_keyword (parser, RID_DEFAULT))
6777 result = PRAGMA_OMP_CLAUSE_DEFAULT;
6778 else if (c_parser_next_token_is (parser, CPP_NAME))
6780 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
6782 switch (p[0])
6784 case 'c':
6785 if (!strcmp ("copyin", p))
6786 result = PRAGMA_OMP_CLAUSE_COPYIN;
6787 else if (!strcmp ("copyprivate", p))
6788 result = PRAGMA_OMP_CLAUSE_COPYPRIVATE;
6789 break;
6790 case 'f':
6791 if (!strcmp ("firstprivate", p))
6792 result = PRAGMA_OMP_CLAUSE_FIRSTPRIVATE;
6793 break;
6794 case 'l':
6795 if (!strcmp ("lastprivate", p))
6796 result = PRAGMA_OMP_CLAUSE_LASTPRIVATE;
6797 break;
6798 case 'n':
6799 if (!strcmp ("nowait", p))
6800 result = PRAGMA_OMP_CLAUSE_NOWAIT;
6801 else if (!strcmp ("num_threads", p))
6802 result = PRAGMA_OMP_CLAUSE_NUM_THREADS;
6803 break;
6804 case 'o':
6805 if (!strcmp ("ordered", p))
6806 result = PRAGMA_OMP_CLAUSE_ORDERED;
6807 break;
6808 case 'p':
6809 if (!strcmp ("private", p))
6810 result = PRAGMA_OMP_CLAUSE_PRIVATE;
6811 break;
6812 case 'r':
6813 if (!strcmp ("reduction", p))
6814 result = PRAGMA_OMP_CLAUSE_REDUCTION;
6815 break;
6816 case 's':
6817 if (!strcmp ("schedule", p))
6818 result = PRAGMA_OMP_CLAUSE_SCHEDULE;
6819 else if (!strcmp ("shared", p))
6820 result = PRAGMA_OMP_CLAUSE_SHARED;
6821 break;
6825 if (result != PRAGMA_OMP_CLAUSE_NONE)
6826 c_parser_consume_token (parser);
6828 return result;
6831 /* Validate that a clause of the given type does not already exist. */
6833 static void
6834 check_no_duplicate_clause (tree clauses, enum tree_code code, const char *name)
6836 tree c;
6838 for (c = clauses; c ; c = OMP_CLAUSE_CHAIN (c))
6839 if (OMP_CLAUSE_CODE (c) == code)
6841 error ("too many %qs clauses", name);
6842 break;
6846 /* OpenMP 2.5:
6847 variable-list:
6848 identifier
6849 variable-list , identifier
6851 If KIND is nonzero, create the appropriate node and install the decl
6852 in OMP_CLAUSE_DECL and add the node to the head of the list.
6854 If KIND is zero, create a TREE_LIST with the decl in TREE_PURPOSE;
6855 return the list created. */
6857 static tree
6858 c_parser_omp_variable_list (c_parser *parser, enum omp_clause_code kind,
6859 tree list)
6861 if (c_parser_next_token_is_not (parser, CPP_NAME)
6862 || c_parser_peek_token (parser)->id_kind != C_ID_ID)
6863 c_parser_error (parser, "expected identifier");
6865 while (c_parser_next_token_is (parser, CPP_NAME)
6866 && c_parser_peek_token (parser)->id_kind == C_ID_ID)
6868 tree t = lookup_name (c_parser_peek_token (parser)->value);
6870 if (t == NULL_TREE)
6871 undeclared_variable (c_parser_peek_token (parser)->value,
6872 c_parser_peek_token (parser)->location);
6873 else if (t == error_mark_node)
6875 else if (kind != 0)
6877 tree u = build_omp_clause (kind);
6878 OMP_CLAUSE_DECL (u) = t;
6879 OMP_CLAUSE_CHAIN (u) = list;
6880 list = u;
6882 else
6883 list = tree_cons (t, NULL_TREE, list);
6885 c_parser_consume_token (parser);
6887 if (c_parser_next_token_is_not (parser, CPP_COMMA))
6888 break;
6890 c_parser_consume_token (parser);
6893 return list;
6896 /* Similarly, but expect leading and trailing parenthesis. This is a very
6897 common case for omp clauses. */
6899 static tree
6900 c_parser_omp_var_list_parens (c_parser *parser, enum tree_code kind, tree list)
6902 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
6904 list = c_parser_omp_variable_list (parser, kind, list);
6905 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
6907 return list;
6910 /* OpenMP 2.5:
6911 copyin ( variable-list ) */
6913 static tree
6914 c_parser_omp_clause_copyin (c_parser *parser, tree list)
6916 return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_COPYIN, list);
6919 /* OpenMP 2.5:
6920 copyprivate ( variable-list ) */
6922 static tree
6923 c_parser_omp_clause_copyprivate (c_parser *parser, tree list)
6925 return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_COPYPRIVATE, list);
6928 /* OpenMP 2.5:
6929 default ( shared | none ) */
6931 static tree
6932 c_parser_omp_clause_default (c_parser *parser, tree list)
6934 enum omp_clause_default_kind kind = OMP_CLAUSE_DEFAULT_UNSPECIFIED;
6935 tree c;
6937 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
6938 return list;
6939 if (c_parser_next_token_is (parser, CPP_NAME))
6941 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
6943 switch (p[0])
6945 case 'n':
6946 if (strcmp ("none", p) != 0)
6947 goto invalid_kind;
6948 kind = OMP_CLAUSE_DEFAULT_NONE;
6949 break;
6951 case 's':
6952 if (strcmp ("shared", p) != 0)
6953 goto invalid_kind;
6954 kind = OMP_CLAUSE_DEFAULT_SHARED;
6955 break;
6957 default:
6958 goto invalid_kind;
6961 c_parser_consume_token (parser);
6963 else
6965 invalid_kind:
6966 c_parser_error (parser, "expected %<none%> or %<shared%>");
6968 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
6970 if (kind == OMP_CLAUSE_DEFAULT_UNSPECIFIED)
6971 return list;
6973 check_no_duplicate_clause (list, OMP_CLAUSE_DEFAULT, "default");
6974 c = build_omp_clause (OMP_CLAUSE_DEFAULT);
6975 OMP_CLAUSE_CHAIN (c) = list;
6976 OMP_CLAUSE_DEFAULT_KIND (c) = kind;
6978 return c;
6981 /* OpenMP 2.5:
6982 firstprivate ( variable-list ) */
6984 static tree
6985 c_parser_omp_clause_firstprivate (c_parser *parser, tree list)
6987 return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_FIRSTPRIVATE, list);
6990 /* OpenMP 2.5:
6991 if ( expression ) */
6993 static tree
6994 c_parser_omp_clause_if (c_parser *parser, tree list)
6996 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
6998 tree t = c_parser_paren_condition (parser);
6999 tree c;
7001 check_no_duplicate_clause (list, OMP_CLAUSE_IF, "if");
7003 c = build_omp_clause (OMP_CLAUSE_IF);
7004 OMP_CLAUSE_IF_EXPR (c) = t;
7005 OMP_CLAUSE_CHAIN (c) = list;
7006 list = c;
7008 else
7009 c_parser_error (parser, "expected %<(%>");
7011 return list;
7014 /* OpenMP 2.5:
7015 lastprivate ( variable-list ) */
7017 static tree
7018 c_parser_omp_clause_lastprivate (c_parser *parser, tree list)
7020 return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_LASTPRIVATE, list);
7023 /* OpenMP 2.5:
7024 nowait */
7026 static tree
7027 c_parser_omp_clause_nowait (c_parser *parser ATTRIBUTE_UNUSED, tree list)
7029 tree c;
7031 check_no_duplicate_clause (list, OMP_CLAUSE_NOWAIT, "nowait");
7033 c = build_omp_clause (OMP_CLAUSE_NOWAIT);
7034 OMP_CLAUSE_CHAIN (c) = list;
7035 return c;
7038 /* OpenMP 2.5:
7039 num_threads ( expression ) */
7041 static tree
7042 c_parser_omp_clause_num_threads (c_parser *parser, tree list)
7044 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
7046 location_t expr_loc = c_parser_peek_token (parser)->location;
7047 tree c, t = c_parser_expression (parser).value;
7049 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
7051 if (!INTEGRAL_TYPE_P (TREE_TYPE (t)))
7053 c_parser_error (parser, "expected integer expression");
7054 return list;
7057 /* Attempt to statically determine when the number isn't positive. */
7058 c = fold_build2 (LE_EXPR, boolean_type_node, t,
7059 build_int_cst (TREE_TYPE (t), 0));
7060 if (c == boolean_true_node)
7062 warning (0, "%H%<num_threads%> value must be positive", &expr_loc);
7063 t = integer_one_node;
7066 check_no_duplicate_clause (list, OMP_CLAUSE_NUM_THREADS, "num_threads");
7068 c = build_omp_clause (OMP_CLAUSE_NUM_THREADS);
7069 OMP_CLAUSE_NUM_THREADS_EXPR (c) = t;
7070 OMP_CLAUSE_CHAIN (c) = list;
7071 list = c;
7074 return list;
7077 /* OpenMP 2.5:
7078 ordered */
7080 static tree
7081 c_parser_omp_clause_ordered (c_parser *parser ATTRIBUTE_UNUSED, tree list)
7083 tree c;
7085 check_no_duplicate_clause (list, OMP_CLAUSE_ORDERED, "ordered");
7087 c = build_omp_clause (OMP_CLAUSE_ORDERED);
7088 OMP_CLAUSE_CHAIN (c) = list;
7089 return c;
7092 /* OpenMP 2.5:
7093 private ( variable-list ) */
7095 static tree
7096 c_parser_omp_clause_private (c_parser *parser, tree list)
7098 return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_PRIVATE, list);
7101 /* OpenMP 2.5:
7102 reduction ( reduction-operator : variable-list )
7104 reduction-operator:
7105 One of: + * - & ^ | && || */
7107 static tree
7108 c_parser_omp_clause_reduction (c_parser *parser, tree list)
7110 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
7112 enum tree_code code;
7114 switch (c_parser_peek_token (parser)->type)
7116 case CPP_PLUS:
7117 code = PLUS_EXPR;
7118 break;
7119 case CPP_MULT:
7120 code = MULT_EXPR;
7121 break;
7122 case CPP_MINUS:
7123 code = MINUS_EXPR;
7124 break;
7125 case CPP_AND:
7126 code = BIT_AND_EXPR;
7127 break;
7128 case CPP_XOR:
7129 code = BIT_XOR_EXPR;
7130 break;
7131 case CPP_OR:
7132 code = BIT_IOR_EXPR;
7133 break;
7134 case CPP_AND_AND:
7135 code = TRUTH_ANDIF_EXPR;
7136 break;
7137 case CPP_OR_OR:
7138 code = TRUTH_ORIF_EXPR;
7139 break;
7140 default:
7141 c_parser_error (parser,
7142 "expected %<+%>, %<*%>, %<-%>, %<&%>, "
7143 "%<^%>, %<|%>, %<&&%>, or %<||%>");
7144 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 0);
7145 return list;
7147 c_parser_consume_token (parser);
7148 if (c_parser_require (parser, CPP_COLON, "expected %<:%>"))
7150 tree nl, c;
7152 nl = c_parser_omp_variable_list (parser, OMP_CLAUSE_REDUCTION, list);
7153 for (c = nl; c != list; c = OMP_CLAUSE_CHAIN (c))
7154 OMP_CLAUSE_REDUCTION_CODE (c) = code;
7156 list = nl;
7158 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
7160 return list;
7163 /* OpenMP 2.5:
7164 schedule ( schedule-kind )
7165 schedule ( schedule-kind , expression )
7167 schedule-kind:
7168 static | dynamic | guided | runtime
7171 static tree
7172 c_parser_omp_clause_schedule (c_parser *parser, tree list)
7174 tree c, t;
7176 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
7177 return list;
7179 c = build_omp_clause (OMP_CLAUSE_SCHEDULE);
7181 if (c_parser_next_token_is (parser, CPP_NAME))
7183 tree kind = c_parser_peek_token (parser)->value;
7184 const char *p = IDENTIFIER_POINTER (kind);
7186 switch (p[0])
7188 case 'd':
7189 if (strcmp ("dynamic", p) != 0)
7190 goto invalid_kind;
7191 OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_DYNAMIC;
7192 break;
7194 case 'g':
7195 if (strcmp ("guided", p) != 0)
7196 goto invalid_kind;
7197 OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_GUIDED;
7198 break;
7200 case 'r':
7201 if (strcmp ("runtime", p) != 0)
7202 goto invalid_kind;
7203 OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_RUNTIME;
7204 break;
7206 default:
7207 goto invalid_kind;
7210 else if (c_parser_next_token_is_keyword (parser, RID_STATIC))
7211 OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_STATIC;
7212 else
7213 goto invalid_kind;
7215 c_parser_consume_token (parser);
7216 if (c_parser_next_token_is (parser, CPP_COMMA))
7218 location_t here;
7219 c_parser_consume_token (parser);
7221 here = c_parser_peek_token (parser)->location;
7222 t = c_parser_expr_no_commas (parser, NULL).value;
7224 if (OMP_CLAUSE_SCHEDULE_KIND (c) == OMP_CLAUSE_SCHEDULE_RUNTIME)
7225 error ("%Hschedule %<runtime%> does not take "
7226 "a %<chunk_size%> parameter", &here);
7227 else if (TREE_CODE (TREE_TYPE (t)) == INTEGER_TYPE)
7228 OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (c) = t;
7229 else
7230 c_parser_error (parser, "expected integer expression");
7232 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
7234 else
7235 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
7236 "expected %<,%> or %<)%>");
7238 check_no_duplicate_clause (list, OMP_CLAUSE_SCHEDULE, "schedule");
7239 OMP_CLAUSE_CHAIN (c) = list;
7240 return c;
7242 invalid_kind:
7243 c_parser_error (parser, "invalid schedule kind");
7244 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 0);
7245 return list;
7248 /* OpenMP 2.5:
7249 shared ( variable-list ) */
7251 static tree
7252 c_parser_omp_clause_shared (c_parser *parser, tree list)
7254 return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_SHARED, list);
7257 /* Parse all OpenMP clauses. The set clauses allowed by the directive
7258 is a bitmask in MASK. Return the list of clauses found; the result
7259 of clause default goes in *pdefault. */
7261 static tree
7262 c_parser_omp_all_clauses (c_parser *parser, unsigned int mask,
7263 const char *where)
7265 tree clauses = NULL;
7266 bool first = true;
7268 while (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL))
7270 location_t here;
7271 pragma_omp_clause c_kind;
7272 const char *c_name;
7273 tree prev = clauses;
7275 if (!first && c_parser_next_token_is (parser, CPP_COMMA))
7276 c_parser_consume_token (parser);
7278 first = false;
7279 here = c_parser_peek_token (parser)->location;
7280 c_kind = c_parser_omp_clause_name (parser);
7282 switch (c_kind)
7284 case PRAGMA_OMP_CLAUSE_COPYIN:
7285 clauses = c_parser_omp_clause_copyin (parser, clauses);
7286 c_name = "copyin";
7287 break;
7288 case PRAGMA_OMP_CLAUSE_COPYPRIVATE:
7289 clauses = c_parser_omp_clause_copyprivate (parser, clauses);
7290 c_name = "copyprivate";
7291 break;
7292 case PRAGMA_OMP_CLAUSE_DEFAULT:
7293 clauses = c_parser_omp_clause_default (parser, clauses);
7294 c_name = "default";
7295 break;
7296 case PRAGMA_OMP_CLAUSE_FIRSTPRIVATE:
7297 clauses = c_parser_omp_clause_firstprivate (parser, clauses);
7298 c_name = "firstprivate";
7299 break;
7300 case PRAGMA_OMP_CLAUSE_IF:
7301 clauses = c_parser_omp_clause_if (parser, clauses);
7302 c_name = "if";
7303 break;
7304 case PRAGMA_OMP_CLAUSE_LASTPRIVATE:
7305 clauses = c_parser_omp_clause_lastprivate (parser, clauses);
7306 c_name = "lastprivate";
7307 break;
7308 case PRAGMA_OMP_CLAUSE_NOWAIT:
7309 clauses = c_parser_omp_clause_nowait (parser, clauses);
7310 c_name = "nowait";
7311 break;
7312 case PRAGMA_OMP_CLAUSE_NUM_THREADS:
7313 clauses = c_parser_omp_clause_num_threads (parser, clauses);
7314 c_name = "num_threads";
7315 break;
7316 case PRAGMA_OMP_CLAUSE_ORDERED:
7317 clauses = c_parser_omp_clause_ordered (parser, clauses);
7318 c_name = "ordered";
7319 break;
7320 case PRAGMA_OMP_CLAUSE_PRIVATE:
7321 clauses = c_parser_omp_clause_private (parser, clauses);
7322 c_name = "private";
7323 break;
7324 case PRAGMA_OMP_CLAUSE_REDUCTION:
7325 clauses = c_parser_omp_clause_reduction (parser, clauses);
7326 c_name = "reduction";
7327 break;
7328 case PRAGMA_OMP_CLAUSE_SCHEDULE:
7329 clauses = c_parser_omp_clause_schedule (parser, clauses);
7330 c_name = "schedule";
7331 break;
7332 case PRAGMA_OMP_CLAUSE_SHARED:
7333 clauses = c_parser_omp_clause_shared (parser, clauses);
7334 c_name = "shared";
7335 break;
7336 default:
7337 c_parser_error (parser, "expected %<#pragma omp%> clause");
7338 goto saw_error;
7341 if (((mask >> c_kind) & 1) == 0 && !parser->error)
7343 /* Remove the invalid clause(s) from the list to avoid
7344 confusing the rest of the compiler. */
7345 clauses = prev;
7346 error ("%H%qs is not valid for %qs", &here, c_name, where);
7350 saw_error:
7351 c_parser_skip_to_pragma_eol (parser);
7353 return c_finish_omp_clauses (clauses);
7356 /* OpenMP 2.5:
7357 structured-block:
7358 statement
7360 In practice, we're also interested in adding the statement to an
7361 outer node. So it is convenient if we work around the fact that
7362 c_parser_statement calls add_stmt. */
7364 static tree
7365 c_parser_omp_structured_block (c_parser *parser)
7367 tree stmt = push_stmt_list ();
7368 c_parser_statement (parser);
7369 return pop_stmt_list (stmt);
7372 /* OpenMP 2.5:
7373 # pragma omp atomic new-line
7374 expression-stmt
7376 expression-stmt:
7377 x binop= expr | x++ | ++x | x-- | --x
7378 binop:
7379 +, *, -, /, &, ^, |, <<, >>
7381 where x is an lvalue expression with scalar type. */
7383 static void
7384 c_parser_omp_atomic (c_parser *parser)
7386 tree lhs, rhs;
7387 tree stmt;
7388 enum tree_code code;
7390 c_parser_skip_to_pragma_eol (parser);
7392 lhs = c_parser_unary_expression (parser).value;
7393 switch (TREE_CODE (lhs))
7395 case ERROR_MARK:
7396 saw_error:
7397 c_parser_skip_to_end_of_block_or_statement (parser);
7398 return;
7400 case PREINCREMENT_EXPR:
7401 case POSTINCREMENT_EXPR:
7402 lhs = TREE_OPERAND (lhs, 0);
7403 code = PLUS_EXPR;
7404 rhs = integer_one_node;
7405 break;
7407 case PREDECREMENT_EXPR:
7408 case POSTDECREMENT_EXPR:
7409 lhs = TREE_OPERAND (lhs, 0);
7410 code = MINUS_EXPR;
7411 rhs = integer_one_node;
7412 break;
7414 default:
7415 switch (c_parser_peek_token (parser)->type)
7417 case CPP_MULT_EQ:
7418 code = MULT_EXPR;
7419 break;
7420 case CPP_DIV_EQ:
7421 code = TRUNC_DIV_EXPR;
7422 break;
7423 case CPP_PLUS_EQ:
7424 code = PLUS_EXPR;
7425 break;
7426 case CPP_MINUS_EQ:
7427 code = MINUS_EXPR;
7428 break;
7429 case CPP_LSHIFT_EQ:
7430 code = LSHIFT_EXPR;
7431 break;
7432 case CPP_RSHIFT_EQ:
7433 code = RSHIFT_EXPR;
7434 break;
7435 case CPP_AND_EQ:
7436 code = BIT_AND_EXPR;
7437 break;
7438 case CPP_OR_EQ:
7439 code = BIT_IOR_EXPR;
7440 break;
7441 case CPP_XOR_EQ:
7442 code = BIT_XOR_EXPR;
7443 break;
7444 default:
7445 c_parser_error (parser,
7446 "invalid operator for %<#pragma omp atomic%>");
7447 goto saw_error;
7450 c_parser_consume_token (parser);
7451 rhs = c_parser_expression (parser).value;
7452 break;
7454 stmt = c_finish_omp_atomic (code, lhs, rhs);
7455 if (stmt != error_mark_node)
7456 add_stmt (stmt);
7457 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
7461 /* OpenMP 2.5:
7462 # pragma omp barrier new-line
7465 static void
7466 c_parser_omp_barrier (c_parser *parser)
7468 c_parser_consume_pragma (parser);
7469 c_parser_skip_to_pragma_eol (parser);
7471 c_finish_omp_barrier ();
7474 /* OpenMP 2.5:
7475 # pragma omp critical [(name)] new-line
7476 structured-block
7479 static tree
7480 c_parser_omp_critical (c_parser *parser)
7482 tree stmt, name = NULL;
7484 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
7486 c_parser_consume_token (parser);
7487 if (c_parser_next_token_is (parser, CPP_NAME))
7489 name = c_parser_peek_token (parser)->value;
7490 c_parser_consume_token (parser);
7491 c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>");
7493 else
7494 c_parser_error (parser, "expected identifier");
7496 else if (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL))
7497 c_parser_error (parser, "expected %<(%> or end of line");
7498 c_parser_skip_to_pragma_eol (parser);
7500 stmt = c_parser_omp_structured_block (parser);
7501 return c_finish_omp_critical (stmt, name);
7504 /* OpenMP 2.5:
7505 # pragma omp flush flush-vars[opt] new-line
7507 flush-vars:
7508 ( variable-list ) */
7510 static void
7511 c_parser_omp_flush (c_parser *parser)
7513 c_parser_consume_pragma (parser);
7514 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
7515 c_parser_omp_var_list_parens (parser, 0, NULL);
7516 else if (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL))
7517 c_parser_error (parser, "expected %<(%> or end of line");
7518 c_parser_skip_to_pragma_eol (parser);
7520 c_finish_omp_flush ();
7523 /* Parse the restricted form of the for statment allowed by OpenMP.
7524 The real trick here is to determine the loop control variable early
7525 so that we can push a new decl if necessary to make it private. */
7527 static tree
7528 c_parser_omp_for_loop (c_parser *parser)
7530 tree decl, cond, incr, save_break, save_cont, body, init;
7531 location_t loc;
7533 if (!c_parser_next_token_is_keyword (parser, RID_FOR))
7535 c_parser_error (parser, "for statement expected");
7536 return NULL;
7538 loc = c_parser_peek_token (parser)->location;
7539 c_parser_consume_token (parser);
7541 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
7542 return NULL;
7544 /* Parse the initialization declaration or expression. */
7545 if (c_parser_next_token_starts_declspecs (parser))
7547 c_parser_declaration_or_fndef (parser, true, true, true, true);
7548 decl = check_for_loop_decls ();
7549 if (decl == NULL)
7550 goto error_init;
7551 if (DECL_INITIAL (decl) == error_mark_node)
7552 decl = error_mark_node;
7553 init = decl;
7555 else if (c_parser_next_token_is (parser, CPP_NAME)
7556 && c_parser_peek_2nd_token (parser)->type == CPP_EQ)
7558 decl = c_parser_postfix_expression (parser).value;
7560 c_parser_require (parser, CPP_EQ, "expected %<=%>");
7562 init = c_parser_expr_no_commas (parser, NULL).value;
7563 init = build_modify_expr (decl, NOP_EXPR, init);
7564 init = c_process_expr_stmt (init);
7566 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
7568 else
7569 goto error_init;
7571 /* Parse the loop condition. */
7572 cond = NULL_TREE;
7573 if (c_parser_next_token_is_not (parser, CPP_SEMICOLON))
7575 cond = c_parser_expression_conv (parser).value;
7576 cond = c_objc_common_truthvalue_conversion (cond);
7577 if (CAN_HAVE_LOCATION_P (cond))
7578 SET_EXPR_LOCATION (cond, input_location);
7580 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
7582 /* Parse the increment expression. */
7583 incr = NULL_TREE;
7584 if (c_parser_next_token_is_not (parser, CPP_CLOSE_PAREN))
7585 incr = c_process_expr_stmt (c_parser_expression (parser).value);
7586 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
7588 parse_body:
7589 save_break = c_break_label;
7590 c_break_label = size_one_node;
7591 save_cont = c_cont_label;
7592 c_cont_label = NULL_TREE;
7593 body = push_stmt_list ();
7595 add_stmt (c_parser_c99_block_statement (parser));
7596 if (c_cont_label)
7597 add_stmt (build1 (LABEL_EXPR, void_type_node, c_cont_label));
7599 body = pop_stmt_list (body);
7600 c_break_label = save_break;
7601 c_cont_label = save_cont;
7603 /* Only bother calling c_finish_omp_for if we haven't already generated
7604 an error from the initialization parsing. */
7605 if (decl != NULL && decl != error_mark_node && init != error_mark_node)
7606 return c_finish_omp_for (loc, decl, init, cond, incr, body, NULL);
7607 return NULL;
7609 error_init:
7610 c_parser_error (parser, "expected iteration declaration or initialization");
7611 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
7612 decl = init = cond = incr = NULL_TREE;
7613 goto parse_body;
7616 /* OpenMP 2.5:
7617 #pragma omp for for-clause[optseq] new-line
7618 for-loop
7621 #define OMP_FOR_CLAUSE_MASK \
7622 ( (1u << PRAGMA_OMP_CLAUSE_PRIVATE) \
7623 | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE) \
7624 | (1u << PRAGMA_OMP_CLAUSE_LASTPRIVATE) \
7625 | (1u << PRAGMA_OMP_CLAUSE_REDUCTION) \
7626 | (1u << PRAGMA_OMP_CLAUSE_ORDERED) \
7627 | (1u << PRAGMA_OMP_CLAUSE_SCHEDULE) \
7628 | (1u << PRAGMA_OMP_CLAUSE_NOWAIT))
7630 static tree
7631 c_parser_omp_for (c_parser *parser)
7633 tree block, clauses, ret;
7635 clauses = c_parser_omp_all_clauses (parser, OMP_FOR_CLAUSE_MASK,
7636 "#pragma omp for");
7638 block = c_begin_compound_stmt (true);
7639 ret = c_parser_omp_for_loop (parser);
7640 if (ret)
7641 OMP_FOR_CLAUSES (ret) = clauses;
7642 block = c_end_compound_stmt (block, true);
7643 add_stmt (block);
7645 return ret;
7648 /* OpenMP 2.5:
7649 # pragma omp master new-line
7650 structured-block
7653 static tree
7654 c_parser_omp_master (c_parser *parser)
7656 c_parser_skip_to_pragma_eol (parser);
7657 return c_finish_omp_master (c_parser_omp_structured_block (parser));
7660 /* OpenMP 2.5:
7661 # pragma omp ordered new-line
7662 structured-block
7665 static tree
7666 c_parser_omp_ordered (c_parser *parser)
7668 c_parser_skip_to_pragma_eol (parser);
7669 return c_finish_omp_ordered (c_parser_omp_structured_block (parser));
7672 /* OpenMP 2.5:
7674 section-scope:
7675 { section-sequence }
7677 section-sequence:
7678 section-directive[opt] structured-block
7679 section-sequence section-directive structured-block */
7681 static tree
7682 c_parser_omp_sections_scope (c_parser *parser)
7684 tree stmt, substmt;
7685 bool error_suppress = false;
7686 location_t loc;
7688 if (!c_parser_require (parser, CPP_OPEN_BRACE, "expected %<{%>"))
7690 /* Avoid skipping until the end of the block. */
7691 parser->error = false;
7692 return NULL_TREE;
7695 stmt = push_stmt_list ();
7697 loc = c_parser_peek_token (parser)->location;
7698 if (c_parser_peek_token (parser)->pragma_kind != PRAGMA_OMP_SECTION)
7700 substmt = push_stmt_list ();
7702 while (1)
7704 c_parser_statement (parser);
7706 if (c_parser_peek_token (parser)->pragma_kind == PRAGMA_OMP_SECTION)
7707 break;
7708 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
7709 break;
7710 if (c_parser_next_token_is (parser, CPP_EOF))
7711 break;
7714 substmt = pop_stmt_list (substmt);
7715 substmt = build1 (OMP_SECTION, void_type_node, substmt);
7716 SET_EXPR_LOCATION (substmt, loc);
7717 add_stmt (substmt);
7720 while (1)
7722 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
7723 break;
7724 if (c_parser_next_token_is (parser, CPP_EOF))
7725 break;
7727 loc = c_parser_peek_token (parser)->location;
7728 if (c_parser_peek_token (parser)->pragma_kind == PRAGMA_OMP_SECTION)
7730 c_parser_consume_pragma (parser);
7731 c_parser_skip_to_pragma_eol (parser);
7732 error_suppress = false;
7734 else if (!error_suppress)
7736 error ("%Hexpected %<#pragma omp section%> or %<}%>",
7737 &loc);
7738 error_suppress = true;
7741 substmt = c_parser_omp_structured_block (parser);
7742 substmt = build1 (OMP_SECTION, void_type_node, substmt);
7743 SET_EXPR_LOCATION (substmt, loc);
7744 add_stmt (substmt);
7746 c_parser_skip_until_found (parser, CPP_CLOSE_BRACE,
7747 "expected %<#pragma omp section%> or %<}%>");
7749 substmt = pop_stmt_list (stmt);
7751 stmt = make_node (OMP_SECTIONS);
7752 TREE_TYPE (stmt) = void_type_node;
7753 OMP_SECTIONS_BODY (stmt) = substmt;
7755 return add_stmt (stmt);
7758 /* OpenMP 2.5:
7759 # pragma omp sections sections-clause[optseq] newline
7760 sections-scope
7763 #define OMP_SECTIONS_CLAUSE_MASK \
7764 ( (1u << PRAGMA_OMP_CLAUSE_PRIVATE) \
7765 | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE) \
7766 | (1u << PRAGMA_OMP_CLAUSE_LASTPRIVATE) \
7767 | (1u << PRAGMA_OMP_CLAUSE_REDUCTION) \
7768 | (1u << PRAGMA_OMP_CLAUSE_NOWAIT))
7770 static tree
7771 c_parser_omp_sections (c_parser *parser)
7773 tree block, clauses, ret;
7775 clauses = c_parser_omp_all_clauses (parser, OMP_SECTIONS_CLAUSE_MASK,
7776 "#pragma omp sections");
7778 block = c_begin_compound_stmt (true);
7779 ret = c_parser_omp_sections_scope (parser);
7780 if (ret)
7781 OMP_SECTIONS_CLAUSES (ret) = clauses;
7782 block = c_end_compound_stmt (block, true);
7783 add_stmt (block);
7785 return ret;
7788 /* OpenMP 2.5:
7789 # pragma parallel parallel-clause new-line
7790 # pragma parallel for parallel-for-clause new-line
7791 # pragma parallel sections parallel-sections-clause new-line
7794 #define OMP_PARALLEL_CLAUSE_MASK \
7795 ( (1u << PRAGMA_OMP_CLAUSE_IF) \
7796 | (1u << PRAGMA_OMP_CLAUSE_PRIVATE) \
7797 | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE) \
7798 | (1u << PRAGMA_OMP_CLAUSE_DEFAULT) \
7799 | (1u << PRAGMA_OMP_CLAUSE_SHARED) \
7800 | (1u << PRAGMA_OMP_CLAUSE_COPYIN) \
7801 | (1u << PRAGMA_OMP_CLAUSE_REDUCTION) \
7802 | (1u << PRAGMA_OMP_CLAUSE_NUM_THREADS))
7804 static tree
7805 c_parser_omp_parallel (c_parser *parser)
7807 enum pragma_kind p_kind = PRAGMA_OMP_PARALLEL;
7808 const char *p_name = "#pragma omp parallel";
7809 tree stmt, clauses, par_clause, ws_clause, block;
7810 unsigned int mask = OMP_PARALLEL_CLAUSE_MASK;
7812 if (c_parser_next_token_is_keyword (parser, RID_FOR))
7814 c_parser_consume_token (parser);
7815 p_kind = PRAGMA_OMP_PARALLEL_FOR;
7816 p_name = "#pragma omp parallel for";
7817 mask |= OMP_FOR_CLAUSE_MASK;
7818 mask &= ~(1u << PRAGMA_OMP_CLAUSE_NOWAIT);
7820 else if (c_parser_next_token_is (parser, CPP_NAME))
7822 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
7823 if (strcmp (p, "sections") == 0)
7825 c_parser_consume_token (parser);
7826 p_kind = PRAGMA_OMP_PARALLEL_SECTIONS;
7827 p_name = "#pragma omp parallel sections";
7828 mask |= OMP_SECTIONS_CLAUSE_MASK;
7829 mask &= ~(1u << PRAGMA_OMP_CLAUSE_NOWAIT);
7833 clauses = c_parser_omp_all_clauses (parser, mask, p_name);
7835 switch (p_kind)
7837 case PRAGMA_OMP_PARALLEL:
7838 block = c_begin_omp_parallel ();
7839 c_parser_statement (parser);
7840 stmt = c_finish_omp_parallel (clauses, block);
7841 break;
7843 case PRAGMA_OMP_PARALLEL_FOR:
7844 block = c_begin_omp_parallel ();
7845 c_split_parallel_clauses (clauses, &par_clause, &ws_clause);
7846 stmt = c_parser_omp_for_loop (parser);
7847 if (stmt)
7848 OMP_FOR_CLAUSES (stmt) = ws_clause;
7849 stmt = c_finish_omp_parallel (par_clause, block);
7850 OMP_PARALLEL_COMBINED (stmt) = 1;
7851 break;
7853 case PRAGMA_OMP_PARALLEL_SECTIONS:
7854 block = c_begin_omp_parallel ();
7855 c_split_parallel_clauses (clauses, &par_clause, &ws_clause);
7856 stmt = c_parser_omp_sections_scope (parser);
7857 if (stmt)
7858 OMP_SECTIONS_CLAUSES (stmt) = ws_clause;
7859 stmt = c_finish_omp_parallel (par_clause, block);
7860 OMP_PARALLEL_COMBINED (stmt) = 1;
7861 break;
7863 default:
7864 gcc_unreachable ();
7867 return stmt;
7870 /* OpenMP 2.5:
7871 # pragma omp single single-clause[optseq] new-line
7872 structured-block
7875 #define OMP_SINGLE_CLAUSE_MASK \
7876 ( (1u << PRAGMA_OMP_CLAUSE_PRIVATE) \
7877 | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE) \
7878 | (1u << PRAGMA_OMP_CLAUSE_COPYPRIVATE) \
7879 | (1u << PRAGMA_OMP_CLAUSE_NOWAIT))
7881 static tree
7882 c_parser_omp_single (c_parser *parser)
7884 tree stmt = make_node (OMP_SINGLE);
7885 TREE_TYPE (stmt) = void_type_node;
7887 OMP_SINGLE_CLAUSES (stmt)
7888 = c_parser_omp_all_clauses (parser, OMP_SINGLE_CLAUSE_MASK,
7889 "#pragma omp single");
7890 OMP_SINGLE_BODY (stmt) = c_parser_omp_structured_block (parser);
7892 return add_stmt (stmt);
7896 /* Main entry point to parsing most OpenMP pragmas. */
7898 static void
7899 c_parser_omp_construct (c_parser *parser)
7901 enum pragma_kind p_kind;
7902 location_t loc;
7903 tree stmt;
7905 loc = c_parser_peek_token (parser)->location;
7906 p_kind = c_parser_peek_token (parser)->pragma_kind;
7907 c_parser_consume_pragma (parser);
7909 /* For all constructs below except #pragma omp atomic
7910 MUST_NOT_THROW catch handlers are needed when exceptions
7911 are enabled. */
7912 if (p_kind != PRAGMA_OMP_ATOMIC)
7913 c_maybe_initialize_eh ();
7915 switch (p_kind)
7917 case PRAGMA_OMP_ATOMIC:
7918 c_parser_omp_atomic (parser);
7919 return;
7920 case PRAGMA_OMP_CRITICAL:
7921 stmt = c_parser_omp_critical (parser);
7922 break;
7923 case PRAGMA_OMP_FOR:
7924 stmt = c_parser_omp_for (parser);
7925 break;
7926 case PRAGMA_OMP_MASTER:
7927 stmt = c_parser_omp_master (parser);
7928 break;
7929 case PRAGMA_OMP_ORDERED:
7930 stmt = c_parser_omp_ordered (parser);
7931 break;
7932 case PRAGMA_OMP_PARALLEL:
7933 stmt = c_parser_omp_parallel (parser);
7934 break;
7935 case PRAGMA_OMP_SECTIONS:
7936 stmt = c_parser_omp_sections (parser);
7937 break;
7938 case PRAGMA_OMP_SINGLE:
7939 stmt = c_parser_omp_single (parser);
7940 break;
7941 default:
7942 gcc_unreachable ();
7945 if (stmt)
7946 SET_EXPR_LOCATION (stmt, loc);
7950 /* OpenMP 2.5:
7951 # pragma omp threadprivate (variable-list) */
7953 static void
7954 c_parser_omp_threadprivate (c_parser *parser)
7956 tree vars, t;
7958 c_parser_consume_pragma (parser);
7959 vars = c_parser_omp_var_list_parens (parser, 0, NULL);
7961 /* Mark every variable in VARS to be assigned thread local storage. */
7962 for (t = vars; t; t = TREE_CHAIN (t))
7964 tree v = TREE_PURPOSE (t);
7966 /* If V had already been marked threadprivate, it doesn't matter
7967 whether it had been used prior to this point. */
7968 if (TREE_CODE (v) != VAR_DECL)
7969 error ("%qD is not a variable", v);
7970 else if (TREE_USED (v) && !C_DECL_THREADPRIVATE_P (v))
7971 error ("%qE declared %<threadprivate%> after first use", v);
7972 else if (! TREE_STATIC (v) && ! DECL_EXTERNAL (v))
7973 error ("automatic variable %qE cannot be %<threadprivate%>", v);
7974 else if (TREE_TYPE (v) == error_mark_node)
7976 else if (! COMPLETE_TYPE_P (TREE_TYPE (v)))
7977 error ("%<threadprivate%> %qE has incomplete type", v);
7978 else
7980 if (! DECL_THREAD_LOCAL_P (v))
7982 DECL_TLS_MODEL (v) = decl_default_tls_model (v);
7983 /* If rtl has been already set for this var, call
7984 make_decl_rtl once again, so that encode_section_info
7985 has a chance to look at the new decl flags. */
7986 if (DECL_RTL_SET_P (v))
7987 make_decl_rtl (v);
7989 C_DECL_THREADPRIVATE_P (v) = 1;
7993 c_parser_skip_to_pragma_eol (parser);
7997 /* Parse a single source file. */
7999 void
8000 c_parse_file (void)
8002 /* Use local storage to begin. If the first token is a pragma, parse it.
8003 If it is #pragma GCC pch_preprocess, then this will load a PCH file
8004 which will cause garbage collection. */
8005 c_parser tparser;
8007 memset (&tparser, 0, sizeof tparser);
8008 the_parser = &tparser;
8010 if (c_parser_peek_token (&tparser)->pragma_kind == PRAGMA_GCC_PCH_PREPROCESS)
8011 c_parser_pragma_pch_preprocess (&tparser);
8013 the_parser = GGC_NEW (c_parser);
8014 *the_parser = tparser;
8016 c_parser_translation_unit (the_parser);
8017 the_parser = NULL;
8020 #include "gt-c-parser.h"