Fix warnings occured during profiledboostrap on
[official-gcc.git] / gcc / c / c-parser.c
blobceb9e1a78e7c567d20da2220ff551702118ef1de
1 /* Parser for C and Objective-C.
2 Copyright (C) 1987-2015 Free Software Foundation, Inc.
4 Parser actions based on the old Bison parser; structure somewhat
5 influenced by and fragments based on the C++ parser.
7 This file is part of GCC.
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 3, or (at your option) any later
12 version.
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 for more details.
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3. If not see
21 <http://www.gnu.org/licenses/>. */
23 /* TODO:
25 Make sure all relevant comments, and all relevant code from all
26 actions, brought over from old parser. Verify exact correspondence
27 of syntax accepted.
29 Add testcases covering every input symbol in every state in old and
30 new parsers.
32 Include full syntax for GNU C, including erroneous cases accepted
33 with error messages, in syntax productions in comments.
35 Make more diagnostics in the front end generally take an explicit
36 location rather than implicitly using input_location. */
38 #include "config.h"
39 #include "system.h"
40 #include "coretypes.h"
41 #include "tm.h" /* For rtl.h: needs enum reg_class. */
42 #include "hash-set.h"
43 #include "vec.h"
44 #include "symtab.h"
45 #include "input.h"
46 #include "alias.h"
47 #include "double-int.h"
48 #include "machmode.h"
49 #include "flags.h"
50 #include "inchash.h"
51 #include "tree.h"
52 #include "fold-const.h"
53 #include "stringpool.h"
54 #include "attribs.h"
55 #include "stor-layout.h"
56 #include "varasm.h"
57 #include "trans-mem.h"
58 #include "langhooks.h"
59 #include "input.h"
60 #include "cpplib.h"
61 #include "timevar.h"
62 #include "c-family/c-pragma.h"
63 #include "c-tree.h"
64 #include "c-lang.h"
65 #include "flags.h"
66 #include "ggc.h"
67 #include "c-family/c-common.h"
68 #include "c-family/c-objc.h"
69 #include "vec.h"
70 #include "target.h"
71 #include "hash-map.h"
72 #include "is-a.h"
73 #include "plugin-api.h"
74 #include "hashtab.h"
75 #include "hash-set.h"
76 #include "machmode.h"
77 #include "hard-reg-set.h"
78 #include "function.h"
79 #include "ipa-ref.h"
80 #include "cgraph.h"
81 #include "plugin.h"
82 #include "omp-low.h"
83 #include "builtins.h"
84 #include "gomp-constants.h"
87 /* Initialization routine for this file. */
89 void
90 c_parse_init (void)
92 /* The only initialization required is of the reserved word
93 identifiers. */
94 unsigned int i;
95 tree id;
96 int mask = 0;
98 /* Make sure RID_MAX hasn't grown past the 8 bits used to hold the keyword in
99 the c_token structure. */
100 gcc_assert (RID_MAX <= 255);
102 mask |= D_CXXONLY;
103 if (!flag_isoc99)
104 mask |= D_C99;
105 if (flag_no_asm)
107 mask |= D_ASM | D_EXT;
108 if (!flag_isoc99)
109 mask |= D_EXT89;
111 if (!c_dialect_objc ())
112 mask |= D_OBJC | D_CXX_OBJC;
114 ridpointers = ggc_cleared_vec_alloc<tree> ((int) RID_MAX);
115 for (i = 0; i < num_c_common_reswords; i++)
117 /* If a keyword is disabled, do not enter it into the table
118 and so create a canonical spelling that isn't a keyword. */
119 if (c_common_reswords[i].disable & mask)
121 if (warn_cxx_compat
122 && (c_common_reswords[i].disable & D_CXXWARN))
124 id = get_identifier (c_common_reswords[i].word);
125 C_SET_RID_CODE (id, RID_CXX_COMPAT_WARN);
126 C_IS_RESERVED_WORD (id) = 1;
128 continue;
131 id = get_identifier (c_common_reswords[i].word);
132 C_SET_RID_CODE (id, c_common_reswords[i].rid);
133 C_IS_RESERVED_WORD (id) = 1;
134 ridpointers [(int) c_common_reswords[i].rid] = id;
137 for (i = 0; i < NUM_INT_N_ENTS; i++)
139 /* We always create the symbols but they aren't always supported. */
140 char name[50];
141 sprintf (name, "__int%d", int_n_data[i].bitsize);
142 id = get_identifier (xstrdup (name));
143 C_SET_RID_CODE (id, RID_FIRST_INT_N + i);
144 C_IS_RESERVED_WORD (id) = 1;
148 /* The C lexer intermediates between the lexer in cpplib and c-lex.c
149 and the C parser. Unlike the C++ lexer, the parser structure
150 stores the lexer information instead of using a separate structure.
151 Identifiers are separated into ordinary identifiers, type names,
152 keywords and some other Objective-C types of identifiers, and some
153 look-ahead is maintained.
155 ??? It might be a good idea to lex the whole file up front (as for
156 C++). It would then be possible to share more of the C and C++
157 lexer code, if desired. */
159 /* More information about the type of a CPP_NAME token. */
160 typedef enum c_id_kind {
161 /* An ordinary identifier. */
162 C_ID_ID,
163 /* An identifier declared as a typedef name. */
164 C_ID_TYPENAME,
165 /* An identifier declared as an Objective-C class name. */
166 C_ID_CLASSNAME,
167 /* An address space identifier. */
168 C_ID_ADDRSPACE,
169 /* Not an identifier. */
170 C_ID_NONE
171 } c_id_kind;
173 /* A single C token after string literal concatenation and conversion
174 of preprocessing tokens to tokens. */
175 typedef struct GTY (()) c_token {
176 /* The kind of token. */
177 ENUM_BITFIELD (cpp_ttype) type : 8;
178 /* If this token is a CPP_NAME, this value indicates whether also
179 declared as some kind of type. Otherwise, it is C_ID_NONE. */
180 ENUM_BITFIELD (c_id_kind) id_kind : 8;
181 /* If this token is a keyword, this value indicates which keyword.
182 Otherwise, this value is RID_MAX. */
183 ENUM_BITFIELD (rid) keyword : 8;
184 /* If this token is a CPP_PRAGMA, this indicates the pragma that
185 was seen. Otherwise it is PRAGMA_NONE. */
186 ENUM_BITFIELD (pragma_kind) pragma_kind : 8;
187 /* The location at which this token was found. */
188 location_t location;
189 /* The value associated with this token, if any. */
190 tree value;
191 } c_token;
193 /* A parser structure recording information about the state and
194 context of parsing. Includes lexer information with up to two
195 tokens of look-ahead; more are not needed for C. */
196 typedef struct GTY(()) c_parser {
197 /* The look-ahead tokens. */
198 c_token * GTY((skip)) tokens;
199 /* Buffer for look-ahead tokens. */
200 c_token tokens_buf[2];
201 /* How many look-ahead tokens are available (0, 1 or 2, or
202 more if parsing from pre-lexed tokens). */
203 unsigned int tokens_avail;
204 /* True if a syntax error is being recovered from; false otherwise.
205 c_parser_error sets this flag. It should clear this flag when
206 enough tokens have been consumed to recover from the error. */
207 BOOL_BITFIELD error : 1;
208 /* True if we're processing a pragma, and shouldn't automatically
209 consume CPP_PRAGMA_EOL. */
210 BOOL_BITFIELD in_pragma : 1;
211 /* True if we're parsing the outermost block of an if statement. */
212 BOOL_BITFIELD in_if_block : 1;
213 /* True if we want to lex an untranslated string. */
214 BOOL_BITFIELD lex_untranslated_string : 1;
216 /* Objective-C specific parser/lexer information. */
218 /* True if we are in a context where the Objective-C "PQ" keywords
219 are considered keywords. */
220 BOOL_BITFIELD objc_pq_context : 1;
221 /* True if we are parsing a (potential) Objective-C foreach
222 statement. This is set to true after we parsed 'for (' and while
223 we wait for 'in' or ';' to decide if it's a standard C for loop or an
224 Objective-C foreach loop. */
225 BOOL_BITFIELD objc_could_be_foreach_context : 1;
226 /* The following flag is needed to contextualize Objective-C lexical
227 analysis. In some cases (e.g., 'int NSObject;'), it is
228 undesirable to bind an identifier to an Objective-C class, even
229 if a class with that name exists. */
230 BOOL_BITFIELD objc_need_raw_identifier : 1;
231 /* Nonzero if we're processing a __transaction statement. The value
232 is 1 | TM_STMT_ATTR_*. */
233 unsigned int in_transaction : 4;
234 /* True if we are in a context where the Objective-C "Property attribute"
235 keywords are valid. */
236 BOOL_BITFIELD objc_property_attr_context : 1;
238 /* Cilk Plus specific parser/lexer information. */
240 /* Buffer to hold all the tokens from parsing the vector attribute for the
241 SIMD-enabled functions (formerly known as elemental functions). */
242 vec <c_token, va_gc> *cilk_simd_fn_tokens;
243 } c_parser;
246 /* The actual parser and external interface. ??? Does this need to be
247 garbage-collected? */
249 static GTY (()) c_parser *the_parser;
251 /* Read in and lex a single token, storing it in *TOKEN. */
253 static void
254 c_lex_one_token (c_parser *parser, c_token *token)
256 timevar_push (TV_LEX);
258 token->type = c_lex_with_flags (&token->value, &token->location, NULL,
259 (parser->lex_untranslated_string
260 ? C_LEX_STRING_NO_TRANSLATE : 0));
261 token->id_kind = C_ID_NONE;
262 token->keyword = RID_MAX;
263 token->pragma_kind = PRAGMA_NONE;
265 switch (token->type)
267 case CPP_NAME:
269 tree decl;
271 bool objc_force_identifier = parser->objc_need_raw_identifier;
272 if (c_dialect_objc ())
273 parser->objc_need_raw_identifier = false;
275 if (C_IS_RESERVED_WORD (token->value))
277 enum rid rid_code = C_RID_CODE (token->value);
279 if (rid_code == RID_CXX_COMPAT_WARN)
281 warning_at (token->location,
282 OPT_Wc___compat,
283 "identifier %qE conflicts with C++ keyword",
284 token->value);
286 else if (rid_code >= RID_FIRST_ADDR_SPACE
287 && rid_code <= RID_LAST_ADDR_SPACE)
289 token->id_kind = C_ID_ADDRSPACE;
290 token->keyword = rid_code;
291 break;
293 else if (c_dialect_objc () && OBJC_IS_PQ_KEYWORD (rid_code))
295 /* We found an Objective-C "pq" keyword (in, out,
296 inout, bycopy, byref, oneway). They need special
297 care because the interpretation depends on the
298 context. */
299 if (parser->objc_pq_context)
301 token->type = CPP_KEYWORD;
302 token->keyword = rid_code;
303 break;
305 else if (parser->objc_could_be_foreach_context
306 && rid_code == RID_IN)
308 /* We are in Objective-C, inside a (potential)
309 foreach context (which means after having
310 parsed 'for (', but before having parsed ';'),
311 and we found 'in'. We consider it the keyword
312 which terminates the declaration at the
313 beginning of a foreach-statement. Note that
314 this means you can't use 'in' for anything else
315 in that context; in particular, in Objective-C
316 you can't use 'in' as the name of the running
317 variable in a C for loop. We could potentially
318 try to add code here to disambiguate, but it
319 seems a reasonable limitation. */
320 token->type = CPP_KEYWORD;
321 token->keyword = rid_code;
322 break;
324 /* Else, "pq" keywords outside of the "pq" context are
325 not keywords, and we fall through to the code for
326 normal tokens. */
328 else if (c_dialect_objc () && OBJC_IS_PATTR_KEYWORD (rid_code))
330 /* We found an Objective-C "property attribute"
331 keyword (getter, setter, readonly, etc). These are
332 only valid in the property context. */
333 if (parser->objc_property_attr_context)
335 token->type = CPP_KEYWORD;
336 token->keyword = rid_code;
337 break;
339 /* Else they are not special keywords.
342 else if (c_dialect_objc ()
343 && (OBJC_IS_AT_KEYWORD (rid_code)
344 || OBJC_IS_CXX_KEYWORD (rid_code)))
346 /* We found one of the Objective-C "@" keywords (defs,
347 selector, synchronized, etc) or one of the
348 Objective-C "cxx" keywords (class, private,
349 protected, public, try, catch, throw) without a
350 preceding '@' sign. Do nothing and fall through to
351 the code for normal tokens (in C++ we would still
352 consider the CXX ones keywords, but not in C). */
355 else
357 token->type = CPP_KEYWORD;
358 token->keyword = rid_code;
359 break;
363 decl = lookup_name (token->value);
364 if (decl)
366 if (TREE_CODE (decl) == TYPE_DECL)
368 token->id_kind = C_ID_TYPENAME;
369 break;
372 else if (c_dialect_objc ())
374 tree objc_interface_decl = objc_is_class_name (token->value);
375 /* Objective-C class names are in the same namespace as
376 variables and typedefs, and hence are shadowed by local
377 declarations. */
378 if (objc_interface_decl
379 && (!objc_force_identifier || global_bindings_p ()))
381 token->value = objc_interface_decl;
382 token->id_kind = C_ID_CLASSNAME;
383 break;
386 token->id_kind = C_ID_ID;
388 break;
389 case CPP_AT_NAME:
390 /* This only happens in Objective-C; it must be a keyword. */
391 token->type = CPP_KEYWORD;
392 switch (C_RID_CODE (token->value))
394 /* Replace 'class' with '@class', 'private' with '@private',
395 etc. This prevents confusion with the C++ keyword
396 'class', and makes the tokens consistent with other
397 Objective-C 'AT' keywords. For example '@class' is
398 reported as RID_AT_CLASS which is consistent with
399 '@synchronized', which is reported as
400 RID_AT_SYNCHRONIZED.
402 case RID_CLASS: token->keyword = RID_AT_CLASS; break;
403 case RID_PRIVATE: token->keyword = RID_AT_PRIVATE; break;
404 case RID_PROTECTED: token->keyword = RID_AT_PROTECTED; break;
405 case RID_PUBLIC: token->keyword = RID_AT_PUBLIC; break;
406 case RID_THROW: token->keyword = RID_AT_THROW; break;
407 case RID_TRY: token->keyword = RID_AT_TRY; break;
408 case RID_CATCH: token->keyword = RID_AT_CATCH; break;
409 default: token->keyword = C_RID_CODE (token->value);
411 break;
412 case CPP_COLON:
413 case CPP_COMMA:
414 case CPP_CLOSE_PAREN:
415 case CPP_SEMICOLON:
416 /* These tokens may affect the interpretation of any identifiers
417 following, if doing Objective-C. */
418 if (c_dialect_objc ())
419 parser->objc_need_raw_identifier = false;
420 break;
421 case CPP_PRAGMA:
422 /* We smuggled the cpp_token->u.pragma value in an INTEGER_CST. */
423 token->pragma_kind = (enum pragma_kind) TREE_INT_CST_LOW (token->value);
424 token->value = NULL;
425 break;
426 default:
427 break;
429 timevar_pop (TV_LEX);
432 /* Return a pointer to the next token from PARSER, reading it in if
433 necessary. */
435 static inline c_token *
436 c_parser_peek_token (c_parser *parser)
438 if (parser->tokens_avail == 0)
440 c_lex_one_token (parser, &parser->tokens[0]);
441 parser->tokens_avail = 1;
443 return &parser->tokens[0];
446 /* Return true if the next token from PARSER has the indicated
447 TYPE. */
449 static inline bool
450 c_parser_next_token_is (c_parser *parser, enum cpp_ttype type)
452 return c_parser_peek_token (parser)->type == type;
455 /* Return true if the next token from PARSER does not have the
456 indicated TYPE. */
458 static inline bool
459 c_parser_next_token_is_not (c_parser *parser, enum cpp_ttype type)
461 return !c_parser_next_token_is (parser, type);
464 /* Return true if the next token from PARSER is the indicated
465 KEYWORD. */
467 static inline bool
468 c_parser_next_token_is_keyword (c_parser *parser, enum rid keyword)
470 return c_parser_peek_token (parser)->keyword == keyword;
473 /* Return a pointer to the next-but-one token from PARSER, reading it
474 in if necessary. The next token is already read in. */
476 static c_token *
477 c_parser_peek_2nd_token (c_parser *parser)
479 if (parser->tokens_avail >= 2)
480 return &parser->tokens[1];
481 gcc_assert (parser->tokens_avail == 1);
482 gcc_assert (parser->tokens[0].type != CPP_EOF);
483 gcc_assert (parser->tokens[0].type != CPP_PRAGMA_EOL);
484 c_lex_one_token (parser, &parser->tokens[1]);
485 parser->tokens_avail = 2;
486 return &parser->tokens[1];
489 /* Return true if TOKEN can start a type name,
490 false otherwise. */
491 static bool
492 c_token_starts_typename (c_token *token)
494 switch (token->type)
496 case CPP_NAME:
497 switch (token->id_kind)
499 case C_ID_ID:
500 return false;
501 case C_ID_ADDRSPACE:
502 return true;
503 case C_ID_TYPENAME:
504 return true;
505 case C_ID_CLASSNAME:
506 gcc_assert (c_dialect_objc ());
507 return true;
508 default:
509 gcc_unreachable ();
511 case CPP_KEYWORD:
512 switch (token->keyword)
514 case RID_UNSIGNED:
515 case RID_LONG:
516 case RID_SHORT:
517 case RID_SIGNED:
518 case RID_COMPLEX:
519 case RID_INT:
520 case RID_CHAR:
521 case RID_FLOAT:
522 case RID_DOUBLE:
523 case RID_VOID:
524 case RID_DFLOAT32:
525 case RID_DFLOAT64:
526 case RID_DFLOAT128:
527 case RID_BOOL:
528 case RID_ENUM:
529 case RID_STRUCT:
530 case RID_UNION:
531 case RID_TYPEOF:
532 case RID_CONST:
533 case RID_ATOMIC:
534 case RID_VOLATILE:
535 case RID_RESTRICT:
536 case RID_ATTRIBUTE:
537 case RID_FRACT:
538 case RID_ACCUM:
539 case RID_SAT:
540 case RID_AUTO_TYPE:
541 return true;
542 default:
543 if (token->keyword >= RID_FIRST_INT_N
544 && token->keyword < RID_FIRST_INT_N + NUM_INT_N_ENTS
545 && int_n_enabled_p[token->keyword - RID_FIRST_INT_N])
546 return true;
547 return false;
549 case CPP_LESS:
550 if (c_dialect_objc ())
551 return true;
552 return false;
553 default:
554 return false;
558 enum c_lookahead_kind {
559 /* Always treat unknown identifiers as typenames. */
560 cla_prefer_type,
562 /* Could be parsing a nonabstract declarator. Only treat an identifier
563 as a typename if followed by another identifier or a star. */
564 cla_nonabstract_decl,
566 /* Never treat identifiers as typenames. */
567 cla_prefer_id
570 /* Return true if the next token from PARSER can start a type name,
571 false otherwise. LA specifies how to do lookahead in order to
572 detect unknown type names. If unsure, pick CLA_PREFER_ID. */
574 static inline bool
575 c_parser_next_tokens_start_typename (c_parser *parser, enum c_lookahead_kind la)
577 c_token *token = c_parser_peek_token (parser);
578 if (c_token_starts_typename (token))
579 return true;
581 /* Try a bit harder to detect an unknown typename. */
582 if (la != cla_prefer_id
583 && token->type == CPP_NAME
584 && token->id_kind == C_ID_ID
586 /* Do not try too hard when we could have "object in array". */
587 && !parser->objc_could_be_foreach_context
589 && (la == cla_prefer_type
590 || c_parser_peek_2nd_token (parser)->type == CPP_NAME
591 || c_parser_peek_2nd_token (parser)->type == CPP_MULT)
593 /* Only unknown identifiers. */
594 && !lookup_name (token->value))
595 return true;
597 return false;
600 /* Return true if TOKEN is a type qualifier, false otherwise. */
601 static bool
602 c_token_is_qualifier (c_token *token)
604 switch (token->type)
606 case CPP_NAME:
607 switch (token->id_kind)
609 case C_ID_ADDRSPACE:
610 return true;
611 default:
612 return false;
614 case CPP_KEYWORD:
615 switch (token->keyword)
617 case RID_CONST:
618 case RID_VOLATILE:
619 case RID_RESTRICT:
620 case RID_ATTRIBUTE:
621 case RID_ATOMIC:
622 return true;
623 default:
624 return false;
626 case CPP_LESS:
627 return false;
628 default:
629 gcc_unreachable ();
633 /* Return true if the next token from PARSER is a type qualifier,
634 false otherwise. */
635 static inline bool
636 c_parser_next_token_is_qualifier (c_parser *parser)
638 c_token *token = c_parser_peek_token (parser);
639 return c_token_is_qualifier (token);
642 /* Return true if TOKEN can start declaration specifiers, false
643 otherwise. */
644 static bool
645 c_token_starts_declspecs (c_token *token)
647 switch (token->type)
649 case CPP_NAME:
650 switch (token->id_kind)
652 case C_ID_ID:
653 return false;
654 case C_ID_ADDRSPACE:
655 return true;
656 case C_ID_TYPENAME:
657 return true;
658 case C_ID_CLASSNAME:
659 gcc_assert (c_dialect_objc ());
660 return true;
661 default:
662 gcc_unreachable ();
664 case CPP_KEYWORD:
665 switch (token->keyword)
667 case RID_STATIC:
668 case RID_EXTERN:
669 case RID_REGISTER:
670 case RID_TYPEDEF:
671 case RID_INLINE:
672 case RID_NORETURN:
673 case RID_AUTO:
674 case RID_THREAD:
675 case RID_UNSIGNED:
676 case RID_LONG:
677 case RID_SHORT:
678 case RID_SIGNED:
679 case RID_COMPLEX:
680 case RID_INT:
681 case RID_CHAR:
682 case RID_FLOAT:
683 case RID_DOUBLE:
684 case RID_VOID:
685 case RID_DFLOAT32:
686 case RID_DFLOAT64:
687 case RID_DFLOAT128:
688 case RID_BOOL:
689 case RID_ENUM:
690 case RID_STRUCT:
691 case RID_UNION:
692 case RID_TYPEOF:
693 case RID_CONST:
694 case RID_VOLATILE:
695 case RID_RESTRICT:
696 case RID_ATTRIBUTE:
697 case RID_FRACT:
698 case RID_ACCUM:
699 case RID_SAT:
700 case RID_ALIGNAS:
701 case RID_ATOMIC:
702 case RID_AUTO_TYPE:
703 return true;
704 default:
705 if (token->keyword >= RID_FIRST_INT_N
706 && token->keyword < RID_FIRST_INT_N + NUM_INT_N_ENTS
707 && int_n_enabled_p[token->keyword - RID_FIRST_INT_N])
708 return true;
709 return false;
711 case CPP_LESS:
712 if (c_dialect_objc ())
713 return true;
714 return false;
715 default:
716 return false;
721 /* Return true if TOKEN can start declaration specifiers or a static
722 assertion, false otherwise. */
723 static bool
724 c_token_starts_declaration (c_token *token)
726 if (c_token_starts_declspecs (token)
727 || token->keyword == RID_STATIC_ASSERT)
728 return true;
729 else
730 return false;
733 /* Return true if the next token from PARSER can start declaration
734 specifiers, false otherwise. */
735 static inline bool
736 c_parser_next_token_starts_declspecs (c_parser *parser)
738 c_token *token = c_parser_peek_token (parser);
740 /* In Objective-C, a classname normally starts a declspecs unless it
741 is immediately followed by a dot. In that case, it is the
742 Objective-C 2.0 "dot-syntax" for class objects, ie, calls the
743 setter/getter on the class. c_token_starts_declspecs() can't
744 differentiate between the two cases because it only checks the
745 current token, so we have a special check here. */
746 if (c_dialect_objc ()
747 && token->type == CPP_NAME
748 && token->id_kind == C_ID_CLASSNAME
749 && c_parser_peek_2nd_token (parser)->type == CPP_DOT)
750 return false;
752 return c_token_starts_declspecs (token);
755 /* Return true if the next tokens from PARSER can start declaration
756 specifiers or a static assertion, false otherwise. */
757 static inline bool
758 c_parser_next_tokens_start_declaration (c_parser *parser)
760 c_token *token = c_parser_peek_token (parser);
762 /* Same as above. */
763 if (c_dialect_objc ()
764 && token->type == CPP_NAME
765 && token->id_kind == C_ID_CLASSNAME
766 && c_parser_peek_2nd_token (parser)->type == CPP_DOT)
767 return false;
769 /* Labels do not start declarations. */
770 if (token->type == CPP_NAME
771 && c_parser_peek_2nd_token (parser)->type == CPP_COLON)
772 return false;
774 if (c_token_starts_declaration (token))
775 return true;
777 if (c_parser_next_tokens_start_typename (parser, cla_nonabstract_decl))
778 return true;
780 return false;
783 /* Consume the next token from PARSER. */
785 static void
786 c_parser_consume_token (c_parser *parser)
788 gcc_assert (parser->tokens_avail >= 1);
789 gcc_assert (parser->tokens[0].type != CPP_EOF);
790 gcc_assert (!parser->in_pragma || parser->tokens[0].type != CPP_PRAGMA_EOL);
791 gcc_assert (parser->error || parser->tokens[0].type != CPP_PRAGMA);
792 if (parser->tokens != &parser->tokens_buf[0])
793 parser->tokens++;
794 else if (parser->tokens_avail == 2)
795 parser->tokens[0] = parser->tokens[1];
796 parser->tokens_avail--;
799 /* Expect the current token to be a #pragma. Consume it and remember
800 that we've begun parsing a pragma. */
802 static void
803 c_parser_consume_pragma (c_parser *parser)
805 gcc_assert (!parser->in_pragma);
806 gcc_assert (parser->tokens_avail >= 1);
807 gcc_assert (parser->tokens[0].type == CPP_PRAGMA);
808 if (parser->tokens != &parser->tokens_buf[0])
809 parser->tokens++;
810 else if (parser->tokens_avail == 2)
811 parser->tokens[0] = parser->tokens[1];
812 parser->tokens_avail--;
813 parser->in_pragma = true;
816 /* Update the global input_location from TOKEN. */
817 static inline void
818 c_parser_set_source_position_from_token (c_token *token)
820 if (token->type != CPP_EOF)
822 input_location = token->location;
826 /* Issue a diagnostic of the form
827 FILE:LINE: MESSAGE before TOKEN
828 where TOKEN is the next token in the input stream of PARSER.
829 MESSAGE (specified by the caller) is usually of the form "expected
830 OTHER-TOKEN".
832 Do not issue a diagnostic if still recovering from an error.
834 ??? This is taken from the C++ parser, but building up messages in
835 this way is not i18n-friendly and some other approach should be
836 used. */
838 static void
839 c_parser_error (c_parser *parser, const char *gmsgid)
841 c_token *token = c_parser_peek_token (parser);
842 if (parser->error)
843 return;
844 parser->error = true;
845 if (!gmsgid)
846 return;
847 /* This diagnostic makes more sense if it is tagged to the line of
848 the token we just peeked at. */
849 c_parser_set_source_position_from_token (token);
850 c_parse_error (gmsgid,
851 /* Because c_parse_error does not understand
852 CPP_KEYWORD, keywords are treated like
853 identifiers. */
854 (token->type == CPP_KEYWORD ? CPP_NAME : token->type),
855 /* ??? The C parser does not save the cpp flags of a
856 token, we need to pass 0 here and we will not get
857 the source spelling of some tokens but rather the
858 canonical spelling. */
859 token->value, /*flags=*/0);
862 /* If the next token is of the indicated TYPE, consume it. Otherwise,
863 issue the error MSGID. If MSGID is NULL then a message has already
864 been produced and no message will be produced this time. Returns
865 true if found, false otherwise. */
867 static bool
868 c_parser_require (c_parser *parser,
869 enum cpp_ttype type,
870 const char *msgid)
872 if (c_parser_next_token_is (parser, type))
874 c_parser_consume_token (parser);
875 return true;
877 else
879 c_parser_error (parser, msgid);
880 return false;
884 /* If the next token is the indicated keyword, consume it. Otherwise,
885 issue the error MSGID. Returns true if found, false otherwise. */
887 static bool
888 c_parser_require_keyword (c_parser *parser,
889 enum rid keyword,
890 const char *msgid)
892 if (c_parser_next_token_is_keyword (parser, keyword))
894 c_parser_consume_token (parser);
895 return true;
897 else
899 c_parser_error (parser, msgid);
900 return false;
904 /* Like c_parser_require, except that tokens will be skipped until the
905 desired token is found. An error message is still produced if the
906 next token is not as expected. If MSGID is NULL then a message has
907 already been produced and no message will be produced this
908 time. */
910 static void
911 c_parser_skip_until_found (c_parser *parser,
912 enum cpp_ttype type,
913 const char *msgid)
915 unsigned nesting_depth = 0;
917 if (c_parser_require (parser, type, msgid))
918 return;
920 /* Skip tokens until the desired token is found. */
921 while (true)
923 /* Peek at the next token. */
924 c_token *token = c_parser_peek_token (parser);
925 /* If we've reached the token we want, consume it and stop. */
926 if (token->type == type && !nesting_depth)
928 c_parser_consume_token (parser);
929 break;
932 /* If we've run out of tokens, stop. */
933 if (token->type == CPP_EOF)
934 return;
935 if (token->type == CPP_PRAGMA_EOL && parser->in_pragma)
936 return;
937 if (token->type == CPP_OPEN_BRACE
938 || token->type == CPP_OPEN_PAREN
939 || token->type == CPP_OPEN_SQUARE)
940 ++nesting_depth;
941 else if (token->type == CPP_CLOSE_BRACE
942 || token->type == CPP_CLOSE_PAREN
943 || token->type == CPP_CLOSE_SQUARE)
945 if (nesting_depth-- == 0)
946 break;
948 /* Consume this token. */
949 c_parser_consume_token (parser);
951 parser->error = false;
954 /* Skip tokens until the end of a parameter is found, but do not
955 consume the comma, semicolon or closing delimiter. */
957 static void
958 c_parser_skip_to_end_of_parameter (c_parser *parser)
960 unsigned nesting_depth = 0;
962 while (true)
964 c_token *token = c_parser_peek_token (parser);
965 if ((token->type == CPP_COMMA || token->type == CPP_SEMICOLON)
966 && !nesting_depth)
967 break;
968 /* If we've run out of tokens, stop. */
969 if (token->type == CPP_EOF)
970 return;
971 if (token->type == CPP_PRAGMA_EOL && parser->in_pragma)
972 return;
973 if (token->type == CPP_OPEN_BRACE
974 || token->type == CPP_OPEN_PAREN
975 || token->type == CPP_OPEN_SQUARE)
976 ++nesting_depth;
977 else if (token->type == CPP_CLOSE_BRACE
978 || token->type == CPP_CLOSE_PAREN
979 || token->type == CPP_CLOSE_SQUARE)
981 if (nesting_depth-- == 0)
982 break;
984 /* Consume this token. */
985 c_parser_consume_token (parser);
987 parser->error = false;
990 /* Expect to be at the end of the pragma directive and consume an
991 end of line marker. */
993 static void
994 c_parser_skip_to_pragma_eol (c_parser *parser)
996 gcc_assert (parser->in_pragma);
997 parser->in_pragma = false;
999 if (!c_parser_require (parser, CPP_PRAGMA_EOL, "expected end of line"))
1000 while (true)
1002 c_token *token = c_parser_peek_token (parser);
1003 if (token->type == CPP_EOF)
1004 break;
1005 if (token->type == CPP_PRAGMA_EOL)
1007 c_parser_consume_token (parser);
1008 break;
1010 c_parser_consume_token (parser);
1013 parser->error = false;
1016 /* Skip tokens until we have consumed an entire block, or until we
1017 have consumed a non-nested ';'. */
1019 static void
1020 c_parser_skip_to_end_of_block_or_statement (c_parser *parser)
1022 unsigned nesting_depth = 0;
1023 bool save_error = parser->error;
1025 while (true)
1027 c_token *token;
1029 /* Peek at the next token. */
1030 token = c_parser_peek_token (parser);
1032 switch (token->type)
1034 case CPP_EOF:
1035 return;
1037 case CPP_PRAGMA_EOL:
1038 if (parser->in_pragma)
1039 return;
1040 break;
1042 case CPP_SEMICOLON:
1043 /* If the next token is a ';', we have reached the
1044 end of the statement. */
1045 if (!nesting_depth)
1047 /* Consume the ';'. */
1048 c_parser_consume_token (parser);
1049 goto finished;
1051 break;
1053 case CPP_CLOSE_BRACE:
1054 /* If the next token is a non-nested '}', then we have
1055 reached the end of the current block. */
1056 if (nesting_depth == 0 || --nesting_depth == 0)
1058 c_parser_consume_token (parser);
1059 goto finished;
1061 break;
1063 case CPP_OPEN_BRACE:
1064 /* If it the next token is a '{', then we are entering a new
1065 block. Consume the entire block. */
1066 ++nesting_depth;
1067 break;
1069 case CPP_PRAGMA:
1070 /* If we see a pragma, consume the whole thing at once. We
1071 have some safeguards against consuming pragmas willy-nilly.
1072 Normally, we'd expect to be here with parser->error set,
1073 which disables these safeguards. But it's possible to get
1074 here for secondary error recovery, after parser->error has
1075 been cleared. */
1076 c_parser_consume_pragma (parser);
1077 c_parser_skip_to_pragma_eol (parser);
1078 parser->error = save_error;
1079 continue;
1081 default:
1082 break;
1085 c_parser_consume_token (parser);
1088 finished:
1089 parser->error = false;
1092 /* CPP's options (initialized by c-opts.c). */
1093 extern cpp_options *cpp_opts;
1095 /* Save the warning flags which are controlled by __extension__. */
1097 static inline int
1098 disable_extension_diagnostics (void)
1100 int ret = (pedantic
1101 | (warn_pointer_arith << 1)
1102 | (warn_traditional << 2)
1103 | (flag_iso << 3)
1104 | (warn_long_long << 4)
1105 | (warn_cxx_compat << 5)
1106 | (warn_overlength_strings << 6)
1107 /* warn_c90_c99_compat has three states: -1/0/1, so we must
1108 play tricks to properly restore it. */
1109 | ((warn_c90_c99_compat == 1) << 7)
1110 | ((warn_c90_c99_compat == -1) << 8)
1111 /* Similarly for warn_c99_c11_compat. */
1112 | ((warn_c99_c11_compat == 1) << 9)
1113 | ((warn_c99_c11_compat == -1) << 10)
1115 cpp_opts->cpp_pedantic = pedantic = 0;
1116 warn_pointer_arith = 0;
1117 cpp_opts->cpp_warn_traditional = warn_traditional = 0;
1118 flag_iso = 0;
1119 cpp_opts->cpp_warn_long_long = warn_long_long = 0;
1120 warn_cxx_compat = 0;
1121 warn_overlength_strings = 0;
1122 warn_c90_c99_compat = 0;
1123 warn_c99_c11_compat = 0;
1124 return ret;
1127 /* Restore the warning flags which are controlled by __extension__.
1128 FLAGS is the return value from disable_extension_diagnostics. */
1130 static inline void
1131 restore_extension_diagnostics (int flags)
1133 cpp_opts->cpp_pedantic = pedantic = flags & 1;
1134 warn_pointer_arith = (flags >> 1) & 1;
1135 cpp_opts->cpp_warn_traditional = warn_traditional = (flags >> 2) & 1;
1136 flag_iso = (flags >> 3) & 1;
1137 cpp_opts->cpp_warn_long_long = warn_long_long = (flags >> 4) & 1;
1138 warn_cxx_compat = (flags >> 5) & 1;
1139 warn_overlength_strings = (flags >> 6) & 1;
1140 /* See above for why is this needed. */
1141 warn_c90_c99_compat = (flags >> 7) & 1 ? 1 : ((flags >> 8) & 1 ? -1 : 0);
1142 warn_c99_c11_compat = (flags >> 9) & 1 ? 1 : ((flags >> 10) & 1 ? -1 : 0);
1145 /* Possibly kinds of declarator to parse. */
1146 typedef enum c_dtr_syn {
1147 /* A normal declarator with an identifier. */
1148 C_DTR_NORMAL,
1149 /* An abstract declarator (maybe empty). */
1150 C_DTR_ABSTRACT,
1151 /* A parameter declarator: may be either, but after a type name does
1152 not redeclare a typedef name as an identifier if it can
1153 alternatively be interpreted as a typedef name; see DR#009,
1154 applied in C90 TC1, omitted from C99 and reapplied in C99 TC2
1155 following DR#249. For example, given a typedef T, "int T" and
1156 "int *T" are valid parameter declarations redeclaring T, while
1157 "int (T)" and "int * (T)" and "int (T[])" and "int (T (int))" are
1158 abstract declarators rather than involving redundant parentheses;
1159 the same applies with attributes inside the parentheses before
1160 "T". */
1161 C_DTR_PARM
1162 } c_dtr_syn;
1164 /* The binary operation precedence levels, where 0 is a dummy lowest level
1165 used for the bottom of the stack. */
1166 enum c_parser_prec {
1167 PREC_NONE,
1168 PREC_LOGOR,
1169 PREC_LOGAND,
1170 PREC_BITOR,
1171 PREC_BITXOR,
1172 PREC_BITAND,
1173 PREC_EQ,
1174 PREC_REL,
1175 PREC_SHIFT,
1176 PREC_ADD,
1177 PREC_MULT,
1178 NUM_PRECS
1181 static void c_parser_external_declaration (c_parser *);
1182 static void c_parser_asm_definition (c_parser *);
1183 static void c_parser_declaration_or_fndef (c_parser *, bool, bool, bool,
1184 bool, bool, tree *, vec<c_token>);
1185 static void c_parser_static_assert_declaration_no_semi (c_parser *);
1186 static void c_parser_static_assert_declaration (c_parser *);
1187 static void c_parser_declspecs (c_parser *, struct c_declspecs *, bool, bool,
1188 bool, bool, bool, enum c_lookahead_kind);
1189 static struct c_typespec c_parser_enum_specifier (c_parser *);
1190 static struct c_typespec c_parser_struct_or_union_specifier (c_parser *);
1191 static tree c_parser_struct_declaration (c_parser *);
1192 static struct c_typespec c_parser_typeof_specifier (c_parser *);
1193 static tree c_parser_alignas_specifier (c_parser *);
1194 static struct c_declarator *c_parser_declarator (c_parser *, bool, c_dtr_syn,
1195 bool *);
1196 static struct c_declarator *c_parser_direct_declarator (c_parser *, bool,
1197 c_dtr_syn, bool *);
1198 static struct c_declarator *c_parser_direct_declarator_inner (c_parser *,
1199 bool,
1200 struct c_declarator *);
1201 static struct c_arg_info *c_parser_parms_declarator (c_parser *, bool, tree);
1202 static struct c_arg_info *c_parser_parms_list_declarator (c_parser *, tree,
1203 tree);
1204 static struct c_parm *c_parser_parameter_declaration (c_parser *, tree);
1205 static tree c_parser_simple_asm_expr (c_parser *);
1206 static tree c_parser_attributes (c_parser *);
1207 static struct c_type_name *c_parser_type_name (c_parser *);
1208 static struct c_expr c_parser_initializer (c_parser *);
1209 static struct c_expr c_parser_braced_init (c_parser *, tree, bool);
1210 static void c_parser_initelt (c_parser *, struct obstack *);
1211 static void c_parser_initval (c_parser *, struct c_expr *,
1212 struct obstack *);
1213 static tree c_parser_compound_statement (c_parser *);
1214 static void c_parser_compound_statement_nostart (c_parser *);
1215 static void c_parser_label (c_parser *);
1216 static void c_parser_statement (c_parser *);
1217 static void c_parser_statement_after_labels (c_parser *);
1218 static void c_parser_if_statement (c_parser *);
1219 static void c_parser_switch_statement (c_parser *);
1220 static void c_parser_while_statement (c_parser *, bool);
1221 static void c_parser_do_statement (c_parser *, bool);
1222 static void c_parser_for_statement (c_parser *, bool);
1223 static tree c_parser_asm_statement (c_parser *);
1224 static tree c_parser_asm_operands (c_parser *);
1225 static tree c_parser_asm_goto_operands (c_parser *);
1226 static tree c_parser_asm_clobbers (c_parser *);
1227 static struct c_expr c_parser_expr_no_commas (c_parser *, struct c_expr *,
1228 tree = NULL_TREE);
1229 static struct c_expr c_parser_conditional_expression (c_parser *,
1230 struct c_expr *, tree);
1231 static struct c_expr c_parser_binary_expression (c_parser *, struct c_expr *,
1232 tree);
1233 static struct c_expr c_parser_cast_expression (c_parser *, struct c_expr *);
1234 static struct c_expr c_parser_unary_expression (c_parser *);
1235 static struct c_expr c_parser_sizeof_expression (c_parser *);
1236 static struct c_expr c_parser_alignof_expression (c_parser *);
1237 static struct c_expr c_parser_postfix_expression (c_parser *);
1238 static struct c_expr c_parser_postfix_expression_after_paren_type (c_parser *,
1239 struct c_type_name *,
1240 location_t);
1241 static struct c_expr c_parser_postfix_expression_after_primary (c_parser *,
1242 location_t loc,
1243 struct c_expr);
1244 static tree c_parser_transaction (c_parser *, enum rid);
1245 static struct c_expr c_parser_transaction_expression (c_parser *, enum rid);
1246 static tree c_parser_transaction_cancel (c_parser *);
1247 static struct c_expr c_parser_expression (c_parser *);
1248 static struct c_expr c_parser_expression_conv (c_parser *);
1249 static vec<tree, va_gc> *c_parser_expr_list (c_parser *, bool, bool,
1250 vec<tree, va_gc> **, location_t *,
1251 tree *, vec<location_t> *,
1252 unsigned int * = NULL);
1253 static void c_parser_oacc_enter_exit_data (c_parser *, bool);
1254 static void c_parser_oacc_update (c_parser *);
1255 static tree c_parser_oacc_loop (location_t, c_parser *, char *);
1256 static void c_parser_omp_construct (c_parser *);
1257 static void c_parser_omp_threadprivate (c_parser *);
1258 static void c_parser_omp_barrier (c_parser *);
1259 static void c_parser_omp_flush (c_parser *);
1260 static tree c_parser_omp_for_loop (location_t, c_parser *, enum tree_code,
1261 tree, tree *);
1262 static void c_parser_omp_taskwait (c_parser *);
1263 static void c_parser_omp_taskyield (c_parser *);
1264 static void c_parser_omp_cancel (c_parser *);
1265 static void c_parser_omp_cancellation_point (c_parser *);
1267 enum pragma_context { pragma_external, pragma_struct, pragma_param,
1268 pragma_stmt, pragma_compound };
1269 static bool c_parser_pragma (c_parser *, enum pragma_context);
1270 static bool c_parser_omp_target (c_parser *, enum pragma_context);
1271 static void c_parser_omp_end_declare_target (c_parser *);
1272 static void c_parser_omp_declare (c_parser *, enum pragma_context);
1274 /* These Objective-C parser functions are only ever called when
1275 compiling Objective-C. */
1276 static void c_parser_objc_class_definition (c_parser *, tree);
1277 static void c_parser_objc_class_instance_variables (c_parser *);
1278 static void c_parser_objc_class_declaration (c_parser *);
1279 static void c_parser_objc_alias_declaration (c_parser *);
1280 static void c_parser_objc_protocol_definition (c_parser *, tree);
1281 static bool c_parser_objc_method_type (c_parser *);
1282 static void c_parser_objc_method_definition (c_parser *);
1283 static void c_parser_objc_methodprotolist (c_parser *);
1284 static void c_parser_objc_methodproto (c_parser *);
1285 static tree c_parser_objc_method_decl (c_parser *, bool, tree *, tree *);
1286 static tree c_parser_objc_type_name (c_parser *);
1287 static tree c_parser_objc_protocol_refs (c_parser *);
1288 static void c_parser_objc_try_catch_finally_statement (c_parser *);
1289 static void c_parser_objc_synchronized_statement (c_parser *);
1290 static tree c_parser_objc_selector (c_parser *);
1291 static tree c_parser_objc_selector_arg (c_parser *);
1292 static tree c_parser_objc_receiver (c_parser *);
1293 static tree c_parser_objc_message_args (c_parser *);
1294 static tree c_parser_objc_keywordexpr (c_parser *);
1295 static void c_parser_objc_at_property_declaration (c_parser *);
1296 static void c_parser_objc_at_synthesize_declaration (c_parser *);
1297 static void c_parser_objc_at_dynamic_declaration (c_parser *);
1298 static bool c_parser_objc_diagnose_bad_element_prefix
1299 (c_parser *, struct c_declspecs *);
1301 /* Cilk Plus supporting routines. */
1302 static void c_parser_cilk_simd (c_parser *);
1303 static void c_parser_cilk_for (c_parser *, tree);
1304 static bool c_parser_cilk_verify_simd (c_parser *, enum pragma_context);
1305 static tree c_parser_array_notation (location_t, c_parser *, tree, tree);
1306 static tree c_parser_cilk_clause_vectorlength (c_parser *, tree, bool);
1307 static void c_parser_cilk_grainsize (c_parser *);
1309 /* Parse a translation unit (C90 6.7, C99 6.9).
1311 translation-unit:
1312 external-declarations
1314 external-declarations:
1315 external-declaration
1316 external-declarations external-declaration
1318 GNU extensions:
1320 translation-unit:
1321 empty
1324 static void
1325 c_parser_translation_unit (c_parser *parser)
1327 if (c_parser_next_token_is (parser, CPP_EOF))
1329 pedwarn (c_parser_peek_token (parser)->location, OPT_Wpedantic,
1330 "ISO C forbids an empty translation unit");
1332 else
1334 void *obstack_position = obstack_alloc (&parser_obstack, 0);
1335 mark_valid_location_for_stdc_pragma (false);
1338 ggc_collect ();
1339 c_parser_external_declaration (parser);
1340 obstack_free (&parser_obstack, obstack_position);
1342 while (c_parser_next_token_is_not (parser, CPP_EOF));
1346 /* Parse an external declaration (C90 6.7, C99 6.9).
1348 external-declaration:
1349 function-definition
1350 declaration
1352 GNU extensions:
1354 external-declaration:
1355 asm-definition
1357 __extension__ external-declaration
1359 Objective-C:
1361 external-declaration:
1362 objc-class-definition
1363 objc-class-declaration
1364 objc-alias-declaration
1365 objc-protocol-definition
1366 objc-method-definition
1367 @end
1370 static void
1371 c_parser_external_declaration (c_parser *parser)
1373 int ext;
1374 switch (c_parser_peek_token (parser)->type)
1376 case CPP_KEYWORD:
1377 switch (c_parser_peek_token (parser)->keyword)
1379 case RID_EXTENSION:
1380 ext = disable_extension_diagnostics ();
1381 c_parser_consume_token (parser);
1382 c_parser_external_declaration (parser);
1383 restore_extension_diagnostics (ext);
1384 break;
1385 case RID_ASM:
1386 c_parser_asm_definition (parser);
1387 break;
1388 case RID_AT_INTERFACE:
1389 case RID_AT_IMPLEMENTATION:
1390 gcc_assert (c_dialect_objc ());
1391 c_parser_objc_class_definition (parser, NULL_TREE);
1392 break;
1393 case RID_AT_CLASS:
1394 gcc_assert (c_dialect_objc ());
1395 c_parser_objc_class_declaration (parser);
1396 break;
1397 case RID_AT_ALIAS:
1398 gcc_assert (c_dialect_objc ());
1399 c_parser_objc_alias_declaration (parser);
1400 break;
1401 case RID_AT_PROTOCOL:
1402 gcc_assert (c_dialect_objc ());
1403 c_parser_objc_protocol_definition (parser, NULL_TREE);
1404 break;
1405 case RID_AT_PROPERTY:
1406 gcc_assert (c_dialect_objc ());
1407 c_parser_objc_at_property_declaration (parser);
1408 break;
1409 case RID_AT_SYNTHESIZE:
1410 gcc_assert (c_dialect_objc ());
1411 c_parser_objc_at_synthesize_declaration (parser);
1412 break;
1413 case RID_AT_DYNAMIC:
1414 gcc_assert (c_dialect_objc ());
1415 c_parser_objc_at_dynamic_declaration (parser);
1416 break;
1417 case RID_AT_END:
1418 gcc_assert (c_dialect_objc ());
1419 c_parser_consume_token (parser);
1420 objc_finish_implementation ();
1421 break;
1422 default:
1423 goto decl_or_fndef;
1425 break;
1426 case CPP_SEMICOLON:
1427 pedwarn (c_parser_peek_token (parser)->location, OPT_Wpedantic,
1428 "ISO C does not allow extra %<;%> outside of a function");
1429 c_parser_consume_token (parser);
1430 break;
1431 case CPP_PRAGMA:
1432 mark_valid_location_for_stdc_pragma (true);
1433 c_parser_pragma (parser, pragma_external);
1434 mark_valid_location_for_stdc_pragma (false);
1435 break;
1436 case CPP_PLUS:
1437 case CPP_MINUS:
1438 if (c_dialect_objc ())
1440 c_parser_objc_method_definition (parser);
1441 break;
1443 /* Else fall through, and yield a syntax error trying to parse
1444 as a declaration or function definition. */
1445 default:
1446 decl_or_fndef:
1447 /* A declaration or a function definition (or, in Objective-C,
1448 an @interface or @protocol with prefix attributes). We can
1449 only tell which after parsing the declaration specifiers, if
1450 any, and the first declarator. */
1451 c_parser_declaration_or_fndef (parser, true, true, true, false, true,
1452 NULL, vNULL);
1453 break;
1457 static void c_finish_omp_declare_simd (c_parser *, tree, tree, vec<c_token>);
1459 /* Parse a declaration or function definition (C90 6.5, 6.7.1, C99
1460 6.7, 6.9.1). If FNDEF_OK is true, a function definition is
1461 accepted; otherwise (old-style parameter declarations) only other
1462 declarations are accepted. If STATIC_ASSERT_OK is true, a static
1463 assertion is accepted; otherwise (old-style parameter declarations)
1464 it is not. If NESTED is true, we are inside a function or parsing
1465 old-style parameter declarations; any functions encountered are
1466 nested functions and declaration specifiers are required; otherwise
1467 we are at top level and functions are normal functions and
1468 declaration specifiers may be optional. If EMPTY_OK is true, empty
1469 declarations are OK (subject to all other constraints); otherwise
1470 (old-style parameter declarations) they are diagnosed. If
1471 START_ATTR_OK is true, the declaration specifiers may start with
1472 attributes; otherwise they may not.
1473 OBJC_FOREACH_OBJECT_DECLARATION can be used to get back the parsed
1474 declaration when parsing an Objective-C foreach statement.
1476 declaration:
1477 declaration-specifiers init-declarator-list[opt] ;
1478 static_assert-declaration
1480 function-definition:
1481 declaration-specifiers[opt] declarator declaration-list[opt]
1482 compound-statement
1484 declaration-list:
1485 declaration
1486 declaration-list declaration
1488 init-declarator-list:
1489 init-declarator
1490 init-declarator-list , init-declarator
1492 init-declarator:
1493 declarator simple-asm-expr[opt] attributes[opt]
1494 declarator simple-asm-expr[opt] attributes[opt] = initializer
1496 GNU extensions:
1498 nested-function-definition:
1499 declaration-specifiers declarator declaration-list[opt]
1500 compound-statement
1502 Objective-C:
1503 attributes objc-class-definition
1504 attributes objc-category-definition
1505 attributes objc-protocol-definition
1507 The simple-asm-expr and attributes are GNU extensions.
1509 This function does not handle __extension__; that is handled in its
1510 callers. ??? Following the old parser, __extension__ may start
1511 external declarations, declarations in functions and declarations
1512 at the start of "for" loops, but not old-style parameter
1513 declarations.
1515 C99 requires declaration specifiers in a function definition; the
1516 absence is diagnosed through the diagnosis of implicit int. In GNU
1517 C we also allow but diagnose declarations without declaration
1518 specifiers, but only at top level (elsewhere they conflict with
1519 other syntax).
1521 In Objective-C, declarations of the looping variable in a foreach
1522 statement are exceptionally terminated by 'in' (for example, 'for
1523 (NSObject *object in array) { ... }').
1525 OpenMP:
1527 declaration:
1528 threadprivate-directive */
1530 static void
1531 c_parser_declaration_or_fndef (c_parser *parser, bool fndef_ok,
1532 bool static_assert_ok, bool empty_ok,
1533 bool nested, bool start_attr_ok,
1534 tree *objc_foreach_object_declaration,
1535 vec<c_token> omp_declare_simd_clauses)
1537 struct c_declspecs *specs;
1538 tree prefix_attrs;
1539 tree all_prefix_attrs;
1540 bool diagnosed_no_specs = false;
1541 location_t here = c_parser_peek_token (parser)->location;
1543 if (static_assert_ok
1544 && c_parser_next_token_is_keyword (parser, RID_STATIC_ASSERT))
1546 c_parser_static_assert_declaration (parser);
1547 return;
1549 specs = build_null_declspecs ();
1551 /* Try to detect an unknown type name when we have "A B" or "A *B". */
1552 if (c_parser_peek_token (parser)->type == CPP_NAME
1553 && c_parser_peek_token (parser)->id_kind == C_ID_ID
1554 && (c_parser_peek_2nd_token (parser)->type == CPP_NAME
1555 || c_parser_peek_2nd_token (parser)->type == CPP_MULT)
1556 && (!nested || !lookup_name (c_parser_peek_token (parser)->value)))
1558 error_at (here, "unknown type name %qE",
1559 c_parser_peek_token (parser)->value);
1561 /* Parse declspecs normally to get a correct pointer type, but avoid
1562 a further "fails to be a type name" error. Refuse nested functions
1563 since it is not how the user likely wants us to recover. */
1564 c_parser_peek_token (parser)->type = CPP_KEYWORD;
1565 c_parser_peek_token (parser)->keyword = RID_VOID;
1566 c_parser_peek_token (parser)->value = error_mark_node;
1567 fndef_ok = !nested;
1570 c_parser_declspecs (parser, specs, true, true, start_attr_ok,
1571 true, true, cla_nonabstract_decl);
1572 if (parser->error)
1574 c_parser_skip_to_end_of_block_or_statement (parser);
1575 return;
1577 if (nested && !specs->declspecs_seen_p)
1579 c_parser_error (parser, "expected declaration specifiers");
1580 c_parser_skip_to_end_of_block_or_statement (parser);
1581 return;
1583 finish_declspecs (specs);
1584 bool auto_type_p = specs->typespec_word == cts_auto_type;
1585 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
1587 if (auto_type_p)
1588 error_at (here, "%<__auto_type%> in empty declaration");
1589 else if (empty_ok)
1590 shadow_tag (specs);
1591 else
1593 shadow_tag_warned (specs, 1);
1594 pedwarn (here, 0, "empty declaration");
1596 c_parser_consume_token (parser);
1597 return;
1600 /* Provide better error recovery. Note that a type name here is usually
1601 better diagnosed as a redeclaration. */
1602 if (empty_ok
1603 && specs->typespec_kind == ctsk_tagdef
1604 && c_parser_next_token_starts_declspecs (parser)
1605 && !c_parser_next_token_is (parser, CPP_NAME))
1607 c_parser_error (parser, "expected %<;%>, identifier or %<(%>");
1608 parser->error = false;
1609 shadow_tag_warned (specs, 1);
1610 return;
1612 else if (c_dialect_objc () && !auto_type_p)
1614 /* Prefix attributes are an error on method decls. */
1615 switch (c_parser_peek_token (parser)->type)
1617 case CPP_PLUS:
1618 case CPP_MINUS:
1619 if (c_parser_objc_diagnose_bad_element_prefix (parser, specs))
1620 return;
1621 if (specs->attrs)
1623 warning_at (c_parser_peek_token (parser)->location,
1624 OPT_Wattributes,
1625 "prefix attributes are ignored for methods");
1626 specs->attrs = NULL_TREE;
1628 if (fndef_ok)
1629 c_parser_objc_method_definition (parser);
1630 else
1631 c_parser_objc_methodproto (parser);
1632 return;
1633 break;
1634 default:
1635 break;
1637 /* This is where we parse 'attributes @interface ...',
1638 'attributes @implementation ...', 'attributes @protocol ...'
1639 (where attributes could be, for example, __attribute__
1640 ((deprecated)).
1642 switch (c_parser_peek_token (parser)->keyword)
1644 case RID_AT_INTERFACE:
1646 if (c_parser_objc_diagnose_bad_element_prefix (parser, specs))
1647 return;
1648 c_parser_objc_class_definition (parser, specs->attrs);
1649 return;
1651 break;
1652 case RID_AT_IMPLEMENTATION:
1654 if (c_parser_objc_diagnose_bad_element_prefix (parser, specs))
1655 return;
1656 if (specs->attrs)
1658 warning_at (c_parser_peek_token (parser)->location,
1659 OPT_Wattributes,
1660 "prefix attributes are ignored for implementations");
1661 specs->attrs = NULL_TREE;
1663 c_parser_objc_class_definition (parser, NULL_TREE);
1664 return;
1666 break;
1667 case RID_AT_PROTOCOL:
1669 if (c_parser_objc_diagnose_bad_element_prefix (parser, specs))
1670 return;
1671 c_parser_objc_protocol_definition (parser, specs->attrs);
1672 return;
1674 break;
1675 case RID_AT_ALIAS:
1676 case RID_AT_CLASS:
1677 case RID_AT_END:
1678 case RID_AT_PROPERTY:
1679 if (specs->attrs)
1681 c_parser_error (parser, "unexpected attribute");
1682 specs->attrs = NULL;
1684 break;
1685 default:
1686 break;
1690 pending_xref_error ();
1691 prefix_attrs = specs->attrs;
1692 all_prefix_attrs = prefix_attrs;
1693 specs->attrs = NULL_TREE;
1694 while (true)
1696 struct c_declarator *declarator;
1697 bool dummy = false;
1698 timevar_id_t tv;
1699 tree fnbody;
1700 /* Declaring either one or more declarators (in which case we
1701 should diagnose if there were no declaration specifiers) or a
1702 function definition (in which case the diagnostic for
1703 implicit int suffices). */
1704 declarator = c_parser_declarator (parser,
1705 specs->typespec_kind != ctsk_none,
1706 C_DTR_NORMAL, &dummy);
1707 if (declarator == NULL)
1709 if (omp_declare_simd_clauses.exists ()
1710 || !vec_safe_is_empty (parser->cilk_simd_fn_tokens))
1711 c_finish_omp_declare_simd (parser, NULL_TREE, NULL_TREE,
1712 omp_declare_simd_clauses);
1713 c_parser_skip_to_end_of_block_or_statement (parser);
1714 return;
1716 if (auto_type_p && declarator->kind != cdk_id)
1718 error_at (here,
1719 "%<__auto_type%> requires a plain identifier"
1720 " as declarator");
1721 c_parser_skip_to_end_of_block_or_statement (parser);
1722 return;
1724 if (c_parser_next_token_is (parser, CPP_EQ)
1725 || c_parser_next_token_is (parser, CPP_COMMA)
1726 || c_parser_next_token_is (parser, CPP_SEMICOLON)
1727 || c_parser_next_token_is_keyword (parser, RID_ASM)
1728 || c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE)
1729 || c_parser_next_token_is_keyword (parser, RID_IN))
1731 tree asm_name = NULL_TREE;
1732 tree postfix_attrs = NULL_TREE;
1733 if (!diagnosed_no_specs && !specs->declspecs_seen_p)
1735 diagnosed_no_specs = true;
1736 pedwarn (here, 0, "data definition has no type or storage class");
1738 /* Having seen a data definition, there cannot now be a
1739 function definition. */
1740 fndef_ok = false;
1741 if (c_parser_next_token_is_keyword (parser, RID_ASM))
1742 asm_name = c_parser_simple_asm_expr (parser);
1743 if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
1745 postfix_attrs = c_parser_attributes (parser);
1746 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
1748 /* This means there is an attribute specifier after
1749 the declarator in a function definition. Provide
1750 some more information for the user. */
1751 error_at (here, "attributes should be specified before the "
1752 "declarator in a function definition");
1753 c_parser_skip_to_end_of_block_or_statement (parser);
1754 return;
1757 if (c_parser_next_token_is (parser, CPP_EQ))
1759 tree d;
1760 struct c_expr init;
1761 location_t init_loc;
1762 c_parser_consume_token (parser);
1763 if (auto_type_p)
1765 start_init (NULL_TREE, asm_name, global_bindings_p ());
1766 init_loc = c_parser_peek_token (parser)->location;
1767 init = c_parser_expr_no_commas (parser, NULL);
1768 if (TREE_CODE (init.value) == COMPONENT_REF
1769 && DECL_C_BIT_FIELD (TREE_OPERAND (init.value, 1)))
1770 error_at (here,
1771 "%<__auto_type%> used with a bit-field"
1772 " initializer");
1773 init = convert_lvalue_to_rvalue (init_loc, init, true, true);
1774 tree init_type = TREE_TYPE (init.value);
1775 /* As with typeof, remove all qualifiers from atomic types. */
1776 if (init_type != error_mark_node && TYPE_ATOMIC (init_type))
1777 init_type
1778 = c_build_qualified_type (init_type, TYPE_UNQUALIFIED);
1779 bool vm_type = variably_modified_type_p (init_type,
1780 NULL_TREE);
1781 if (vm_type)
1782 init.value = c_save_expr (init.value);
1783 finish_init ();
1784 specs->typespec_kind = ctsk_typeof;
1785 specs->locations[cdw_typedef] = init_loc;
1786 specs->typedef_p = true;
1787 specs->type = init_type;
1788 if (vm_type)
1790 bool maybe_const = true;
1791 tree type_expr = c_fully_fold (init.value, false,
1792 &maybe_const);
1793 specs->expr_const_operands &= maybe_const;
1794 if (specs->expr)
1795 specs->expr = build2 (COMPOUND_EXPR,
1796 TREE_TYPE (type_expr),
1797 specs->expr, type_expr);
1798 else
1799 specs->expr = type_expr;
1801 d = start_decl (declarator, specs, true,
1802 chainon (postfix_attrs, all_prefix_attrs));
1803 if (!d)
1804 d = error_mark_node;
1805 if (omp_declare_simd_clauses.exists ()
1806 || !vec_safe_is_empty (parser->cilk_simd_fn_tokens))
1807 c_finish_omp_declare_simd (parser, d, NULL_TREE,
1808 omp_declare_simd_clauses);
1810 else
1812 /* The declaration of the variable is in effect while
1813 its initializer is parsed. */
1814 d = start_decl (declarator, specs, true,
1815 chainon (postfix_attrs, all_prefix_attrs));
1816 if (!d)
1817 d = error_mark_node;
1818 if (omp_declare_simd_clauses.exists ()
1819 || !vec_safe_is_empty (parser->cilk_simd_fn_tokens))
1820 c_finish_omp_declare_simd (parser, d, NULL_TREE,
1821 omp_declare_simd_clauses);
1822 start_init (d, asm_name, global_bindings_p ());
1823 init_loc = c_parser_peek_token (parser)->location;
1824 init = c_parser_initializer (parser);
1825 finish_init ();
1827 if (d != error_mark_node)
1829 maybe_warn_string_init (init_loc, TREE_TYPE (d), init);
1830 finish_decl (d, init_loc, init.value,
1831 init.original_type, asm_name);
1834 else
1836 if (auto_type_p)
1838 error_at (here,
1839 "%<__auto_type%> requires an initialized "
1840 "data declaration");
1841 c_parser_skip_to_end_of_block_or_statement (parser);
1842 return;
1844 tree d = start_decl (declarator, specs, false,
1845 chainon (postfix_attrs,
1846 all_prefix_attrs));
1847 if (omp_declare_simd_clauses.exists ()
1848 || !vec_safe_is_empty (parser->cilk_simd_fn_tokens))
1850 tree parms = NULL_TREE;
1851 if (d && TREE_CODE (d) == FUNCTION_DECL)
1853 struct c_declarator *ce = declarator;
1854 while (ce != NULL)
1855 if (ce->kind == cdk_function)
1857 parms = ce->u.arg_info->parms;
1858 break;
1860 else
1861 ce = ce->declarator;
1863 if (parms)
1864 temp_store_parm_decls (d, parms);
1865 c_finish_omp_declare_simd (parser, d, parms,
1866 omp_declare_simd_clauses);
1867 if (parms)
1868 temp_pop_parm_decls ();
1870 if (d)
1871 finish_decl (d, UNKNOWN_LOCATION, NULL_TREE,
1872 NULL_TREE, asm_name);
1874 if (c_parser_next_token_is_keyword (parser, RID_IN))
1876 if (d)
1877 *objc_foreach_object_declaration = d;
1878 else
1879 *objc_foreach_object_declaration = error_mark_node;
1882 if (c_parser_next_token_is (parser, CPP_COMMA))
1884 if (auto_type_p)
1886 error_at (here,
1887 "%<__auto_type%> may only be used with"
1888 " a single declarator");
1889 c_parser_skip_to_end_of_block_or_statement (parser);
1890 return;
1892 c_parser_consume_token (parser);
1893 if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
1894 all_prefix_attrs = chainon (c_parser_attributes (parser),
1895 prefix_attrs);
1896 else
1897 all_prefix_attrs = prefix_attrs;
1898 continue;
1900 else if (c_parser_next_token_is (parser, CPP_SEMICOLON))
1902 c_parser_consume_token (parser);
1903 return;
1905 else if (c_parser_next_token_is_keyword (parser, RID_IN))
1907 /* This can only happen in Objective-C: we found the
1908 'in' that terminates the declaration inside an
1909 Objective-C foreach statement. Do not consume the
1910 token, so that the caller can use it to determine
1911 that this indeed is a foreach context. */
1912 return;
1914 else
1916 c_parser_error (parser, "expected %<,%> or %<;%>");
1917 c_parser_skip_to_end_of_block_or_statement (parser);
1918 return;
1921 else if (auto_type_p)
1923 error_at (here,
1924 "%<__auto_type%> requires an initialized data declaration");
1925 c_parser_skip_to_end_of_block_or_statement (parser);
1926 return;
1928 else if (!fndef_ok)
1930 c_parser_error (parser, "expected %<=%>, %<,%>, %<;%>, "
1931 "%<asm%> or %<__attribute__%>");
1932 c_parser_skip_to_end_of_block_or_statement (parser);
1933 return;
1935 /* Function definition (nested or otherwise). */
1936 if (nested)
1938 pedwarn (here, OPT_Wpedantic, "ISO C forbids nested functions");
1939 c_push_function_context ();
1941 if (!start_function (specs, declarator, all_prefix_attrs))
1943 /* This can appear in many cases looking nothing like a
1944 function definition, so we don't give a more specific
1945 error suggesting there was one. */
1946 c_parser_error (parser, "expected %<=%>, %<,%>, %<;%>, %<asm%> "
1947 "or %<__attribute__%>");
1948 if (nested)
1949 c_pop_function_context ();
1950 break;
1953 if (DECL_DECLARED_INLINE_P (current_function_decl))
1954 tv = TV_PARSE_INLINE;
1955 else
1956 tv = TV_PARSE_FUNC;
1957 timevar_push (tv);
1959 /* Parse old-style parameter declarations. ??? Attributes are
1960 not allowed to start declaration specifiers here because of a
1961 syntax conflict between a function declaration with attribute
1962 suffix and a function definition with an attribute prefix on
1963 first old-style parameter declaration. Following the old
1964 parser, they are not accepted on subsequent old-style
1965 parameter declarations either. However, there is no
1966 ambiguity after the first declaration, nor indeed on the
1967 first as long as we don't allow postfix attributes after a
1968 declarator with a nonempty identifier list in a definition;
1969 and postfix attributes have never been accepted here in
1970 function definitions either. */
1971 while (c_parser_next_token_is_not (parser, CPP_EOF)
1972 && c_parser_next_token_is_not (parser, CPP_OPEN_BRACE))
1973 c_parser_declaration_or_fndef (parser, false, false, false,
1974 true, false, NULL, vNULL);
1975 store_parm_decls ();
1976 if (omp_declare_simd_clauses.exists ()
1977 || !vec_safe_is_empty (parser->cilk_simd_fn_tokens))
1978 c_finish_omp_declare_simd (parser, current_function_decl, NULL_TREE,
1979 omp_declare_simd_clauses);
1980 DECL_STRUCT_FUNCTION (current_function_decl)->function_start_locus
1981 = c_parser_peek_token (parser)->location;
1982 fnbody = c_parser_compound_statement (parser);
1983 if (flag_cilkplus && contains_array_notation_expr (fnbody))
1984 fnbody = expand_array_notation_exprs (fnbody);
1985 if (nested)
1987 tree decl = current_function_decl;
1988 /* Mark nested functions as needing static-chain initially.
1989 lower_nested_functions will recompute it but the
1990 DECL_STATIC_CHAIN flag is also used before that happens,
1991 by initializer_constant_valid_p. See gcc.dg/nested-fn-2.c. */
1992 DECL_STATIC_CHAIN (decl) = 1;
1993 add_stmt (fnbody);
1994 finish_function ();
1995 c_pop_function_context ();
1996 add_stmt (build_stmt (DECL_SOURCE_LOCATION (decl), DECL_EXPR, decl));
1998 else
2000 add_stmt (fnbody);
2001 finish_function ();
2004 timevar_pop (tv);
2005 break;
2009 /* Parse an asm-definition (asm() outside a function body). This is a
2010 GNU extension.
2012 asm-definition:
2013 simple-asm-expr ;
2016 static void
2017 c_parser_asm_definition (c_parser *parser)
2019 tree asm_str = c_parser_simple_asm_expr (parser);
2020 if (asm_str)
2021 symtab->finalize_toplevel_asm (asm_str);
2022 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
2025 /* Parse a static assertion (C11 6.7.10).
2027 static_assert-declaration:
2028 static_assert-declaration-no-semi ;
2031 static void
2032 c_parser_static_assert_declaration (c_parser *parser)
2034 c_parser_static_assert_declaration_no_semi (parser);
2035 if (parser->error
2036 || !c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>"))
2037 c_parser_skip_to_end_of_block_or_statement (parser);
2040 /* Parse a static assertion (C11 6.7.10), without the trailing
2041 semicolon.
2043 static_assert-declaration-no-semi:
2044 _Static_assert ( constant-expression , string-literal )
2047 static void
2048 c_parser_static_assert_declaration_no_semi (c_parser *parser)
2050 location_t assert_loc, value_loc;
2051 tree value;
2052 tree string;
2054 gcc_assert (c_parser_next_token_is_keyword (parser, RID_STATIC_ASSERT));
2055 assert_loc = c_parser_peek_token (parser)->location;
2056 if (flag_isoc99)
2057 pedwarn_c99 (assert_loc, OPT_Wpedantic,
2058 "ISO C99 does not support %<_Static_assert%>");
2059 else
2060 pedwarn_c99 (assert_loc, OPT_Wpedantic,
2061 "ISO C90 does not support %<_Static_assert%>");
2062 c_parser_consume_token (parser);
2063 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
2064 return;
2065 value_loc = c_parser_peek_token (parser)->location;
2066 value = c_parser_expr_no_commas (parser, NULL).value;
2067 parser->lex_untranslated_string = true;
2068 if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
2070 parser->lex_untranslated_string = false;
2071 return;
2073 switch (c_parser_peek_token (parser)->type)
2075 case CPP_STRING:
2076 case CPP_STRING16:
2077 case CPP_STRING32:
2078 case CPP_WSTRING:
2079 case CPP_UTF8STRING:
2080 string = c_parser_peek_token (parser)->value;
2081 c_parser_consume_token (parser);
2082 parser->lex_untranslated_string = false;
2083 break;
2084 default:
2085 c_parser_error (parser, "expected string literal");
2086 parser->lex_untranslated_string = false;
2087 return;
2089 c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>");
2091 if (!INTEGRAL_TYPE_P (TREE_TYPE (value)))
2093 error_at (value_loc, "expression in static assertion is not an integer");
2094 return;
2096 if (TREE_CODE (value) != INTEGER_CST)
2098 value = c_fully_fold (value, false, NULL);
2099 /* Strip no-op conversions. */
2100 STRIP_TYPE_NOPS (value);
2101 if (TREE_CODE (value) == INTEGER_CST)
2102 pedwarn (value_loc, OPT_Wpedantic, "expression in static assertion "
2103 "is not an integer constant expression");
2105 if (TREE_CODE (value) != INTEGER_CST)
2107 error_at (value_loc, "expression in static assertion is not constant");
2108 return;
2110 constant_expression_warning (value);
2111 if (integer_zerop (value))
2112 error_at (assert_loc, "static assertion failed: %E", string);
2115 /* Parse some declaration specifiers (possibly none) (C90 6.5, C99
2116 6.7), adding them to SPECS (which may already include some).
2117 Storage class specifiers are accepted iff SCSPEC_OK; type
2118 specifiers are accepted iff TYPESPEC_OK; alignment specifiers are
2119 accepted iff ALIGNSPEC_OK; attributes are accepted at the start
2120 iff START_ATTR_OK; __auto_type is accepted iff AUTO_TYPE_OK.
2122 declaration-specifiers:
2123 storage-class-specifier declaration-specifiers[opt]
2124 type-specifier declaration-specifiers[opt]
2125 type-qualifier declaration-specifiers[opt]
2126 function-specifier declaration-specifiers[opt]
2127 alignment-specifier declaration-specifiers[opt]
2129 Function specifiers (inline) are from C99, and are currently
2130 handled as storage class specifiers, as is __thread. Alignment
2131 specifiers are from C11.
2133 C90 6.5.1, C99 6.7.1:
2134 storage-class-specifier:
2135 typedef
2136 extern
2137 static
2138 auto
2139 register
2140 _Thread_local
2142 (_Thread_local is new in C11.)
2144 C99 6.7.4:
2145 function-specifier:
2146 inline
2147 _Noreturn
2149 (_Noreturn is new in C11.)
2151 C90 6.5.2, C99 6.7.2:
2152 type-specifier:
2153 void
2154 char
2155 short
2157 long
2158 float
2159 double
2160 signed
2161 unsigned
2162 _Bool
2163 _Complex
2164 [_Imaginary removed in C99 TC2]
2165 struct-or-union-specifier
2166 enum-specifier
2167 typedef-name
2168 atomic-type-specifier
2170 (_Bool and _Complex are new in C99.)
2171 (atomic-type-specifier is new in C11.)
2173 C90 6.5.3, C99 6.7.3:
2175 type-qualifier:
2176 const
2177 restrict
2178 volatile
2179 address-space-qualifier
2180 _Atomic
2182 (restrict is new in C99.)
2183 (_Atomic is new in C11.)
2185 GNU extensions:
2187 declaration-specifiers:
2188 attributes declaration-specifiers[opt]
2190 type-qualifier:
2191 address-space
2193 address-space:
2194 identifier recognized by the target
2196 storage-class-specifier:
2197 __thread
2199 type-specifier:
2200 typeof-specifier
2201 __auto_type
2202 __intN
2203 _Decimal32
2204 _Decimal64
2205 _Decimal128
2206 _Fract
2207 _Accum
2208 _Sat
2210 (_Fract, _Accum, and _Sat are new from ISO/IEC DTR 18037:
2211 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1169.pdf)
2213 atomic-type-specifier
2214 _Atomic ( type-name )
2216 Objective-C:
2218 type-specifier:
2219 class-name objc-protocol-refs[opt]
2220 typedef-name objc-protocol-refs
2221 objc-protocol-refs
2224 static void
2225 c_parser_declspecs (c_parser *parser, struct c_declspecs *specs,
2226 bool scspec_ok, bool typespec_ok, bool start_attr_ok,
2227 bool alignspec_ok, bool auto_type_ok,
2228 enum c_lookahead_kind la)
2230 bool attrs_ok = start_attr_ok;
2231 bool seen_type = specs->typespec_kind != ctsk_none;
2233 if (!typespec_ok)
2234 gcc_assert (la == cla_prefer_id);
2236 while (c_parser_next_token_is (parser, CPP_NAME)
2237 || c_parser_next_token_is (parser, CPP_KEYWORD)
2238 || (c_dialect_objc () && c_parser_next_token_is (parser, CPP_LESS)))
2240 struct c_typespec t;
2241 tree attrs;
2242 tree align;
2243 location_t loc = c_parser_peek_token (parser)->location;
2245 /* If we cannot accept a type, exit if the next token must start
2246 one. Also, if we already have seen a tagged definition,
2247 a typename would be an error anyway and likely the user
2248 has simply forgotten a semicolon, so we exit. */
2249 if ((!typespec_ok || specs->typespec_kind == ctsk_tagdef)
2250 && c_parser_next_tokens_start_typename (parser, la)
2251 && !c_parser_next_token_is_qualifier (parser))
2252 break;
2254 if (c_parser_next_token_is (parser, CPP_NAME))
2256 c_token *name_token = c_parser_peek_token (parser);
2257 tree value = name_token->value;
2258 c_id_kind kind = name_token->id_kind;
2260 if (kind == C_ID_ADDRSPACE)
2262 addr_space_t as
2263 = name_token->keyword - RID_FIRST_ADDR_SPACE;
2264 declspecs_add_addrspace (name_token->location, specs, as);
2265 c_parser_consume_token (parser);
2266 attrs_ok = true;
2267 continue;
2270 gcc_assert (!c_parser_next_token_is_qualifier (parser));
2272 /* If we cannot accept a type, and the next token must start one,
2273 exit. Do the same if we already have seen a tagged definition,
2274 since it would be an error anyway and likely the user has simply
2275 forgotten a semicolon. */
2276 if (seen_type || !c_parser_next_tokens_start_typename (parser, la))
2277 break;
2279 /* Now at an unknown typename (C_ID_ID), a C_ID_TYPENAME or
2280 a C_ID_CLASSNAME. */
2281 c_parser_consume_token (parser);
2282 seen_type = true;
2283 attrs_ok = true;
2284 if (kind == C_ID_ID)
2286 error_at (loc, "unknown type name %qE", value);
2287 t.kind = ctsk_typedef;
2288 t.spec = error_mark_node;
2290 else if (kind == C_ID_TYPENAME
2291 && (!c_dialect_objc ()
2292 || c_parser_next_token_is_not (parser, CPP_LESS)))
2294 t.kind = ctsk_typedef;
2295 /* For a typedef name, record the meaning, not the name.
2296 In case of 'foo foo, bar;'. */
2297 t.spec = lookup_name (value);
2299 else
2301 tree proto = NULL_TREE;
2302 gcc_assert (c_dialect_objc ());
2303 t.kind = ctsk_objc;
2304 if (c_parser_next_token_is (parser, CPP_LESS))
2305 proto = c_parser_objc_protocol_refs (parser);
2306 t.spec = objc_get_protocol_qualified_type (value, proto);
2308 t.expr = NULL_TREE;
2309 t.expr_const_operands = true;
2310 declspecs_add_type (name_token->location, specs, t);
2311 continue;
2313 if (c_parser_next_token_is (parser, CPP_LESS))
2315 /* Make "<SomeProtocol>" equivalent to "id <SomeProtocol>" -
2316 nisse@lysator.liu.se. */
2317 tree proto;
2318 gcc_assert (c_dialect_objc ());
2319 if (!typespec_ok || seen_type)
2320 break;
2321 proto = c_parser_objc_protocol_refs (parser);
2322 t.kind = ctsk_objc;
2323 t.spec = objc_get_protocol_qualified_type (NULL_TREE, proto);
2324 t.expr = NULL_TREE;
2325 t.expr_const_operands = true;
2326 declspecs_add_type (loc, specs, t);
2327 continue;
2329 gcc_assert (c_parser_next_token_is (parser, CPP_KEYWORD));
2330 switch (c_parser_peek_token (parser)->keyword)
2332 case RID_STATIC:
2333 case RID_EXTERN:
2334 case RID_REGISTER:
2335 case RID_TYPEDEF:
2336 case RID_INLINE:
2337 case RID_NORETURN:
2338 case RID_AUTO:
2339 case RID_THREAD:
2340 if (!scspec_ok)
2341 goto out;
2342 attrs_ok = true;
2343 /* TODO: Distinguish between function specifiers (inline, noreturn)
2344 and storage class specifiers, either here or in
2345 declspecs_add_scspec. */
2346 declspecs_add_scspec (loc, specs,
2347 c_parser_peek_token (parser)->value);
2348 c_parser_consume_token (parser);
2349 break;
2350 case RID_AUTO_TYPE:
2351 if (!auto_type_ok)
2352 goto out;
2353 /* Fall through. */
2354 case RID_UNSIGNED:
2355 case RID_LONG:
2356 case RID_SHORT:
2357 case RID_SIGNED:
2358 case RID_COMPLEX:
2359 case RID_INT:
2360 case RID_CHAR:
2361 case RID_FLOAT:
2362 case RID_DOUBLE:
2363 case RID_VOID:
2364 case RID_DFLOAT32:
2365 case RID_DFLOAT64:
2366 case RID_DFLOAT128:
2367 case RID_BOOL:
2368 case RID_FRACT:
2369 case RID_ACCUM:
2370 case RID_SAT:
2371 case RID_INT_N_0:
2372 case RID_INT_N_1:
2373 case RID_INT_N_2:
2374 case RID_INT_N_3:
2375 if (!typespec_ok)
2376 goto out;
2377 attrs_ok = true;
2378 seen_type = true;
2379 if (c_dialect_objc ())
2380 parser->objc_need_raw_identifier = true;
2381 t.kind = ctsk_resword;
2382 t.spec = c_parser_peek_token (parser)->value;
2383 t.expr = NULL_TREE;
2384 t.expr_const_operands = true;
2385 declspecs_add_type (loc, specs, t);
2386 c_parser_consume_token (parser);
2387 break;
2388 case RID_ENUM:
2389 if (!typespec_ok)
2390 goto out;
2391 attrs_ok = true;
2392 seen_type = true;
2393 t = c_parser_enum_specifier (parser);
2394 invoke_plugin_callbacks (PLUGIN_FINISH_TYPE, t.spec);
2395 declspecs_add_type (loc, specs, t);
2396 break;
2397 case RID_STRUCT:
2398 case RID_UNION:
2399 if (!typespec_ok)
2400 goto out;
2401 attrs_ok = true;
2402 seen_type = true;
2403 t = c_parser_struct_or_union_specifier (parser);
2404 invoke_plugin_callbacks (PLUGIN_FINISH_TYPE, t.spec);
2405 declspecs_add_type (loc, specs, t);
2406 break;
2407 case RID_TYPEOF:
2408 /* ??? The old parser rejected typeof after other type
2409 specifiers, but is a syntax error the best way of
2410 handling this? */
2411 if (!typespec_ok || seen_type)
2412 goto out;
2413 attrs_ok = true;
2414 seen_type = true;
2415 t = c_parser_typeof_specifier (parser);
2416 declspecs_add_type (loc, specs, t);
2417 break;
2418 case RID_ATOMIC:
2419 /* C parser handling of Objective-C constructs needs
2420 checking for correct lvalue-to-rvalue conversions, and
2421 the code in build_modify_expr handling various
2422 Objective-C cases, and that in build_unary_op handling
2423 Objective-C cases for increment / decrement, also needs
2424 updating; uses of TYPE_MAIN_VARIANT in objc_compare_types
2425 and objc_types_are_equivalent may also need updates. */
2426 if (c_dialect_objc ())
2427 sorry ("%<_Atomic%> in Objective-C");
2428 /* C parser handling of OpenMP constructs needs checking for
2429 correct lvalue-to-rvalue conversions. */
2430 if (flag_openmp)
2431 sorry ("%<_Atomic%> with OpenMP");
2432 if (flag_isoc99)
2433 pedwarn_c99 (loc, OPT_Wpedantic,
2434 "ISO C99 does not support the %<_Atomic%> qualifier");
2435 else
2436 pedwarn_c99 (loc, OPT_Wpedantic,
2437 "ISO C90 does not support the %<_Atomic%> qualifier");
2438 attrs_ok = true;
2439 tree value;
2440 value = c_parser_peek_token (parser)->value;
2441 c_parser_consume_token (parser);
2442 if (typespec_ok && c_parser_next_token_is (parser, CPP_OPEN_PAREN))
2444 /* _Atomic ( type-name ). */
2445 seen_type = true;
2446 c_parser_consume_token (parser);
2447 struct c_type_name *type = c_parser_type_name (parser);
2448 t.kind = ctsk_typeof;
2449 t.spec = error_mark_node;
2450 t.expr = NULL_TREE;
2451 t.expr_const_operands = true;
2452 if (type != NULL)
2453 t.spec = groktypename (type, &t.expr,
2454 &t.expr_const_operands);
2455 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2456 "expected %<)%>");
2457 if (t.spec != error_mark_node)
2459 if (TREE_CODE (t.spec) == ARRAY_TYPE)
2460 error_at (loc, "%<_Atomic%>-qualified array type");
2461 else if (TREE_CODE (t.spec) == FUNCTION_TYPE)
2462 error_at (loc, "%<_Atomic%>-qualified function type");
2463 else if (TYPE_QUALS (t.spec) != TYPE_UNQUALIFIED)
2464 error_at (loc, "%<_Atomic%> applied to a qualified type");
2465 else
2466 t.spec = c_build_qualified_type (t.spec, TYPE_QUAL_ATOMIC);
2468 declspecs_add_type (loc, specs, t);
2470 else
2471 declspecs_add_qual (loc, specs, value);
2472 break;
2473 case RID_CONST:
2474 case RID_VOLATILE:
2475 case RID_RESTRICT:
2476 attrs_ok = true;
2477 declspecs_add_qual (loc, specs, c_parser_peek_token (parser)->value);
2478 c_parser_consume_token (parser);
2479 break;
2480 case RID_ATTRIBUTE:
2481 if (!attrs_ok)
2482 goto out;
2483 attrs = c_parser_attributes (parser);
2484 declspecs_add_attrs (loc, specs, attrs);
2485 break;
2486 case RID_ALIGNAS:
2487 if (!alignspec_ok)
2488 goto out;
2489 align = c_parser_alignas_specifier (parser);
2490 declspecs_add_alignas (loc, specs, align);
2491 break;
2492 default:
2493 goto out;
2496 out: ;
2499 /* Parse an enum specifier (C90 6.5.2.2, C99 6.7.2.2).
2501 enum-specifier:
2502 enum attributes[opt] identifier[opt] { enumerator-list } attributes[opt]
2503 enum attributes[opt] identifier[opt] { enumerator-list , } attributes[opt]
2504 enum attributes[opt] identifier
2506 The form with trailing comma is new in C99. The forms with
2507 attributes are GNU extensions. In GNU C, we accept any expression
2508 without commas in the syntax (assignment expressions, not just
2509 conditional expressions); assignment expressions will be diagnosed
2510 as non-constant.
2512 enumerator-list:
2513 enumerator
2514 enumerator-list , enumerator
2516 enumerator:
2517 enumeration-constant
2518 enumeration-constant = constant-expression
2521 static struct c_typespec
2522 c_parser_enum_specifier (c_parser *parser)
2524 struct c_typespec ret;
2525 tree attrs;
2526 tree ident = NULL_TREE;
2527 location_t enum_loc;
2528 location_t ident_loc = UNKNOWN_LOCATION; /* Quiet warning. */
2529 gcc_assert (c_parser_next_token_is_keyword (parser, RID_ENUM));
2530 enum_loc = c_parser_peek_token (parser)->location;
2531 c_parser_consume_token (parser);
2532 attrs = c_parser_attributes (parser);
2533 enum_loc = c_parser_peek_token (parser)->location;
2534 /* Set the location in case we create a decl now. */
2535 c_parser_set_source_position_from_token (c_parser_peek_token (parser));
2536 if (c_parser_next_token_is (parser, CPP_NAME))
2538 ident = c_parser_peek_token (parser)->value;
2539 ident_loc = c_parser_peek_token (parser)->location;
2540 enum_loc = ident_loc;
2541 c_parser_consume_token (parser);
2543 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
2545 /* Parse an enum definition. */
2546 struct c_enum_contents the_enum;
2547 tree type;
2548 tree postfix_attrs;
2549 /* We chain the enumerators in reverse order, then put them in
2550 forward order at the end. */
2551 tree values;
2552 timevar_push (TV_PARSE_ENUM);
2553 type = start_enum (enum_loc, &the_enum, ident);
2554 values = NULL_TREE;
2555 c_parser_consume_token (parser);
2556 while (true)
2558 tree enum_id;
2559 tree enum_value;
2560 tree enum_decl;
2561 bool seen_comma;
2562 c_token *token;
2563 location_t comma_loc = UNKNOWN_LOCATION; /* Quiet warning. */
2564 location_t decl_loc, value_loc;
2565 if (c_parser_next_token_is_not (parser, CPP_NAME))
2567 c_parser_error (parser, "expected identifier");
2568 c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL);
2569 values = error_mark_node;
2570 break;
2572 token = c_parser_peek_token (parser);
2573 enum_id = token->value;
2574 /* Set the location in case we create a decl now. */
2575 c_parser_set_source_position_from_token (token);
2576 decl_loc = value_loc = token->location;
2577 c_parser_consume_token (parser);
2578 if (c_parser_next_token_is (parser, CPP_EQ))
2580 c_parser_consume_token (parser);
2581 value_loc = c_parser_peek_token (parser)->location;
2582 enum_value = c_parser_expr_no_commas (parser, NULL).value;
2584 else
2585 enum_value = NULL_TREE;
2586 enum_decl = build_enumerator (decl_loc, value_loc,
2587 &the_enum, enum_id, enum_value);
2588 TREE_CHAIN (enum_decl) = values;
2589 values = enum_decl;
2590 seen_comma = false;
2591 if (c_parser_next_token_is (parser, CPP_COMMA))
2593 comma_loc = c_parser_peek_token (parser)->location;
2594 seen_comma = true;
2595 c_parser_consume_token (parser);
2597 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
2599 if (seen_comma)
2600 pedwarn_c90 (comma_loc, OPT_Wpedantic,
2601 "comma at end of enumerator list");
2602 c_parser_consume_token (parser);
2603 break;
2605 if (!seen_comma)
2607 c_parser_error (parser, "expected %<,%> or %<}%>");
2608 c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL);
2609 values = error_mark_node;
2610 break;
2613 postfix_attrs = c_parser_attributes (parser);
2614 ret.spec = finish_enum (type, nreverse (values),
2615 chainon (attrs, postfix_attrs));
2616 ret.kind = ctsk_tagdef;
2617 ret.expr = NULL_TREE;
2618 ret.expr_const_operands = true;
2619 timevar_pop (TV_PARSE_ENUM);
2620 return ret;
2622 else if (!ident)
2624 c_parser_error (parser, "expected %<{%>");
2625 ret.spec = error_mark_node;
2626 ret.kind = ctsk_tagref;
2627 ret.expr = NULL_TREE;
2628 ret.expr_const_operands = true;
2629 return ret;
2631 ret = parser_xref_tag (ident_loc, ENUMERAL_TYPE, ident);
2632 /* In ISO C, enumerated types can be referred to only if already
2633 defined. */
2634 if (pedantic && !COMPLETE_TYPE_P (ret.spec))
2636 gcc_assert (ident);
2637 pedwarn (enum_loc, OPT_Wpedantic,
2638 "ISO C forbids forward references to %<enum%> types");
2640 return ret;
2643 /* Parse a struct or union specifier (C90 6.5.2.1, C99 6.7.2.1).
2645 struct-or-union-specifier:
2646 struct-or-union attributes[opt] identifier[opt]
2647 { struct-contents } attributes[opt]
2648 struct-or-union attributes[opt] identifier
2650 struct-contents:
2651 struct-declaration-list
2653 struct-declaration-list:
2654 struct-declaration ;
2655 struct-declaration-list struct-declaration ;
2657 GNU extensions:
2659 struct-contents:
2660 empty
2661 struct-declaration
2662 struct-declaration-list struct-declaration
2664 struct-declaration-list:
2665 struct-declaration-list ;
2668 (Note that in the syntax here, unlike that in ISO C, the semicolons
2669 are included here rather than in struct-declaration, in order to
2670 describe the syntax with extra semicolons and missing semicolon at
2671 end.)
2673 Objective-C:
2675 struct-declaration-list:
2676 @defs ( class-name )
2678 (Note this does not include a trailing semicolon, but can be
2679 followed by further declarations, and gets a pedwarn-if-pedantic
2680 when followed by a semicolon.) */
2682 static struct c_typespec
2683 c_parser_struct_or_union_specifier (c_parser *parser)
2685 struct c_typespec ret;
2686 tree attrs;
2687 tree ident = NULL_TREE;
2688 location_t struct_loc;
2689 location_t ident_loc = UNKNOWN_LOCATION;
2690 enum tree_code code;
2691 switch (c_parser_peek_token (parser)->keyword)
2693 case RID_STRUCT:
2694 code = RECORD_TYPE;
2695 break;
2696 case RID_UNION:
2697 code = UNION_TYPE;
2698 break;
2699 default:
2700 gcc_unreachable ();
2702 struct_loc = c_parser_peek_token (parser)->location;
2703 c_parser_consume_token (parser);
2704 attrs = c_parser_attributes (parser);
2706 /* Set the location in case we create a decl now. */
2707 c_parser_set_source_position_from_token (c_parser_peek_token (parser));
2709 if (c_parser_next_token_is (parser, CPP_NAME))
2711 ident = c_parser_peek_token (parser)->value;
2712 ident_loc = c_parser_peek_token (parser)->location;
2713 struct_loc = ident_loc;
2714 c_parser_consume_token (parser);
2716 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
2718 /* Parse a struct or union definition. Start the scope of the
2719 tag before parsing components. */
2720 struct c_struct_parse_info *struct_info;
2721 tree type = start_struct (struct_loc, code, ident, &struct_info);
2722 tree postfix_attrs;
2723 /* We chain the components in reverse order, then put them in
2724 forward order at the end. Each struct-declaration may
2725 declare multiple components (comma-separated), so we must use
2726 chainon to join them, although when parsing each
2727 struct-declaration we can use TREE_CHAIN directly.
2729 The theory behind all this is that there will be more
2730 semicolon separated fields than comma separated fields, and
2731 so we'll be minimizing the number of node traversals required
2732 by chainon. */
2733 tree contents;
2734 timevar_push (TV_PARSE_STRUCT);
2735 contents = NULL_TREE;
2736 c_parser_consume_token (parser);
2737 /* Handle the Objective-C @defs construct,
2738 e.g. foo(sizeof(struct{ @defs(ClassName) }));. */
2739 if (c_parser_next_token_is_keyword (parser, RID_AT_DEFS))
2741 tree name;
2742 gcc_assert (c_dialect_objc ());
2743 c_parser_consume_token (parser);
2744 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
2745 goto end_at_defs;
2746 if (c_parser_next_token_is (parser, CPP_NAME)
2747 && c_parser_peek_token (parser)->id_kind == C_ID_CLASSNAME)
2749 name = c_parser_peek_token (parser)->value;
2750 c_parser_consume_token (parser);
2752 else
2754 c_parser_error (parser, "expected class name");
2755 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
2756 goto end_at_defs;
2758 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2759 "expected %<)%>");
2760 contents = nreverse (objc_get_class_ivars (name));
2762 end_at_defs:
2763 /* Parse the struct-declarations and semicolons. Problems with
2764 semicolons are diagnosed here; empty structures are diagnosed
2765 elsewhere. */
2766 while (true)
2768 tree decls;
2769 /* Parse any stray semicolon. */
2770 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
2772 pedwarn (c_parser_peek_token (parser)->location, OPT_Wpedantic,
2773 "extra semicolon in struct or union specified");
2774 c_parser_consume_token (parser);
2775 continue;
2777 /* Stop if at the end of the struct or union contents. */
2778 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
2780 c_parser_consume_token (parser);
2781 break;
2783 /* Accept #pragmas at struct scope. */
2784 if (c_parser_next_token_is (parser, CPP_PRAGMA))
2786 c_parser_pragma (parser, pragma_struct);
2787 continue;
2789 /* Parse some comma-separated declarations, but not the
2790 trailing semicolon if any. */
2791 decls = c_parser_struct_declaration (parser);
2792 contents = chainon (decls, contents);
2793 /* If no semicolon follows, either we have a parse error or
2794 are at the end of the struct or union and should
2795 pedwarn. */
2796 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
2797 c_parser_consume_token (parser);
2798 else
2800 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
2801 pedwarn (c_parser_peek_token (parser)->location, 0,
2802 "no semicolon at end of struct or union");
2803 else if (parser->error
2804 || !c_parser_next_token_starts_declspecs (parser))
2806 c_parser_error (parser, "expected %<;%>");
2807 c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL);
2808 break;
2811 /* If we come here, we have already emitted an error
2812 for an expected `;', identifier or `(', and we also
2813 recovered already. Go on with the next field. */
2816 postfix_attrs = c_parser_attributes (parser);
2817 ret.spec = finish_struct (struct_loc, type, nreverse (contents),
2818 chainon (attrs, postfix_attrs), struct_info);
2819 ret.kind = ctsk_tagdef;
2820 ret.expr = NULL_TREE;
2821 ret.expr_const_operands = true;
2822 timevar_pop (TV_PARSE_STRUCT);
2823 return ret;
2825 else if (!ident)
2827 c_parser_error (parser, "expected %<{%>");
2828 ret.spec = error_mark_node;
2829 ret.kind = ctsk_tagref;
2830 ret.expr = NULL_TREE;
2831 ret.expr_const_operands = true;
2832 return ret;
2834 ret = parser_xref_tag (ident_loc, code, ident);
2835 return ret;
2838 /* Parse a struct-declaration (C90 6.5.2.1, C99 6.7.2.1), *without*
2839 the trailing semicolon.
2841 struct-declaration:
2842 specifier-qualifier-list struct-declarator-list
2843 static_assert-declaration-no-semi
2845 specifier-qualifier-list:
2846 type-specifier specifier-qualifier-list[opt]
2847 type-qualifier specifier-qualifier-list[opt]
2848 attributes specifier-qualifier-list[opt]
2850 struct-declarator-list:
2851 struct-declarator
2852 struct-declarator-list , attributes[opt] struct-declarator
2854 struct-declarator:
2855 declarator attributes[opt]
2856 declarator[opt] : constant-expression attributes[opt]
2858 GNU extensions:
2860 struct-declaration:
2861 __extension__ struct-declaration
2862 specifier-qualifier-list
2864 Unlike the ISO C syntax, semicolons are handled elsewhere. The use
2865 of attributes where shown is a GNU extension. In GNU C, we accept
2866 any expression without commas in the syntax (assignment
2867 expressions, not just conditional expressions); assignment
2868 expressions will be diagnosed as non-constant. */
2870 static tree
2871 c_parser_struct_declaration (c_parser *parser)
2873 struct c_declspecs *specs;
2874 tree prefix_attrs;
2875 tree all_prefix_attrs;
2876 tree decls;
2877 location_t decl_loc;
2878 if (c_parser_next_token_is_keyword (parser, RID_EXTENSION))
2880 int ext;
2881 tree decl;
2882 ext = disable_extension_diagnostics ();
2883 c_parser_consume_token (parser);
2884 decl = c_parser_struct_declaration (parser);
2885 restore_extension_diagnostics (ext);
2886 return decl;
2888 if (c_parser_next_token_is_keyword (parser, RID_STATIC_ASSERT))
2890 c_parser_static_assert_declaration_no_semi (parser);
2891 return NULL_TREE;
2893 specs = build_null_declspecs ();
2894 decl_loc = c_parser_peek_token (parser)->location;
2895 /* Strictly by the standard, we shouldn't allow _Alignas here,
2896 but it appears to have been intended to allow it there, so
2897 we're keeping it as it is until WG14 reaches a conclusion
2898 of N1731.
2899 <http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1731.pdf> */
2900 c_parser_declspecs (parser, specs, false, true, true,
2901 true, false, cla_nonabstract_decl);
2902 if (parser->error)
2903 return NULL_TREE;
2904 if (!specs->declspecs_seen_p)
2906 c_parser_error (parser, "expected specifier-qualifier-list");
2907 return NULL_TREE;
2909 finish_declspecs (specs);
2910 if (c_parser_next_token_is (parser, CPP_SEMICOLON)
2911 || c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
2913 tree ret;
2914 if (specs->typespec_kind == ctsk_none)
2916 pedwarn (decl_loc, OPT_Wpedantic,
2917 "ISO C forbids member declarations with no members");
2918 shadow_tag_warned (specs, pedantic);
2919 ret = NULL_TREE;
2921 else
2923 /* Support for unnamed structs or unions as members of
2924 structs or unions (which is [a] useful and [b] supports
2925 MS P-SDK). */
2926 tree attrs = NULL;
2928 ret = grokfield (c_parser_peek_token (parser)->location,
2929 build_id_declarator (NULL_TREE), specs,
2930 NULL_TREE, &attrs);
2931 if (ret)
2932 decl_attributes (&ret, attrs, 0);
2934 return ret;
2937 /* Provide better error recovery. Note that a type name here is valid,
2938 and will be treated as a field name. */
2939 if (specs->typespec_kind == ctsk_tagdef
2940 && TREE_CODE (specs->type) != ENUMERAL_TYPE
2941 && c_parser_next_token_starts_declspecs (parser)
2942 && !c_parser_next_token_is (parser, CPP_NAME))
2944 c_parser_error (parser, "expected %<;%>, identifier or %<(%>");
2945 parser->error = false;
2946 return NULL_TREE;
2949 pending_xref_error ();
2950 prefix_attrs = specs->attrs;
2951 all_prefix_attrs = prefix_attrs;
2952 specs->attrs = NULL_TREE;
2953 decls = NULL_TREE;
2954 while (true)
2956 /* Declaring one or more declarators or un-named bit-fields. */
2957 struct c_declarator *declarator;
2958 bool dummy = false;
2959 if (c_parser_next_token_is (parser, CPP_COLON))
2960 declarator = build_id_declarator (NULL_TREE);
2961 else
2962 declarator = c_parser_declarator (parser,
2963 specs->typespec_kind != ctsk_none,
2964 C_DTR_NORMAL, &dummy);
2965 if (declarator == NULL)
2967 c_parser_skip_to_end_of_block_or_statement (parser);
2968 break;
2970 if (c_parser_next_token_is (parser, CPP_COLON)
2971 || c_parser_next_token_is (parser, CPP_COMMA)
2972 || c_parser_next_token_is (parser, CPP_SEMICOLON)
2973 || c_parser_next_token_is (parser, CPP_CLOSE_BRACE)
2974 || c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
2976 tree postfix_attrs = NULL_TREE;
2977 tree width = NULL_TREE;
2978 tree d;
2979 if (c_parser_next_token_is (parser, CPP_COLON))
2981 c_parser_consume_token (parser);
2982 width = c_parser_expr_no_commas (parser, NULL).value;
2984 if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
2985 postfix_attrs = c_parser_attributes (parser);
2986 d = grokfield (c_parser_peek_token (parser)->location,
2987 declarator, specs, width, &all_prefix_attrs);
2988 decl_attributes (&d, chainon (postfix_attrs,
2989 all_prefix_attrs), 0);
2990 DECL_CHAIN (d) = decls;
2991 decls = d;
2992 if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
2993 all_prefix_attrs = chainon (c_parser_attributes (parser),
2994 prefix_attrs);
2995 else
2996 all_prefix_attrs = prefix_attrs;
2997 if (c_parser_next_token_is (parser, CPP_COMMA))
2998 c_parser_consume_token (parser);
2999 else if (c_parser_next_token_is (parser, CPP_SEMICOLON)
3000 || c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
3002 /* Semicolon consumed in caller. */
3003 break;
3005 else
3007 c_parser_error (parser, "expected %<,%>, %<;%> or %<}%>");
3008 break;
3011 else
3013 c_parser_error (parser,
3014 "expected %<:%>, %<,%>, %<;%>, %<}%> or "
3015 "%<__attribute__%>");
3016 break;
3019 return decls;
3022 /* Parse a typeof specifier (a GNU extension).
3024 typeof-specifier:
3025 typeof ( expression )
3026 typeof ( type-name )
3029 static struct c_typespec
3030 c_parser_typeof_specifier (c_parser *parser)
3032 struct c_typespec ret;
3033 ret.kind = ctsk_typeof;
3034 ret.spec = error_mark_node;
3035 ret.expr = NULL_TREE;
3036 ret.expr_const_operands = true;
3037 gcc_assert (c_parser_next_token_is_keyword (parser, RID_TYPEOF));
3038 c_parser_consume_token (parser);
3039 c_inhibit_evaluation_warnings++;
3040 in_typeof++;
3041 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
3043 c_inhibit_evaluation_warnings--;
3044 in_typeof--;
3045 return ret;
3047 if (c_parser_next_tokens_start_typename (parser, cla_prefer_id))
3049 struct c_type_name *type = c_parser_type_name (parser);
3050 c_inhibit_evaluation_warnings--;
3051 in_typeof--;
3052 if (type != NULL)
3054 ret.spec = groktypename (type, &ret.expr, &ret.expr_const_operands);
3055 pop_maybe_used (variably_modified_type_p (ret.spec, NULL_TREE));
3058 else
3060 bool was_vm;
3061 location_t here = c_parser_peek_token (parser)->location;
3062 struct c_expr expr = c_parser_expression (parser);
3063 c_inhibit_evaluation_warnings--;
3064 in_typeof--;
3065 if (TREE_CODE (expr.value) == COMPONENT_REF
3066 && DECL_C_BIT_FIELD (TREE_OPERAND (expr.value, 1)))
3067 error_at (here, "%<typeof%> applied to a bit-field");
3068 mark_exp_read (expr.value);
3069 ret.spec = TREE_TYPE (expr.value);
3070 was_vm = variably_modified_type_p (ret.spec, NULL_TREE);
3071 /* This is returned with the type so that when the type is
3072 evaluated, this can be evaluated. */
3073 if (was_vm)
3074 ret.expr = c_fully_fold (expr.value, false, &ret.expr_const_operands);
3075 pop_maybe_used (was_vm);
3076 /* For use in macros such as those in <stdatomic.h>, remove all
3077 qualifiers from atomic types. (const can be an issue for more macros
3078 using typeof than just the <stdatomic.h> ones.) */
3079 if (ret.spec != error_mark_node && TYPE_ATOMIC (ret.spec))
3080 ret.spec = c_build_qualified_type (ret.spec, TYPE_UNQUALIFIED);
3082 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
3083 return ret;
3086 /* Parse an alignment-specifier.
3088 C11 6.7.5:
3090 alignment-specifier:
3091 _Alignas ( type-name )
3092 _Alignas ( constant-expression )
3095 static tree
3096 c_parser_alignas_specifier (c_parser * parser)
3098 tree ret = error_mark_node;
3099 location_t loc = c_parser_peek_token (parser)->location;
3100 gcc_assert (c_parser_next_token_is_keyword (parser, RID_ALIGNAS));
3101 c_parser_consume_token (parser);
3102 if (flag_isoc99)
3103 pedwarn_c99 (loc, OPT_Wpedantic,
3104 "ISO C99 does not support %<_Alignas%>");
3105 else
3106 pedwarn_c99 (loc, OPT_Wpedantic,
3107 "ISO C90 does not support %<_Alignas%>");
3108 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
3109 return ret;
3110 if (c_parser_next_tokens_start_typename (parser, cla_prefer_id))
3112 struct c_type_name *type = c_parser_type_name (parser);
3113 if (type != NULL)
3114 ret = c_sizeof_or_alignof_type (loc, groktypename (type, NULL, NULL),
3115 false, true, 1);
3117 else
3118 ret = c_parser_expr_no_commas (parser, NULL).value;
3119 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
3120 return ret;
3123 /* Parse a declarator, possibly an abstract declarator (C90 6.5.4,
3124 6.5.5, C99 6.7.5, 6.7.6). If TYPE_SEEN_P then a typedef name may
3125 be redeclared; otherwise it may not. KIND indicates which kind of
3126 declarator is wanted. Returns a valid declarator except in the
3127 case of a syntax error in which case NULL is returned. *SEEN_ID is
3128 set to true if an identifier being declared is seen; this is used
3129 to diagnose bad forms of abstract array declarators and to
3130 determine whether an identifier list is syntactically permitted.
3132 declarator:
3133 pointer[opt] direct-declarator
3135 direct-declarator:
3136 identifier
3137 ( attributes[opt] declarator )
3138 direct-declarator array-declarator
3139 direct-declarator ( parameter-type-list )
3140 direct-declarator ( identifier-list[opt] )
3142 pointer:
3143 * type-qualifier-list[opt]
3144 * type-qualifier-list[opt] pointer
3146 type-qualifier-list:
3147 type-qualifier
3148 attributes
3149 type-qualifier-list type-qualifier
3150 type-qualifier-list attributes
3152 array-declarator:
3153 [ type-qualifier-list[opt] assignment-expression[opt] ]
3154 [ static type-qualifier-list[opt] assignment-expression ]
3155 [ type-qualifier-list static assignment-expression ]
3156 [ type-qualifier-list[opt] * ]
3158 parameter-type-list:
3159 parameter-list
3160 parameter-list , ...
3162 parameter-list:
3163 parameter-declaration
3164 parameter-list , parameter-declaration
3166 parameter-declaration:
3167 declaration-specifiers declarator attributes[opt]
3168 declaration-specifiers abstract-declarator[opt] attributes[opt]
3170 identifier-list:
3171 identifier
3172 identifier-list , identifier
3174 abstract-declarator:
3175 pointer
3176 pointer[opt] direct-abstract-declarator
3178 direct-abstract-declarator:
3179 ( attributes[opt] abstract-declarator )
3180 direct-abstract-declarator[opt] array-declarator
3181 direct-abstract-declarator[opt] ( parameter-type-list[opt] )
3183 GNU extensions:
3185 direct-declarator:
3186 direct-declarator ( parameter-forward-declarations
3187 parameter-type-list[opt] )
3189 direct-abstract-declarator:
3190 direct-abstract-declarator[opt] ( parameter-forward-declarations
3191 parameter-type-list[opt] )
3193 parameter-forward-declarations:
3194 parameter-list ;
3195 parameter-forward-declarations parameter-list ;
3197 The uses of attributes shown above are GNU extensions.
3199 Some forms of array declarator are not included in C99 in the
3200 syntax for abstract declarators; these are disallowed elsewhere.
3201 This may be a defect (DR#289).
3203 This function also accepts an omitted abstract declarator as being
3204 an abstract declarator, although not part of the formal syntax. */
3206 static struct c_declarator *
3207 c_parser_declarator (c_parser *parser, bool type_seen_p, c_dtr_syn kind,
3208 bool *seen_id)
3210 /* Parse any initial pointer part. */
3211 if (c_parser_next_token_is (parser, CPP_MULT))
3213 struct c_declspecs *quals_attrs = build_null_declspecs ();
3214 struct c_declarator *inner;
3215 c_parser_consume_token (parser);
3216 c_parser_declspecs (parser, quals_attrs, false, false, true,
3217 false, false, cla_prefer_id);
3218 inner = c_parser_declarator (parser, type_seen_p, kind, seen_id);
3219 if (inner == NULL)
3220 return NULL;
3221 else
3222 return make_pointer_declarator (quals_attrs, inner);
3224 /* Now we have a direct declarator, direct abstract declarator or
3225 nothing (which counts as a direct abstract declarator here). */
3226 return c_parser_direct_declarator (parser, type_seen_p, kind, seen_id);
3229 /* Parse a direct declarator or direct abstract declarator; arguments
3230 as c_parser_declarator. */
3232 static struct c_declarator *
3233 c_parser_direct_declarator (c_parser *parser, bool type_seen_p, c_dtr_syn kind,
3234 bool *seen_id)
3236 /* The direct declarator must start with an identifier (possibly
3237 omitted) or a parenthesized declarator (possibly abstract). In
3238 an ordinary declarator, initial parentheses must start a
3239 parenthesized declarator. In an abstract declarator or parameter
3240 declarator, they could start a parenthesized declarator or a
3241 parameter list. To tell which, the open parenthesis and any
3242 following attributes must be read. If a declaration specifier
3243 follows, then it is a parameter list; if the specifier is a
3244 typedef name, there might be an ambiguity about redeclaring it,
3245 which is resolved in the direction of treating it as a typedef
3246 name. If a close parenthesis follows, it is also an empty
3247 parameter list, as the syntax does not permit empty abstract
3248 declarators. Otherwise, it is a parenthesized declarator (in
3249 which case the analysis may be repeated inside it, recursively).
3251 ??? There is an ambiguity in a parameter declaration "int
3252 (__attribute__((foo)) x)", where x is not a typedef name: it
3253 could be an abstract declarator for a function, or declare x with
3254 parentheses. The proper resolution of this ambiguity needs
3255 documenting. At present we follow an accident of the old
3256 parser's implementation, whereby the first parameter must have
3257 some declaration specifiers other than just attributes. Thus as
3258 a parameter declaration it is treated as a parenthesized
3259 parameter named x, and as an abstract declarator it is
3260 rejected.
3262 ??? Also following the old parser, attributes inside an empty
3263 parameter list are ignored, making it a list not yielding a
3264 prototype, rather than giving an error or making it have one
3265 parameter with implicit type int.
3267 ??? Also following the old parser, typedef names may be
3268 redeclared in declarators, but not Objective-C class names. */
3270 if (kind != C_DTR_ABSTRACT
3271 && c_parser_next_token_is (parser, CPP_NAME)
3272 && ((type_seen_p
3273 && (c_parser_peek_token (parser)->id_kind == C_ID_TYPENAME
3274 || c_parser_peek_token (parser)->id_kind == C_ID_CLASSNAME))
3275 || c_parser_peek_token (parser)->id_kind == C_ID_ID))
3277 struct c_declarator *inner
3278 = build_id_declarator (c_parser_peek_token (parser)->value);
3279 *seen_id = true;
3280 inner->id_loc = c_parser_peek_token (parser)->location;
3281 c_parser_consume_token (parser);
3282 return c_parser_direct_declarator_inner (parser, *seen_id, inner);
3285 if (kind != C_DTR_NORMAL
3286 && c_parser_next_token_is (parser, CPP_OPEN_SQUARE))
3288 struct c_declarator *inner = build_id_declarator (NULL_TREE);
3289 return c_parser_direct_declarator_inner (parser, *seen_id, inner);
3292 /* Either we are at the end of an abstract declarator, or we have
3293 parentheses. */
3295 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
3297 tree attrs;
3298 struct c_declarator *inner;
3299 c_parser_consume_token (parser);
3300 attrs = c_parser_attributes (parser);
3301 if (kind != C_DTR_NORMAL
3302 && (c_parser_next_token_starts_declspecs (parser)
3303 || c_parser_next_token_is (parser, CPP_CLOSE_PAREN)))
3305 struct c_arg_info *args
3306 = c_parser_parms_declarator (parser, kind == C_DTR_NORMAL,
3307 attrs);
3308 if (args == NULL)
3309 return NULL;
3310 else
3312 inner
3313 = build_function_declarator (args,
3314 build_id_declarator (NULL_TREE));
3315 return c_parser_direct_declarator_inner (parser, *seen_id,
3316 inner);
3319 /* A parenthesized declarator. */
3320 inner = c_parser_declarator (parser, type_seen_p, kind, seen_id);
3321 if (inner != NULL && attrs != NULL)
3322 inner = build_attrs_declarator (attrs, inner);
3323 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3325 c_parser_consume_token (parser);
3326 if (inner == NULL)
3327 return NULL;
3328 else
3329 return c_parser_direct_declarator_inner (parser, *seen_id, inner);
3331 else
3333 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
3334 "expected %<)%>");
3335 return NULL;
3338 else
3340 if (kind == C_DTR_NORMAL)
3342 c_parser_error (parser, "expected identifier or %<(%>");
3343 return NULL;
3345 else
3346 return build_id_declarator (NULL_TREE);
3350 /* Parse part of a direct declarator or direct abstract declarator,
3351 given that some (in INNER) has already been parsed; ID_PRESENT is
3352 true if an identifier is present, false for an abstract
3353 declarator. */
3355 static struct c_declarator *
3356 c_parser_direct_declarator_inner (c_parser *parser, bool id_present,
3357 struct c_declarator *inner)
3359 /* Parse a sequence of array declarators and parameter lists. */
3360 if (c_parser_next_token_is (parser, CPP_OPEN_SQUARE))
3362 location_t brace_loc = c_parser_peek_token (parser)->location;
3363 struct c_declarator *declarator;
3364 struct c_declspecs *quals_attrs = build_null_declspecs ();
3365 bool static_seen;
3366 bool star_seen;
3367 struct c_expr dimen;
3368 dimen.value = NULL_TREE;
3369 dimen.original_code = ERROR_MARK;
3370 dimen.original_type = NULL_TREE;
3371 c_parser_consume_token (parser);
3372 c_parser_declspecs (parser, quals_attrs, false, false, true,
3373 false, false, cla_prefer_id);
3374 static_seen = c_parser_next_token_is_keyword (parser, RID_STATIC);
3375 if (static_seen)
3376 c_parser_consume_token (parser);
3377 if (static_seen && !quals_attrs->declspecs_seen_p)
3378 c_parser_declspecs (parser, quals_attrs, false, false, true,
3379 false, false, cla_prefer_id);
3380 if (!quals_attrs->declspecs_seen_p)
3381 quals_attrs = NULL;
3382 /* If "static" is present, there must be an array dimension.
3383 Otherwise, there may be a dimension, "*", or no
3384 dimension. */
3385 if (static_seen)
3387 star_seen = false;
3388 dimen = c_parser_expr_no_commas (parser, NULL);
3390 else
3392 if (c_parser_next_token_is (parser, CPP_CLOSE_SQUARE))
3394 dimen.value = NULL_TREE;
3395 star_seen = false;
3397 else if (flag_cilkplus
3398 && c_parser_next_token_is (parser, CPP_COLON))
3400 dimen.value = error_mark_node;
3401 star_seen = false;
3402 error_at (c_parser_peek_token (parser)->location,
3403 "array notations cannot be used in declaration");
3404 c_parser_consume_token (parser);
3406 else if (c_parser_next_token_is (parser, CPP_MULT))
3408 if (c_parser_peek_2nd_token (parser)->type == CPP_CLOSE_SQUARE)
3410 dimen.value = NULL_TREE;
3411 star_seen = true;
3412 c_parser_consume_token (parser);
3414 else
3416 star_seen = false;
3417 dimen = c_parser_expr_no_commas (parser, NULL);
3420 else
3422 star_seen = false;
3423 dimen = c_parser_expr_no_commas (parser, NULL);
3426 if (c_parser_next_token_is (parser, CPP_CLOSE_SQUARE))
3427 c_parser_consume_token (parser);
3428 else if (flag_cilkplus
3429 && c_parser_next_token_is (parser, CPP_COLON))
3431 error_at (c_parser_peek_token (parser)->location,
3432 "array notations cannot be used in declaration");
3433 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, NULL);
3434 return NULL;
3436 else
3438 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
3439 "expected %<]%>");
3440 return NULL;
3442 if (dimen.value)
3443 dimen = convert_lvalue_to_rvalue (brace_loc, dimen, true, true);
3444 declarator = build_array_declarator (brace_loc, dimen.value, quals_attrs,
3445 static_seen, star_seen);
3446 if (declarator == NULL)
3447 return NULL;
3448 inner = set_array_declarator_inner (declarator, inner);
3449 return c_parser_direct_declarator_inner (parser, id_present, inner);
3451 else if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
3453 tree attrs;
3454 struct c_arg_info *args;
3455 c_parser_consume_token (parser);
3456 attrs = c_parser_attributes (parser);
3457 args = c_parser_parms_declarator (parser, id_present, attrs);
3458 if (args == NULL)
3459 return NULL;
3460 else
3462 inner = build_function_declarator (args, inner);
3463 return c_parser_direct_declarator_inner (parser, id_present, inner);
3466 return inner;
3469 /* Parse a parameter list or identifier list, including the closing
3470 parenthesis but not the opening one. ATTRS are the attributes at
3471 the start of the list. ID_LIST_OK is true if an identifier list is
3472 acceptable; such a list must not have attributes at the start. */
3474 static struct c_arg_info *
3475 c_parser_parms_declarator (c_parser *parser, bool id_list_ok, tree attrs)
3477 push_scope ();
3478 declare_parm_level ();
3479 /* If the list starts with an identifier, it is an identifier list.
3480 Otherwise, it is either a prototype list or an empty list. */
3481 if (id_list_ok
3482 && !attrs
3483 && c_parser_next_token_is (parser, CPP_NAME)
3484 && c_parser_peek_token (parser)->id_kind == C_ID_ID
3486 /* Look ahead to detect typos in type names. */
3487 && c_parser_peek_2nd_token (parser)->type != CPP_NAME
3488 && c_parser_peek_2nd_token (parser)->type != CPP_MULT
3489 && c_parser_peek_2nd_token (parser)->type != CPP_OPEN_PAREN
3490 && c_parser_peek_2nd_token (parser)->type != CPP_OPEN_SQUARE)
3492 tree list = NULL_TREE, *nextp = &list;
3493 while (c_parser_next_token_is (parser, CPP_NAME)
3494 && c_parser_peek_token (parser)->id_kind == C_ID_ID)
3496 *nextp = build_tree_list (NULL_TREE,
3497 c_parser_peek_token (parser)->value);
3498 nextp = & TREE_CHAIN (*nextp);
3499 c_parser_consume_token (parser);
3500 if (c_parser_next_token_is_not (parser, CPP_COMMA))
3501 break;
3502 c_parser_consume_token (parser);
3503 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3505 c_parser_error (parser, "expected identifier");
3506 break;
3509 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3511 struct c_arg_info *ret = build_arg_info ();
3512 ret->types = list;
3513 c_parser_consume_token (parser);
3514 pop_scope ();
3515 return ret;
3517 else
3519 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
3520 "expected %<)%>");
3521 pop_scope ();
3522 return NULL;
3525 else
3527 struct c_arg_info *ret = c_parser_parms_list_declarator (parser, attrs,
3528 NULL);
3529 pop_scope ();
3530 return ret;
3534 /* Parse a parameter list (possibly empty), including the closing
3535 parenthesis but not the opening one. ATTRS are the attributes at
3536 the start of the list. EXPR is NULL or an expression that needs to
3537 be evaluated for the side effects of array size expressions in the
3538 parameters. */
3540 static struct c_arg_info *
3541 c_parser_parms_list_declarator (c_parser *parser, tree attrs, tree expr)
3543 bool bad_parm = false;
3545 /* ??? Following the old parser, forward parameter declarations may
3546 use abstract declarators, and if no real parameter declarations
3547 follow the forward declarations then this is not diagnosed. Also
3548 note as above that attributes are ignored as the only contents of
3549 the parentheses, or as the only contents after forward
3550 declarations. */
3551 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3553 struct c_arg_info *ret = build_arg_info ();
3554 c_parser_consume_token (parser);
3555 return ret;
3557 if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
3559 struct c_arg_info *ret = build_arg_info ();
3561 if (flag_allow_parameterless_variadic_functions)
3563 /* F (...) is allowed. */
3564 ret->types = NULL_TREE;
3566 else
3568 /* Suppress -Wold-style-definition for this case. */
3569 ret->types = error_mark_node;
3570 error_at (c_parser_peek_token (parser)->location,
3571 "ISO C requires a named argument before %<...%>");
3573 c_parser_consume_token (parser);
3574 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3576 c_parser_consume_token (parser);
3577 return ret;
3579 else
3581 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
3582 "expected %<)%>");
3583 return NULL;
3586 /* Nonempty list of parameters, either terminated with semicolon
3587 (forward declarations; recurse) or with close parenthesis (normal
3588 function) or with ", ... )" (variadic function). */
3589 while (true)
3591 /* Parse a parameter. */
3592 struct c_parm *parm = c_parser_parameter_declaration (parser, attrs);
3593 attrs = NULL_TREE;
3594 if (parm == NULL)
3595 bad_parm = true;
3596 else
3597 push_parm_decl (parm, &expr);
3598 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
3600 tree new_attrs;
3601 c_parser_consume_token (parser);
3602 mark_forward_parm_decls ();
3603 new_attrs = c_parser_attributes (parser);
3604 return c_parser_parms_list_declarator (parser, new_attrs, expr);
3606 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3608 c_parser_consume_token (parser);
3609 if (bad_parm)
3610 return NULL;
3611 else
3612 return get_parm_info (false, expr);
3614 if (!c_parser_require (parser, CPP_COMMA,
3615 "expected %<;%>, %<,%> or %<)%>"))
3617 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
3618 return NULL;
3620 if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
3622 c_parser_consume_token (parser);
3623 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3625 c_parser_consume_token (parser);
3626 if (bad_parm)
3627 return NULL;
3628 else
3629 return get_parm_info (true, expr);
3631 else
3633 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
3634 "expected %<)%>");
3635 return NULL;
3641 /* Parse a parameter declaration. ATTRS are the attributes at the
3642 start of the declaration if it is the first parameter. */
3644 static struct c_parm *
3645 c_parser_parameter_declaration (c_parser *parser, tree attrs)
3647 struct c_declspecs *specs;
3648 struct c_declarator *declarator;
3649 tree prefix_attrs;
3650 tree postfix_attrs = NULL_TREE;
3651 bool dummy = false;
3653 /* Accept #pragmas between parameter declarations. */
3654 while (c_parser_next_token_is (parser, CPP_PRAGMA))
3655 c_parser_pragma (parser, pragma_param);
3657 if (!c_parser_next_token_starts_declspecs (parser))
3659 c_token *token = c_parser_peek_token (parser);
3660 if (parser->error)
3661 return NULL;
3662 c_parser_set_source_position_from_token (token);
3663 if (c_parser_next_tokens_start_typename (parser, cla_prefer_type))
3665 error_at (token->location, "unknown type name %qE", token->value);
3666 parser->error = true;
3668 /* ??? In some Objective-C cases '...' isn't applicable so there
3669 should be a different message. */
3670 else
3671 c_parser_error (parser,
3672 "expected declaration specifiers or %<...%>");
3673 c_parser_skip_to_end_of_parameter (parser);
3674 return NULL;
3676 specs = build_null_declspecs ();
3677 if (attrs)
3679 declspecs_add_attrs (input_location, specs, attrs);
3680 attrs = NULL_TREE;
3682 c_parser_declspecs (parser, specs, true, true, true, true, false,
3683 cla_nonabstract_decl);
3684 finish_declspecs (specs);
3685 pending_xref_error ();
3686 prefix_attrs = specs->attrs;
3687 specs->attrs = NULL_TREE;
3688 declarator = c_parser_declarator (parser,
3689 specs->typespec_kind != ctsk_none,
3690 C_DTR_PARM, &dummy);
3691 if (declarator == NULL)
3693 c_parser_skip_until_found (parser, CPP_COMMA, NULL);
3694 return NULL;
3696 if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
3697 postfix_attrs = c_parser_attributes (parser);
3698 return build_c_parm (specs, chainon (postfix_attrs, prefix_attrs),
3699 declarator);
3702 /* Parse a string literal in an asm expression. It should not be
3703 translated, and wide string literals are an error although
3704 permitted by the syntax. This is a GNU extension.
3706 asm-string-literal:
3707 string-literal
3709 ??? At present, following the old parser, the caller needs to have
3710 set lex_untranslated_string to 1. It would be better to follow the
3711 C++ parser rather than using this kludge. */
3713 static tree
3714 c_parser_asm_string_literal (c_parser *parser)
3716 tree str;
3717 int save_flag = warn_overlength_strings;
3718 warn_overlength_strings = 0;
3719 if (c_parser_next_token_is (parser, CPP_STRING))
3721 str = c_parser_peek_token (parser)->value;
3722 c_parser_consume_token (parser);
3724 else if (c_parser_next_token_is (parser, CPP_WSTRING))
3726 error_at (c_parser_peek_token (parser)->location,
3727 "wide string literal in %<asm%>");
3728 str = build_string (1, "");
3729 c_parser_consume_token (parser);
3731 else
3733 c_parser_error (parser, "expected string literal");
3734 str = NULL_TREE;
3736 warn_overlength_strings = save_flag;
3737 return str;
3740 /* Parse a simple asm expression. This is used in restricted
3741 contexts, where a full expression with inputs and outputs does not
3742 make sense. This is a GNU extension.
3744 simple-asm-expr:
3745 asm ( asm-string-literal )
3748 static tree
3749 c_parser_simple_asm_expr (c_parser *parser)
3751 tree str;
3752 gcc_assert (c_parser_next_token_is_keyword (parser, RID_ASM));
3753 /* ??? Follow the C++ parser rather than using the
3754 lex_untranslated_string kludge. */
3755 parser->lex_untranslated_string = true;
3756 c_parser_consume_token (parser);
3757 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
3759 parser->lex_untranslated_string = false;
3760 return NULL_TREE;
3762 str = c_parser_asm_string_literal (parser);
3763 parser->lex_untranslated_string = false;
3764 if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
3766 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
3767 return NULL_TREE;
3769 return str;
3772 static tree
3773 c_parser_attribute_any_word (c_parser *parser)
3775 tree attr_name = NULL_TREE;
3777 if (c_parser_next_token_is (parser, CPP_KEYWORD))
3779 /* ??? See comment above about what keywords are accepted here. */
3780 bool ok;
3781 switch (c_parser_peek_token (parser)->keyword)
3783 case RID_STATIC:
3784 case RID_UNSIGNED:
3785 case RID_LONG:
3786 case RID_CONST:
3787 case RID_EXTERN:
3788 case RID_REGISTER:
3789 case RID_TYPEDEF:
3790 case RID_SHORT:
3791 case RID_INLINE:
3792 case RID_NORETURN:
3793 case RID_VOLATILE:
3794 case RID_SIGNED:
3795 case RID_AUTO:
3796 case RID_RESTRICT:
3797 case RID_COMPLEX:
3798 case RID_THREAD:
3799 case RID_INT:
3800 case RID_CHAR:
3801 case RID_FLOAT:
3802 case RID_DOUBLE:
3803 case RID_VOID:
3804 case RID_DFLOAT32:
3805 case RID_DFLOAT64:
3806 case RID_DFLOAT128:
3807 case RID_BOOL:
3808 case RID_FRACT:
3809 case RID_ACCUM:
3810 case RID_SAT:
3811 case RID_TRANSACTION_ATOMIC:
3812 case RID_TRANSACTION_CANCEL:
3813 case RID_ATOMIC:
3814 case RID_AUTO_TYPE:
3815 case RID_INT_N_0:
3816 case RID_INT_N_1:
3817 case RID_INT_N_2:
3818 case RID_INT_N_3:
3819 ok = true;
3820 break;
3821 default:
3822 ok = false;
3823 break;
3825 if (!ok)
3826 return NULL_TREE;
3828 /* Accept __attribute__((__const)) as __attribute__((const)) etc. */
3829 attr_name = ridpointers[(int) c_parser_peek_token (parser)->keyword];
3831 else if (c_parser_next_token_is (parser, CPP_NAME))
3832 attr_name = c_parser_peek_token (parser)->value;
3834 return attr_name;
3837 /* Returns true of NAME is an IDENTIFIER_NODE with identiifer "vector,"
3838 "__vector" or "__vector__." */
3840 static inline bool
3841 is_cilkplus_vector_p (tree name)
3843 if (flag_cilkplus && is_attribute_p ("vector", name))
3844 return true;
3845 return false;
3848 #define CILK_SIMD_FN_CLAUSE_MASK \
3849 ((OMP_CLAUSE_MASK_1 << PRAGMA_CILK_CLAUSE_VECTORLENGTH) \
3850 | (OMP_CLAUSE_MASK_1 << PRAGMA_CILK_CLAUSE_LINEAR) \
3851 | (OMP_CLAUSE_MASK_1 << PRAGMA_CILK_CLAUSE_UNIFORM) \
3852 | (OMP_CLAUSE_MASK_1 << PRAGMA_CILK_CLAUSE_MASK) \
3853 | (OMP_CLAUSE_MASK_1 << PRAGMA_CILK_CLAUSE_NOMASK))
3855 /* Parses the vector attribute of SIMD enabled functions in Cilk Plus.
3856 VEC_TOKEN is the "vector" token that is replaced with "simd" and
3857 pushed into the token list.
3858 Syntax:
3859 vector
3860 vector (<vector attributes>). */
3862 static void
3863 c_parser_cilk_simd_fn_vector_attrs (c_parser *parser, c_token vec_token)
3865 gcc_assert (is_cilkplus_vector_p (vec_token.value));
3867 int paren_scope = 0;
3868 vec_safe_push (parser->cilk_simd_fn_tokens, vec_token);
3869 /* Consume the "vector" token. */
3870 c_parser_consume_token (parser);
3872 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
3874 c_parser_consume_token (parser);
3875 paren_scope++;
3877 while (paren_scope > 0)
3879 c_token *token = c_parser_peek_token (parser);
3880 if (token->type == CPP_OPEN_PAREN)
3881 paren_scope++;
3882 else if (token->type == CPP_CLOSE_PAREN)
3883 paren_scope--;
3884 /* Do not push the last ')' since we are not pushing the '('. */
3885 if (!(token->type == CPP_CLOSE_PAREN && paren_scope == 0))
3886 vec_safe_push (parser->cilk_simd_fn_tokens, *token);
3887 c_parser_consume_token (parser);
3890 /* Since we are converting an attribute to a pragma, we need to end the
3891 attribute with PRAGMA_EOL. */
3892 c_token eol_token;
3893 memset (&eol_token, 0, sizeof (eol_token));
3894 eol_token.type = CPP_PRAGMA_EOL;
3895 vec_safe_push (parser->cilk_simd_fn_tokens, eol_token);
3898 /* Add 2 CPP_EOF at the end of PARSER->ELEM_FN_TOKENS vector. */
3900 static void
3901 c_finish_cilk_simd_fn_tokens (c_parser *parser)
3903 c_token last_token = parser->cilk_simd_fn_tokens->last ();
3905 /* c_parser_attributes is called in several places, so if these EOF
3906 tokens are already inserted, then don't do them again. */
3907 if (last_token.type == CPP_EOF)
3908 return;
3910 /* Two CPP_EOF token are added as a safety net since the normal C
3911 front-end has two token look-ahead. */
3912 c_token eof_token;
3913 eof_token.type = CPP_EOF;
3914 vec_safe_push (parser->cilk_simd_fn_tokens, eof_token);
3915 vec_safe_push (parser->cilk_simd_fn_tokens, eof_token);
3918 /* Parse (possibly empty) attributes. This is a GNU extension.
3920 attributes:
3921 empty
3922 attributes attribute
3924 attribute:
3925 __attribute__ ( ( attribute-list ) )
3927 attribute-list:
3928 attrib
3929 attribute_list , attrib
3931 attrib:
3932 empty
3933 any-word
3934 any-word ( identifier )
3935 any-word ( identifier , nonempty-expr-list )
3936 any-word ( expr-list )
3938 where the "identifier" must not be declared as a type, and
3939 "any-word" may be any identifier (including one declared as a
3940 type), a reserved word storage class specifier, type specifier or
3941 type qualifier. ??? This still leaves out most reserved keywords
3942 (following the old parser), shouldn't we include them, and why not
3943 allow identifiers declared as types to start the arguments? */
3945 static tree
3946 c_parser_attributes (c_parser *parser)
3948 tree attrs = NULL_TREE;
3949 while (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
3951 /* ??? Follow the C++ parser rather than using the
3952 lex_untranslated_string kludge. */
3953 parser->lex_untranslated_string = true;
3954 c_parser_consume_token (parser);
3955 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
3957 parser->lex_untranslated_string = false;
3958 return attrs;
3960 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
3962 parser->lex_untranslated_string = false;
3963 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
3964 return attrs;
3966 /* Parse the attribute list. */
3967 while (c_parser_next_token_is (parser, CPP_COMMA)
3968 || c_parser_next_token_is (parser, CPP_NAME)
3969 || c_parser_next_token_is (parser, CPP_KEYWORD))
3971 tree attr, attr_name, attr_args;
3972 vec<tree, va_gc> *expr_list;
3973 if (c_parser_next_token_is (parser, CPP_COMMA))
3975 c_parser_consume_token (parser);
3976 continue;
3979 attr_name = c_parser_attribute_any_word (parser);
3980 if (attr_name == NULL)
3981 break;
3982 if (is_cilkplus_vector_p (attr_name))
3984 c_token *v_token = c_parser_peek_token (parser);
3985 c_parser_cilk_simd_fn_vector_attrs (parser, *v_token);
3986 continue;
3988 c_parser_consume_token (parser);
3989 if (c_parser_next_token_is_not (parser, CPP_OPEN_PAREN))
3991 attr = build_tree_list (attr_name, NULL_TREE);
3992 attrs = chainon (attrs, attr);
3993 continue;
3995 c_parser_consume_token (parser);
3996 /* Parse the attribute contents. If they start with an
3997 identifier which is followed by a comma or close
3998 parenthesis, then the arguments start with that
3999 identifier; otherwise they are an expression list.
4000 In objective-c the identifier may be a classname. */
4001 if (c_parser_next_token_is (parser, CPP_NAME)
4002 && (c_parser_peek_token (parser)->id_kind == C_ID_ID
4003 || (c_dialect_objc ()
4004 && c_parser_peek_token (parser)->id_kind
4005 == C_ID_CLASSNAME))
4006 && ((c_parser_peek_2nd_token (parser)->type == CPP_COMMA)
4007 || (c_parser_peek_2nd_token (parser)->type
4008 == CPP_CLOSE_PAREN))
4009 && (attribute_takes_identifier_p (attr_name)
4010 || (c_dialect_objc ()
4011 && c_parser_peek_token (parser)->id_kind
4012 == C_ID_CLASSNAME)))
4014 tree arg1 = c_parser_peek_token (parser)->value;
4015 c_parser_consume_token (parser);
4016 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
4017 attr_args = build_tree_list (NULL_TREE, arg1);
4018 else
4020 tree tree_list;
4021 c_parser_consume_token (parser);
4022 expr_list = c_parser_expr_list (parser, false, true,
4023 NULL, NULL, NULL, NULL);
4024 tree_list = build_tree_list_vec (expr_list);
4025 attr_args = tree_cons (NULL_TREE, arg1, tree_list);
4026 release_tree_vector (expr_list);
4029 else
4031 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
4032 attr_args = NULL_TREE;
4033 else
4035 expr_list = c_parser_expr_list (parser, false, true,
4036 NULL, NULL, NULL, NULL);
4037 attr_args = build_tree_list_vec (expr_list);
4038 release_tree_vector (expr_list);
4041 attr = build_tree_list (attr_name, attr_args);
4042 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
4043 c_parser_consume_token (parser);
4044 else
4046 parser->lex_untranslated_string = false;
4047 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
4048 "expected %<)%>");
4049 return attrs;
4051 attrs = chainon (attrs, attr);
4053 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
4054 c_parser_consume_token (parser);
4055 else
4057 parser->lex_untranslated_string = false;
4058 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
4059 "expected %<)%>");
4060 return attrs;
4062 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
4063 c_parser_consume_token (parser);
4064 else
4066 parser->lex_untranslated_string = false;
4067 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
4068 "expected %<)%>");
4069 return attrs;
4071 parser->lex_untranslated_string = false;
4074 if (flag_cilkplus && !vec_safe_is_empty (parser->cilk_simd_fn_tokens))
4075 c_finish_cilk_simd_fn_tokens (parser);
4076 return attrs;
4079 /* Parse a type name (C90 6.5.5, C99 6.7.6).
4081 type-name:
4082 specifier-qualifier-list abstract-declarator[opt]
4085 static struct c_type_name *
4086 c_parser_type_name (c_parser *parser)
4088 struct c_declspecs *specs = build_null_declspecs ();
4089 struct c_declarator *declarator;
4090 struct c_type_name *ret;
4091 bool dummy = false;
4092 c_parser_declspecs (parser, specs, false, true, true, false, false,
4093 cla_prefer_type);
4094 if (!specs->declspecs_seen_p)
4096 c_parser_error (parser, "expected specifier-qualifier-list");
4097 return NULL;
4099 if (specs->type != error_mark_node)
4101 pending_xref_error ();
4102 finish_declspecs (specs);
4104 declarator = c_parser_declarator (parser,
4105 specs->typespec_kind != ctsk_none,
4106 C_DTR_ABSTRACT, &dummy);
4107 if (declarator == NULL)
4108 return NULL;
4109 ret = XOBNEW (&parser_obstack, struct c_type_name);
4110 ret->specs = specs;
4111 ret->declarator = declarator;
4112 return ret;
4115 /* Parse an initializer (C90 6.5.7, C99 6.7.8).
4117 initializer:
4118 assignment-expression
4119 { initializer-list }
4120 { initializer-list , }
4122 initializer-list:
4123 designation[opt] initializer
4124 initializer-list , designation[opt] initializer
4126 designation:
4127 designator-list =
4129 designator-list:
4130 designator
4131 designator-list designator
4133 designator:
4134 array-designator
4135 . identifier
4137 array-designator:
4138 [ constant-expression ]
4140 GNU extensions:
4142 initializer:
4145 designation:
4146 array-designator
4147 identifier :
4149 array-designator:
4150 [ constant-expression ... constant-expression ]
4152 Any expression without commas is accepted in the syntax for the
4153 constant-expressions, with non-constant expressions rejected later.
4155 This function is only used for top-level initializers; for nested
4156 ones, see c_parser_initval. */
4158 static struct c_expr
4159 c_parser_initializer (c_parser *parser)
4161 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
4162 return c_parser_braced_init (parser, NULL_TREE, false);
4163 else
4165 struct c_expr ret;
4166 location_t loc = c_parser_peek_token (parser)->location;
4167 ret = c_parser_expr_no_commas (parser, NULL);
4168 if (TREE_CODE (ret.value) != STRING_CST
4169 && TREE_CODE (ret.value) != COMPOUND_LITERAL_EXPR)
4170 ret = convert_lvalue_to_rvalue (loc, ret, true, true);
4171 return ret;
4175 /* Parse a braced initializer list. TYPE is the type specified for a
4176 compound literal, and NULL_TREE for other initializers and for
4177 nested braced lists. NESTED_P is true for nested braced lists,
4178 false for the list of a compound literal or the list that is the
4179 top-level initializer in a declaration. */
4181 static struct c_expr
4182 c_parser_braced_init (c_parser *parser, tree type, bool nested_p)
4184 struct c_expr ret;
4185 struct obstack braced_init_obstack;
4186 location_t brace_loc = c_parser_peek_token (parser)->location;
4187 gcc_obstack_init (&braced_init_obstack);
4188 gcc_assert (c_parser_next_token_is (parser, CPP_OPEN_BRACE));
4189 c_parser_consume_token (parser);
4190 if (nested_p)
4191 push_init_level (brace_loc, 0, &braced_init_obstack);
4192 else
4193 really_start_incremental_init (type);
4194 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
4196 pedwarn (brace_loc, OPT_Wpedantic, "ISO C forbids empty initializer braces");
4198 else
4200 /* Parse a non-empty initializer list, possibly with a trailing
4201 comma. */
4202 while (true)
4204 c_parser_initelt (parser, &braced_init_obstack);
4205 if (parser->error)
4206 break;
4207 if (c_parser_next_token_is (parser, CPP_COMMA))
4208 c_parser_consume_token (parser);
4209 else
4210 break;
4211 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
4212 break;
4215 if (c_parser_next_token_is_not (parser, CPP_CLOSE_BRACE))
4217 ret.value = error_mark_node;
4218 ret.original_code = ERROR_MARK;
4219 ret.original_type = NULL;
4220 c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, "expected %<}%>");
4221 pop_init_level (brace_loc, 0, &braced_init_obstack);
4222 obstack_free (&braced_init_obstack, NULL);
4223 return ret;
4225 c_parser_consume_token (parser);
4226 ret = pop_init_level (brace_loc, 0, &braced_init_obstack);
4227 obstack_free (&braced_init_obstack, NULL);
4228 return ret;
4231 /* Parse a nested initializer, including designators. */
4233 static void
4234 c_parser_initelt (c_parser *parser, struct obstack * braced_init_obstack)
4236 /* Parse any designator or designator list. A single array
4237 designator may have the subsequent "=" omitted in GNU C, but a
4238 longer list or a structure member designator may not. */
4239 if (c_parser_next_token_is (parser, CPP_NAME)
4240 && c_parser_peek_2nd_token (parser)->type == CPP_COLON)
4242 /* Old-style structure member designator. */
4243 set_init_label (c_parser_peek_token (parser)->location,
4244 c_parser_peek_token (parser)->value,
4245 braced_init_obstack);
4246 /* Use the colon as the error location. */
4247 pedwarn (c_parser_peek_2nd_token (parser)->location, OPT_Wpedantic,
4248 "obsolete use of designated initializer with %<:%>");
4249 c_parser_consume_token (parser);
4250 c_parser_consume_token (parser);
4252 else
4254 /* des_seen is 0 if there have been no designators, 1 if there
4255 has been a single array designator and 2 otherwise. */
4256 int des_seen = 0;
4257 /* Location of a designator. */
4258 location_t des_loc = UNKNOWN_LOCATION; /* Quiet warning. */
4259 while (c_parser_next_token_is (parser, CPP_OPEN_SQUARE)
4260 || c_parser_next_token_is (parser, CPP_DOT))
4262 int des_prev = des_seen;
4263 if (!des_seen)
4264 des_loc = c_parser_peek_token (parser)->location;
4265 if (des_seen < 2)
4266 des_seen++;
4267 if (c_parser_next_token_is (parser, CPP_DOT))
4269 des_seen = 2;
4270 c_parser_consume_token (parser);
4271 if (c_parser_next_token_is (parser, CPP_NAME))
4273 set_init_label (des_loc, c_parser_peek_token (parser)->value,
4274 braced_init_obstack);
4275 c_parser_consume_token (parser);
4277 else
4279 struct c_expr init;
4280 init.value = error_mark_node;
4281 init.original_code = ERROR_MARK;
4282 init.original_type = NULL;
4283 c_parser_error (parser, "expected identifier");
4284 c_parser_skip_until_found (parser, CPP_COMMA, NULL);
4285 process_init_element (input_location, init, false,
4286 braced_init_obstack);
4287 return;
4290 else
4292 tree first, second;
4293 location_t ellipsis_loc = UNKNOWN_LOCATION; /* Quiet warning. */
4294 location_t array_index_loc = UNKNOWN_LOCATION;
4295 /* ??? Following the old parser, [ objc-receiver
4296 objc-message-args ] is accepted as an initializer,
4297 being distinguished from a designator by what follows
4298 the first assignment expression inside the square
4299 brackets, but after a first array designator a
4300 subsequent square bracket is for Objective-C taken to
4301 start an expression, using the obsolete form of
4302 designated initializer without '=', rather than
4303 possibly being a second level of designation: in LALR
4304 terms, the '[' is shifted rather than reducing
4305 designator to designator-list. */
4306 if (des_prev == 1 && c_dialect_objc ())
4308 des_seen = des_prev;
4309 break;
4311 if (des_prev == 0 && c_dialect_objc ())
4313 /* This might be an array designator or an
4314 Objective-C message expression. If the former,
4315 continue parsing here; if the latter, parse the
4316 remainder of the initializer given the starting
4317 primary-expression. ??? It might make sense to
4318 distinguish when des_prev == 1 as well; see
4319 previous comment. */
4320 tree rec, args;
4321 struct c_expr mexpr;
4322 c_parser_consume_token (parser);
4323 if (c_parser_peek_token (parser)->type == CPP_NAME
4324 && ((c_parser_peek_token (parser)->id_kind
4325 == C_ID_TYPENAME)
4326 || (c_parser_peek_token (parser)->id_kind
4327 == C_ID_CLASSNAME)))
4329 /* Type name receiver. */
4330 tree id = c_parser_peek_token (parser)->value;
4331 c_parser_consume_token (parser);
4332 rec = objc_get_class_reference (id);
4333 goto parse_message_args;
4335 first = c_parser_expr_no_commas (parser, NULL).value;
4336 mark_exp_read (first);
4337 if (c_parser_next_token_is (parser, CPP_ELLIPSIS)
4338 || c_parser_next_token_is (parser, CPP_CLOSE_SQUARE))
4339 goto array_desig_after_first;
4340 /* Expression receiver. So far only one part
4341 without commas has been parsed; there might be
4342 more of the expression. */
4343 rec = first;
4344 while (c_parser_next_token_is (parser, CPP_COMMA))
4346 struct c_expr next;
4347 location_t comma_loc, exp_loc;
4348 comma_loc = c_parser_peek_token (parser)->location;
4349 c_parser_consume_token (parser);
4350 exp_loc = c_parser_peek_token (parser)->location;
4351 next = c_parser_expr_no_commas (parser, NULL);
4352 next = convert_lvalue_to_rvalue (exp_loc, next,
4353 true, true);
4354 rec = build_compound_expr (comma_loc, rec, next.value);
4356 parse_message_args:
4357 /* Now parse the objc-message-args. */
4358 args = c_parser_objc_message_args (parser);
4359 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
4360 "expected %<]%>");
4361 mexpr.value
4362 = objc_build_message_expr (rec, args);
4363 mexpr.original_code = ERROR_MARK;
4364 mexpr.original_type = NULL;
4365 /* Now parse and process the remainder of the
4366 initializer, starting with this message
4367 expression as a primary-expression. */
4368 c_parser_initval (parser, &mexpr, braced_init_obstack);
4369 return;
4371 c_parser_consume_token (parser);
4372 array_index_loc = c_parser_peek_token (parser)->location;
4373 first = c_parser_expr_no_commas (parser, NULL).value;
4374 mark_exp_read (first);
4375 array_desig_after_first:
4376 if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
4378 ellipsis_loc = c_parser_peek_token (parser)->location;
4379 c_parser_consume_token (parser);
4380 second = c_parser_expr_no_commas (parser, NULL).value;
4381 mark_exp_read (second);
4383 else
4384 second = NULL_TREE;
4385 if (c_parser_next_token_is (parser, CPP_CLOSE_SQUARE))
4387 c_parser_consume_token (parser);
4388 set_init_index (array_index_loc, first, second,
4389 braced_init_obstack);
4390 if (second)
4391 pedwarn (ellipsis_loc, OPT_Wpedantic,
4392 "ISO C forbids specifying range of elements to initialize");
4394 else
4395 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
4396 "expected %<]%>");
4399 if (des_seen >= 1)
4401 if (c_parser_next_token_is (parser, CPP_EQ))
4403 pedwarn_c90 (des_loc, OPT_Wpedantic,
4404 "ISO C90 forbids specifying subobject "
4405 "to initialize");
4406 c_parser_consume_token (parser);
4408 else
4410 if (des_seen == 1)
4411 pedwarn (c_parser_peek_token (parser)->location, OPT_Wpedantic,
4412 "obsolete use of designated initializer without %<=%>");
4413 else
4415 struct c_expr init;
4416 init.value = error_mark_node;
4417 init.original_code = ERROR_MARK;
4418 init.original_type = NULL;
4419 c_parser_error (parser, "expected %<=%>");
4420 c_parser_skip_until_found (parser, CPP_COMMA, NULL);
4421 process_init_element (input_location, init, false,
4422 braced_init_obstack);
4423 return;
4428 c_parser_initval (parser, NULL, braced_init_obstack);
4431 /* Parse a nested initializer; as c_parser_initializer but parses
4432 initializers within braced lists, after any designators have been
4433 applied. If AFTER is not NULL then it is an Objective-C message
4434 expression which is the primary-expression starting the
4435 initializer. */
4437 static void
4438 c_parser_initval (c_parser *parser, struct c_expr *after,
4439 struct obstack * braced_init_obstack)
4441 struct c_expr init;
4442 gcc_assert (!after || c_dialect_objc ());
4443 location_t loc = c_parser_peek_token (parser)->location;
4445 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE) && !after)
4446 init = c_parser_braced_init (parser, NULL_TREE, true);
4447 else
4449 init = c_parser_expr_no_commas (parser, after);
4450 if (init.value != NULL_TREE
4451 && TREE_CODE (init.value) != STRING_CST
4452 && TREE_CODE (init.value) != COMPOUND_LITERAL_EXPR)
4453 init = convert_lvalue_to_rvalue (loc, init, true, true);
4455 process_init_element (loc, init, false, braced_init_obstack);
4458 /* Parse a compound statement (possibly a function body) (C90 6.6.2,
4459 C99 6.8.2).
4461 compound-statement:
4462 { block-item-list[opt] }
4463 { label-declarations block-item-list }
4465 block-item-list:
4466 block-item
4467 block-item-list block-item
4469 block-item:
4470 nested-declaration
4471 statement
4473 nested-declaration:
4474 declaration
4476 GNU extensions:
4478 compound-statement:
4479 { label-declarations block-item-list }
4481 nested-declaration:
4482 __extension__ nested-declaration
4483 nested-function-definition
4485 label-declarations:
4486 label-declaration
4487 label-declarations label-declaration
4489 label-declaration:
4490 __label__ identifier-list ;
4492 Allowing the mixing of declarations and code is new in C99. The
4493 GNU syntax also permits (not shown above) labels at the end of
4494 compound statements, which yield an error. We don't allow labels
4495 on declarations; this might seem like a natural extension, but
4496 there would be a conflict between attributes on the label and
4497 prefix attributes on the declaration. ??? The syntax follows the
4498 old parser in requiring something after label declarations.
4499 Although they are erroneous if the labels declared aren't defined,
4500 is it useful for the syntax to be this way?
4502 OpenACC:
4504 block-item:
4505 openacc-directive
4507 openacc-directive:
4508 update-directive
4510 OpenMP:
4512 block-item:
4513 openmp-directive
4515 openmp-directive:
4516 barrier-directive
4517 flush-directive
4518 taskwait-directive
4519 taskyield-directive
4520 cancel-directive
4521 cancellation-point-directive */
4523 static tree
4524 c_parser_compound_statement (c_parser *parser)
4526 tree stmt;
4527 location_t brace_loc;
4528 brace_loc = c_parser_peek_token (parser)->location;
4529 if (!c_parser_require (parser, CPP_OPEN_BRACE, "expected %<{%>"))
4531 /* Ensure a scope is entered and left anyway to avoid confusion
4532 if we have just prepared to enter a function body. */
4533 stmt = c_begin_compound_stmt (true);
4534 c_end_compound_stmt (brace_loc, stmt, true);
4535 return error_mark_node;
4537 stmt = c_begin_compound_stmt (true);
4538 c_parser_compound_statement_nostart (parser);
4540 /* If the compound stmt contains array notations, then we expand them. */
4541 if (flag_cilkplus && contains_array_notation_expr (stmt))
4542 stmt = expand_array_notation_exprs (stmt);
4543 return c_end_compound_stmt (brace_loc, stmt, true);
4546 /* Parse a compound statement except for the opening brace. This is
4547 used for parsing both compound statements and statement expressions
4548 (which follow different paths to handling the opening). */
4550 static void
4551 c_parser_compound_statement_nostart (c_parser *parser)
4553 bool last_stmt = false;
4554 bool last_label = false;
4555 bool save_valid_for_pragma = valid_location_for_stdc_pragma_p ();
4556 location_t label_loc = UNKNOWN_LOCATION; /* Quiet warning. */
4557 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
4559 c_parser_consume_token (parser);
4560 return;
4562 mark_valid_location_for_stdc_pragma (true);
4563 if (c_parser_next_token_is_keyword (parser, RID_LABEL))
4565 /* Read zero or more forward-declarations for labels that nested
4566 functions can jump to. */
4567 mark_valid_location_for_stdc_pragma (false);
4568 while (c_parser_next_token_is_keyword (parser, RID_LABEL))
4570 label_loc = c_parser_peek_token (parser)->location;
4571 c_parser_consume_token (parser);
4572 /* Any identifiers, including those declared as type names,
4573 are OK here. */
4574 while (true)
4576 tree label;
4577 if (c_parser_next_token_is_not (parser, CPP_NAME))
4579 c_parser_error (parser, "expected identifier");
4580 break;
4582 label
4583 = declare_label (c_parser_peek_token (parser)->value);
4584 C_DECLARED_LABEL_FLAG (label) = 1;
4585 add_stmt (build_stmt (label_loc, DECL_EXPR, label));
4586 c_parser_consume_token (parser);
4587 if (c_parser_next_token_is (parser, CPP_COMMA))
4588 c_parser_consume_token (parser);
4589 else
4590 break;
4592 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
4594 pedwarn (label_loc, OPT_Wpedantic, "ISO C forbids label declarations");
4596 /* We must now have at least one statement, label or declaration. */
4597 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
4599 mark_valid_location_for_stdc_pragma (save_valid_for_pragma);
4600 c_parser_error (parser, "expected declaration or statement");
4601 c_parser_consume_token (parser);
4602 return;
4604 while (c_parser_next_token_is_not (parser, CPP_CLOSE_BRACE))
4606 location_t loc = c_parser_peek_token (parser)->location;
4607 if (c_parser_next_token_is_keyword (parser, RID_CASE)
4608 || c_parser_next_token_is_keyword (parser, RID_DEFAULT)
4609 || (c_parser_next_token_is (parser, CPP_NAME)
4610 && c_parser_peek_2nd_token (parser)->type == CPP_COLON))
4612 if (c_parser_next_token_is_keyword (parser, RID_CASE))
4613 label_loc = c_parser_peek_2nd_token (parser)->location;
4614 else
4615 label_loc = c_parser_peek_token (parser)->location;
4616 last_label = true;
4617 last_stmt = false;
4618 mark_valid_location_for_stdc_pragma (false);
4619 c_parser_label (parser);
4621 else if (!last_label
4622 && c_parser_next_tokens_start_declaration (parser))
4624 last_label = false;
4625 mark_valid_location_for_stdc_pragma (false);
4626 c_parser_declaration_or_fndef (parser, true, true, true, true,
4627 true, NULL, vNULL);
4628 if (last_stmt)
4629 pedwarn_c90 (loc, OPT_Wdeclaration_after_statement,
4630 "ISO C90 forbids mixed declarations and code");
4631 last_stmt = false;
4633 else if (!last_label
4634 && c_parser_next_token_is_keyword (parser, RID_EXTENSION))
4636 /* __extension__ can start a declaration, but is also an
4637 unary operator that can start an expression. Consume all
4638 but the last of a possible series of __extension__ to
4639 determine which. */
4640 while (c_parser_peek_2nd_token (parser)->type == CPP_KEYWORD
4641 && (c_parser_peek_2nd_token (parser)->keyword
4642 == RID_EXTENSION))
4643 c_parser_consume_token (parser);
4644 if (c_token_starts_declaration (c_parser_peek_2nd_token (parser)))
4646 int ext;
4647 ext = disable_extension_diagnostics ();
4648 c_parser_consume_token (parser);
4649 last_label = false;
4650 mark_valid_location_for_stdc_pragma (false);
4651 c_parser_declaration_or_fndef (parser, true, true, true, true,
4652 true, NULL, vNULL);
4653 /* Following the old parser, __extension__ does not
4654 disable this diagnostic. */
4655 restore_extension_diagnostics (ext);
4656 if (last_stmt)
4657 pedwarn_c90 (loc, OPT_Wdeclaration_after_statement,
4658 "ISO C90 forbids mixed declarations and code");
4659 last_stmt = false;
4661 else
4662 goto statement;
4664 else if (c_parser_next_token_is (parser, CPP_PRAGMA))
4666 /* External pragmas, and some omp pragmas, are not associated
4667 with regular c code, and so are not to be considered statements
4668 syntactically. This ensures that the user doesn't put them
4669 places that would turn into syntax errors if the directive
4670 were ignored. */
4671 if (c_parser_pragma (parser, pragma_compound))
4672 last_label = false, last_stmt = true;
4674 else if (c_parser_next_token_is (parser, CPP_EOF))
4676 mark_valid_location_for_stdc_pragma (save_valid_for_pragma);
4677 c_parser_error (parser, "expected declaration or statement");
4678 return;
4680 else if (c_parser_next_token_is_keyword (parser, RID_ELSE))
4682 if (parser->in_if_block)
4684 mark_valid_location_for_stdc_pragma (save_valid_for_pragma);
4685 error_at (loc, """expected %<}%> before %<else%>");
4686 return;
4688 else
4690 error_at (loc, "%<else%> without a previous %<if%>");
4691 c_parser_consume_token (parser);
4692 continue;
4695 else
4697 statement:
4698 last_label = false;
4699 last_stmt = true;
4700 mark_valid_location_for_stdc_pragma (false);
4701 c_parser_statement_after_labels (parser);
4704 parser->error = false;
4706 if (last_label)
4707 error_at (label_loc, "label at end of compound statement");
4708 c_parser_consume_token (parser);
4709 /* Restore the value we started with. */
4710 mark_valid_location_for_stdc_pragma (save_valid_for_pragma);
4713 /* Parse all consecutive labels. */
4715 static void
4716 c_parser_all_labels (c_parser *parser)
4718 while (c_parser_next_token_is_keyword (parser, RID_CASE)
4719 || c_parser_next_token_is_keyword (parser, RID_DEFAULT)
4720 || (c_parser_next_token_is (parser, CPP_NAME)
4721 && c_parser_peek_2nd_token (parser)->type == CPP_COLON))
4722 c_parser_label (parser);
4725 /* Parse a label (C90 6.6.1, C99 6.8.1).
4727 label:
4728 identifier : attributes[opt]
4729 case constant-expression :
4730 default :
4732 GNU extensions:
4734 label:
4735 case constant-expression ... constant-expression :
4737 The use of attributes on labels is a GNU extension. The syntax in
4738 GNU C accepts any expressions without commas, non-constant
4739 expressions being rejected later. */
4741 static void
4742 c_parser_label (c_parser *parser)
4744 location_t loc1 = c_parser_peek_token (parser)->location;
4745 tree label = NULL_TREE;
4746 if (c_parser_next_token_is_keyword (parser, RID_CASE))
4748 tree exp1, exp2;
4749 c_parser_consume_token (parser);
4750 exp1 = c_parser_expr_no_commas (parser, NULL).value;
4751 if (c_parser_next_token_is (parser, CPP_COLON))
4753 c_parser_consume_token (parser);
4754 label = do_case (loc1, exp1, NULL_TREE);
4756 else if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
4758 c_parser_consume_token (parser);
4759 exp2 = c_parser_expr_no_commas (parser, NULL).value;
4760 if (c_parser_require (parser, CPP_COLON, "expected %<:%>"))
4761 label = do_case (loc1, exp1, exp2);
4763 else
4764 c_parser_error (parser, "expected %<:%> or %<...%>");
4766 else if (c_parser_next_token_is_keyword (parser, RID_DEFAULT))
4768 c_parser_consume_token (parser);
4769 if (c_parser_require (parser, CPP_COLON, "expected %<:%>"))
4770 label = do_case (loc1, NULL_TREE, NULL_TREE);
4772 else
4774 tree name = c_parser_peek_token (parser)->value;
4775 tree tlab;
4776 tree attrs;
4777 location_t loc2 = c_parser_peek_token (parser)->location;
4778 gcc_assert (c_parser_next_token_is (parser, CPP_NAME));
4779 c_parser_consume_token (parser);
4780 gcc_assert (c_parser_next_token_is (parser, CPP_COLON));
4781 c_parser_consume_token (parser);
4782 attrs = c_parser_attributes (parser);
4783 tlab = define_label (loc2, name);
4784 if (tlab)
4786 decl_attributes (&tlab, attrs, 0);
4787 label = add_stmt (build_stmt (loc1, LABEL_EXPR, tlab));
4790 if (label)
4792 if (c_parser_next_tokens_start_declaration (parser))
4794 error_at (c_parser_peek_token (parser)->location,
4795 "a label can only be part of a statement and "
4796 "a declaration is not a statement");
4797 c_parser_declaration_or_fndef (parser, /*fndef_ok*/ false,
4798 /*static_assert_ok*/ true,
4799 /*empty_ok*/ true, /*nested*/ true,
4800 /*start_attr_ok*/ true, NULL,
4801 vNULL);
4806 /* Parse a statement (C90 6.6, C99 6.8).
4808 statement:
4809 labeled-statement
4810 compound-statement
4811 expression-statement
4812 selection-statement
4813 iteration-statement
4814 jump-statement
4816 labeled-statement:
4817 label statement
4819 expression-statement:
4820 expression[opt] ;
4822 selection-statement:
4823 if-statement
4824 switch-statement
4826 iteration-statement:
4827 while-statement
4828 do-statement
4829 for-statement
4831 jump-statement:
4832 goto identifier ;
4833 continue ;
4834 break ;
4835 return expression[opt] ;
4837 GNU extensions:
4839 statement:
4840 asm-statement
4842 jump-statement:
4843 goto * expression ;
4845 Objective-C:
4847 statement:
4848 objc-throw-statement
4849 objc-try-catch-statement
4850 objc-synchronized-statement
4852 objc-throw-statement:
4853 @throw expression ;
4854 @throw ;
4856 OpenACC:
4858 statement:
4859 openacc-construct
4861 openacc-construct:
4862 parallel-construct
4863 kernels-construct
4864 data-construct
4865 loop-construct
4867 parallel-construct:
4868 parallel-directive structured-block
4870 kernels-construct:
4871 kernels-directive structured-block
4873 data-construct:
4874 data-directive structured-block
4876 loop-construct:
4877 loop-directive structured-block
4879 OpenMP:
4881 statement:
4882 openmp-construct
4884 openmp-construct:
4885 parallel-construct
4886 for-construct
4887 simd-construct
4888 for-simd-construct
4889 sections-construct
4890 single-construct
4891 parallel-for-construct
4892 parallel-for-simd-construct
4893 parallel-sections-construct
4894 master-construct
4895 critical-construct
4896 atomic-construct
4897 ordered-construct
4899 parallel-construct:
4900 parallel-directive structured-block
4902 for-construct:
4903 for-directive iteration-statement
4905 simd-construct:
4906 simd-directive iteration-statements
4908 for-simd-construct:
4909 for-simd-directive iteration-statements
4911 sections-construct:
4912 sections-directive section-scope
4914 single-construct:
4915 single-directive structured-block
4917 parallel-for-construct:
4918 parallel-for-directive iteration-statement
4920 parallel-for-simd-construct:
4921 parallel-for-simd-directive iteration-statement
4923 parallel-sections-construct:
4924 parallel-sections-directive section-scope
4926 master-construct:
4927 master-directive structured-block
4929 critical-construct:
4930 critical-directive structured-block
4932 atomic-construct:
4933 atomic-directive expression-statement
4935 ordered-construct:
4936 ordered-directive structured-block
4938 Transactional Memory:
4940 statement:
4941 transaction-statement
4942 transaction-cancel-statement
4945 static void
4946 c_parser_statement (c_parser *parser)
4948 c_parser_all_labels (parser);
4949 c_parser_statement_after_labels (parser);
4952 /* Parse a statement, other than a labeled statement. */
4954 static void
4955 c_parser_statement_after_labels (c_parser *parser)
4957 location_t loc = c_parser_peek_token (parser)->location;
4958 tree stmt = NULL_TREE;
4959 bool in_if_block = parser->in_if_block;
4960 parser->in_if_block = false;
4961 switch (c_parser_peek_token (parser)->type)
4963 case CPP_OPEN_BRACE:
4964 add_stmt (c_parser_compound_statement (parser));
4965 break;
4966 case CPP_KEYWORD:
4967 switch (c_parser_peek_token (parser)->keyword)
4969 case RID_IF:
4970 c_parser_if_statement (parser);
4971 break;
4972 case RID_SWITCH:
4973 c_parser_switch_statement (parser);
4974 break;
4975 case RID_WHILE:
4976 c_parser_while_statement (parser, false);
4977 break;
4978 case RID_DO:
4979 c_parser_do_statement (parser, false);
4980 break;
4981 case RID_FOR:
4982 c_parser_for_statement (parser, false);
4983 break;
4984 case RID_CILK_FOR:
4985 if (!flag_cilkplus)
4987 error_at (c_parser_peek_token (parser)->location,
4988 "-fcilkplus must be enabled to use %<_Cilk_for%>");
4989 c_parser_skip_to_end_of_block_or_statement (parser);
4991 else
4992 c_parser_cilk_for (parser, integer_zero_node);
4993 break;
4994 case RID_CILK_SYNC:
4995 c_parser_consume_token (parser);
4996 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
4997 if (!flag_cilkplus)
4998 error_at (loc, "-fcilkplus must be enabled to use %<_Cilk_sync%>");
4999 else
5000 add_stmt (build_cilk_sync ());
5001 break;
5002 case RID_GOTO:
5003 c_parser_consume_token (parser);
5004 if (c_parser_next_token_is (parser, CPP_NAME))
5006 stmt = c_finish_goto_label (loc,
5007 c_parser_peek_token (parser)->value);
5008 c_parser_consume_token (parser);
5010 else if (c_parser_next_token_is (parser, CPP_MULT))
5012 struct c_expr val;
5014 c_parser_consume_token (parser);
5015 val = c_parser_expression (parser);
5016 if (check_no_cilk (val.value,
5017 "Cilk array notation cannot be used as a computed goto expression",
5018 "%<_Cilk_spawn%> statement cannot be used as a computed goto expression",
5019 loc))
5020 val.value = error_mark_node;
5021 val = convert_lvalue_to_rvalue (loc, val, false, true);
5022 stmt = c_finish_goto_ptr (loc, val.value);
5024 else
5025 c_parser_error (parser, "expected identifier or %<*%>");
5026 goto expect_semicolon;
5027 case RID_CONTINUE:
5028 c_parser_consume_token (parser);
5029 stmt = c_finish_bc_stmt (loc, &c_cont_label, false);
5030 goto expect_semicolon;
5031 case RID_BREAK:
5032 c_parser_consume_token (parser);
5033 stmt = c_finish_bc_stmt (loc, &c_break_label, true);
5034 goto expect_semicolon;
5035 case RID_RETURN:
5036 c_parser_consume_token (parser);
5037 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
5039 stmt = c_finish_return (loc, NULL_TREE, NULL_TREE);
5040 c_parser_consume_token (parser);
5042 else
5044 location_t xloc = c_parser_peek_token (parser)->location;
5045 struct c_expr expr = c_parser_expression_conv (parser);
5046 mark_exp_read (expr.value);
5047 stmt = c_finish_return (xloc, expr.value, expr.original_type);
5048 goto expect_semicolon;
5050 break;
5051 case RID_ASM:
5052 stmt = c_parser_asm_statement (parser);
5053 break;
5054 case RID_TRANSACTION_ATOMIC:
5055 case RID_TRANSACTION_RELAXED:
5056 stmt = c_parser_transaction (parser,
5057 c_parser_peek_token (parser)->keyword);
5058 break;
5059 case RID_TRANSACTION_CANCEL:
5060 stmt = c_parser_transaction_cancel (parser);
5061 goto expect_semicolon;
5062 case RID_AT_THROW:
5063 gcc_assert (c_dialect_objc ());
5064 c_parser_consume_token (parser);
5065 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
5067 stmt = objc_build_throw_stmt (loc, NULL_TREE);
5068 c_parser_consume_token (parser);
5070 else
5072 struct c_expr expr = c_parser_expression (parser);
5073 expr = convert_lvalue_to_rvalue (loc, expr, false, false);
5074 if (check_no_cilk (expr.value,
5075 "Cilk array notation cannot be used for a throw expression",
5076 "%<_Cilk_spawn%> statement cannot be used for a throw expression"))
5077 expr.value = error_mark_node;
5078 else
5080 expr.value = c_fully_fold (expr.value, false, NULL);
5081 stmt = objc_build_throw_stmt (loc, expr.value);
5083 goto expect_semicolon;
5085 break;
5086 case RID_AT_TRY:
5087 gcc_assert (c_dialect_objc ());
5088 c_parser_objc_try_catch_finally_statement (parser);
5089 break;
5090 case RID_AT_SYNCHRONIZED:
5091 gcc_assert (c_dialect_objc ());
5092 c_parser_objc_synchronized_statement (parser);
5093 break;
5094 default:
5095 goto expr_stmt;
5097 break;
5098 case CPP_SEMICOLON:
5099 c_parser_consume_token (parser);
5100 break;
5101 case CPP_CLOSE_PAREN:
5102 case CPP_CLOSE_SQUARE:
5103 /* Avoid infinite loop in error recovery:
5104 c_parser_skip_until_found stops at a closing nesting
5105 delimiter without consuming it, but here we need to consume
5106 it to proceed further. */
5107 c_parser_error (parser, "expected statement");
5108 c_parser_consume_token (parser);
5109 break;
5110 case CPP_PRAGMA:
5111 c_parser_pragma (parser, pragma_stmt);
5112 break;
5113 default:
5114 expr_stmt:
5115 stmt = c_finish_expr_stmt (loc, c_parser_expression_conv (parser).value);
5116 expect_semicolon:
5117 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
5118 break;
5120 /* Two cases cannot and do not have line numbers associated: If stmt
5121 is degenerate, such as "2;", then stmt is an INTEGER_CST, which
5122 cannot hold line numbers. But that's OK because the statement
5123 will either be changed to a MODIFY_EXPR during gimplification of
5124 the statement expr, or discarded. If stmt was compound, but
5125 without new variables, we will have skipped the creation of a
5126 BIND and will have a bare STATEMENT_LIST. But that's OK because
5127 (recursively) all of the component statements should already have
5128 line numbers assigned. ??? Can we discard no-op statements
5129 earlier? */
5130 if (CAN_HAVE_LOCATION_P (stmt)
5131 && EXPR_LOCATION (stmt) == UNKNOWN_LOCATION)
5132 SET_EXPR_LOCATION (stmt, loc);
5134 parser->in_if_block = in_if_block;
5137 /* Parse the condition from an if, do, while or for statements. */
5139 static tree
5140 c_parser_condition (c_parser *parser)
5142 location_t loc = c_parser_peek_token (parser)->location;
5143 tree cond;
5144 cond = c_parser_expression_conv (parser).value;
5145 cond = c_objc_common_truthvalue_conversion (loc, cond);
5146 cond = c_fully_fold (cond, false, NULL);
5147 if (warn_sequence_point)
5148 verify_sequence_points (cond);
5149 return cond;
5152 /* Parse a parenthesized condition from an if, do or while statement.
5154 condition:
5155 ( expression )
5157 static tree
5158 c_parser_paren_condition (c_parser *parser)
5160 tree cond;
5161 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5162 return error_mark_node;
5163 cond = c_parser_condition (parser);
5164 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
5165 return cond;
5168 /* Parse a statement which is a block in C99. */
5170 static tree
5171 c_parser_c99_block_statement (c_parser *parser)
5173 tree block = c_begin_compound_stmt (flag_isoc99);
5174 location_t loc = c_parser_peek_token (parser)->location;
5175 c_parser_statement (parser);
5176 return c_end_compound_stmt (loc, block, flag_isoc99);
5179 /* Parse the body of an if statement. This is just parsing a
5180 statement but (a) it is a block in C99, (b) we track whether the
5181 body is an if statement for the sake of -Wparentheses warnings, (c)
5182 we handle an empty body specially for the sake of -Wempty-body
5183 warnings, and (d) we call parser_compound_statement directly
5184 because c_parser_statement_after_labels resets
5185 parser->in_if_block. */
5187 static tree
5188 c_parser_if_body (c_parser *parser, bool *if_p)
5190 tree block = c_begin_compound_stmt (flag_isoc99);
5191 location_t body_loc = c_parser_peek_token (parser)->location;
5192 c_parser_all_labels (parser);
5193 *if_p = c_parser_next_token_is_keyword (parser, RID_IF);
5194 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
5196 location_t loc = c_parser_peek_token (parser)->location;
5197 add_stmt (build_empty_stmt (loc));
5198 c_parser_consume_token (parser);
5199 if (!c_parser_next_token_is_keyword (parser, RID_ELSE))
5200 warning_at (loc, OPT_Wempty_body,
5201 "suggest braces around empty body in an %<if%> statement");
5203 else if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
5204 add_stmt (c_parser_compound_statement (parser));
5205 else
5206 c_parser_statement_after_labels (parser);
5207 return c_end_compound_stmt (body_loc, block, flag_isoc99);
5210 /* Parse the else body of an if statement. This is just parsing a
5211 statement but (a) it is a block in C99, (b) we handle an empty body
5212 specially for the sake of -Wempty-body warnings. */
5214 static tree
5215 c_parser_else_body (c_parser *parser)
5217 location_t else_loc = c_parser_peek_token (parser)->location;
5218 tree block = c_begin_compound_stmt (flag_isoc99);
5219 c_parser_all_labels (parser);
5220 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
5222 location_t loc = c_parser_peek_token (parser)->location;
5223 warning_at (loc,
5224 OPT_Wempty_body,
5225 "suggest braces around empty body in an %<else%> statement");
5226 add_stmt (build_empty_stmt (loc));
5227 c_parser_consume_token (parser);
5229 else
5230 c_parser_statement_after_labels (parser);
5231 return c_end_compound_stmt (else_loc, block, flag_isoc99);
5234 /* Parse an if statement (C90 6.6.4, C99 6.8.4).
5236 if-statement:
5237 if ( expression ) statement
5238 if ( expression ) statement else statement
5241 static void
5242 c_parser_if_statement (c_parser *parser)
5244 tree block;
5245 location_t loc;
5246 tree cond;
5247 bool first_if = false;
5248 tree first_body, second_body;
5249 bool in_if_block;
5250 tree if_stmt;
5252 gcc_assert (c_parser_next_token_is_keyword (parser, RID_IF));
5253 c_parser_consume_token (parser);
5254 block = c_begin_compound_stmt (flag_isoc99);
5255 loc = c_parser_peek_token (parser)->location;
5256 cond = c_parser_paren_condition (parser);
5257 if (flag_cilkplus && contains_cilk_spawn_stmt (cond))
5259 error_at (loc, "if statement cannot contain %<Cilk_spawn%>");
5260 cond = error_mark_node;
5262 in_if_block = parser->in_if_block;
5263 parser->in_if_block = true;
5264 first_body = c_parser_if_body (parser, &first_if);
5265 parser->in_if_block = in_if_block;
5266 if (c_parser_next_token_is_keyword (parser, RID_ELSE))
5268 c_parser_consume_token (parser);
5269 second_body = c_parser_else_body (parser);
5271 else
5272 second_body = NULL_TREE;
5273 c_finish_if_stmt (loc, cond, first_body, second_body, first_if);
5274 if_stmt = c_end_compound_stmt (loc, block, flag_isoc99);
5276 /* If the if statement contains array notations, then we expand them. */
5277 if (flag_cilkplus && contains_array_notation_expr (if_stmt))
5278 if_stmt = fix_conditional_array_notations (if_stmt);
5279 add_stmt (if_stmt);
5282 /* Parse a switch statement (C90 6.6.4, C99 6.8.4).
5284 switch-statement:
5285 switch (expression) statement
5288 static void
5289 c_parser_switch_statement (c_parser *parser)
5291 struct c_expr ce;
5292 tree block, expr, body, save_break;
5293 location_t switch_loc = c_parser_peek_token (parser)->location;
5294 location_t switch_cond_loc;
5295 gcc_assert (c_parser_next_token_is_keyword (parser, RID_SWITCH));
5296 c_parser_consume_token (parser);
5297 block = c_begin_compound_stmt (flag_isoc99);
5298 bool explicit_cast_p = false;
5299 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5301 switch_cond_loc = c_parser_peek_token (parser)->location;
5302 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)
5303 && c_token_starts_typename (c_parser_peek_2nd_token (parser)))
5304 explicit_cast_p = true;
5305 ce = c_parser_expression (parser);
5306 ce = convert_lvalue_to_rvalue (switch_cond_loc, ce, true, false);
5307 expr = ce.value;
5308 /* ??? expr has no valid location? */
5309 if (check_no_cilk (expr,
5310 "Cilk array notation cannot be used as a condition for switch statement",
5311 "%<_Cilk_spawn%> statement cannot be used as a condition for switch statement",
5312 switch_cond_loc))
5313 expr = error_mark_node;
5314 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
5316 else
5318 switch_cond_loc = UNKNOWN_LOCATION;
5319 expr = error_mark_node;
5321 c_start_case (switch_loc, switch_cond_loc, expr, explicit_cast_p);
5322 save_break = c_break_label;
5323 c_break_label = NULL_TREE;
5324 body = c_parser_c99_block_statement (parser);
5325 c_finish_case (body, ce.original_type);
5326 if (c_break_label)
5328 location_t here = c_parser_peek_token (parser)->location;
5329 tree t = build1 (LABEL_EXPR, void_type_node, c_break_label);
5330 SET_EXPR_LOCATION (t, here);
5331 add_stmt (t);
5333 c_break_label = save_break;
5334 add_stmt (c_end_compound_stmt (switch_loc, block, flag_isoc99));
5337 /* Parse a while statement (C90 6.6.5, C99 6.8.5).
5339 while-statement:
5340 while (expression) statement
5343 static void
5344 c_parser_while_statement (c_parser *parser, bool ivdep)
5346 tree block, cond, body, save_break, save_cont;
5347 location_t loc;
5348 gcc_assert (c_parser_next_token_is_keyword (parser, RID_WHILE));
5349 c_parser_consume_token (parser);
5350 block = c_begin_compound_stmt (flag_isoc99);
5351 loc = c_parser_peek_token (parser)->location;
5352 cond = c_parser_paren_condition (parser);
5353 if (check_no_cilk (cond,
5354 "Cilk array notation cannot be used as a condition for while statement",
5355 "%<_Cilk_spawn%> statement cannot be used as a condition for while statement"))
5356 cond = error_mark_node;
5357 if (ivdep && cond != error_mark_node)
5358 cond = build2 (ANNOTATE_EXPR, TREE_TYPE (cond), cond,
5359 build_int_cst (integer_type_node,
5360 annot_expr_ivdep_kind));
5361 save_break = c_break_label;
5362 c_break_label = NULL_TREE;
5363 save_cont = c_cont_label;
5364 c_cont_label = NULL_TREE;
5365 body = c_parser_c99_block_statement (parser);
5366 c_finish_loop (loc, cond, NULL, body, c_break_label, c_cont_label, true);
5367 add_stmt (c_end_compound_stmt (loc, block, flag_isoc99));
5368 c_break_label = save_break;
5369 c_cont_label = save_cont;
5372 /* Parse a do statement (C90 6.6.5, C99 6.8.5).
5374 do-statement:
5375 do statement while ( expression ) ;
5378 static void
5379 c_parser_do_statement (c_parser *parser, bool ivdep)
5381 tree block, cond, body, save_break, save_cont, new_break, new_cont;
5382 location_t loc;
5383 gcc_assert (c_parser_next_token_is_keyword (parser, RID_DO));
5384 c_parser_consume_token (parser);
5385 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
5386 warning_at (c_parser_peek_token (parser)->location,
5387 OPT_Wempty_body,
5388 "suggest braces around empty body in %<do%> statement");
5389 block = c_begin_compound_stmt (flag_isoc99);
5390 loc = c_parser_peek_token (parser)->location;
5391 save_break = c_break_label;
5392 c_break_label = NULL_TREE;
5393 save_cont = c_cont_label;
5394 c_cont_label = NULL_TREE;
5395 body = c_parser_c99_block_statement (parser);
5396 c_parser_require_keyword (parser, RID_WHILE, "expected %<while%>");
5397 new_break = c_break_label;
5398 c_break_label = save_break;
5399 new_cont = c_cont_label;
5400 c_cont_label = save_cont;
5401 cond = c_parser_paren_condition (parser);
5402 if (check_no_cilk (cond,
5403 "Cilk array notation cannot be used as a condition for a do-while statement",
5404 "%<_Cilk_spawn%> statement cannot be used as a condition for a do-while statement"))
5405 cond = error_mark_node;
5406 if (ivdep && cond != error_mark_node)
5407 cond = build2 (ANNOTATE_EXPR, TREE_TYPE (cond), cond,
5408 build_int_cst (integer_type_node,
5409 annot_expr_ivdep_kind));
5410 if (!c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>"))
5411 c_parser_skip_to_end_of_block_or_statement (parser);
5412 c_finish_loop (loc, cond, NULL, body, new_break, new_cont, false);
5413 add_stmt (c_end_compound_stmt (loc, block, flag_isoc99));
5416 /* Parse a for statement (C90 6.6.5, C99 6.8.5).
5418 for-statement:
5419 for ( expression[opt] ; expression[opt] ; expression[opt] ) statement
5420 for ( nested-declaration expression[opt] ; expression[opt] ) statement
5422 The form with a declaration is new in C99.
5424 ??? In accordance with the old parser, the declaration may be a
5425 nested function, which is then rejected in check_for_loop_decls,
5426 but does it make any sense for this to be included in the grammar?
5427 Note in particular that the nested function does not include a
5428 trailing ';', whereas the "declaration" production includes one.
5429 Also, can we reject bad declarations earlier and cheaper than
5430 check_for_loop_decls?
5432 In Objective-C, there are two additional variants:
5434 foreach-statement:
5435 for ( expression in expresssion ) statement
5436 for ( declaration in expression ) statement
5438 This is inconsistent with C, because the second variant is allowed
5439 even if c99 is not enabled.
5441 The rest of the comment documents these Objective-C foreach-statement.
5443 Here is the canonical example of the first variant:
5444 for (object in array) { do something with object }
5445 we call the first expression ("object") the "object_expression" and
5446 the second expression ("array") the "collection_expression".
5447 object_expression must be an lvalue of type "id" (a generic Objective-C
5448 object) because the loop works by assigning to object_expression the
5449 various objects from the collection_expression. collection_expression
5450 must evaluate to something of type "id" which responds to the method
5451 countByEnumeratingWithState:objects:count:.
5453 The canonical example of the second variant is:
5454 for (id object in array) { do something with object }
5455 which is completely equivalent to
5457 id object;
5458 for (object in array) { do something with object }
5460 Note that initizializing 'object' in some way (eg, "for ((object =
5461 xxx) in array) { do something with object }") is possibly
5462 technically valid, but completely pointless as 'object' will be
5463 assigned to something else as soon as the loop starts. We should
5464 most likely reject it (TODO).
5466 The beginning of the Objective-C foreach-statement looks exactly
5467 like the beginning of the for-statement, and we can tell it is a
5468 foreach-statement only because the initial declaration or
5469 expression is terminated by 'in' instead of ';'.
5472 static void
5473 c_parser_for_statement (c_parser *parser, bool ivdep)
5475 tree block, cond, incr, save_break, save_cont, body;
5476 /* The following are only used when parsing an ObjC foreach statement. */
5477 tree object_expression;
5478 /* Silence the bogus uninitialized warning. */
5479 tree collection_expression = NULL;
5480 location_t loc = c_parser_peek_token (parser)->location;
5481 location_t for_loc = c_parser_peek_token (parser)->location;
5482 bool is_foreach_statement = false;
5483 gcc_assert (c_parser_next_token_is_keyword (parser, RID_FOR));
5484 c_parser_consume_token (parser);
5485 /* Open a compound statement in Objective-C as well, just in case this is
5486 as foreach expression. */
5487 block = c_begin_compound_stmt (flag_isoc99 || c_dialect_objc ());
5488 cond = error_mark_node;
5489 incr = error_mark_node;
5490 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5492 /* Parse the initialization declaration or expression. */
5493 object_expression = error_mark_node;
5494 parser->objc_could_be_foreach_context = c_dialect_objc ();
5495 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
5497 parser->objc_could_be_foreach_context = false;
5498 c_parser_consume_token (parser);
5499 c_finish_expr_stmt (loc, NULL_TREE);
5501 else if (c_parser_next_tokens_start_declaration (parser))
5503 c_parser_declaration_or_fndef (parser, true, true, true, true, true,
5504 &object_expression, vNULL);
5505 parser->objc_could_be_foreach_context = false;
5507 if (c_parser_next_token_is_keyword (parser, RID_IN))
5509 c_parser_consume_token (parser);
5510 is_foreach_statement = true;
5511 if (check_for_loop_decls (for_loc, true) == NULL_TREE)
5512 c_parser_error (parser, "multiple iterating variables in fast enumeration");
5514 else
5515 check_for_loop_decls (for_loc, flag_isoc99);
5517 else if (c_parser_next_token_is_keyword (parser, RID_EXTENSION))
5519 /* __extension__ can start a declaration, but is also an
5520 unary operator that can start an expression. Consume all
5521 but the last of a possible series of __extension__ to
5522 determine which. */
5523 while (c_parser_peek_2nd_token (parser)->type == CPP_KEYWORD
5524 && (c_parser_peek_2nd_token (parser)->keyword
5525 == RID_EXTENSION))
5526 c_parser_consume_token (parser);
5527 if (c_token_starts_declaration (c_parser_peek_2nd_token (parser)))
5529 int ext;
5530 ext = disable_extension_diagnostics ();
5531 c_parser_consume_token (parser);
5532 c_parser_declaration_or_fndef (parser, true, true, true, true,
5533 true, &object_expression, vNULL);
5534 parser->objc_could_be_foreach_context = false;
5536 restore_extension_diagnostics (ext);
5537 if (c_parser_next_token_is_keyword (parser, RID_IN))
5539 c_parser_consume_token (parser);
5540 is_foreach_statement = true;
5541 if (check_for_loop_decls (for_loc, true) == NULL_TREE)
5542 c_parser_error (parser, "multiple iterating variables in fast enumeration");
5544 else
5545 check_for_loop_decls (for_loc, flag_isoc99);
5547 else
5548 goto init_expr;
5550 else
5552 init_expr:
5554 struct c_expr ce;
5555 tree init_expression;
5556 ce = c_parser_expression (parser);
5557 /* In theory we could forbid _Cilk_spawn here, as the spec says "only in top
5558 level statement", but it works just fine, so allow it. */
5559 init_expression = ce.value;
5560 parser->objc_could_be_foreach_context = false;
5561 if (c_parser_next_token_is_keyword (parser, RID_IN))
5563 c_parser_consume_token (parser);
5564 is_foreach_statement = true;
5565 if (! lvalue_p (init_expression))
5566 c_parser_error (parser, "invalid iterating variable in fast enumeration");
5567 object_expression = c_fully_fold (init_expression, false, NULL);
5569 else
5571 ce = convert_lvalue_to_rvalue (loc, ce, true, false);
5572 init_expression = ce.value;
5573 c_finish_expr_stmt (loc, init_expression);
5574 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
5578 /* Parse the loop condition. In the case of a foreach
5579 statement, there is no loop condition. */
5580 gcc_assert (!parser->objc_could_be_foreach_context);
5581 if (!is_foreach_statement)
5583 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
5585 if (ivdep)
5587 c_parser_error (parser, "missing loop condition in loop with "
5588 "%<GCC ivdep%> pragma");
5589 cond = error_mark_node;
5591 else
5593 c_parser_consume_token (parser);
5594 cond = NULL_TREE;
5597 else
5599 cond = c_parser_condition (parser);
5600 if (check_no_cilk (cond,
5601 "Cilk array notation cannot be used in a condition for a for-loop",
5602 "%<_Cilk_spawn%> statement cannot be used in a condition for a for-loop"))
5603 cond = error_mark_node;
5604 c_parser_skip_until_found (parser, CPP_SEMICOLON,
5605 "expected %<;%>");
5607 if (ivdep && cond != error_mark_node)
5608 cond = build2 (ANNOTATE_EXPR, TREE_TYPE (cond), cond,
5609 build_int_cst (integer_type_node,
5610 annot_expr_ivdep_kind));
5612 /* Parse the increment expression (the third expression in a
5613 for-statement). In the case of a foreach-statement, this is
5614 the expression that follows the 'in'. */
5615 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
5617 if (is_foreach_statement)
5619 c_parser_error (parser, "missing collection in fast enumeration");
5620 collection_expression = error_mark_node;
5622 else
5623 incr = c_process_expr_stmt (loc, NULL_TREE);
5625 else
5627 if (is_foreach_statement)
5628 collection_expression = c_fully_fold (c_parser_expression (parser).value,
5629 false, NULL);
5630 else
5632 struct c_expr ce = c_parser_expression (parser);
5633 ce = convert_lvalue_to_rvalue (loc, ce, true, false);
5634 incr = c_process_expr_stmt (loc, ce.value);
5637 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
5639 save_break = c_break_label;
5640 c_break_label = NULL_TREE;
5641 save_cont = c_cont_label;
5642 c_cont_label = NULL_TREE;
5643 body = c_parser_c99_block_statement (parser);
5644 if (is_foreach_statement)
5645 objc_finish_foreach_loop (loc, object_expression, collection_expression, body, c_break_label, c_cont_label);
5646 else
5647 c_finish_loop (loc, cond, incr, body, c_break_label, c_cont_label, true);
5648 add_stmt (c_end_compound_stmt (loc, block, flag_isoc99 || c_dialect_objc ()));
5649 c_break_label = save_break;
5650 c_cont_label = save_cont;
5653 /* Parse an asm statement, a GNU extension. This is a full-blown asm
5654 statement with inputs, outputs, clobbers, and volatile tag
5655 allowed.
5657 asm-statement:
5658 asm type-qualifier[opt] ( asm-argument ) ;
5659 asm type-qualifier[opt] goto ( asm-goto-argument ) ;
5661 asm-argument:
5662 asm-string-literal
5663 asm-string-literal : asm-operands[opt]
5664 asm-string-literal : asm-operands[opt] : asm-operands[opt]
5665 asm-string-literal : asm-operands[opt] : asm-operands[opt] : asm-clobbers[opt]
5667 asm-goto-argument:
5668 asm-string-literal : : asm-operands[opt] : asm-clobbers[opt] \
5669 : asm-goto-operands
5671 Qualifiers other than volatile are accepted in the syntax but
5672 warned for. */
5674 static tree
5675 c_parser_asm_statement (c_parser *parser)
5677 tree quals, str, outputs, inputs, clobbers, labels, ret;
5678 bool simple, is_goto;
5679 location_t asm_loc = c_parser_peek_token (parser)->location;
5680 int section, nsections;
5682 gcc_assert (c_parser_next_token_is_keyword (parser, RID_ASM));
5683 c_parser_consume_token (parser);
5684 if (c_parser_next_token_is_keyword (parser, RID_VOLATILE))
5686 quals = c_parser_peek_token (parser)->value;
5687 c_parser_consume_token (parser);
5689 else if (c_parser_next_token_is_keyword (parser, RID_CONST)
5690 || c_parser_next_token_is_keyword (parser, RID_RESTRICT))
5692 warning_at (c_parser_peek_token (parser)->location,
5694 "%E qualifier ignored on asm",
5695 c_parser_peek_token (parser)->value);
5696 quals = NULL_TREE;
5697 c_parser_consume_token (parser);
5699 else
5700 quals = NULL_TREE;
5702 is_goto = false;
5703 if (c_parser_next_token_is_keyword (parser, RID_GOTO))
5705 c_parser_consume_token (parser);
5706 is_goto = true;
5709 /* ??? Follow the C++ parser rather than using the
5710 lex_untranslated_string kludge. */
5711 parser->lex_untranslated_string = true;
5712 ret = NULL;
5714 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5715 goto error;
5717 str = c_parser_asm_string_literal (parser);
5718 if (str == NULL_TREE)
5719 goto error_close_paren;
5721 simple = true;
5722 outputs = NULL_TREE;
5723 inputs = NULL_TREE;
5724 clobbers = NULL_TREE;
5725 labels = NULL_TREE;
5727 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN) && !is_goto)
5728 goto done_asm;
5730 /* Parse each colon-delimited section of operands. */
5731 nsections = 3 + is_goto;
5732 for (section = 0; section < nsections; ++section)
5734 if (!c_parser_require (parser, CPP_COLON,
5735 is_goto
5736 ? "expected %<:%>"
5737 : "expected %<:%> or %<)%>"))
5738 goto error_close_paren;
5740 /* Once past any colon, we're no longer a simple asm. */
5741 simple = false;
5743 if ((!c_parser_next_token_is (parser, CPP_COLON)
5744 && !c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
5745 || section == 3)
5746 switch (section)
5748 case 0:
5749 /* For asm goto, we don't allow output operands, but reserve
5750 the slot for a future extension that does allow them. */
5751 if (!is_goto)
5752 outputs = c_parser_asm_operands (parser);
5753 break;
5754 case 1:
5755 inputs = c_parser_asm_operands (parser);
5756 break;
5757 case 2:
5758 clobbers = c_parser_asm_clobbers (parser);
5759 break;
5760 case 3:
5761 labels = c_parser_asm_goto_operands (parser);
5762 break;
5763 default:
5764 gcc_unreachable ();
5767 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN) && !is_goto)
5768 goto done_asm;
5771 done_asm:
5772 if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
5774 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5775 goto error;
5778 if (!c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>"))
5779 c_parser_skip_to_end_of_block_or_statement (parser);
5781 ret = build_asm_stmt (quals, build_asm_expr (asm_loc, str, outputs, inputs,
5782 clobbers, labels, simple));
5784 error:
5785 parser->lex_untranslated_string = false;
5786 return ret;
5788 error_close_paren:
5789 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5790 goto error;
5793 /* Parse asm operands, a GNU extension.
5795 asm-operands:
5796 asm-operand
5797 asm-operands , asm-operand
5799 asm-operand:
5800 asm-string-literal ( expression )
5801 [ identifier ] asm-string-literal ( expression )
5804 static tree
5805 c_parser_asm_operands (c_parser *parser)
5807 tree list = NULL_TREE;
5808 while (true)
5810 tree name, str;
5811 struct c_expr expr;
5812 if (c_parser_next_token_is (parser, CPP_OPEN_SQUARE))
5814 c_parser_consume_token (parser);
5815 if (c_parser_next_token_is (parser, CPP_NAME))
5817 tree id = c_parser_peek_token (parser)->value;
5818 c_parser_consume_token (parser);
5819 name = build_string (IDENTIFIER_LENGTH (id),
5820 IDENTIFIER_POINTER (id));
5822 else
5824 c_parser_error (parser, "expected identifier");
5825 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, NULL);
5826 return NULL_TREE;
5828 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
5829 "expected %<]%>");
5831 else
5832 name = NULL_TREE;
5833 str = c_parser_asm_string_literal (parser);
5834 if (str == NULL_TREE)
5835 return NULL_TREE;
5836 parser->lex_untranslated_string = false;
5837 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5839 parser->lex_untranslated_string = true;
5840 return NULL_TREE;
5842 expr = c_parser_expression (parser);
5843 mark_exp_read (expr.value);
5844 parser->lex_untranslated_string = true;
5845 if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
5847 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5848 return NULL_TREE;
5850 list = chainon (list, build_tree_list (build_tree_list (name, str),
5851 expr.value));
5852 if (c_parser_next_token_is (parser, CPP_COMMA))
5853 c_parser_consume_token (parser);
5854 else
5855 break;
5857 return list;
5860 /* Parse asm clobbers, a GNU extension.
5862 asm-clobbers:
5863 asm-string-literal
5864 asm-clobbers , asm-string-literal
5867 static tree
5868 c_parser_asm_clobbers (c_parser *parser)
5870 tree list = NULL_TREE;
5871 while (true)
5873 tree str = c_parser_asm_string_literal (parser);
5874 if (str)
5875 list = tree_cons (NULL_TREE, str, list);
5876 else
5877 return NULL_TREE;
5878 if (c_parser_next_token_is (parser, CPP_COMMA))
5879 c_parser_consume_token (parser);
5880 else
5881 break;
5883 return list;
5886 /* Parse asm goto labels, a GNU extension.
5888 asm-goto-operands:
5889 identifier
5890 asm-goto-operands , identifier
5893 static tree
5894 c_parser_asm_goto_operands (c_parser *parser)
5896 tree list = NULL_TREE;
5897 while (true)
5899 tree name, label;
5901 if (c_parser_next_token_is (parser, CPP_NAME))
5903 c_token *tok = c_parser_peek_token (parser);
5904 name = tok->value;
5905 label = lookup_label_for_goto (tok->location, name);
5906 c_parser_consume_token (parser);
5907 TREE_USED (label) = 1;
5909 else
5911 c_parser_error (parser, "expected identifier");
5912 return NULL_TREE;
5915 name = build_string (IDENTIFIER_LENGTH (name),
5916 IDENTIFIER_POINTER (name));
5917 list = tree_cons (name, label, list);
5918 if (c_parser_next_token_is (parser, CPP_COMMA))
5919 c_parser_consume_token (parser);
5920 else
5921 return nreverse (list);
5925 /* Parse an expression other than a compound expression; that is, an
5926 assignment expression (C90 6.3.16, C99 6.5.16). If AFTER is not
5927 NULL then it is an Objective-C message expression which is the
5928 primary-expression starting the expression as an initializer.
5930 assignment-expression:
5931 conditional-expression
5932 unary-expression assignment-operator assignment-expression
5934 assignment-operator: one of
5935 = *= /= %= += -= <<= >>= &= ^= |=
5937 In GNU C we accept any conditional expression on the LHS and
5938 diagnose the invalid lvalue rather than producing a syntax
5939 error. */
5941 static struct c_expr
5942 c_parser_expr_no_commas (c_parser *parser, struct c_expr *after,
5943 tree omp_atomic_lhs)
5945 struct c_expr lhs, rhs, ret;
5946 enum tree_code code;
5947 location_t op_location, exp_location;
5948 gcc_assert (!after || c_dialect_objc ());
5949 lhs = c_parser_conditional_expression (parser, after, omp_atomic_lhs);
5950 op_location = c_parser_peek_token (parser)->location;
5951 switch (c_parser_peek_token (parser)->type)
5953 case CPP_EQ:
5954 code = NOP_EXPR;
5955 break;
5956 case CPP_MULT_EQ:
5957 code = MULT_EXPR;
5958 break;
5959 case CPP_DIV_EQ:
5960 code = TRUNC_DIV_EXPR;
5961 break;
5962 case CPP_MOD_EQ:
5963 code = TRUNC_MOD_EXPR;
5964 break;
5965 case CPP_PLUS_EQ:
5966 code = PLUS_EXPR;
5967 break;
5968 case CPP_MINUS_EQ:
5969 code = MINUS_EXPR;
5970 break;
5971 case CPP_LSHIFT_EQ:
5972 code = LSHIFT_EXPR;
5973 break;
5974 case CPP_RSHIFT_EQ:
5975 code = RSHIFT_EXPR;
5976 break;
5977 case CPP_AND_EQ:
5978 code = BIT_AND_EXPR;
5979 break;
5980 case CPP_XOR_EQ:
5981 code = BIT_XOR_EXPR;
5982 break;
5983 case CPP_OR_EQ:
5984 code = BIT_IOR_EXPR;
5985 break;
5986 default:
5987 return lhs;
5989 c_parser_consume_token (parser);
5990 exp_location = c_parser_peek_token (parser)->location;
5991 rhs = c_parser_expr_no_commas (parser, NULL);
5992 rhs = convert_lvalue_to_rvalue (exp_location, rhs, true, true);
5994 ret.value = build_modify_expr (op_location, lhs.value, lhs.original_type,
5995 code, exp_location, rhs.value,
5996 rhs.original_type);
5997 if (code == NOP_EXPR)
5998 ret.original_code = MODIFY_EXPR;
5999 else
6001 TREE_NO_WARNING (ret.value) = 1;
6002 ret.original_code = ERROR_MARK;
6004 ret.original_type = NULL;
6005 return ret;
6008 /* Parse a conditional expression (C90 6.3.15, C99 6.5.15). If AFTER
6009 is not NULL then it is an Objective-C message expression which is
6010 the primary-expression starting the expression as an initializer.
6012 conditional-expression:
6013 logical-OR-expression
6014 logical-OR-expression ? expression : conditional-expression
6016 GNU extensions:
6018 conditional-expression:
6019 logical-OR-expression ? : conditional-expression
6022 static struct c_expr
6023 c_parser_conditional_expression (c_parser *parser, struct c_expr *after,
6024 tree omp_atomic_lhs)
6026 struct c_expr cond, exp1, exp2, ret;
6027 location_t cond_loc, colon_loc, middle_loc;
6029 gcc_assert (!after || c_dialect_objc ());
6031 cond = c_parser_binary_expression (parser, after, omp_atomic_lhs);
6033 if (c_parser_next_token_is_not (parser, CPP_QUERY))
6034 return cond;
6035 cond_loc = c_parser_peek_token (parser)->location;
6036 cond = convert_lvalue_to_rvalue (cond_loc, cond, true, true);
6037 c_parser_consume_token (parser);
6038 if (c_parser_next_token_is (parser, CPP_COLON))
6040 tree eptype = NULL_TREE;
6042 middle_loc = c_parser_peek_token (parser)->location;
6043 pedwarn (middle_loc, OPT_Wpedantic,
6044 "ISO C forbids omitting the middle term of a ?: expression");
6045 warn_for_omitted_condop (middle_loc, cond.value);
6046 if (TREE_CODE (cond.value) == EXCESS_PRECISION_EXPR)
6048 eptype = TREE_TYPE (cond.value);
6049 cond.value = TREE_OPERAND (cond.value, 0);
6051 /* Make sure first operand is calculated only once. */
6052 exp1.value = c_save_expr (default_conversion (cond.value));
6053 if (eptype)
6054 exp1.value = build1 (EXCESS_PRECISION_EXPR, eptype, exp1.value);
6055 exp1.original_type = NULL;
6056 cond.value = c_objc_common_truthvalue_conversion (cond_loc, exp1.value);
6057 c_inhibit_evaluation_warnings += cond.value == truthvalue_true_node;
6059 else
6061 cond.value
6062 = c_objc_common_truthvalue_conversion
6063 (cond_loc, default_conversion (cond.value));
6064 c_inhibit_evaluation_warnings += cond.value == truthvalue_false_node;
6065 exp1 = c_parser_expression_conv (parser);
6066 mark_exp_read (exp1.value);
6067 c_inhibit_evaluation_warnings +=
6068 ((cond.value == truthvalue_true_node)
6069 - (cond.value == truthvalue_false_node));
6072 colon_loc = c_parser_peek_token (parser)->location;
6073 if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
6075 c_inhibit_evaluation_warnings -= cond.value == truthvalue_true_node;
6076 ret.value = error_mark_node;
6077 ret.original_code = ERROR_MARK;
6078 ret.original_type = NULL;
6079 return ret;
6082 location_t exp2_loc = c_parser_peek_token (parser)->location;
6083 exp2 = c_parser_conditional_expression (parser, NULL, NULL_TREE);
6084 exp2 = convert_lvalue_to_rvalue (exp2_loc, exp2, true, true);
6086 c_inhibit_evaluation_warnings -= cond.value == truthvalue_true_node;
6087 ret.value = build_conditional_expr (colon_loc, cond.value,
6088 cond.original_code == C_MAYBE_CONST_EXPR,
6089 exp1.value, exp1.original_type,
6090 exp2.value, exp2.original_type);
6091 ret.original_code = ERROR_MARK;
6092 if (exp1.value == error_mark_node || exp2.value == error_mark_node)
6093 ret.original_type = NULL;
6094 else
6096 tree t1, t2;
6098 /* If both sides are enum type, the default conversion will have
6099 made the type of the result be an integer type. We want to
6100 remember the enum types we started with. */
6101 t1 = exp1.original_type ? exp1.original_type : TREE_TYPE (exp1.value);
6102 t2 = exp2.original_type ? exp2.original_type : TREE_TYPE (exp2.value);
6103 ret.original_type = ((t1 != error_mark_node
6104 && t2 != error_mark_node
6105 && (TYPE_MAIN_VARIANT (t1)
6106 == TYPE_MAIN_VARIANT (t2)))
6107 ? t1
6108 : NULL);
6110 return ret;
6113 /* Parse a binary expression; that is, a logical-OR-expression (C90
6114 6.3.5-6.3.14, C99 6.5.5-6.5.14). If AFTER is not NULL then it is
6115 an Objective-C message expression which is the primary-expression
6116 starting the expression as an initializer.
6118 OMP_ATOMIC_LHS is NULL, unless parsing OpenMP #pragma omp atomic,
6119 when it should be the unfolded lhs. In a valid OpenMP source,
6120 one of the operands of the toplevel binary expression must be equal
6121 to it. In that case, just return a build2 created binary operation
6122 rather than result of parser_build_binary_op.
6124 multiplicative-expression:
6125 cast-expression
6126 multiplicative-expression * cast-expression
6127 multiplicative-expression / cast-expression
6128 multiplicative-expression % cast-expression
6130 additive-expression:
6131 multiplicative-expression
6132 additive-expression + multiplicative-expression
6133 additive-expression - multiplicative-expression
6135 shift-expression:
6136 additive-expression
6137 shift-expression << additive-expression
6138 shift-expression >> additive-expression
6140 relational-expression:
6141 shift-expression
6142 relational-expression < shift-expression
6143 relational-expression > shift-expression
6144 relational-expression <= shift-expression
6145 relational-expression >= shift-expression
6147 equality-expression:
6148 relational-expression
6149 equality-expression == relational-expression
6150 equality-expression != relational-expression
6152 AND-expression:
6153 equality-expression
6154 AND-expression & equality-expression
6156 exclusive-OR-expression:
6157 AND-expression
6158 exclusive-OR-expression ^ AND-expression
6160 inclusive-OR-expression:
6161 exclusive-OR-expression
6162 inclusive-OR-expression | exclusive-OR-expression
6164 logical-AND-expression:
6165 inclusive-OR-expression
6166 logical-AND-expression && inclusive-OR-expression
6168 logical-OR-expression:
6169 logical-AND-expression
6170 logical-OR-expression || logical-AND-expression
6173 static struct c_expr
6174 c_parser_binary_expression (c_parser *parser, struct c_expr *after,
6175 tree omp_atomic_lhs)
6177 /* A binary expression is parsed using operator-precedence parsing,
6178 with the operands being cast expressions. All the binary
6179 operators are left-associative. Thus a binary expression is of
6180 form:
6182 E0 op1 E1 op2 E2 ...
6184 which we represent on a stack. On the stack, the precedence
6185 levels are strictly increasing. When a new operator is
6186 encountered of higher precedence than that at the top of the
6187 stack, it is pushed; its LHS is the top expression, and its RHS
6188 is everything parsed until it is popped. When a new operator is
6189 encountered with precedence less than or equal to that at the top
6190 of the stack, triples E[i-1] op[i] E[i] are popped and replaced
6191 by the result of the operation until the operator at the top of
6192 the stack has lower precedence than the new operator or there is
6193 only one element on the stack; then the top expression is the LHS
6194 of the new operator. In the case of logical AND and OR
6195 expressions, we also need to adjust c_inhibit_evaluation_warnings
6196 as appropriate when the operators are pushed and popped. */
6198 struct {
6199 /* The expression at this stack level. */
6200 struct c_expr expr;
6201 /* The precedence of the operator on its left, PREC_NONE at the
6202 bottom of the stack. */
6203 enum c_parser_prec prec;
6204 /* The operation on its left. */
6205 enum tree_code op;
6206 /* The source location of this operation. */
6207 location_t loc;
6208 } stack[NUM_PRECS];
6209 int sp;
6210 /* Location of the binary operator. */
6211 location_t binary_loc = UNKNOWN_LOCATION; /* Quiet warning. */
6212 #define POP \
6213 do { \
6214 switch (stack[sp].op) \
6216 case TRUTH_ANDIF_EXPR: \
6217 c_inhibit_evaluation_warnings -= (stack[sp - 1].expr.value \
6218 == truthvalue_false_node); \
6219 break; \
6220 case TRUTH_ORIF_EXPR: \
6221 c_inhibit_evaluation_warnings -= (stack[sp - 1].expr.value \
6222 == truthvalue_true_node); \
6223 break; \
6224 default: \
6225 break; \
6227 stack[sp - 1].expr \
6228 = convert_lvalue_to_rvalue (stack[sp - 1].loc, \
6229 stack[sp - 1].expr, true, true); \
6230 stack[sp].expr \
6231 = convert_lvalue_to_rvalue (stack[sp].loc, \
6232 stack[sp].expr, true, true); \
6233 if (__builtin_expect (omp_atomic_lhs != NULL_TREE, 0) && sp == 1 \
6234 && c_parser_peek_token (parser)->type == CPP_SEMICOLON \
6235 && ((1 << stack[sp].prec) \
6236 & ((1 << PREC_BITOR) | (1 << PREC_BITXOR) | (1 << PREC_BITAND) \
6237 | (1 << PREC_SHIFT) | (1 << PREC_ADD) | (1 << PREC_MULT))) \
6238 && stack[sp].op != TRUNC_MOD_EXPR \
6239 && stack[0].expr.value != error_mark_node \
6240 && stack[1].expr.value != error_mark_node \
6241 && (c_tree_equal (stack[0].expr.value, omp_atomic_lhs) \
6242 || c_tree_equal (stack[1].expr.value, omp_atomic_lhs))) \
6243 stack[0].expr.value \
6244 = build2 (stack[1].op, TREE_TYPE (stack[0].expr.value), \
6245 stack[0].expr.value, stack[1].expr.value); \
6246 else \
6247 stack[sp - 1].expr = parser_build_binary_op (stack[sp].loc, \
6248 stack[sp].op, \
6249 stack[sp - 1].expr, \
6250 stack[sp].expr); \
6251 sp--; \
6252 } while (0)
6253 gcc_assert (!after || c_dialect_objc ());
6254 stack[0].loc = c_parser_peek_token (parser)->location;
6255 stack[0].expr = c_parser_cast_expression (parser, after);
6256 stack[0].prec = PREC_NONE;
6257 sp = 0;
6258 while (true)
6260 enum c_parser_prec oprec;
6261 enum tree_code ocode;
6262 if (parser->error)
6263 goto out;
6264 switch (c_parser_peek_token (parser)->type)
6266 case CPP_MULT:
6267 oprec = PREC_MULT;
6268 ocode = MULT_EXPR;
6269 break;
6270 case CPP_DIV:
6271 oprec = PREC_MULT;
6272 ocode = TRUNC_DIV_EXPR;
6273 break;
6274 case CPP_MOD:
6275 oprec = PREC_MULT;
6276 ocode = TRUNC_MOD_EXPR;
6277 break;
6278 case CPP_PLUS:
6279 oprec = PREC_ADD;
6280 ocode = PLUS_EXPR;
6281 break;
6282 case CPP_MINUS:
6283 oprec = PREC_ADD;
6284 ocode = MINUS_EXPR;
6285 break;
6286 case CPP_LSHIFT:
6287 oprec = PREC_SHIFT;
6288 ocode = LSHIFT_EXPR;
6289 break;
6290 case CPP_RSHIFT:
6291 oprec = PREC_SHIFT;
6292 ocode = RSHIFT_EXPR;
6293 break;
6294 case CPP_LESS:
6295 oprec = PREC_REL;
6296 ocode = LT_EXPR;
6297 break;
6298 case CPP_GREATER:
6299 oprec = PREC_REL;
6300 ocode = GT_EXPR;
6301 break;
6302 case CPP_LESS_EQ:
6303 oprec = PREC_REL;
6304 ocode = LE_EXPR;
6305 break;
6306 case CPP_GREATER_EQ:
6307 oprec = PREC_REL;
6308 ocode = GE_EXPR;
6309 break;
6310 case CPP_EQ_EQ:
6311 oprec = PREC_EQ;
6312 ocode = EQ_EXPR;
6313 break;
6314 case CPP_NOT_EQ:
6315 oprec = PREC_EQ;
6316 ocode = NE_EXPR;
6317 break;
6318 case CPP_AND:
6319 oprec = PREC_BITAND;
6320 ocode = BIT_AND_EXPR;
6321 break;
6322 case CPP_XOR:
6323 oprec = PREC_BITXOR;
6324 ocode = BIT_XOR_EXPR;
6325 break;
6326 case CPP_OR:
6327 oprec = PREC_BITOR;
6328 ocode = BIT_IOR_EXPR;
6329 break;
6330 case CPP_AND_AND:
6331 oprec = PREC_LOGAND;
6332 ocode = TRUTH_ANDIF_EXPR;
6333 break;
6334 case CPP_OR_OR:
6335 oprec = PREC_LOGOR;
6336 ocode = TRUTH_ORIF_EXPR;
6337 break;
6338 default:
6339 /* Not a binary operator, so end of the binary
6340 expression. */
6341 goto out;
6343 binary_loc = c_parser_peek_token (parser)->location;
6344 while (oprec <= stack[sp].prec)
6345 POP;
6346 c_parser_consume_token (parser);
6347 switch (ocode)
6349 case TRUTH_ANDIF_EXPR:
6350 stack[sp].expr
6351 = convert_lvalue_to_rvalue (stack[sp].loc,
6352 stack[sp].expr, true, true);
6353 stack[sp].expr.value = c_objc_common_truthvalue_conversion
6354 (stack[sp].loc, default_conversion (stack[sp].expr.value));
6355 c_inhibit_evaluation_warnings += (stack[sp].expr.value
6356 == truthvalue_false_node);
6357 break;
6358 case TRUTH_ORIF_EXPR:
6359 stack[sp].expr
6360 = convert_lvalue_to_rvalue (stack[sp].loc,
6361 stack[sp].expr, true, true);
6362 stack[sp].expr.value = c_objc_common_truthvalue_conversion
6363 (stack[sp].loc, default_conversion (stack[sp].expr.value));
6364 c_inhibit_evaluation_warnings += (stack[sp].expr.value
6365 == truthvalue_true_node);
6366 break;
6367 default:
6368 break;
6370 sp++;
6371 stack[sp].loc = binary_loc;
6372 stack[sp].expr = c_parser_cast_expression (parser, NULL);
6373 stack[sp].prec = oprec;
6374 stack[sp].op = ocode;
6375 stack[sp].loc = binary_loc;
6377 out:
6378 while (sp > 0)
6379 POP;
6380 return stack[0].expr;
6381 #undef POP
6384 /* Parse a cast expression (C90 6.3.4, C99 6.5.4). If AFTER is not
6385 NULL then it is an Objective-C message expression which is the
6386 primary-expression starting the expression as an initializer.
6388 cast-expression:
6389 unary-expression
6390 ( type-name ) unary-expression
6393 static struct c_expr
6394 c_parser_cast_expression (c_parser *parser, struct c_expr *after)
6396 location_t cast_loc = c_parser_peek_token (parser)->location;
6397 gcc_assert (!after || c_dialect_objc ());
6398 if (after)
6399 return c_parser_postfix_expression_after_primary (parser,
6400 cast_loc, *after);
6401 /* If the expression begins with a parenthesized type name, it may
6402 be either a cast or a compound literal; we need to see whether
6403 the next character is '{' to tell the difference. If not, it is
6404 an unary expression. Full detection of unknown typenames here
6405 would require a 3-token lookahead. */
6406 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)
6407 && c_token_starts_typename (c_parser_peek_2nd_token (parser)))
6409 struct c_type_name *type_name;
6410 struct c_expr ret;
6411 struct c_expr expr;
6412 c_parser_consume_token (parser);
6413 type_name = c_parser_type_name (parser);
6414 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
6415 if (type_name == NULL)
6417 ret.value = error_mark_node;
6418 ret.original_code = ERROR_MARK;
6419 ret.original_type = NULL;
6420 return ret;
6423 /* Save casted types in the function's used types hash table. */
6424 used_types_insert (type_name->specs->type);
6426 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
6427 return c_parser_postfix_expression_after_paren_type (parser, type_name,
6428 cast_loc);
6430 location_t expr_loc = c_parser_peek_token (parser)->location;
6431 expr = c_parser_cast_expression (parser, NULL);
6432 expr = convert_lvalue_to_rvalue (expr_loc, expr, true, true);
6434 ret.value = c_cast_expr (cast_loc, type_name, expr.value);
6435 ret.original_code = ERROR_MARK;
6436 ret.original_type = NULL;
6437 return ret;
6439 else
6440 return c_parser_unary_expression (parser);
6443 /* Parse an unary expression (C90 6.3.3, C99 6.5.3).
6445 unary-expression:
6446 postfix-expression
6447 ++ unary-expression
6448 -- unary-expression
6449 unary-operator cast-expression
6450 sizeof unary-expression
6451 sizeof ( type-name )
6453 unary-operator: one of
6454 & * + - ~ !
6456 GNU extensions:
6458 unary-expression:
6459 __alignof__ unary-expression
6460 __alignof__ ( type-name )
6461 && identifier
6463 (C11 permits _Alignof with type names only.)
6465 unary-operator: one of
6466 __extension__ __real__ __imag__
6468 Transactional Memory:
6470 unary-expression:
6471 transaction-expression
6473 In addition, the GNU syntax treats ++ and -- as unary operators, so
6474 they may be applied to cast expressions with errors for non-lvalues
6475 given later. */
6477 static struct c_expr
6478 c_parser_unary_expression (c_parser *parser)
6480 int ext;
6481 struct c_expr ret, op;
6482 location_t op_loc = c_parser_peek_token (parser)->location;
6483 location_t exp_loc;
6484 ret.original_code = ERROR_MARK;
6485 ret.original_type = NULL;
6486 switch (c_parser_peek_token (parser)->type)
6488 case CPP_PLUS_PLUS:
6489 c_parser_consume_token (parser);
6490 exp_loc = c_parser_peek_token (parser)->location;
6491 op = c_parser_cast_expression (parser, NULL);
6493 /* If there is array notations in op, we expand them. */
6494 if (flag_cilkplus && TREE_CODE (op.value) == ARRAY_NOTATION_REF)
6495 return fix_array_notation_expr (exp_loc, PREINCREMENT_EXPR, op);
6496 else
6498 op = default_function_array_read_conversion (exp_loc, op);
6499 return parser_build_unary_op (op_loc, PREINCREMENT_EXPR, op);
6501 case CPP_MINUS_MINUS:
6502 c_parser_consume_token (parser);
6503 exp_loc = c_parser_peek_token (parser)->location;
6504 op = c_parser_cast_expression (parser, NULL);
6506 /* If there is array notations in op, we expand them. */
6507 if (flag_cilkplus && TREE_CODE (op.value) == ARRAY_NOTATION_REF)
6508 return fix_array_notation_expr (exp_loc, PREDECREMENT_EXPR, op);
6509 else
6511 op = default_function_array_read_conversion (exp_loc, op);
6512 return parser_build_unary_op (op_loc, PREDECREMENT_EXPR, op);
6514 case CPP_AND:
6515 c_parser_consume_token (parser);
6516 op = c_parser_cast_expression (parser, NULL);
6517 mark_exp_read (op.value);
6518 return parser_build_unary_op (op_loc, ADDR_EXPR, op);
6519 case CPP_MULT:
6520 c_parser_consume_token (parser);
6521 exp_loc = c_parser_peek_token (parser)->location;
6522 op = c_parser_cast_expression (parser, NULL);
6523 op = convert_lvalue_to_rvalue (exp_loc, op, true, true);
6524 ret.value = build_indirect_ref (op_loc, op.value, RO_UNARY_STAR);
6525 return ret;
6526 case CPP_PLUS:
6527 if (!c_dialect_objc () && !in_system_header_at (input_location))
6528 warning_at (op_loc,
6529 OPT_Wtraditional,
6530 "traditional C rejects the unary plus operator");
6531 c_parser_consume_token (parser);
6532 exp_loc = c_parser_peek_token (parser)->location;
6533 op = c_parser_cast_expression (parser, NULL);
6534 op = convert_lvalue_to_rvalue (exp_loc, op, true, true);
6535 return parser_build_unary_op (op_loc, CONVERT_EXPR, op);
6536 case CPP_MINUS:
6537 c_parser_consume_token (parser);
6538 exp_loc = c_parser_peek_token (parser)->location;
6539 op = c_parser_cast_expression (parser, NULL);
6540 op = convert_lvalue_to_rvalue (exp_loc, op, true, true);
6541 return parser_build_unary_op (op_loc, NEGATE_EXPR, op);
6542 case CPP_COMPL:
6543 c_parser_consume_token (parser);
6544 exp_loc = c_parser_peek_token (parser)->location;
6545 op = c_parser_cast_expression (parser, NULL);
6546 op = convert_lvalue_to_rvalue (exp_loc, op, true, true);
6547 return parser_build_unary_op (op_loc, BIT_NOT_EXPR, op);
6548 case CPP_NOT:
6549 c_parser_consume_token (parser);
6550 exp_loc = c_parser_peek_token (parser)->location;
6551 op = c_parser_cast_expression (parser, NULL);
6552 op = convert_lvalue_to_rvalue (exp_loc, op, true, true);
6553 return parser_build_unary_op (op_loc, TRUTH_NOT_EXPR, op);
6554 case CPP_AND_AND:
6555 /* Refer to the address of a label as a pointer. */
6556 c_parser_consume_token (parser);
6557 if (c_parser_next_token_is (parser, CPP_NAME))
6559 ret.value = finish_label_address_expr
6560 (c_parser_peek_token (parser)->value, op_loc);
6561 c_parser_consume_token (parser);
6563 else
6565 c_parser_error (parser, "expected identifier");
6566 ret.value = error_mark_node;
6568 return ret;
6569 case CPP_KEYWORD:
6570 switch (c_parser_peek_token (parser)->keyword)
6572 case RID_SIZEOF:
6573 return c_parser_sizeof_expression (parser);
6574 case RID_ALIGNOF:
6575 return c_parser_alignof_expression (parser);
6576 case RID_EXTENSION:
6577 c_parser_consume_token (parser);
6578 ext = disable_extension_diagnostics ();
6579 ret = c_parser_cast_expression (parser, NULL);
6580 restore_extension_diagnostics (ext);
6581 return ret;
6582 case RID_REALPART:
6583 c_parser_consume_token (parser);
6584 exp_loc = c_parser_peek_token (parser)->location;
6585 op = c_parser_cast_expression (parser, NULL);
6586 op = default_function_array_conversion (exp_loc, op);
6587 return parser_build_unary_op (op_loc, REALPART_EXPR, op);
6588 case RID_IMAGPART:
6589 c_parser_consume_token (parser);
6590 exp_loc = c_parser_peek_token (parser)->location;
6591 op = c_parser_cast_expression (parser, NULL);
6592 op = default_function_array_conversion (exp_loc, op);
6593 return parser_build_unary_op (op_loc, IMAGPART_EXPR, op);
6594 case RID_TRANSACTION_ATOMIC:
6595 case RID_TRANSACTION_RELAXED:
6596 return c_parser_transaction_expression (parser,
6597 c_parser_peek_token (parser)->keyword);
6598 default:
6599 return c_parser_postfix_expression (parser);
6601 default:
6602 return c_parser_postfix_expression (parser);
6606 /* Parse a sizeof expression. */
6608 static struct c_expr
6609 c_parser_sizeof_expression (c_parser *parser)
6611 struct c_expr expr;
6612 location_t expr_loc;
6613 gcc_assert (c_parser_next_token_is_keyword (parser, RID_SIZEOF));
6614 c_parser_consume_token (parser);
6615 c_inhibit_evaluation_warnings++;
6616 in_sizeof++;
6617 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)
6618 && c_token_starts_typename (c_parser_peek_2nd_token (parser)))
6620 /* Either sizeof ( type-name ) or sizeof unary-expression
6621 starting with a compound literal. */
6622 struct c_type_name *type_name;
6623 c_parser_consume_token (parser);
6624 expr_loc = c_parser_peek_token (parser)->location;
6625 type_name = c_parser_type_name (parser);
6626 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
6627 if (type_name == NULL)
6629 struct c_expr ret;
6630 c_inhibit_evaluation_warnings--;
6631 in_sizeof--;
6632 ret.value = error_mark_node;
6633 ret.original_code = ERROR_MARK;
6634 ret.original_type = NULL;
6635 return ret;
6637 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
6639 expr = c_parser_postfix_expression_after_paren_type (parser,
6640 type_name,
6641 expr_loc);
6642 goto sizeof_expr;
6644 /* sizeof ( type-name ). */
6645 c_inhibit_evaluation_warnings--;
6646 in_sizeof--;
6647 return c_expr_sizeof_type (expr_loc, type_name);
6649 else
6651 expr_loc = c_parser_peek_token (parser)->location;
6652 expr = c_parser_unary_expression (parser);
6653 sizeof_expr:
6654 c_inhibit_evaluation_warnings--;
6655 in_sizeof--;
6656 mark_exp_read (expr.value);
6657 if (TREE_CODE (expr.value) == COMPONENT_REF
6658 && DECL_C_BIT_FIELD (TREE_OPERAND (expr.value, 1)))
6659 error_at (expr_loc, "%<sizeof%> applied to a bit-field");
6660 return c_expr_sizeof_expr (expr_loc, expr);
6664 /* Parse an alignof expression. */
6666 static struct c_expr
6667 c_parser_alignof_expression (c_parser *parser)
6669 struct c_expr expr;
6670 location_t loc = c_parser_peek_token (parser)->location;
6671 tree alignof_spelling = c_parser_peek_token (parser)->value;
6672 gcc_assert (c_parser_next_token_is_keyword (parser, RID_ALIGNOF));
6673 bool is_c11_alignof = strcmp (IDENTIFIER_POINTER (alignof_spelling),
6674 "_Alignof") == 0;
6675 /* A diagnostic is not required for the use of this identifier in
6676 the implementation namespace; only diagnose it for the C11
6677 spelling because of existing code using the other spellings. */
6678 if (is_c11_alignof)
6680 if (flag_isoc99)
6681 pedwarn_c99 (loc, OPT_Wpedantic, "ISO C99 does not support %qE",
6682 alignof_spelling);
6683 else
6684 pedwarn_c99 (loc, OPT_Wpedantic, "ISO C90 does not support %qE",
6685 alignof_spelling);
6687 c_parser_consume_token (parser);
6688 c_inhibit_evaluation_warnings++;
6689 in_alignof++;
6690 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)
6691 && c_token_starts_typename (c_parser_peek_2nd_token (parser)))
6693 /* Either __alignof__ ( type-name ) or __alignof__
6694 unary-expression starting with a compound literal. */
6695 location_t loc;
6696 struct c_type_name *type_name;
6697 struct c_expr ret;
6698 c_parser_consume_token (parser);
6699 loc = c_parser_peek_token (parser)->location;
6700 type_name = c_parser_type_name (parser);
6701 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
6702 if (type_name == NULL)
6704 struct c_expr ret;
6705 c_inhibit_evaluation_warnings--;
6706 in_alignof--;
6707 ret.value = error_mark_node;
6708 ret.original_code = ERROR_MARK;
6709 ret.original_type = NULL;
6710 return ret;
6712 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
6714 expr = c_parser_postfix_expression_after_paren_type (parser,
6715 type_name,
6716 loc);
6717 goto alignof_expr;
6719 /* alignof ( type-name ). */
6720 c_inhibit_evaluation_warnings--;
6721 in_alignof--;
6722 ret.value = c_sizeof_or_alignof_type (loc, groktypename (type_name,
6723 NULL, NULL),
6724 false, is_c11_alignof, 1);
6725 ret.original_code = ERROR_MARK;
6726 ret.original_type = NULL;
6727 return ret;
6729 else
6731 struct c_expr ret;
6732 expr = c_parser_unary_expression (parser);
6733 alignof_expr:
6734 mark_exp_read (expr.value);
6735 c_inhibit_evaluation_warnings--;
6736 in_alignof--;
6737 pedwarn (loc, OPT_Wpedantic, "ISO C does not allow %<%E (expression)%>",
6738 alignof_spelling);
6739 ret.value = c_alignof_expr (loc, expr.value);
6740 ret.original_code = ERROR_MARK;
6741 ret.original_type = NULL;
6742 return ret;
6746 /* Helper function to read arguments of builtins which are interfaces
6747 for the middle-end nodes like COMPLEX_EXPR, VEC_PERM_EXPR and
6748 others. The name of the builtin is passed using BNAME parameter.
6749 Function returns true if there were no errors while parsing and
6750 stores the arguments in CEXPR_LIST. */
6751 static bool
6752 c_parser_get_builtin_args (c_parser *parser, const char *bname,
6753 vec<c_expr_t, va_gc> **ret_cexpr_list,
6754 bool choose_expr_p)
6756 location_t loc = c_parser_peek_token (parser)->location;
6757 vec<c_expr_t, va_gc> *cexpr_list;
6758 c_expr_t expr;
6759 bool saved_force_folding_builtin_constant_p;
6761 *ret_cexpr_list = NULL;
6762 if (c_parser_next_token_is_not (parser, CPP_OPEN_PAREN))
6764 error_at (loc, "cannot take address of %qs", bname);
6765 return false;
6768 c_parser_consume_token (parser);
6770 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
6772 c_parser_consume_token (parser);
6773 return true;
6776 saved_force_folding_builtin_constant_p
6777 = force_folding_builtin_constant_p;
6778 force_folding_builtin_constant_p |= choose_expr_p;
6779 expr = c_parser_expr_no_commas (parser, NULL);
6780 force_folding_builtin_constant_p
6781 = saved_force_folding_builtin_constant_p;
6782 vec_alloc (cexpr_list, 1);
6783 vec_safe_push (cexpr_list, expr);
6784 while (c_parser_next_token_is (parser, CPP_COMMA))
6786 c_parser_consume_token (parser);
6787 expr = c_parser_expr_no_commas (parser, NULL);
6788 vec_safe_push (cexpr_list, expr);
6791 if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
6792 return false;
6794 *ret_cexpr_list = cexpr_list;
6795 return true;
6798 /* This represents a single generic-association. */
6800 struct c_generic_association
6802 /* The location of the starting token of the type. */
6803 location_t type_location;
6804 /* The association's type, or NULL_TREE for 'default'. */
6805 tree type;
6806 /* The association's expression. */
6807 struct c_expr expression;
6810 /* Parse a generic-selection. (C11 6.5.1.1).
6812 generic-selection:
6813 _Generic ( assignment-expression , generic-assoc-list )
6815 generic-assoc-list:
6816 generic-association
6817 generic-assoc-list , generic-association
6819 generic-association:
6820 type-name : assignment-expression
6821 default : assignment-expression
6824 static struct c_expr
6825 c_parser_generic_selection (c_parser *parser)
6827 vec<c_generic_association> associations = vNULL;
6828 struct c_expr selector, error_expr;
6829 tree selector_type;
6830 struct c_generic_association matched_assoc;
6831 bool match_found = false;
6832 location_t generic_loc, selector_loc;
6834 error_expr.original_code = ERROR_MARK;
6835 error_expr.original_type = NULL;
6836 error_expr.value = error_mark_node;
6837 matched_assoc.type_location = UNKNOWN_LOCATION;
6838 matched_assoc.type = NULL_TREE;
6839 matched_assoc.expression = error_expr;
6841 gcc_assert (c_parser_next_token_is_keyword (parser, RID_GENERIC));
6842 generic_loc = c_parser_peek_token (parser)->location;
6843 c_parser_consume_token (parser);
6844 if (flag_isoc99)
6845 pedwarn_c99 (generic_loc, OPT_Wpedantic,
6846 "ISO C99 does not support %<_Generic%>");
6847 else
6848 pedwarn_c99 (generic_loc, OPT_Wpedantic,
6849 "ISO C90 does not support %<_Generic%>");
6851 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
6852 return error_expr;
6854 c_inhibit_evaluation_warnings++;
6855 selector_loc = c_parser_peek_token (parser)->location;
6856 selector = c_parser_expr_no_commas (parser, NULL);
6857 selector = default_function_array_conversion (selector_loc, selector);
6858 c_inhibit_evaluation_warnings--;
6860 if (selector.value == error_mark_node)
6862 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
6863 return selector;
6865 selector_type = TREE_TYPE (selector.value);
6866 /* In ISO C terms, rvalues (including the controlling expression of
6867 _Generic) do not have qualified types. */
6868 if (TREE_CODE (selector_type) != ARRAY_TYPE)
6869 selector_type = TYPE_MAIN_VARIANT (selector_type);
6870 /* In ISO C terms, _Noreturn is not part of the type of expressions
6871 such as &abort, but in GCC it is represented internally as a type
6872 qualifier. */
6873 if (FUNCTION_POINTER_TYPE_P (selector_type)
6874 && TYPE_QUALS (TREE_TYPE (selector_type)) != TYPE_UNQUALIFIED)
6875 selector_type
6876 = build_pointer_type (TYPE_MAIN_VARIANT (TREE_TYPE (selector_type)));
6878 if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
6880 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
6881 return error_expr;
6884 while (1)
6886 struct c_generic_association assoc, *iter;
6887 unsigned int ix;
6888 c_token *token = c_parser_peek_token (parser);
6890 assoc.type_location = token->location;
6891 if (token->type == CPP_KEYWORD && token->keyword == RID_DEFAULT)
6893 c_parser_consume_token (parser);
6894 assoc.type = NULL_TREE;
6896 else
6898 struct c_type_name *type_name;
6900 type_name = c_parser_type_name (parser);
6901 if (type_name == NULL)
6903 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
6904 goto error_exit;
6906 assoc.type = groktypename (type_name, NULL, NULL);
6907 if (assoc.type == error_mark_node)
6909 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
6910 goto error_exit;
6913 if (TREE_CODE (assoc.type) == FUNCTION_TYPE)
6914 error_at (assoc.type_location,
6915 "%<_Generic%> association has function type");
6916 else if (!COMPLETE_TYPE_P (assoc.type))
6917 error_at (assoc.type_location,
6918 "%<_Generic%> association has incomplete type");
6920 if (variably_modified_type_p (assoc.type, NULL_TREE))
6921 error_at (assoc.type_location,
6922 "%<_Generic%> association has "
6923 "variable length type");
6926 if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
6928 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
6929 goto error_exit;
6932 assoc.expression = c_parser_expr_no_commas (parser, NULL);
6933 if (assoc.expression.value == error_mark_node)
6935 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
6936 goto error_exit;
6939 for (ix = 0; associations.iterate (ix, &iter); ++ix)
6941 if (assoc.type == NULL_TREE)
6943 if (iter->type == NULL_TREE)
6945 error_at (assoc.type_location,
6946 "duplicate %<default%> case in %<_Generic%>");
6947 inform (iter->type_location, "original %<default%> is here");
6950 else if (iter->type != NULL_TREE)
6952 if (comptypes (assoc.type, iter->type))
6954 error_at (assoc.type_location,
6955 "%<_Generic%> specifies two compatible types");
6956 inform (iter->type_location, "compatible type is here");
6961 if (assoc.type == NULL_TREE)
6963 if (!match_found)
6965 matched_assoc = assoc;
6966 match_found = true;
6969 else if (comptypes (assoc.type, selector_type))
6971 if (!match_found || matched_assoc.type == NULL_TREE)
6973 matched_assoc = assoc;
6974 match_found = true;
6976 else
6978 error_at (assoc.type_location,
6979 "%<_Generic> selector matches multiple associations");
6980 inform (matched_assoc.type_location,
6981 "other match is here");
6985 associations.safe_push (assoc);
6987 if (c_parser_peek_token (parser)->type != CPP_COMMA)
6988 break;
6989 c_parser_consume_token (parser);
6992 associations.release ();
6994 if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
6996 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
6997 return error_expr;
7000 if (!match_found)
7002 error_at (selector_loc, "%<_Generic%> selector of type %qT is not "
7003 "compatible with any association",
7004 selector_type);
7005 return error_expr;
7008 return matched_assoc.expression;
7010 error_exit:
7011 associations.release ();
7012 return error_expr;
7015 /* Parse a postfix expression (C90 6.3.1-6.3.2, C99 6.5.1-6.5.2).
7017 postfix-expression:
7018 primary-expression
7019 postfix-expression [ expression ]
7020 postfix-expression ( argument-expression-list[opt] )
7021 postfix-expression . identifier
7022 postfix-expression -> identifier
7023 postfix-expression ++
7024 postfix-expression --
7025 ( type-name ) { initializer-list }
7026 ( type-name ) { initializer-list , }
7028 argument-expression-list:
7029 argument-expression
7030 argument-expression-list , argument-expression
7032 primary-expression:
7033 identifier
7034 constant
7035 string-literal
7036 ( expression )
7037 generic-selection
7039 GNU extensions:
7041 primary-expression:
7042 __func__
7043 (treated as a keyword in GNU C)
7044 __FUNCTION__
7045 __PRETTY_FUNCTION__
7046 ( compound-statement )
7047 __builtin_va_arg ( assignment-expression , type-name )
7048 __builtin_offsetof ( type-name , offsetof-member-designator )
7049 __builtin_choose_expr ( assignment-expression ,
7050 assignment-expression ,
7051 assignment-expression )
7052 __builtin_types_compatible_p ( type-name , type-name )
7053 __builtin_complex ( assignment-expression , assignment-expression )
7054 __builtin_shuffle ( assignment-expression , assignment-expression )
7055 __builtin_shuffle ( assignment-expression ,
7056 assignment-expression ,
7057 assignment-expression, )
7059 offsetof-member-designator:
7060 identifier
7061 offsetof-member-designator . identifier
7062 offsetof-member-designator [ expression ]
7064 Objective-C:
7066 primary-expression:
7067 [ objc-receiver objc-message-args ]
7068 @selector ( objc-selector-arg )
7069 @protocol ( identifier )
7070 @encode ( type-name )
7071 objc-string-literal
7072 Classname . identifier
7075 static struct c_expr
7076 c_parser_postfix_expression (c_parser *parser)
7078 struct c_expr expr, e1;
7079 struct c_type_name *t1, *t2;
7080 location_t loc = c_parser_peek_token (parser)->location;;
7081 expr.original_code = ERROR_MARK;
7082 expr.original_type = NULL;
7083 switch (c_parser_peek_token (parser)->type)
7085 case CPP_NUMBER:
7086 expr.value = c_parser_peek_token (parser)->value;
7087 loc = c_parser_peek_token (parser)->location;
7088 c_parser_consume_token (parser);
7089 if (TREE_CODE (expr.value) == FIXED_CST
7090 && !targetm.fixed_point_supported_p ())
7092 error_at (loc, "fixed-point types not supported for this target");
7093 expr.value = error_mark_node;
7095 break;
7096 case CPP_CHAR:
7097 case CPP_CHAR16:
7098 case CPP_CHAR32:
7099 case CPP_WCHAR:
7100 expr.value = c_parser_peek_token (parser)->value;
7101 c_parser_consume_token (parser);
7102 break;
7103 case CPP_STRING:
7104 case CPP_STRING16:
7105 case CPP_STRING32:
7106 case CPP_WSTRING:
7107 case CPP_UTF8STRING:
7108 expr.value = c_parser_peek_token (parser)->value;
7109 expr.original_code = STRING_CST;
7110 c_parser_consume_token (parser);
7111 break;
7112 case CPP_OBJC_STRING:
7113 gcc_assert (c_dialect_objc ());
7114 expr.value
7115 = objc_build_string_object (c_parser_peek_token (parser)->value);
7116 c_parser_consume_token (parser);
7117 break;
7118 case CPP_NAME:
7119 switch (c_parser_peek_token (parser)->id_kind)
7121 case C_ID_ID:
7123 tree id = c_parser_peek_token (parser)->value;
7124 c_parser_consume_token (parser);
7125 expr.value = build_external_ref (loc, id,
7126 (c_parser_peek_token (parser)->type
7127 == CPP_OPEN_PAREN),
7128 &expr.original_type);
7129 break;
7131 case C_ID_CLASSNAME:
7133 /* Here we parse the Objective-C 2.0 Class.name dot
7134 syntax. */
7135 tree class_name = c_parser_peek_token (parser)->value;
7136 tree component;
7137 c_parser_consume_token (parser);
7138 gcc_assert (c_dialect_objc ());
7139 if (!c_parser_require (parser, CPP_DOT, "expected %<.%>"))
7141 expr.value = error_mark_node;
7142 break;
7144 if (c_parser_next_token_is_not (parser, CPP_NAME))
7146 c_parser_error (parser, "expected identifier");
7147 expr.value = error_mark_node;
7148 break;
7150 component = c_parser_peek_token (parser)->value;
7151 c_parser_consume_token (parser);
7152 expr.value = objc_build_class_component_ref (class_name,
7153 component);
7154 break;
7156 default:
7157 c_parser_error (parser, "expected expression");
7158 expr.value = error_mark_node;
7159 break;
7161 break;
7162 case CPP_OPEN_PAREN:
7163 /* A parenthesized expression, statement expression or compound
7164 literal. */
7165 if (c_parser_peek_2nd_token (parser)->type == CPP_OPEN_BRACE)
7167 /* A statement expression. */
7168 tree stmt;
7169 location_t brace_loc;
7170 c_parser_consume_token (parser);
7171 brace_loc = c_parser_peek_token (parser)->location;
7172 c_parser_consume_token (parser);
7173 if (!building_stmt_list_p ())
7175 error_at (loc, "braced-group within expression allowed "
7176 "only inside a function");
7177 parser->error = true;
7178 c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL);
7179 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
7180 expr.value = error_mark_node;
7181 break;
7183 stmt = c_begin_stmt_expr ();
7184 c_parser_compound_statement_nostart (parser);
7185 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
7186 "expected %<)%>");
7187 pedwarn (loc, OPT_Wpedantic,
7188 "ISO C forbids braced-groups within expressions");
7189 expr.value = c_finish_stmt_expr (brace_loc, stmt);
7190 mark_exp_read (expr.value);
7192 else if (c_token_starts_typename (c_parser_peek_2nd_token (parser)))
7194 /* A compound literal. ??? Can we actually get here rather
7195 than going directly to
7196 c_parser_postfix_expression_after_paren_type from
7197 elsewhere? */
7198 location_t loc;
7199 struct c_type_name *type_name;
7200 c_parser_consume_token (parser);
7201 loc = c_parser_peek_token (parser)->location;
7202 type_name = c_parser_type_name (parser);
7203 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
7204 "expected %<)%>");
7205 if (type_name == NULL)
7207 expr.value = error_mark_node;
7209 else
7210 expr = c_parser_postfix_expression_after_paren_type (parser,
7211 type_name,
7212 loc);
7214 else
7216 /* A parenthesized expression. */
7217 c_parser_consume_token (parser);
7218 expr = c_parser_expression (parser);
7219 if (TREE_CODE (expr.value) == MODIFY_EXPR)
7220 TREE_NO_WARNING (expr.value) = 1;
7221 if (expr.original_code != C_MAYBE_CONST_EXPR)
7222 expr.original_code = ERROR_MARK;
7223 /* Don't change EXPR.ORIGINAL_TYPE. */
7224 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
7225 "expected %<)%>");
7227 break;
7228 case CPP_KEYWORD:
7229 switch (c_parser_peek_token (parser)->keyword)
7231 case RID_FUNCTION_NAME:
7232 pedwarn (loc, OPT_Wpedantic, "ISO C does not support "
7233 "%<__FUNCTION__%> predefined identifier");
7234 expr.value = fname_decl (loc,
7235 c_parser_peek_token (parser)->keyword,
7236 c_parser_peek_token (parser)->value);
7237 c_parser_consume_token (parser);
7238 break;
7239 case RID_PRETTY_FUNCTION_NAME:
7240 pedwarn (loc, OPT_Wpedantic, "ISO C does not support "
7241 "%<__PRETTY_FUNCTION__%> predefined identifier");
7242 expr.value = fname_decl (loc,
7243 c_parser_peek_token (parser)->keyword,
7244 c_parser_peek_token (parser)->value);
7245 c_parser_consume_token (parser);
7246 break;
7247 case RID_C99_FUNCTION_NAME:
7248 pedwarn_c90 (loc, OPT_Wpedantic, "ISO C90 does not support "
7249 "%<__func__%> predefined identifier");
7250 expr.value = fname_decl (loc,
7251 c_parser_peek_token (parser)->keyword,
7252 c_parser_peek_token (parser)->value);
7253 c_parser_consume_token (parser);
7254 break;
7255 case RID_VA_ARG:
7256 c_parser_consume_token (parser);
7257 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
7259 expr.value = error_mark_node;
7260 break;
7262 e1 = c_parser_expr_no_commas (parser, NULL);
7263 mark_exp_read (e1.value);
7264 e1.value = c_fully_fold (e1.value, false, NULL);
7265 if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
7267 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
7268 expr.value = error_mark_node;
7269 break;
7271 loc = c_parser_peek_token (parser)->location;
7272 t1 = c_parser_type_name (parser);
7273 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
7274 "expected %<)%>");
7275 if (t1 == NULL)
7277 expr.value = error_mark_node;
7279 else
7281 tree type_expr = NULL_TREE;
7282 expr.value = c_build_va_arg (loc, e1.value,
7283 groktypename (t1, &type_expr, NULL));
7284 if (type_expr)
7286 expr.value = build2 (C_MAYBE_CONST_EXPR,
7287 TREE_TYPE (expr.value), type_expr,
7288 expr.value);
7289 C_MAYBE_CONST_EXPR_NON_CONST (expr.value) = true;
7292 break;
7293 case RID_OFFSETOF:
7294 c_parser_consume_token (parser);
7295 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
7297 expr.value = error_mark_node;
7298 break;
7300 t1 = c_parser_type_name (parser);
7301 if (t1 == NULL)
7302 parser->error = true;
7303 if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
7304 gcc_assert (parser->error);
7305 if (parser->error)
7307 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
7308 expr.value = error_mark_node;
7309 break;
7313 tree type = groktypename (t1, NULL, NULL);
7314 tree offsetof_ref;
7315 if (type == error_mark_node)
7316 offsetof_ref = error_mark_node;
7317 else
7319 offsetof_ref = build1 (INDIRECT_REF, type, null_pointer_node);
7320 SET_EXPR_LOCATION (offsetof_ref, loc);
7322 /* Parse the second argument to __builtin_offsetof. We
7323 must have one identifier, and beyond that we want to
7324 accept sub structure and sub array references. */
7325 if (c_parser_next_token_is (parser, CPP_NAME))
7327 offsetof_ref = build_component_ref
7328 (loc, offsetof_ref, c_parser_peek_token (parser)->value);
7329 c_parser_consume_token (parser);
7330 while (c_parser_next_token_is (parser, CPP_DOT)
7331 || c_parser_next_token_is (parser,
7332 CPP_OPEN_SQUARE)
7333 || c_parser_next_token_is (parser,
7334 CPP_DEREF))
7336 if (c_parser_next_token_is (parser, CPP_DEREF))
7338 loc = c_parser_peek_token (parser)->location;
7339 offsetof_ref = build_array_ref (loc,
7340 offsetof_ref,
7341 integer_zero_node);
7342 goto do_dot;
7344 else if (c_parser_next_token_is (parser, CPP_DOT))
7346 do_dot:
7347 c_parser_consume_token (parser);
7348 if (c_parser_next_token_is_not (parser,
7349 CPP_NAME))
7351 c_parser_error (parser, "expected identifier");
7352 break;
7354 offsetof_ref = build_component_ref
7355 (loc, offsetof_ref,
7356 c_parser_peek_token (parser)->value);
7357 c_parser_consume_token (parser);
7359 else
7361 struct c_expr ce;
7362 tree idx;
7363 loc = c_parser_peek_token (parser)->location;
7364 c_parser_consume_token (parser);
7365 ce = c_parser_expression (parser);
7366 ce = convert_lvalue_to_rvalue (loc, ce, false, false);
7367 idx = ce.value;
7368 idx = c_fully_fold (idx, false, NULL);
7369 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
7370 "expected %<]%>");
7371 offsetof_ref = build_array_ref (loc, offsetof_ref, idx);
7375 else
7376 c_parser_error (parser, "expected identifier");
7377 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
7378 "expected %<)%>");
7379 expr.value = fold_offsetof (offsetof_ref);
7381 break;
7382 case RID_CHOOSE_EXPR:
7384 vec<c_expr_t, va_gc> *cexpr_list;
7385 c_expr_t *e1_p, *e2_p, *e3_p;
7386 tree c;
7388 c_parser_consume_token (parser);
7389 if (!c_parser_get_builtin_args (parser,
7390 "__builtin_choose_expr",
7391 &cexpr_list, true))
7393 expr.value = error_mark_node;
7394 break;
7397 if (vec_safe_length (cexpr_list) != 3)
7399 error_at (loc, "wrong number of arguments to "
7400 "%<__builtin_choose_expr%>");
7401 expr.value = error_mark_node;
7402 break;
7405 e1_p = &(*cexpr_list)[0];
7406 e2_p = &(*cexpr_list)[1];
7407 e3_p = &(*cexpr_list)[2];
7409 c = e1_p->value;
7410 mark_exp_read (e2_p->value);
7411 mark_exp_read (e3_p->value);
7412 if (TREE_CODE (c) != INTEGER_CST
7413 || !INTEGRAL_TYPE_P (TREE_TYPE (c)))
7414 error_at (loc,
7415 "first argument to %<__builtin_choose_expr%> not"
7416 " a constant");
7417 constant_expression_warning (c);
7418 expr = integer_zerop (c) ? *e3_p : *e2_p;
7419 break;
7421 case RID_TYPES_COMPATIBLE_P:
7422 c_parser_consume_token (parser);
7423 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
7425 expr.value = error_mark_node;
7426 break;
7428 t1 = c_parser_type_name (parser);
7429 if (t1 == NULL)
7431 expr.value = error_mark_node;
7432 break;
7434 if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
7436 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
7437 expr.value = error_mark_node;
7438 break;
7440 t2 = c_parser_type_name (parser);
7441 if (t2 == NULL)
7443 expr.value = error_mark_node;
7444 break;
7446 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
7447 "expected %<)%>");
7449 tree e1, e2;
7450 e1 = groktypename (t1, NULL, NULL);
7451 e2 = groktypename (t2, NULL, NULL);
7452 if (e1 == error_mark_node || e2 == error_mark_node)
7454 expr.value = error_mark_node;
7455 break;
7458 e1 = TYPE_MAIN_VARIANT (e1);
7459 e2 = TYPE_MAIN_VARIANT (e2);
7461 expr.value
7462 = comptypes (e1, e2) ? integer_one_node : integer_zero_node;
7464 break;
7465 case RID_BUILTIN_CALL_WITH_STATIC_CHAIN:
7467 vec<c_expr_t, va_gc> *cexpr_list;
7468 c_expr_t *e2_p;
7469 tree chain_value;
7471 c_parser_consume_token (parser);
7472 if (!c_parser_get_builtin_args (parser,
7473 "__builtin_call_with_static_chain",
7474 &cexpr_list, false))
7476 expr.value = error_mark_node;
7477 break;
7479 if (vec_safe_length (cexpr_list) != 2)
7481 error_at (loc, "wrong number of arguments to "
7482 "%<__builtin_call_with_static_chain%>");
7483 expr.value = error_mark_node;
7484 break;
7487 expr = (*cexpr_list)[0];
7488 e2_p = &(*cexpr_list)[1];
7489 *e2_p = convert_lvalue_to_rvalue (loc, *e2_p, true, true);
7490 chain_value = e2_p->value;
7491 mark_exp_read (chain_value);
7493 if (TREE_CODE (expr.value) != CALL_EXPR)
7494 error_at (loc, "first argument to "
7495 "%<__builtin_call_with_static_chain%> "
7496 "must be a call expression");
7497 else if (TREE_CODE (TREE_TYPE (chain_value)) != POINTER_TYPE)
7498 error_at (loc, "second argument to "
7499 "%<__builtin_call_with_static_chain%> "
7500 "must be a pointer type");
7501 else
7502 CALL_EXPR_STATIC_CHAIN (expr.value) = chain_value;
7503 break;
7505 case RID_BUILTIN_COMPLEX:
7507 vec<c_expr_t, va_gc> *cexpr_list;
7508 c_expr_t *e1_p, *e2_p;
7510 c_parser_consume_token (parser);
7511 if (!c_parser_get_builtin_args (parser,
7512 "__builtin_complex",
7513 &cexpr_list, false))
7515 expr.value = error_mark_node;
7516 break;
7519 if (vec_safe_length (cexpr_list) != 2)
7521 error_at (loc, "wrong number of arguments to "
7522 "%<__builtin_complex%>");
7523 expr.value = error_mark_node;
7524 break;
7527 e1_p = &(*cexpr_list)[0];
7528 e2_p = &(*cexpr_list)[1];
7530 *e1_p = convert_lvalue_to_rvalue (loc, *e1_p, true, true);
7531 if (TREE_CODE (e1_p->value) == EXCESS_PRECISION_EXPR)
7532 e1_p->value = convert (TREE_TYPE (e1_p->value),
7533 TREE_OPERAND (e1_p->value, 0));
7534 *e2_p = convert_lvalue_to_rvalue (loc, *e2_p, true, true);
7535 if (TREE_CODE (e2_p->value) == EXCESS_PRECISION_EXPR)
7536 e2_p->value = convert (TREE_TYPE (e2_p->value),
7537 TREE_OPERAND (e2_p->value, 0));
7538 if (!SCALAR_FLOAT_TYPE_P (TREE_TYPE (e1_p->value))
7539 || DECIMAL_FLOAT_TYPE_P (TREE_TYPE (e1_p->value))
7540 || !SCALAR_FLOAT_TYPE_P (TREE_TYPE (e2_p->value))
7541 || DECIMAL_FLOAT_TYPE_P (TREE_TYPE (e2_p->value)))
7543 error_at (loc, "%<__builtin_complex%> operand "
7544 "not of real binary floating-point type");
7545 expr.value = error_mark_node;
7546 break;
7548 if (TYPE_MAIN_VARIANT (TREE_TYPE (e1_p->value))
7549 != TYPE_MAIN_VARIANT (TREE_TYPE (e2_p->value)))
7551 error_at (loc,
7552 "%<__builtin_complex%> operands of different types");
7553 expr.value = error_mark_node;
7554 break;
7556 pedwarn_c90 (loc, OPT_Wpedantic,
7557 "ISO C90 does not support complex types");
7558 expr.value = build2 (COMPLEX_EXPR,
7559 build_complex_type
7560 (TYPE_MAIN_VARIANT
7561 (TREE_TYPE (e1_p->value))),
7562 e1_p->value, e2_p->value);
7563 break;
7565 case RID_BUILTIN_SHUFFLE:
7567 vec<c_expr_t, va_gc> *cexpr_list;
7568 unsigned int i;
7569 c_expr_t *p;
7571 c_parser_consume_token (parser);
7572 if (!c_parser_get_builtin_args (parser,
7573 "__builtin_shuffle",
7574 &cexpr_list, false))
7576 expr.value = error_mark_node;
7577 break;
7580 FOR_EACH_VEC_SAFE_ELT (cexpr_list, i, p)
7581 *p = convert_lvalue_to_rvalue (loc, *p, true, true);
7583 if (vec_safe_length (cexpr_list) == 2)
7584 expr.value =
7585 c_build_vec_perm_expr
7586 (loc, (*cexpr_list)[0].value,
7587 NULL_TREE, (*cexpr_list)[1].value);
7589 else if (vec_safe_length (cexpr_list) == 3)
7590 expr.value =
7591 c_build_vec_perm_expr
7592 (loc, (*cexpr_list)[0].value,
7593 (*cexpr_list)[1].value,
7594 (*cexpr_list)[2].value);
7595 else
7597 error_at (loc, "wrong number of arguments to "
7598 "%<__builtin_shuffle%>");
7599 expr.value = error_mark_node;
7601 break;
7603 case RID_AT_SELECTOR:
7604 gcc_assert (c_dialect_objc ());
7605 c_parser_consume_token (parser);
7606 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
7608 expr.value = error_mark_node;
7609 break;
7612 tree sel = c_parser_objc_selector_arg (parser);
7613 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
7614 "expected %<)%>");
7615 expr.value = objc_build_selector_expr (loc, sel);
7617 break;
7618 case RID_AT_PROTOCOL:
7619 gcc_assert (c_dialect_objc ());
7620 c_parser_consume_token (parser);
7621 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
7623 expr.value = error_mark_node;
7624 break;
7626 if (c_parser_next_token_is_not (parser, CPP_NAME))
7628 c_parser_error (parser, "expected identifier");
7629 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
7630 expr.value = error_mark_node;
7631 break;
7634 tree id = c_parser_peek_token (parser)->value;
7635 c_parser_consume_token (parser);
7636 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
7637 "expected %<)%>");
7638 expr.value = objc_build_protocol_expr (id);
7640 break;
7641 case RID_AT_ENCODE:
7642 /* Extension to support C-structures in the archiver. */
7643 gcc_assert (c_dialect_objc ());
7644 c_parser_consume_token (parser);
7645 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
7647 expr.value = error_mark_node;
7648 break;
7650 t1 = c_parser_type_name (parser);
7651 if (t1 == NULL)
7653 expr.value = error_mark_node;
7654 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
7655 break;
7657 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
7658 "expected %<)%>");
7660 tree type = groktypename (t1, NULL, NULL);
7661 expr.value = objc_build_encode_expr (type);
7663 break;
7664 case RID_GENERIC:
7665 expr = c_parser_generic_selection (parser);
7666 break;
7667 case RID_CILK_SPAWN:
7668 c_parser_consume_token (parser);
7669 if (!flag_cilkplus)
7671 error_at (loc, "-fcilkplus must be enabled to use "
7672 "%<_Cilk_spawn%>");
7673 expr = c_parser_postfix_expression (parser);
7674 expr.value = error_mark_node;
7676 else if (c_parser_peek_token (parser)->keyword == RID_CILK_SPAWN)
7678 error_at (loc, "consecutive %<_Cilk_spawn%> keywords "
7679 "are not permitted");
7680 /* Now flush out all the _Cilk_spawns. */
7681 while (c_parser_peek_token (parser)->keyword == RID_CILK_SPAWN)
7682 c_parser_consume_token (parser);
7683 expr = c_parser_postfix_expression (parser);
7685 else
7687 expr = c_parser_postfix_expression (parser);
7688 expr.value = build_cilk_spawn (loc, expr.value);
7690 break;
7691 default:
7692 c_parser_error (parser, "expected expression");
7693 expr.value = error_mark_node;
7694 break;
7696 break;
7697 case CPP_OPEN_SQUARE:
7698 if (c_dialect_objc ())
7700 tree receiver, args;
7701 c_parser_consume_token (parser);
7702 receiver = c_parser_objc_receiver (parser);
7703 args = c_parser_objc_message_args (parser);
7704 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
7705 "expected %<]%>");
7706 expr.value = objc_build_message_expr (receiver, args);
7707 break;
7709 /* Else fall through to report error. */
7710 default:
7711 c_parser_error (parser, "expected expression");
7712 expr.value = error_mark_node;
7713 break;
7715 return c_parser_postfix_expression_after_primary (parser, loc, expr);
7718 /* Parse a postfix expression after a parenthesized type name: the
7719 brace-enclosed initializer of a compound literal, possibly followed
7720 by some postfix operators. This is separate because it is not
7721 possible to tell until after the type name whether a cast
7722 expression has a cast or a compound literal, or whether the operand
7723 of sizeof is a parenthesized type name or starts with a compound
7724 literal. TYPE_LOC is the location where TYPE_NAME starts--the
7725 location of the first token after the parentheses around the type
7726 name. */
7728 static struct c_expr
7729 c_parser_postfix_expression_after_paren_type (c_parser *parser,
7730 struct c_type_name *type_name,
7731 location_t type_loc)
7733 tree type;
7734 struct c_expr init;
7735 bool non_const;
7736 struct c_expr expr;
7737 location_t start_loc;
7738 tree type_expr = NULL_TREE;
7739 bool type_expr_const = true;
7740 check_compound_literal_type (type_loc, type_name);
7741 start_init (NULL_TREE, NULL, 0);
7742 type = groktypename (type_name, &type_expr, &type_expr_const);
7743 start_loc = c_parser_peek_token (parser)->location;
7744 if (type != error_mark_node && C_TYPE_VARIABLE_SIZE (type))
7746 error_at (type_loc, "compound literal has variable size");
7747 type = error_mark_node;
7749 init = c_parser_braced_init (parser, type, false);
7750 finish_init ();
7751 maybe_warn_string_init (type_loc, type, init);
7753 if (type != error_mark_node
7754 && !ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (type))
7755 && current_function_decl)
7757 error ("compound literal qualified by address-space qualifier");
7758 type = error_mark_node;
7761 pedwarn_c90 (start_loc, OPT_Wpedantic, "ISO C90 forbids compound literals");
7762 non_const = ((init.value && TREE_CODE (init.value) == CONSTRUCTOR)
7763 ? CONSTRUCTOR_NON_CONST (init.value)
7764 : init.original_code == C_MAYBE_CONST_EXPR);
7765 non_const |= !type_expr_const;
7766 expr.value = build_compound_literal (start_loc, type, init.value, non_const);
7767 expr.original_code = ERROR_MARK;
7768 expr.original_type = NULL;
7769 if (type_expr)
7771 if (TREE_CODE (expr.value) == C_MAYBE_CONST_EXPR)
7773 gcc_assert (C_MAYBE_CONST_EXPR_PRE (expr.value) == NULL_TREE);
7774 C_MAYBE_CONST_EXPR_PRE (expr.value) = type_expr;
7776 else
7778 gcc_assert (!non_const);
7779 expr.value = build2 (C_MAYBE_CONST_EXPR, type,
7780 type_expr, expr.value);
7783 return c_parser_postfix_expression_after_primary (parser, start_loc, expr);
7786 /* Callback function for sizeof_pointer_memaccess_warning to compare
7787 types. */
7789 static bool
7790 sizeof_ptr_memacc_comptypes (tree type1, tree type2)
7792 return comptypes (type1, type2) == 1;
7795 /* Parse a postfix expression after the initial primary or compound
7796 literal; that is, parse a series of postfix operators.
7798 EXPR_LOC is the location of the primary expression. */
7800 static struct c_expr
7801 c_parser_postfix_expression_after_primary (c_parser *parser,
7802 location_t expr_loc,
7803 struct c_expr expr)
7805 struct c_expr orig_expr;
7806 tree ident, idx;
7807 location_t sizeof_arg_loc[3];
7808 tree sizeof_arg[3];
7809 unsigned int literal_zero_mask;
7810 unsigned int i;
7811 vec<tree, va_gc> *exprlist;
7812 vec<tree, va_gc> *origtypes = NULL;
7813 vec<location_t> arg_loc = vNULL;
7815 while (true)
7817 location_t op_loc = c_parser_peek_token (parser)->location;
7818 switch (c_parser_peek_token (parser)->type)
7820 case CPP_OPEN_SQUARE:
7821 /* Array reference. */
7822 c_parser_consume_token (parser);
7823 if (flag_cilkplus
7824 && c_parser_peek_token (parser)->type == CPP_COLON)
7825 /* If we are here, then we have something like this:
7826 Array [ : ]
7828 expr.value = c_parser_array_notation (expr_loc, parser, NULL_TREE,
7829 expr.value);
7830 else
7832 idx = c_parser_expression (parser).value;
7833 /* Here we have 3 options:
7834 1. Array [EXPR] -- Normal Array call.
7835 2. Array [EXPR : EXPR] -- Array notation without stride.
7836 3. Array [EXPR : EXPR : EXPR] -- Array notation with stride.
7838 For 1, we just handle it just like a normal array expression.
7839 For 2 and 3 we handle it like we handle array notations. The
7840 idx value we have above becomes the initial/start index.
7842 if (flag_cilkplus
7843 && c_parser_peek_token (parser)->type == CPP_COLON)
7844 expr.value = c_parser_array_notation (expr_loc, parser, idx,
7845 expr.value);
7846 else
7848 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
7849 "expected %<]%>");
7850 expr.value = build_array_ref (op_loc, expr.value, idx);
7853 expr.original_code = ERROR_MARK;
7854 expr.original_type = NULL;
7855 break;
7856 case CPP_OPEN_PAREN:
7857 /* Function call. */
7858 c_parser_consume_token (parser);
7859 for (i = 0; i < 3; i++)
7861 sizeof_arg[i] = NULL_TREE;
7862 sizeof_arg_loc[i] = UNKNOWN_LOCATION;
7864 literal_zero_mask = 0;
7865 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
7866 exprlist = NULL;
7867 else
7868 exprlist = c_parser_expr_list (parser, true, false, &origtypes,
7869 sizeof_arg_loc, sizeof_arg,
7870 &arg_loc, &literal_zero_mask);
7871 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
7872 "expected %<)%>");
7873 orig_expr = expr;
7874 mark_exp_read (expr.value);
7875 if (warn_sizeof_pointer_memaccess)
7876 sizeof_pointer_memaccess_warning (sizeof_arg_loc,
7877 expr.value, exprlist,
7878 sizeof_arg,
7879 sizeof_ptr_memacc_comptypes);
7880 if (warn_memset_transposed_args
7881 && TREE_CODE (expr.value) == FUNCTION_DECL
7882 && DECL_BUILT_IN_CLASS (expr.value) == BUILT_IN_NORMAL
7883 && DECL_FUNCTION_CODE (expr.value) == BUILT_IN_MEMSET
7884 && vec_safe_length (exprlist) == 3
7885 && integer_zerop ((*exprlist)[2])
7886 && (literal_zero_mask & (1 << 2)) != 0
7887 && (!integer_zerop ((*exprlist)[1])
7888 || (literal_zero_mask & (1 << 1)) == 0))
7889 warning_at (expr_loc, OPT_Wmemset_transposed_args,
7890 "%<memset%> used with constant zero length parameter; "
7891 "this could be due to transposed parameters");
7893 expr.value
7894 = c_build_function_call_vec (expr_loc, arg_loc, expr.value,
7895 exprlist, origtypes);
7896 expr.original_code = ERROR_MARK;
7897 if (TREE_CODE (expr.value) == INTEGER_CST
7898 && TREE_CODE (orig_expr.value) == FUNCTION_DECL
7899 && DECL_BUILT_IN_CLASS (orig_expr.value) == BUILT_IN_NORMAL
7900 && DECL_FUNCTION_CODE (orig_expr.value) == BUILT_IN_CONSTANT_P)
7901 expr.original_code = C_MAYBE_CONST_EXPR;
7902 expr.original_type = NULL;
7903 if (exprlist)
7905 release_tree_vector (exprlist);
7906 release_tree_vector (origtypes);
7908 arg_loc.release ();
7909 break;
7910 case CPP_DOT:
7911 /* Structure element reference. */
7912 c_parser_consume_token (parser);
7913 expr = default_function_array_conversion (expr_loc, expr);
7914 if (c_parser_next_token_is (parser, CPP_NAME))
7915 ident = c_parser_peek_token (parser)->value;
7916 else
7918 c_parser_error (parser, "expected identifier");
7919 expr.value = error_mark_node;
7920 expr.original_code = ERROR_MARK;
7921 expr.original_type = NULL;
7922 return expr;
7924 c_parser_consume_token (parser);
7925 expr.value = build_component_ref (op_loc, expr.value, ident);
7926 expr.original_code = ERROR_MARK;
7927 if (TREE_CODE (expr.value) != COMPONENT_REF)
7928 expr.original_type = NULL;
7929 else
7931 /* Remember the original type of a bitfield. */
7932 tree field = TREE_OPERAND (expr.value, 1);
7933 if (TREE_CODE (field) != FIELD_DECL)
7934 expr.original_type = NULL;
7935 else
7936 expr.original_type = DECL_BIT_FIELD_TYPE (field);
7938 break;
7939 case CPP_DEREF:
7940 /* Structure element reference. */
7941 c_parser_consume_token (parser);
7942 expr = convert_lvalue_to_rvalue (expr_loc, expr, true, false);
7943 if (c_parser_next_token_is (parser, CPP_NAME))
7944 ident = c_parser_peek_token (parser)->value;
7945 else
7947 c_parser_error (parser, "expected identifier");
7948 expr.value = error_mark_node;
7949 expr.original_code = ERROR_MARK;
7950 expr.original_type = NULL;
7951 return expr;
7953 c_parser_consume_token (parser);
7954 expr.value = build_component_ref (op_loc,
7955 build_indirect_ref (op_loc,
7956 expr.value,
7957 RO_ARROW),
7958 ident);
7959 expr.original_code = ERROR_MARK;
7960 if (TREE_CODE (expr.value) != COMPONENT_REF)
7961 expr.original_type = NULL;
7962 else
7964 /* Remember the original type of a bitfield. */
7965 tree field = TREE_OPERAND (expr.value, 1);
7966 if (TREE_CODE (field) != FIELD_DECL)
7967 expr.original_type = NULL;
7968 else
7969 expr.original_type = DECL_BIT_FIELD_TYPE (field);
7971 break;
7972 case CPP_PLUS_PLUS:
7973 /* Postincrement. */
7974 c_parser_consume_token (parser);
7975 /* If the expressions have array notations, we expand them. */
7976 if (flag_cilkplus
7977 && TREE_CODE (expr.value) == ARRAY_NOTATION_REF)
7978 expr = fix_array_notation_expr (expr_loc, POSTINCREMENT_EXPR, expr);
7979 else
7981 expr = default_function_array_read_conversion (expr_loc, expr);
7982 expr.value = build_unary_op (op_loc,
7983 POSTINCREMENT_EXPR, expr.value, 0);
7985 expr.original_code = ERROR_MARK;
7986 expr.original_type = NULL;
7987 break;
7988 case CPP_MINUS_MINUS:
7989 /* Postdecrement. */
7990 c_parser_consume_token (parser);
7991 /* If the expressions have array notations, we expand them. */
7992 if (flag_cilkplus
7993 && TREE_CODE (expr.value) == ARRAY_NOTATION_REF)
7994 expr = fix_array_notation_expr (expr_loc, POSTDECREMENT_EXPR, expr);
7995 else
7997 expr = default_function_array_read_conversion (expr_loc, expr);
7998 expr.value = build_unary_op (op_loc,
7999 POSTDECREMENT_EXPR, expr.value, 0);
8001 expr.original_code = ERROR_MARK;
8002 expr.original_type = NULL;
8003 break;
8004 default:
8005 return expr;
8010 /* Parse an expression (C90 6.3.17, C99 6.5.17).
8012 expression:
8013 assignment-expression
8014 expression , assignment-expression
8017 static struct c_expr
8018 c_parser_expression (c_parser *parser)
8020 location_t tloc = c_parser_peek_token (parser)->location;
8021 struct c_expr expr;
8022 expr = c_parser_expr_no_commas (parser, NULL);
8023 if (c_parser_next_token_is (parser, CPP_COMMA))
8024 expr = convert_lvalue_to_rvalue (tloc, expr, true, false);
8025 while (c_parser_next_token_is (parser, CPP_COMMA))
8027 struct c_expr next;
8028 tree lhsval;
8029 location_t loc = c_parser_peek_token (parser)->location;
8030 location_t expr_loc;
8031 c_parser_consume_token (parser);
8032 expr_loc = c_parser_peek_token (parser)->location;
8033 lhsval = expr.value;
8034 while (TREE_CODE (lhsval) == COMPOUND_EXPR)
8035 lhsval = TREE_OPERAND (lhsval, 1);
8036 if (DECL_P (lhsval) || handled_component_p (lhsval))
8037 mark_exp_read (lhsval);
8038 next = c_parser_expr_no_commas (parser, NULL);
8039 next = convert_lvalue_to_rvalue (expr_loc, next, true, false);
8040 expr.value = build_compound_expr (loc, expr.value, next.value);
8041 expr.original_code = COMPOUND_EXPR;
8042 expr.original_type = next.original_type;
8044 return expr;
8047 /* Parse an expression and convert functions or arrays to pointers and
8048 lvalues to rvalues. */
8050 static struct c_expr
8051 c_parser_expression_conv (c_parser *parser)
8053 struct c_expr expr;
8054 location_t loc = c_parser_peek_token (parser)->location;
8055 expr = c_parser_expression (parser);
8056 expr = convert_lvalue_to_rvalue (loc, expr, true, false);
8057 return expr;
8060 /* Helper function of c_parser_expr_list. Check if IDXth (0 based)
8061 argument is a literal zero alone and if so, set it in literal_zero_mask. */
8063 static inline void
8064 c_parser_check_literal_zero (c_parser *parser, unsigned *literal_zero_mask,
8065 unsigned int idx)
8067 if (idx >= HOST_BITS_PER_INT)
8068 return;
8070 c_token *tok = c_parser_peek_token (parser);
8071 switch (tok->type)
8073 case CPP_NUMBER:
8074 case CPP_CHAR:
8075 case CPP_WCHAR:
8076 case CPP_CHAR16:
8077 case CPP_CHAR32:
8078 /* If a parameter is literal zero alone, remember it
8079 for -Wmemset-transposed-args warning. */
8080 if (integer_zerop (tok->value)
8081 && !TREE_OVERFLOW (tok->value)
8082 && (c_parser_peek_2nd_token (parser)->type == CPP_COMMA
8083 || c_parser_peek_2nd_token (parser)->type == CPP_CLOSE_PAREN))
8084 *literal_zero_mask |= 1U << idx;
8085 default:
8086 break;
8090 /* Parse a non-empty list of expressions. If CONVERT_P, convert
8091 functions and arrays to pointers and lvalues to rvalues. If
8092 FOLD_P, fold the expressions. If LOCATIONS is non-NULL, save the
8093 locations of function arguments into this vector.
8095 nonempty-expr-list:
8096 assignment-expression
8097 nonempty-expr-list , assignment-expression
8100 static vec<tree, va_gc> *
8101 c_parser_expr_list (c_parser *parser, bool convert_p, bool fold_p,
8102 vec<tree, va_gc> **p_orig_types,
8103 location_t *sizeof_arg_loc, tree *sizeof_arg,
8104 vec<location_t> *locations,
8105 unsigned int *literal_zero_mask)
8107 vec<tree, va_gc> *ret;
8108 vec<tree, va_gc> *orig_types;
8109 struct c_expr expr;
8110 location_t loc = c_parser_peek_token (parser)->location;
8111 location_t cur_sizeof_arg_loc = UNKNOWN_LOCATION;
8112 unsigned int idx = 0;
8114 ret = make_tree_vector ();
8115 if (p_orig_types == NULL)
8116 orig_types = NULL;
8117 else
8118 orig_types = make_tree_vector ();
8120 if (sizeof_arg != NULL
8121 && c_parser_next_token_is_keyword (parser, RID_SIZEOF))
8122 cur_sizeof_arg_loc = c_parser_peek_2nd_token (parser)->location;
8123 if (literal_zero_mask)
8124 c_parser_check_literal_zero (parser, literal_zero_mask, 0);
8125 expr = c_parser_expr_no_commas (parser, NULL);
8126 if (convert_p)
8127 expr = convert_lvalue_to_rvalue (loc, expr, true, true);
8128 if (fold_p)
8129 expr.value = c_fully_fold (expr.value, false, NULL);
8130 ret->quick_push (expr.value);
8131 if (orig_types)
8132 orig_types->quick_push (expr.original_type);
8133 if (locations)
8134 locations->safe_push (loc);
8135 if (sizeof_arg != NULL
8136 && cur_sizeof_arg_loc != UNKNOWN_LOCATION
8137 && expr.original_code == SIZEOF_EXPR)
8139 sizeof_arg[0] = c_last_sizeof_arg;
8140 sizeof_arg_loc[0] = cur_sizeof_arg_loc;
8142 while (c_parser_next_token_is (parser, CPP_COMMA))
8144 c_parser_consume_token (parser);
8145 loc = c_parser_peek_token (parser)->location;
8146 if (sizeof_arg != NULL
8147 && c_parser_next_token_is_keyword (parser, RID_SIZEOF))
8148 cur_sizeof_arg_loc = c_parser_peek_2nd_token (parser)->location;
8149 else
8150 cur_sizeof_arg_loc = UNKNOWN_LOCATION;
8151 if (literal_zero_mask)
8152 c_parser_check_literal_zero (parser, literal_zero_mask, idx + 1);
8153 expr = c_parser_expr_no_commas (parser, NULL);
8154 if (convert_p)
8155 expr = convert_lvalue_to_rvalue (loc, expr, true, true);
8156 if (fold_p)
8157 expr.value = c_fully_fold (expr.value, false, NULL);
8158 vec_safe_push (ret, expr.value);
8159 if (orig_types)
8160 vec_safe_push (orig_types, expr.original_type);
8161 if (locations)
8162 locations->safe_push (loc);
8163 if (++idx < 3
8164 && sizeof_arg != NULL
8165 && cur_sizeof_arg_loc != UNKNOWN_LOCATION
8166 && expr.original_code == SIZEOF_EXPR)
8168 sizeof_arg[idx] = c_last_sizeof_arg;
8169 sizeof_arg_loc[idx] = cur_sizeof_arg_loc;
8172 if (orig_types)
8173 *p_orig_types = orig_types;
8174 return ret;
8177 /* Parse Objective-C-specific constructs. */
8179 /* Parse an objc-class-definition.
8181 objc-class-definition:
8182 @interface identifier objc-superclass[opt] objc-protocol-refs[opt]
8183 objc-class-instance-variables[opt] objc-methodprotolist @end
8184 @implementation identifier objc-superclass[opt]
8185 objc-class-instance-variables[opt]
8186 @interface identifier ( identifier ) objc-protocol-refs[opt]
8187 objc-methodprotolist @end
8188 @interface identifier ( ) objc-protocol-refs[opt]
8189 objc-methodprotolist @end
8190 @implementation identifier ( identifier )
8192 objc-superclass:
8193 : identifier
8195 "@interface identifier (" must start "@interface identifier (
8196 identifier ) ...": objc-methodprotolist in the first production may
8197 not start with a parenthesized identifier as a declarator of a data
8198 definition with no declaration specifiers if the objc-superclass,
8199 objc-protocol-refs and objc-class-instance-variables are omitted. */
8201 static void
8202 c_parser_objc_class_definition (c_parser *parser, tree attributes)
8204 bool iface_p;
8205 tree id1;
8206 tree superclass;
8207 if (c_parser_next_token_is_keyword (parser, RID_AT_INTERFACE))
8208 iface_p = true;
8209 else if (c_parser_next_token_is_keyword (parser, RID_AT_IMPLEMENTATION))
8210 iface_p = false;
8211 else
8212 gcc_unreachable ();
8214 c_parser_consume_token (parser);
8215 if (c_parser_next_token_is_not (parser, CPP_NAME))
8217 c_parser_error (parser, "expected identifier");
8218 return;
8220 id1 = c_parser_peek_token (parser)->value;
8221 c_parser_consume_token (parser);
8222 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
8224 /* We have a category or class extension. */
8225 tree id2;
8226 tree proto = NULL_TREE;
8227 c_parser_consume_token (parser);
8228 if (c_parser_next_token_is_not (parser, CPP_NAME))
8230 if (iface_p && c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
8232 /* We have a class extension. */
8233 id2 = NULL_TREE;
8235 else
8237 c_parser_error (parser, "expected identifier or %<)%>");
8238 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
8239 return;
8242 else
8244 id2 = c_parser_peek_token (parser)->value;
8245 c_parser_consume_token (parser);
8247 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
8248 if (!iface_p)
8250 objc_start_category_implementation (id1, id2);
8251 return;
8253 if (c_parser_next_token_is (parser, CPP_LESS))
8254 proto = c_parser_objc_protocol_refs (parser);
8255 objc_start_category_interface (id1, id2, proto, attributes);
8256 c_parser_objc_methodprotolist (parser);
8257 c_parser_require_keyword (parser, RID_AT_END, "expected %<@end%>");
8258 objc_finish_interface ();
8259 return;
8261 if (c_parser_next_token_is (parser, CPP_COLON))
8263 c_parser_consume_token (parser);
8264 if (c_parser_next_token_is_not (parser, CPP_NAME))
8266 c_parser_error (parser, "expected identifier");
8267 return;
8269 superclass = c_parser_peek_token (parser)->value;
8270 c_parser_consume_token (parser);
8272 else
8273 superclass = NULL_TREE;
8274 if (iface_p)
8276 tree proto = NULL_TREE;
8277 if (c_parser_next_token_is (parser, CPP_LESS))
8278 proto = c_parser_objc_protocol_refs (parser);
8279 objc_start_class_interface (id1, superclass, proto, attributes);
8281 else
8282 objc_start_class_implementation (id1, superclass);
8283 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
8284 c_parser_objc_class_instance_variables (parser);
8285 if (iface_p)
8287 objc_continue_interface ();
8288 c_parser_objc_methodprotolist (parser);
8289 c_parser_require_keyword (parser, RID_AT_END, "expected %<@end%>");
8290 objc_finish_interface ();
8292 else
8294 objc_continue_implementation ();
8295 return;
8299 /* Parse objc-class-instance-variables.
8301 objc-class-instance-variables:
8302 { objc-instance-variable-decl-list[opt] }
8304 objc-instance-variable-decl-list:
8305 objc-visibility-spec
8306 objc-instance-variable-decl ;
8308 objc-instance-variable-decl-list objc-visibility-spec
8309 objc-instance-variable-decl-list objc-instance-variable-decl ;
8310 objc-instance-variable-decl-list ;
8312 objc-visibility-spec:
8313 @private
8314 @protected
8315 @public
8317 objc-instance-variable-decl:
8318 struct-declaration
8321 static void
8322 c_parser_objc_class_instance_variables (c_parser *parser)
8324 gcc_assert (c_parser_next_token_is (parser, CPP_OPEN_BRACE));
8325 c_parser_consume_token (parser);
8326 while (c_parser_next_token_is_not (parser, CPP_EOF))
8328 tree decls;
8329 /* Parse any stray semicolon. */
8330 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
8332 pedwarn (c_parser_peek_token (parser)->location, OPT_Wpedantic,
8333 "extra semicolon");
8334 c_parser_consume_token (parser);
8335 continue;
8337 /* Stop if at the end of the instance variables. */
8338 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
8340 c_parser_consume_token (parser);
8341 break;
8343 /* Parse any objc-visibility-spec. */
8344 if (c_parser_next_token_is_keyword (parser, RID_AT_PRIVATE))
8346 c_parser_consume_token (parser);
8347 objc_set_visibility (OBJC_IVAR_VIS_PRIVATE);
8348 continue;
8350 else if (c_parser_next_token_is_keyword (parser, RID_AT_PROTECTED))
8352 c_parser_consume_token (parser);
8353 objc_set_visibility (OBJC_IVAR_VIS_PROTECTED);
8354 continue;
8356 else if (c_parser_next_token_is_keyword (parser, RID_AT_PUBLIC))
8358 c_parser_consume_token (parser);
8359 objc_set_visibility (OBJC_IVAR_VIS_PUBLIC);
8360 continue;
8362 else if (c_parser_next_token_is_keyword (parser, RID_AT_PACKAGE))
8364 c_parser_consume_token (parser);
8365 objc_set_visibility (OBJC_IVAR_VIS_PACKAGE);
8366 continue;
8368 else if (c_parser_next_token_is (parser, CPP_PRAGMA))
8370 c_parser_pragma (parser, pragma_external);
8371 continue;
8374 /* Parse some comma-separated declarations. */
8375 decls = c_parser_struct_declaration (parser);
8376 if (decls == NULL)
8378 /* There is a syntax error. We want to skip the offending
8379 tokens up to the next ';' (included) or '}'
8380 (excluded). */
8382 /* First, skip manually a ')' or ']'. This is because they
8383 reduce the nesting level, so c_parser_skip_until_found()
8384 wouldn't be able to skip past them. */
8385 c_token *token = c_parser_peek_token (parser);
8386 if (token->type == CPP_CLOSE_PAREN || token->type == CPP_CLOSE_SQUARE)
8387 c_parser_consume_token (parser);
8389 /* Then, do the standard skipping. */
8390 c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
8392 /* We hopefully recovered. Start normal parsing again. */
8393 parser->error = false;
8394 continue;
8396 else
8398 /* Comma-separated instance variables are chained together
8399 in reverse order; add them one by one. */
8400 tree ivar = nreverse (decls);
8401 for (; ivar; ivar = DECL_CHAIN (ivar))
8402 objc_add_instance_variable (copy_node (ivar));
8404 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
8408 /* Parse an objc-class-declaration.
8410 objc-class-declaration:
8411 @class identifier-list ;
8414 static void
8415 c_parser_objc_class_declaration (c_parser *parser)
8417 gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_CLASS));
8418 c_parser_consume_token (parser);
8419 /* Any identifiers, including those declared as type names, are OK
8420 here. */
8421 while (true)
8423 tree id;
8424 if (c_parser_next_token_is_not (parser, CPP_NAME))
8426 c_parser_error (parser, "expected identifier");
8427 c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
8428 parser->error = false;
8429 return;
8431 id = c_parser_peek_token (parser)->value;
8432 objc_declare_class (id);
8433 c_parser_consume_token (parser);
8434 if (c_parser_next_token_is (parser, CPP_COMMA))
8435 c_parser_consume_token (parser);
8436 else
8437 break;
8439 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
8442 /* Parse an objc-alias-declaration.
8444 objc-alias-declaration:
8445 @compatibility_alias identifier identifier ;
8448 static void
8449 c_parser_objc_alias_declaration (c_parser *parser)
8451 tree id1, id2;
8452 gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_ALIAS));
8453 c_parser_consume_token (parser);
8454 if (c_parser_next_token_is_not (parser, CPP_NAME))
8456 c_parser_error (parser, "expected identifier");
8457 c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
8458 return;
8460 id1 = c_parser_peek_token (parser)->value;
8461 c_parser_consume_token (parser);
8462 if (c_parser_next_token_is_not (parser, CPP_NAME))
8464 c_parser_error (parser, "expected identifier");
8465 c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
8466 return;
8468 id2 = c_parser_peek_token (parser)->value;
8469 c_parser_consume_token (parser);
8470 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
8471 objc_declare_alias (id1, id2);
8474 /* Parse an objc-protocol-definition.
8476 objc-protocol-definition:
8477 @protocol identifier objc-protocol-refs[opt] objc-methodprotolist @end
8478 @protocol identifier-list ;
8480 "@protocol identifier ;" should be resolved as "@protocol
8481 identifier-list ;": objc-methodprotolist may not start with a
8482 semicolon in the first alternative if objc-protocol-refs are
8483 omitted. */
8485 static void
8486 c_parser_objc_protocol_definition (c_parser *parser, tree attributes)
8488 gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_PROTOCOL));
8490 c_parser_consume_token (parser);
8491 if (c_parser_next_token_is_not (parser, CPP_NAME))
8493 c_parser_error (parser, "expected identifier");
8494 return;
8496 if (c_parser_peek_2nd_token (parser)->type == CPP_COMMA
8497 || c_parser_peek_2nd_token (parser)->type == CPP_SEMICOLON)
8499 /* Any identifiers, including those declared as type names, are
8500 OK here. */
8501 while (true)
8503 tree id;
8504 if (c_parser_next_token_is_not (parser, CPP_NAME))
8506 c_parser_error (parser, "expected identifier");
8507 break;
8509 id = c_parser_peek_token (parser)->value;
8510 objc_declare_protocol (id, attributes);
8511 c_parser_consume_token (parser);
8512 if (c_parser_next_token_is (parser, CPP_COMMA))
8513 c_parser_consume_token (parser);
8514 else
8515 break;
8517 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
8519 else
8521 tree id = c_parser_peek_token (parser)->value;
8522 tree proto = NULL_TREE;
8523 c_parser_consume_token (parser);
8524 if (c_parser_next_token_is (parser, CPP_LESS))
8525 proto = c_parser_objc_protocol_refs (parser);
8526 parser->objc_pq_context = true;
8527 objc_start_protocol (id, proto, attributes);
8528 c_parser_objc_methodprotolist (parser);
8529 c_parser_require_keyword (parser, RID_AT_END, "expected %<@end%>");
8530 parser->objc_pq_context = false;
8531 objc_finish_interface ();
8535 /* Parse an objc-method-type.
8537 objc-method-type:
8541 Return true if it is a class method (+) and false if it is
8542 an instance method (-).
8544 static inline bool
8545 c_parser_objc_method_type (c_parser *parser)
8547 switch (c_parser_peek_token (parser)->type)
8549 case CPP_PLUS:
8550 c_parser_consume_token (parser);
8551 return true;
8552 case CPP_MINUS:
8553 c_parser_consume_token (parser);
8554 return false;
8555 default:
8556 gcc_unreachable ();
8560 /* Parse an objc-method-definition.
8562 objc-method-definition:
8563 objc-method-type objc-method-decl ;[opt] compound-statement
8566 static void
8567 c_parser_objc_method_definition (c_parser *parser)
8569 bool is_class_method = c_parser_objc_method_type (parser);
8570 tree decl, attributes = NULL_TREE, expr = NULL_TREE;
8571 parser->objc_pq_context = true;
8572 decl = c_parser_objc_method_decl (parser, is_class_method, &attributes,
8573 &expr);
8574 if (decl == error_mark_node)
8575 return; /* Bail here. */
8577 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
8579 c_parser_consume_token (parser);
8580 pedwarn (c_parser_peek_token (parser)->location, OPT_Wpedantic,
8581 "extra semicolon in method definition specified");
8584 if (!c_parser_next_token_is (parser, CPP_OPEN_BRACE))
8586 c_parser_error (parser, "expected %<{%>");
8587 return;
8590 parser->objc_pq_context = false;
8591 if (objc_start_method_definition (is_class_method, decl, attributes, expr))
8593 add_stmt (c_parser_compound_statement (parser));
8594 objc_finish_method_definition (current_function_decl);
8596 else
8598 /* This code is executed when we find a method definition
8599 outside of an @implementation context (or invalid for other
8600 reasons). Parse the method (to keep going) but do not emit
8601 any code.
8603 c_parser_compound_statement (parser);
8607 /* Parse an objc-methodprotolist.
8609 objc-methodprotolist:
8610 empty
8611 objc-methodprotolist objc-methodproto
8612 objc-methodprotolist declaration
8613 objc-methodprotolist ;
8614 @optional
8615 @required
8617 The declaration is a data definition, which may be missing
8618 declaration specifiers under the same rules and diagnostics as
8619 other data definitions outside functions, and the stray semicolon
8620 is diagnosed the same way as a stray semicolon outside a
8621 function. */
8623 static void
8624 c_parser_objc_methodprotolist (c_parser *parser)
8626 while (true)
8628 /* The list is terminated by @end. */
8629 switch (c_parser_peek_token (parser)->type)
8631 case CPP_SEMICOLON:
8632 pedwarn (c_parser_peek_token (parser)->location, OPT_Wpedantic,
8633 "ISO C does not allow extra %<;%> outside of a function");
8634 c_parser_consume_token (parser);
8635 break;
8636 case CPP_PLUS:
8637 case CPP_MINUS:
8638 c_parser_objc_methodproto (parser);
8639 break;
8640 case CPP_PRAGMA:
8641 c_parser_pragma (parser, pragma_external);
8642 break;
8643 case CPP_EOF:
8644 return;
8645 default:
8646 if (c_parser_next_token_is_keyword (parser, RID_AT_END))
8647 return;
8648 else if (c_parser_next_token_is_keyword (parser, RID_AT_PROPERTY))
8649 c_parser_objc_at_property_declaration (parser);
8650 else if (c_parser_next_token_is_keyword (parser, RID_AT_OPTIONAL))
8652 objc_set_method_opt (true);
8653 c_parser_consume_token (parser);
8655 else if (c_parser_next_token_is_keyword (parser, RID_AT_REQUIRED))
8657 objc_set_method_opt (false);
8658 c_parser_consume_token (parser);
8660 else
8661 c_parser_declaration_or_fndef (parser, false, false, true,
8662 false, true, NULL, vNULL);
8663 break;
8668 /* Parse an objc-methodproto.
8670 objc-methodproto:
8671 objc-method-type objc-method-decl ;
8674 static void
8675 c_parser_objc_methodproto (c_parser *parser)
8677 bool is_class_method = c_parser_objc_method_type (parser);
8678 tree decl, attributes = NULL_TREE;
8680 /* Remember protocol qualifiers in prototypes. */
8681 parser->objc_pq_context = true;
8682 decl = c_parser_objc_method_decl (parser, is_class_method, &attributes,
8683 NULL);
8684 /* Forget protocol qualifiers now. */
8685 parser->objc_pq_context = false;
8687 /* Do not allow the presence of attributes to hide an erroneous
8688 method implementation in the interface section. */
8689 if (!c_parser_next_token_is (parser, CPP_SEMICOLON))
8691 c_parser_error (parser, "expected %<;%>");
8692 return;
8695 if (decl != error_mark_node)
8696 objc_add_method_declaration (is_class_method, decl, attributes);
8698 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
8701 /* If we are at a position that method attributes may be present, check that
8702 there are not any parsed already (a syntax error) and then collect any
8703 specified at the current location. Finally, if new attributes were present,
8704 check that the next token is legal ( ';' for decls and '{' for defs). */
8706 static bool
8707 c_parser_objc_maybe_method_attributes (c_parser* parser, tree* attributes)
8709 bool bad = false;
8710 if (*attributes)
8712 c_parser_error (parser,
8713 "method attributes must be specified at the end only");
8714 *attributes = NULL_TREE;
8715 bad = true;
8718 if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
8719 *attributes = c_parser_attributes (parser);
8721 /* If there were no attributes here, just report any earlier error. */
8722 if (*attributes == NULL_TREE || bad)
8723 return bad;
8725 /* If the attributes are followed by a ; or {, then just report any earlier
8726 error. */
8727 if (c_parser_next_token_is (parser, CPP_SEMICOLON)
8728 || c_parser_next_token_is (parser, CPP_OPEN_BRACE))
8729 return bad;
8731 /* We've got attributes, but not at the end. */
8732 c_parser_error (parser,
8733 "expected %<;%> or %<{%> after method attribute definition");
8734 return true;
8737 /* Parse an objc-method-decl.
8739 objc-method-decl:
8740 ( objc-type-name ) objc-selector
8741 objc-selector
8742 ( objc-type-name ) objc-keyword-selector objc-optparmlist
8743 objc-keyword-selector objc-optparmlist
8744 attributes
8746 objc-keyword-selector:
8747 objc-keyword-decl
8748 objc-keyword-selector objc-keyword-decl
8750 objc-keyword-decl:
8751 objc-selector : ( objc-type-name ) identifier
8752 objc-selector : identifier
8753 : ( objc-type-name ) identifier
8754 : identifier
8756 objc-optparmlist:
8757 objc-optparms objc-optellipsis
8759 objc-optparms:
8760 empty
8761 objc-opt-parms , parameter-declaration
8763 objc-optellipsis:
8764 empty
8765 , ...
8768 static tree
8769 c_parser_objc_method_decl (c_parser *parser, bool is_class_method,
8770 tree *attributes, tree *expr)
8772 tree type = NULL_TREE;
8773 tree sel;
8774 tree parms = NULL_TREE;
8775 bool ellipsis = false;
8776 bool attr_err = false;
8778 *attributes = NULL_TREE;
8779 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
8781 c_parser_consume_token (parser);
8782 type = c_parser_objc_type_name (parser);
8783 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
8785 sel = c_parser_objc_selector (parser);
8786 /* If there is no selector, or a colon follows, we have an
8787 objc-keyword-selector. If there is a selector, and a colon does
8788 not follow, that selector ends the objc-method-decl. */
8789 if (!sel || c_parser_next_token_is (parser, CPP_COLON))
8791 tree tsel = sel;
8792 tree list = NULL_TREE;
8793 while (true)
8795 tree atype = NULL_TREE, id, keyworddecl;
8796 tree param_attr = NULL_TREE;
8797 if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
8798 break;
8799 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
8801 c_parser_consume_token (parser);
8802 atype = c_parser_objc_type_name (parser);
8803 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
8804 "expected %<)%>");
8806 /* New ObjC allows attributes on method parameters. */
8807 if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
8808 param_attr = c_parser_attributes (parser);
8809 if (c_parser_next_token_is_not (parser, CPP_NAME))
8811 c_parser_error (parser, "expected identifier");
8812 return error_mark_node;
8814 id = c_parser_peek_token (parser)->value;
8815 c_parser_consume_token (parser);
8816 keyworddecl = objc_build_keyword_decl (tsel, atype, id, param_attr);
8817 list = chainon (list, keyworddecl);
8818 tsel = c_parser_objc_selector (parser);
8819 if (!tsel && c_parser_next_token_is_not (parser, CPP_COLON))
8820 break;
8823 attr_err |= c_parser_objc_maybe_method_attributes (parser, attributes) ;
8825 /* Parse the optional parameter list. Optional Objective-C
8826 method parameters follow the C syntax, and may include '...'
8827 to denote a variable number of arguments. */
8828 parms = make_node (TREE_LIST);
8829 while (c_parser_next_token_is (parser, CPP_COMMA))
8831 struct c_parm *parm;
8832 c_parser_consume_token (parser);
8833 if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
8835 ellipsis = true;
8836 c_parser_consume_token (parser);
8837 attr_err |= c_parser_objc_maybe_method_attributes
8838 (parser, attributes) ;
8839 break;
8841 parm = c_parser_parameter_declaration (parser, NULL_TREE);
8842 if (parm == NULL)
8843 break;
8844 parms = chainon (parms,
8845 build_tree_list (NULL_TREE, grokparm (parm, expr)));
8847 sel = list;
8849 else
8850 attr_err |= c_parser_objc_maybe_method_attributes (parser, attributes) ;
8852 if (sel == NULL)
8854 c_parser_error (parser, "objective-c method declaration is expected");
8855 return error_mark_node;
8858 if (attr_err)
8859 return error_mark_node;
8861 return objc_build_method_signature (is_class_method, type, sel, parms, ellipsis);
8864 /* Parse an objc-type-name.
8866 objc-type-name:
8867 objc-type-qualifiers[opt] type-name
8868 objc-type-qualifiers[opt]
8870 objc-type-qualifiers:
8871 objc-type-qualifier
8872 objc-type-qualifiers objc-type-qualifier
8874 objc-type-qualifier: one of
8875 in out inout bycopy byref oneway
8878 static tree
8879 c_parser_objc_type_name (c_parser *parser)
8881 tree quals = NULL_TREE;
8882 struct c_type_name *type_name = NULL;
8883 tree type = NULL_TREE;
8884 while (true)
8886 c_token *token = c_parser_peek_token (parser);
8887 if (token->type == CPP_KEYWORD
8888 && (token->keyword == RID_IN
8889 || token->keyword == RID_OUT
8890 || token->keyword == RID_INOUT
8891 || token->keyword == RID_BYCOPY
8892 || token->keyword == RID_BYREF
8893 || token->keyword == RID_ONEWAY))
8895 quals = chainon (build_tree_list (NULL_TREE, token->value), quals);
8896 c_parser_consume_token (parser);
8898 else
8899 break;
8901 if (c_parser_next_tokens_start_typename (parser, cla_prefer_type))
8902 type_name = c_parser_type_name (parser);
8903 if (type_name)
8904 type = groktypename (type_name, NULL, NULL);
8906 /* If the type is unknown, and error has already been produced and
8907 we need to recover from the error. In that case, use NULL_TREE
8908 for the type, as if no type had been specified; this will use the
8909 default type ('id') which is good for error recovery. */
8910 if (type == error_mark_node)
8911 type = NULL_TREE;
8913 return build_tree_list (quals, type);
8916 /* Parse objc-protocol-refs.
8918 objc-protocol-refs:
8919 < identifier-list >
8922 static tree
8923 c_parser_objc_protocol_refs (c_parser *parser)
8925 tree list = NULL_TREE;
8926 gcc_assert (c_parser_next_token_is (parser, CPP_LESS));
8927 c_parser_consume_token (parser);
8928 /* Any identifiers, including those declared as type names, are OK
8929 here. */
8930 while (true)
8932 tree id;
8933 if (c_parser_next_token_is_not (parser, CPP_NAME))
8935 c_parser_error (parser, "expected identifier");
8936 break;
8938 id = c_parser_peek_token (parser)->value;
8939 list = chainon (list, build_tree_list (NULL_TREE, id));
8940 c_parser_consume_token (parser);
8941 if (c_parser_next_token_is (parser, CPP_COMMA))
8942 c_parser_consume_token (parser);
8943 else
8944 break;
8946 c_parser_require (parser, CPP_GREATER, "expected %<>%>");
8947 return list;
8950 /* Parse an objc-try-catch-finally-statement.
8952 objc-try-catch-finally-statement:
8953 @try compound-statement objc-catch-list[opt]
8954 @try compound-statement objc-catch-list[opt] @finally compound-statement
8956 objc-catch-list:
8957 @catch ( objc-catch-parameter-declaration ) compound-statement
8958 objc-catch-list @catch ( objc-catch-parameter-declaration ) compound-statement
8960 objc-catch-parameter-declaration:
8961 parameter-declaration
8962 '...'
8964 where '...' is to be interpreted literally, that is, it means CPP_ELLIPSIS.
8966 PS: This function is identical to cp_parser_objc_try_catch_finally_statement
8967 for C++. Keep them in sync. */
8969 static void
8970 c_parser_objc_try_catch_finally_statement (c_parser *parser)
8972 location_t location;
8973 tree stmt;
8975 gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_TRY));
8976 c_parser_consume_token (parser);
8977 location = c_parser_peek_token (parser)->location;
8978 objc_maybe_warn_exceptions (location);
8979 stmt = c_parser_compound_statement (parser);
8980 objc_begin_try_stmt (location, stmt);
8982 while (c_parser_next_token_is_keyword (parser, RID_AT_CATCH))
8984 struct c_parm *parm;
8985 tree parameter_declaration = error_mark_node;
8986 bool seen_open_paren = false;
8988 c_parser_consume_token (parser);
8989 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
8990 seen_open_paren = true;
8991 if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
8993 /* We have "@catch (...)" (where the '...' are literally
8994 what is in the code). Skip the '...'.
8995 parameter_declaration is set to NULL_TREE, and
8996 objc_being_catch_clauses() knows that that means
8997 '...'. */
8998 c_parser_consume_token (parser);
8999 parameter_declaration = NULL_TREE;
9001 else
9003 /* We have "@catch (NSException *exception)" or something
9004 like that. Parse the parameter declaration. */
9005 parm = c_parser_parameter_declaration (parser, NULL_TREE);
9006 if (parm == NULL)
9007 parameter_declaration = error_mark_node;
9008 else
9009 parameter_declaration = grokparm (parm, NULL);
9011 if (seen_open_paren)
9012 c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>");
9013 else
9015 /* If there was no open parenthesis, we are recovering from
9016 an error, and we are trying to figure out what mistake
9017 the user has made. */
9019 /* If there is an immediate closing parenthesis, the user
9020 probably forgot the opening one (ie, they typed "@catch
9021 NSException *e)". Parse the closing parenthesis and keep
9022 going. */
9023 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
9024 c_parser_consume_token (parser);
9026 /* If these is no immediate closing parenthesis, the user
9027 probably doesn't know that parenthesis are required at
9028 all (ie, they typed "@catch NSException *e"). So, just
9029 forget about the closing parenthesis and keep going. */
9031 objc_begin_catch_clause (parameter_declaration);
9032 if (c_parser_require (parser, CPP_OPEN_BRACE, "expected %<{%>"))
9033 c_parser_compound_statement_nostart (parser);
9034 objc_finish_catch_clause ();
9036 if (c_parser_next_token_is_keyword (parser, RID_AT_FINALLY))
9038 c_parser_consume_token (parser);
9039 location = c_parser_peek_token (parser)->location;
9040 stmt = c_parser_compound_statement (parser);
9041 objc_build_finally_clause (location, stmt);
9043 objc_finish_try_stmt ();
9046 /* Parse an objc-synchronized-statement.
9048 objc-synchronized-statement:
9049 @synchronized ( expression ) compound-statement
9052 static void
9053 c_parser_objc_synchronized_statement (c_parser *parser)
9055 location_t loc;
9056 tree expr, stmt;
9057 gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_SYNCHRONIZED));
9058 c_parser_consume_token (parser);
9059 loc = c_parser_peek_token (parser)->location;
9060 objc_maybe_warn_exceptions (loc);
9061 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
9063 struct c_expr ce = c_parser_expression (parser);
9064 ce = convert_lvalue_to_rvalue (loc, ce, false, false);
9065 expr = ce.value;
9066 expr = c_fully_fold (expr, false, NULL);
9067 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
9069 else
9070 expr = error_mark_node;
9071 stmt = c_parser_compound_statement (parser);
9072 objc_build_synchronized (loc, expr, stmt);
9075 /* Parse an objc-selector; return NULL_TREE without an error if the
9076 next token is not an objc-selector.
9078 objc-selector:
9079 identifier
9080 one of
9081 enum struct union if else while do for switch case default
9082 break continue return goto asm sizeof typeof __alignof
9083 unsigned long const short volatile signed restrict _Complex
9084 in out inout bycopy byref oneway int char float double void _Bool
9085 _Atomic
9087 ??? Why this selection of keywords but not, for example, storage
9088 class specifiers? */
9090 static tree
9091 c_parser_objc_selector (c_parser *parser)
9093 c_token *token = c_parser_peek_token (parser);
9094 tree value = token->value;
9095 if (token->type == CPP_NAME)
9097 c_parser_consume_token (parser);
9098 return value;
9100 if (token->type != CPP_KEYWORD)
9101 return NULL_TREE;
9102 switch (token->keyword)
9104 case RID_ENUM:
9105 case RID_STRUCT:
9106 case RID_UNION:
9107 case RID_IF:
9108 case RID_ELSE:
9109 case RID_WHILE:
9110 case RID_DO:
9111 case RID_FOR:
9112 case RID_SWITCH:
9113 case RID_CASE:
9114 case RID_DEFAULT:
9115 case RID_BREAK:
9116 case RID_CONTINUE:
9117 case RID_RETURN:
9118 case RID_GOTO:
9119 case RID_ASM:
9120 case RID_SIZEOF:
9121 case RID_TYPEOF:
9122 case RID_ALIGNOF:
9123 case RID_UNSIGNED:
9124 case RID_LONG:
9125 case RID_CONST:
9126 case RID_SHORT:
9127 case RID_VOLATILE:
9128 case RID_SIGNED:
9129 case RID_RESTRICT:
9130 case RID_COMPLEX:
9131 case RID_IN:
9132 case RID_OUT:
9133 case RID_INOUT:
9134 case RID_BYCOPY:
9135 case RID_BYREF:
9136 case RID_ONEWAY:
9137 case RID_INT:
9138 case RID_CHAR:
9139 case RID_FLOAT:
9140 case RID_DOUBLE:
9141 case RID_VOID:
9142 case RID_BOOL:
9143 case RID_ATOMIC:
9144 case RID_AUTO_TYPE:
9145 case RID_INT_N_0:
9146 case RID_INT_N_1:
9147 case RID_INT_N_2:
9148 case RID_INT_N_3:
9149 c_parser_consume_token (parser);
9150 return value;
9151 default:
9152 return NULL_TREE;
9156 /* Parse an objc-selector-arg.
9158 objc-selector-arg:
9159 objc-selector
9160 objc-keywordname-list
9162 objc-keywordname-list:
9163 objc-keywordname
9164 objc-keywordname-list objc-keywordname
9166 objc-keywordname:
9167 objc-selector :
9171 static tree
9172 c_parser_objc_selector_arg (c_parser *parser)
9174 tree sel = c_parser_objc_selector (parser);
9175 tree list = NULL_TREE;
9176 if (sel && c_parser_next_token_is_not (parser, CPP_COLON))
9177 return sel;
9178 while (true)
9180 if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
9181 return list;
9182 list = chainon (list, build_tree_list (sel, NULL_TREE));
9183 sel = c_parser_objc_selector (parser);
9184 if (!sel && c_parser_next_token_is_not (parser, CPP_COLON))
9185 break;
9187 return list;
9190 /* Parse an objc-receiver.
9192 objc-receiver:
9193 expression
9194 class-name
9195 type-name
9198 static tree
9199 c_parser_objc_receiver (c_parser *parser)
9201 location_t loc = c_parser_peek_token (parser)->location;
9203 if (c_parser_peek_token (parser)->type == CPP_NAME
9204 && (c_parser_peek_token (parser)->id_kind == C_ID_TYPENAME
9205 || c_parser_peek_token (parser)->id_kind == C_ID_CLASSNAME))
9207 tree id = c_parser_peek_token (parser)->value;
9208 c_parser_consume_token (parser);
9209 return objc_get_class_reference (id);
9211 struct c_expr ce = c_parser_expression (parser);
9212 ce = convert_lvalue_to_rvalue (loc, ce, false, false);
9213 return c_fully_fold (ce.value, false, NULL);
9216 /* Parse objc-message-args.
9218 objc-message-args:
9219 objc-selector
9220 objc-keywordarg-list
9222 objc-keywordarg-list:
9223 objc-keywordarg
9224 objc-keywordarg-list objc-keywordarg
9226 objc-keywordarg:
9227 objc-selector : objc-keywordexpr
9228 : objc-keywordexpr
9231 static tree
9232 c_parser_objc_message_args (c_parser *parser)
9234 tree sel = c_parser_objc_selector (parser);
9235 tree list = NULL_TREE;
9236 if (sel && c_parser_next_token_is_not (parser, CPP_COLON))
9237 return sel;
9238 while (true)
9240 tree keywordexpr;
9241 if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
9242 return error_mark_node;
9243 keywordexpr = c_parser_objc_keywordexpr (parser);
9244 list = chainon (list, build_tree_list (sel, keywordexpr));
9245 sel = c_parser_objc_selector (parser);
9246 if (!sel && c_parser_next_token_is_not (parser, CPP_COLON))
9247 break;
9249 return list;
9252 /* Parse an objc-keywordexpr.
9254 objc-keywordexpr:
9255 nonempty-expr-list
9258 static tree
9259 c_parser_objc_keywordexpr (c_parser *parser)
9261 tree ret;
9262 vec<tree, va_gc> *expr_list = c_parser_expr_list (parser, true, true,
9263 NULL, NULL, NULL, NULL);
9264 if (vec_safe_length (expr_list) == 1)
9266 /* Just return the expression, remove a level of
9267 indirection. */
9268 ret = (*expr_list)[0];
9270 else
9272 /* We have a comma expression, we will collapse later. */
9273 ret = build_tree_list_vec (expr_list);
9275 release_tree_vector (expr_list);
9276 return ret;
9279 /* A check, needed in several places, that ObjC interface, implementation or
9280 method definitions are not prefixed by incorrect items. */
9281 static bool
9282 c_parser_objc_diagnose_bad_element_prefix (c_parser *parser,
9283 struct c_declspecs *specs)
9285 if (!specs->declspecs_seen_p || specs->non_sc_seen_p
9286 || specs->typespec_kind != ctsk_none)
9288 c_parser_error (parser,
9289 "no type or storage class may be specified here,");
9290 c_parser_skip_to_end_of_block_or_statement (parser);
9291 return true;
9293 return false;
9296 /* Parse an Objective-C @property declaration. The syntax is:
9298 objc-property-declaration:
9299 '@property' objc-property-attributes[opt] struct-declaration ;
9301 objc-property-attributes:
9302 '(' objc-property-attribute-list ')'
9304 objc-property-attribute-list:
9305 objc-property-attribute
9306 objc-property-attribute-list, objc-property-attribute
9308 objc-property-attribute
9309 'getter' = identifier
9310 'setter' = identifier
9311 'readonly'
9312 'readwrite'
9313 'assign'
9314 'retain'
9315 'copy'
9316 'nonatomic'
9318 For example:
9319 @property NSString *name;
9320 @property (readonly) id object;
9321 @property (retain, nonatomic, getter=getTheName) id name;
9322 @property int a, b, c;
9324 PS: This function is identical to cp_parser_objc_at_propery_declaration
9325 for C++. Keep them in sync. */
9326 static void
9327 c_parser_objc_at_property_declaration (c_parser *parser)
9329 /* The following variables hold the attributes of the properties as
9330 parsed. They are 'false' or 'NULL_TREE' if the attribute was not
9331 seen. When we see an attribute, we set them to 'true' (if they
9332 are boolean properties) or to the identifier (if they have an
9333 argument, ie, for getter and setter). Note that here we only
9334 parse the list of attributes, check the syntax and accumulate the
9335 attributes that we find. objc_add_property_declaration() will
9336 then process the information. */
9337 bool property_assign = false;
9338 bool property_copy = false;
9339 tree property_getter_ident = NULL_TREE;
9340 bool property_nonatomic = false;
9341 bool property_readonly = false;
9342 bool property_readwrite = false;
9343 bool property_retain = false;
9344 tree property_setter_ident = NULL_TREE;
9346 /* 'properties' is the list of properties that we read. Usually a
9347 single one, but maybe more (eg, in "@property int a, b, c;" there
9348 are three). */
9349 tree properties;
9350 location_t loc;
9352 loc = c_parser_peek_token (parser)->location;
9353 gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_PROPERTY));
9355 c_parser_consume_token (parser); /* Eat '@property'. */
9357 /* Parse the optional attribute list... */
9358 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
9360 /* Eat the '(' */
9361 c_parser_consume_token (parser);
9363 /* Property attribute keywords are valid now. */
9364 parser->objc_property_attr_context = true;
9366 while (true)
9368 bool syntax_error = false;
9369 c_token *token = c_parser_peek_token (parser);
9370 enum rid keyword;
9372 if (token->type != CPP_KEYWORD)
9374 if (token->type == CPP_CLOSE_PAREN)
9375 c_parser_error (parser, "expected identifier");
9376 else
9378 c_parser_consume_token (parser);
9379 c_parser_error (parser, "unknown property attribute");
9381 break;
9383 keyword = token->keyword;
9384 c_parser_consume_token (parser);
9385 switch (keyword)
9387 case RID_ASSIGN: property_assign = true; break;
9388 case RID_COPY: property_copy = true; break;
9389 case RID_NONATOMIC: property_nonatomic = true; break;
9390 case RID_READONLY: property_readonly = true; break;
9391 case RID_READWRITE: property_readwrite = true; break;
9392 case RID_RETAIN: property_retain = true; break;
9394 case RID_GETTER:
9395 case RID_SETTER:
9396 if (c_parser_next_token_is_not (parser, CPP_EQ))
9398 if (keyword == RID_GETTER)
9399 c_parser_error (parser,
9400 "missing %<=%> (after %<getter%> attribute)");
9401 else
9402 c_parser_error (parser,
9403 "missing %<=%> (after %<setter%> attribute)");
9404 syntax_error = true;
9405 break;
9407 c_parser_consume_token (parser); /* eat the = */
9408 if (c_parser_next_token_is_not (parser, CPP_NAME))
9410 c_parser_error (parser, "expected identifier");
9411 syntax_error = true;
9412 break;
9414 if (keyword == RID_SETTER)
9416 if (property_setter_ident != NULL_TREE)
9417 c_parser_error (parser, "the %<setter%> attribute may only be specified once");
9418 else
9419 property_setter_ident = c_parser_peek_token (parser)->value;
9420 c_parser_consume_token (parser);
9421 if (c_parser_next_token_is_not (parser, CPP_COLON))
9422 c_parser_error (parser, "setter name must terminate with %<:%>");
9423 else
9424 c_parser_consume_token (parser);
9426 else
9428 if (property_getter_ident != NULL_TREE)
9429 c_parser_error (parser, "the %<getter%> attribute may only be specified once");
9430 else
9431 property_getter_ident = c_parser_peek_token (parser)->value;
9432 c_parser_consume_token (parser);
9434 break;
9435 default:
9436 c_parser_error (parser, "unknown property attribute");
9437 syntax_error = true;
9438 break;
9441 if (syntax_error)
9442 break;
9444 if (c_parser_next_token_is (parser, CPP_COMMA))
9445 c_parser_consume_token (parser);
9446 else
9447 break;
9449 parser->objc_property_attr_context = false;
9450 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
9452 /* ... and the property declaration(s). */
9453 properties = c_parser_struct_declaration (parser);
9455 if (properties == error_mark_node)
9457 c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
9458 parser->error = false;
9459 return;
9462 if (properties == NULL_TREE)
9463 c_parser_error (parser, "expected identifier");
9464 else
9466 /* Comma-separated properties are chained together in
9467 reverse order; add them one by one. */
9468 properties = nreverse (properties);
9470 for (; properties; properties = TREE_CHAIN (properties))
9471 objc_add_property_declaration (loc, copy_node (properties),
9472 property_readonly, property_readwrite,
9473 property_assign, property_retain,
9474 property_copy, property_nonatomic,
9475 property_getter_ident, property_setter_ident);
9478 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
9479 parser->error = false;
9482 /* Parse an Objective-C @synthesize declaration. The syntax is:
9484 objc-synthesize-declaration:
9485 @synthesize objc-synthesize-identifier-list ;
9487 objc-synthesize-identifier-list:
9488 objc-synthesize-identifier
9489 objc-synthesize-identifier-list, objc-synthesize-identifier
9491 objc-synthesize-identifier
9492 identifier
9493 identifier = identifier
9495 For example:
9496 @synthesize MyProperty;
9497 @synthesize OneProperty, AnotherProperty=MyIvar, YetAnotherProperty;
9499 PS: This function is identical to cp_parser_objc_at_synthesize_declaration
9500 for C++. Keep them in sync.
9502 static void
9503 c_parser_objc_at_synthesize_declaration (c_parser *parser)
9505 tree list = NULL_TREE;
9506 location_t loc;
9507 gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_SYNTHESIZE));
9508 loc = c_parser_peek_token (parser)->location;
9510 c_parser_consume_token (parser);
9511 while (true)
9513 tree property, ivar;
9514 if (c_parser_next_token_is_not (parser, CPP_NAME))
9516 c_parser_error (parser, "expected identifier");
9517 c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
9518 /* Once we find the semicolon, we can resume normal parsing.
9519 We have to reset parser->error manually because
9520 c_parser_skip_until_found() won't reset it for us if the
9521 next token is precisely a semicolon. */
9522 parser->error = false;
9523 return;
9525 property = c_parser_peek_token (parser)->value;
9526 c_parser_consume_token (parser);
9527 if (c_parser_next_token_is (parser, CPP_EQ))
9529 c_parser_consume_token (parser);
9530 if (c_parser_next_token_is_not (parser, CPP_NAME))
9532 c_parser_error (parser, "expected identifier");
9533 c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
9534 parser->error = false;
9535 return;
9537 ivar = c_parser_peek_token (parser)->value;
9538 c_parser_consume_token (parser);
9540 else
9541 ivar = NULL_TREE;
9542 list = chainon (list, build_tree_list (ivar, property));
9543 if (c_parser_next_token_is (parser, CPP_COMMA))
9544 c_parser_consume_token (parser);
9545 else
9546 break;
9548 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
9549 objc_add_synthesize_declaration (loc, list);
9552 /* Parse an Objective-C @dynamic declaration. The syntax is:
9554 objc-dynamic-declaration:
9555 @dynamic identifier-list ;
9557 For example:
9558 @dynamic MyProperty;
9559 @dynamic MyProperty, AnotherProperty;
9561 PS: This function is identical to cp_parser_objc_at_dynamic_declaration
9562 for C++. Keep them in sync.
9564 static void
9565 c_parser_objc_at_dynamic_declaration (c_parser *parser)
9567 tree list = NULL_TREE;
9568 location_t loc;
9569 gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_DYNAMIC));
9570 loc = c_parser_peek_token (parser)->location;
9572 c_parser_consume_token (parser);
9573 while (true)
9575 tree property;
9576 if (c_parser_next_token_is_not (parser, CPP_NAME))
9578 c_parser_error (parser, "expected identifier");
9579 c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
9580 parser->error = false;
9581 return;
9583 property = c_parser_peek_token (parser)->value;
9584 list = chainon (list, build_tree_list (NULL_TREE, property));
9585 c_parser_consume_token (parser);
9586 if (c_parser_next_token_is (parser, CPP_COMMA))
9587 c_parser_consume_token (parser);
9588 else
9589 break;
9591 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
9592 objc_add_dynamic_declaration (loc, list);
9596 /* Handle pragmas. Some OpenMP pragmas are associated with, and therefore
9597 should be considered, statements. ALLOW_STMT is true if we're within
9598 the context of a function and such pragmas are to be allowed. Returns
9599 true if we actually parsed such a pragma. */
9601 static bool
9602 c_parser_pragma (c_parser *parser, enum pragma_context context)
9604 unsigned int id;
9606 id = c_parser_peek_token (parser)->pragma_kind;
9607 gcc_assert (id != PRAGMA_NONE);
9609 switch (id)
9611 case PRAGMA_OACC_ENTER_DATA:
9612 c_parser_oacc_enter_exit_data (parser, true);
9613 return false;
9615 case PRAGMA_OACC_EXIT_DATA:
9616 c_parser_oacc_enter_exit_data (parser, false);
9617 return false;
9619 case PRAGMA_OACC_UPDATE:
9620 if (context != pragma_compound)
9622 if (context == pragma_stmt)
9623 c_parser_error (parser, "%<#pragma acc update%> may only be "
9624 "used in compound statements");
9625 goto bad_stmt;
9627 c_parser_oacc_update (parser);
9628 return false;
9630 case PRAGMA_OMP_BARRIER:
9631 if (context != pragma_compound)
9633 if (context == pragma_stmt)
9634 c_parser_error (parser, "%<#pragma omp barrier%> may only be "
9635 "used in compound statements");
9636 goto bad_stmt;
9638 c_parser_omp_barrier (parser);
9639 return false;
9641 case PRAGMA_OMP_FLUSH:
9642 if (context != pragma_compound)
9644 if (context == pragma_stmt)
9645 c_parser_error (parser, "%<#pragma omp flush%> may only be "
9646 "used in compound statements");
9647 goto bad_stmt;
9649 c_parser_omp_flush (parser);
9650 return false;
9652 case PRAGMA_OMP_TASKWAIT:
9653 if (context != pragma_compound)
9655 if (context == pragma_stmt)
9656 c_parser_error (parser, "%<#pragma omp taskwait%> may only be "
9657 "used in compound statements");
9658 goto bad_stmt;
9660 c_parser_omp_taskwait (parser);
9661 return false;
9663 case PRAGMA_OMP_TASKYIELD:
9664 if (context != pragma_compound)
9666 if (context == pragma_stmt)
9667 c_parser_error (parser, "%<#pragma omp taskyield%> may only be "
9668 "used in compound statements");
9669 goto bad_stmt;
9671 c_parser_omp_taskyield (parser);
9672 return false;
9674 case PRAGMA_OMP_CANCEL:
9675 if (context != pragma_compound)
9677 if (context == pragma_stmt)
9678 c_parser_error (parser, "%<#pragma omp cancel%> may only be "
9679 "used in compound statements");
9680 goto bad_stmt;
9682 c_parser_omp_cancel (parser);
9683 return false;
9685 case PRAGMA_OMP_CANCELLATION_POINT:
9686 if (context != pragma_compound)
9688 if (context == pragma_stmt)
9689 c_parser_error (parser, "%<#pragma omp cancellation point%> may "
9690 "only be used in compound statements");
9691 goto bad_stmt;
9693 c_parser_omp_cancellation_point (parser);
9694 return false;
9696 case PRAGMA_OMP_THREADPRIVATE:
9697 c_parser_omp_threadprivate (parser);
9698 return false;
9700 case PRAGMA_OMP_TARGET:
9701 return c_parser_omp_target (parser, context);
9703 case PRAGMA_OMP_END_DECLARE_TARGET:
9704 c_parser_omp_end_declare_target (parser);
9705 return false;
9707 case PRAGMA_OMP_SECTION:
9708 error_at (c_parser_peek_token (parser)->location,
9709 "%<#pragma omp section%> may only be used in "
9710 "%<#pragma omp sections%> construct");
9711 c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL);
9712 return false;
9714 case PRAGMA_OMP_DECLARE_REDUCTION:
9715 c_parser_omp_declare (parser, context);
9716 return false;
9717 case PRAGMA_IVDEP:
9718 c_parser_consume_pragma (parser);
9719 c_parser_skip_to_pragma_eol (parser);
9720 if (!c_parser_next_token_is_keyword (parser, RID_FOR)
9721 && !c_parser_next_token_is_keyword (parser, RID_WHILE)
9722 && !c_parser_next_token_is_keyword (parser, RID_DO))
9724 c_parser_error (parser, "for, while or do statement expected");
9725 return false;
9727 if (c_parser_next_token_is_keyword (parser, RID_FOR))
9728 c_parser_for_statement (parser, true);
9729 else if (c_parser_next_token_is_keyword (parser, RID_WHILE))
9730 c_parser_while_statement (parser, true);
9731 else
9732 c_parser_do_statement (parser, true);
9733 return false;
9735 case PRAGMA_GCC_PCH_PREPROCESS:
9736 c_parser_error (parser, "%<#pragma GCC pch_preprocess%> must be first");
9737 c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL);
9738 return false;
9740 case PRAGMA_CILK_SIMD:
9741 if (!c_parser_cilk_verify_simd (parser, context))
9742 return false;
9743 c_parser_consume_pragma (parser);
9744 c_parser_cilk_simd (parser);
9745 return false;
9746 case PRAGMA_CILK_GRAINSIZE:
9747 if (!flag_cilkplus)
9749 warning (0, "%<#pragma grainsize%> ignored because -fcilkplus is not"
9750 " enabled");
9751 c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL);
9752 return false;
9754 if (context == pragma_external)
9756 error_at (c_parser_peek_token (parser)->location,
9757 "%<#pragma grainsize%> must be inside a function");
9758 c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL);
9759 return false;
9761 c_parser_cilk_grainsize (parser);
9762 return false;
9764 default:
9765 if (id < PRAGMA_FIRST_EXTERNAL)
9767 if (context != pragma_stmt && context != pragma_compound)
9769 bad_stmt:
9770 c_parser_error (parser, "expected declaration specifiers");
9771 c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL);
9772 return false;
9774 c_parser_omp_construct (parser);
9775 return true;
9777 break;
9780 c_parser_consume_pragma (parser);
9781 c_invoke_pragma_handler (id);
9783 /* Skip to EOL, but suppress any error message. Those will have been
9784 generated by the handler routine through calling error, as opposed
9785 to calling c_parser_error. */
9786 parser->error = true;
9787 c_parser_skip_to_pragma_eol (parser);
9789 return false;
9792 /* The interface the pragma parsers have to the lexer. */
9794 enum cpp_ttype
9795 pragma_lex (tree *value)
9797 c_token *tok = c_parser_peek_token (the_parser);
9798 enum cpp_ttype ret = tok->type;
9800 *value = tok->value;
9801 if (ret == CPP_PRAGMA_EOL || ret == CPP_EOF)
9802 ret = CPP_EOF;
9803 else
9805 if (ret == CPP_KEYWORD)
9806 ret = CPP_NAME;
9807 c_parser_consume_token (the_parser);
9810 return ret;
9813 static void
9814 c_parser_pragma_pch_preprocess (c_parser *parser)
9816 tree name = NULL;
9818 c_parser_consume_pragma (parser);
9819 if (c_parser_next_token_is (parser, CPP_STRING))
9821 name = c_parser_peek_token (parser)->value;
9822 c_parser_consume_token (parser);
9824 else
9825 c_parser_error (parser, "expected string literal");
9826 c_parser_skip_to_pragma_eol (parser);
9828 if (name)
9829 c_common_pch_pragma (parse_in, TREE_STRING_POINTER (name));
9832 /* OpenACC and OpenMP parsing routines. */
9834 /* Returns name of the next clause.
9835 If the clause is not recognized PRAGMA_OMP_CLAUSE_NONE is returned and
9836 the token is not consumed. Otherwise appropriate pragma_omp_clause is
9837 returned and the token is consumed. */
9839 static pragma_omp_clause
9840 c_parser_omp_clause_name (c_parser *parser)
9842 pragma_omp_clause result = PRAGMA_OMP_CLAUSE_NONE;
9844 if (c_parser_next_token_is_keyword (parser, RID_AUTO))
9845 result = PRAGMA_OACC_CLAUSE_AUTO;
9846 else if (c_parser_next_token_is_keyword (parser, RID_IF))
9847 result = PRAGMA_OMP_CLAUSE_IF;
9848 else if (c_parser_next_token_is_keyword (parser, RID_DEFAULT))
9849 result = PRAGMA_OMP_CLAUSE_DEFAULT;
9850 else if (c_parser_next_token_is_keyword (parser, RID_FOR))
9851 result = PRAGMA_OMP_CLAUSE_FOR;
9852 else if (c_parser_next_token_is (parser, CPP_NAME))
9854 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
9856 switch (p[0])
9858 case 'a':
9859 if (!strcmp ("aligned", p))
9860 result = PRAGMA_OMP_CLAUSE_ALIGNED;
9861 else if (!strcmp ("async", p))
9862 result = PRAGMA_OACC_CLAUSE_ASYNC;
9863 break;
9864 case 'c':
9865 if (!strcmp ("collapse", p))
9866 result = PRAGMA_OMP_CLAUSE_COLLAPSE;
9867 else if (!strcmp ("copy", p))
9868 result = PRAGMA_OACC_CLAUSE_COPY;
9869 else if (!strcmp ("copyin", p))
9870 result = PRAGMA_OMP_CLAUSE_COPYIN;
9871 else if (!strcmp ("copyout", p))
9872 result = PRAGMA_OACC_CLAUSE_COPYOUT;
9873 else if (!strcmp ("copyprivate", p))
9874 result = PRAGMA_OMP_CLAUSE_COPYPRIVATE;
9875 else if (!strcmp ("create", p))
9876 result = PRAGMA_OACC_CLAUSE_CREATE;
9877 break;
9878 case 'd':
9879 if (!strcmp ("delete", p))
9880 result = PRAGMA_OACC_CLAUSE_DELETE;
9881 else if (!strcmp ("depend", p))
9882 result = PRAGMA_OMP_CLAUSE_DEPEND;
9883 else if (!strcmp ("device", p))
9884 result = PRAGMA_OMP_CLAUSE_DEVICE;
9885 else if (!strcmp ("deviceptr", p))
9886 result = PRAGMA_OACC_CLAUSE_DEVICEPTR;
9887 else if (!strcmp ("dist_schedule", p))
9888 result = PRAGMA_OMP_CLAUSE_DIST_SCHEDULE;
9889 break;
9890 case 'f':
9891 if (!strcmp ("final", p))
9892 result = PRAGMA_OMP_CLAUSE_FINAL;
9893 else if (!strcmp ("firstprivate", p))
9894 result = PRAGMA_OMP_CLAUSE_FIRSTPRIVATE;
9895 else if (!strcmp ("from", p))
9896 result = PRAGMA_OMP_CLAUSE_FROM;
9897 break;
9898 case 'g':
9899 if (!strcmp ("gang", p))
9900 result = PRAGMA_OACC_CLAUSE_GANG;
9901 break;
9902 case 'h':
9903 if (!strcmp ("host", p))
9904 result = PRAGMA_OACC_CLAUSE_HOST;
9905 break;
9906 case 'i':
9907 if (!strcmp ("inbranch", p))
9908 result = PRAGMA_OMP_CLAUSE_INBRANCH;
9909 break;
9910 case 'l':
9911 if (!strcmp ("lastprivate", p))
9912 result = PRAGMA_OMP_CLAUSE_LASTPRIVATE;
9913 else if (!strcmp ("linear", p))
9914 result = PRAGMA_OMP_CLAUSE_LINEAR;
9915 break;
9916 case 'm':
9917 if (!strcmp ("map", p))
9918 result = PRAGMA_OMP_CLAUSE_MAP;
9919 else if (!strcmp ("mergeable", p))
9920 result = PRAGMA_OMP_CLAUSE_MERGEABLE;
9921 else if (flag_cilkplus && !strcmp ("mask", p))
9922 result = PRAGMA_CILK_CLAUSE_MASK;
9923 break;
9924 case 'n':
9925 if (!strcmp ("notinbranch", p))
9926 result = PRAGMA_OMP_CLAUSE_NOTINBRANCH;
9927 else if (!strcmp ("nowait", p))
9928 result = PRAGMA_OMP_CLAUSE_NOWAIT;
9929 else if (!strcmp ("num_gangs", p))
9930 result = PRAGMA_OACC_CLAUSE_NUM_GANGS;
9931 else if (!strcmp ("num_teams", p))
9932 result = PRAGMA_OMP_CLAUSE_NUM_TEAMS;
9933 else if (!strcmp ("num_threads", p))
9934 result = PRAGMA_OMP_CLAUSE_NUM_THREADS;
9935 else if (!strcmp ("num_workers", p))
9936 result = PRAGMA_OACC_CLAUSE_NUM_WORKERS;
9937 else if (flag_cilkplus && !strcmp ("nomask", p))
9938 result = PRAGMA_CILK_CLAUSE_NOMASK;
9939 break;
9940 case 'o':
9941 if (!strcmp ("ordered", p))
9942 result = PRAGMA_OMP_CLAUSE_ORDERED;
9943 break;
9944 case 'p':
9945 if (!strcmp ("parallel", p))
9946 result = PRAGMA_OMP_CLAUSE_PARALLEL;
9947 else if (!strcmp ("present", p))
9948 result = PRAGMA_OACC_CLAUSE_PRESENT;
9949 else if (!strcmp ("present_or_copy", p)
9950 || !strcmp ("pcopy", p))
9951 result = PRAGMA_OACC_CLAUSE_PRESENT_OR_COPY;
9952 else if (!strcmp ("present_or_copyin", p)
9953 || !strcmp ("pcopyin", p))
9954 result = PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYIN;
9955 else if (!strcmp ("present_or_copyout", p)
9956 || !strcmp ("pcopyout", p))
9957 result = PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYOUT;
9958 else if (!strcmp ("present_or_create", p)
9959 || !strcmp ("pcreate", p))
9960 result = PRAGMA_OACC_CLAUSE_PRESENT_OR_CREATE;
9961 else if (!strcmp ("private", p))
9962 result = PRAGMA_OMP_CLAUSE_PRIVATE;
9963 else if (!strcmp ("proc_bind", p))
9964 result = PRAGMA_OMP_CLAUSE_PROC_BIND;
9965 break;
9966 case 'r':
9967 if (!strcmp ("reduction", p))
9968 result = PRAGMA_OMP_CLAUSE_REDUCTION;
9969 break;
9970 case 's':
9971 if (!strcmp ("safelen", p))
9972 result = PRAGMA_OMP_CLAUSE_SAFELEN;
9973 else if (!strcmp ("schedule", p))
9974 result = PRAGMA_OMP_CLAUSE_SCHEDULE;
9975 else if (!strcmp ("sections", p))
9976 result = PRAGMA_OMP_CLAUSE_SECTIONS;
9977 else if (!strcmp ("seq", p))
9978 result = PRAGMA_OACC_CLAUSE_SEQ;
9979 else if (!strcmp ("shared", p))
9980 result = PRAGMA_OMP_CLAUSE_SHARED;
9981 else if (!strcmp ("simdlen", p))
9982 result = PRAGMA_OMP_CLAUSE_SIMDLEN;
9983 else if (!strcmp ("self", p))
9984 result = PRAGMA_OACC_CLAUSE_SELF;
9985 break;
9986 case 't':
9987 if (!strcmp ("taskgroup", p))
9988 result = PRAGMA_OMP_CLAUSE_TASKGROUP;
9989 else if (!strcmp ("thread_limit", p))
9990 result = PRAGMA_OMP_CLAUSE_THREAD_LIMIT;
9991 else if (!strcmp ("to", p))
9992 result = PRAGMA_OMP_CLAUSE_TO;
9993 break;
9994 case 'u':
9995 if (!strcmp ("uniform", p))
9996 result = PRAGMA_OMP_CLAUSE_UNIFORM;
9997 else if (!strcmp ("untied", p))
9998 result = PRAGMA_OMP_CLAUSE_UNTIED;
9999 break;
10000 case 'v':
10001 if (!strcmp ("vector", p))
10002 result = PRAGMA_OACC_CLAUSE_VECTOR;
10003 else if (!strcmp ("vector_length", p))
10004 result = PRAGMA_OACC_CLAUSE_VECTOR_LENGTH;
10005 else if (flag_cilkplus && !strcmp ("vectorlength", p))
10006 result = PRAGMA_CILK_CLAUSE_VECTORLENGTH;
10007 break;
10008 case 'w':
10009 if (!strcmp ("wait", p))
10010 result = PRAGMA_OACC_CLAUSE_WAIT;
10011 else if (!strcmp ("worker", p))
10012 result = PRAGMA_OACC_CLAUSE_WORKER;
10013 break;
10017 if (result != PRAGMA_OMP_CLAUSE_NONE)
10018 c_parser_consume_token (parser);
10020 return result;
10023 /* Validate that a clause of the given type does not already exist. */
10025 static void
10026 check_no_duplicate_clause (tree clauses, enum omp_clause_code code,
10027 const char *name)
10029 tree c;
10031 for (c = clauses; c ; c = OMP_CLAUSE_CHAIN (c))
10032 if (OMP_CLAUSE_CODE (c) == code)
10034 location_t loc = OMP_CLAUSE_LOCATION (c);
10035 error_at (loc, "too many %qs clauses", name);
10036 break;
10040 /* OpenACC 2.0
10041 Parse wait clause or wait directive parameters. */
10043 static tree
10044 c_parser_oacc_wait_list (c_parser *parser, location_t clause_loc, tree list)
10046 vec<tree, va_gc> *args;
10047 tree t, args_tree;
10049 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
10050 return list;
10052 args = c_parser_expr_list (parser, false, true, NULL, NULL, NULL, NULL);
10054 if (args->length () == 0)
10056 c_parser_error (parser, "expected integer expression before ')'");
10057 release_tree_vector (args);
10058 return list;
10061 args_tree = build_tree_list_vec (args);
10063 for (t = args_tree; t; t = TREE_CHAIN (t))
10065 tree targ = TREE_VALUE (t);
10067 if (targ != error_mark_node)
10069 if (!INTEGRAL_TYPE_P (TREE_TYPE (targ)))
10071 c_parser_error (parser, "expression must be integral");
10072 targ = error_mark_node;
10074 else
10076 tree c = build_omp_clause (clause_loc, OMP_CLAUSE_WAIT);
10078 OMP_CLAUSE_DECL (c) = targ;
10079 OMP_CLAUSE_CHAIN (c) = list;
10080 list = c;
10085 release_tree_vector (args);
10086 c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>");
10087 return list;
10090 /* OpenACC 2.0, OpenMP 2.5:
10091 variable-list:
10092 identifier
10093 variable-list , identifier
10095 If KIND is nonzero, create the appropriate node and install the
10096 decl in OMP_CLAUSE_DECL and add the node to the head of the list.
10097 If KIND is nonzero, CLAUSE_LOC is the location of the clause.
10099 If KIND is zero, create a TREE_LIST with the decl in TREE_PURPOSE;
10100 return the list created. */
10102 static tree
10103 c_parser_omp_variable_list (c_parser *parser,
10104 location_t clause_loc,
10105 enum omp_clause_code kind, tree list)
10107 if (c_parser_next_token_is_not (parser, CPP_NAME)
10108 || c_parser_peek_token (parser)->id_kind != C_ID_ID)
10109 c_parser_error (parser, "expected identifier");
10111 while (c_parser_next_token_is (parser, CPP_NAME)
10112 && c_parser_peek_token (parser)->id_kind == C_ID_ID)
10114 tree t = lookup_name (c_parser_peek_token (parser)->value);
10116 if (t == NULL_TREE)
10118 undeclared_variable (c_parser_peek_token (parser)->location,
10119 c_parser_peek_token (parser)->value);
10120 t = error_mark_node;
10123 c_parser_consume_token (parser);
10125 if (t == error_mark_node)
10127 else if (kind != 0)
10129 switch (kind)
10131 case OMP_CLAUSE__CACHE_:
10132 if (c_parser_peek_token (parser)->type != CPP_OPEN_SQUARE)
10134 c_parser_error (parser, "expected %<[%>");
10135 t = error_mark_node;
10136 break;
10138 /* FALL THROUGH. */
10139 case OMP_CLAUSE_MAP:
10140 case OMP_CLAUSE_FROM:
10141 case OMP_CLAUSE_TO:
10142 case OMP_CLAUSE_DEPEND:
10143 while (c_parser_next_token_is (parser, CPP_OPEN_SQUARE))
10145 tree low_bound = NULL_TREE, length = NULL_TREE;
10147 c_parser_consume_token (parser);
10148 if (!c_parser_next_token_is (parser, CPP_COLON))
10150 low_bound = c_parser_expression (parser).value;
10151 mark_exp_read (low_bound);
10153 if (c_parser_next_token_is (parser, CPP_CLOSE_SQUARE))
10154 length = integer_one_node;
10155 else
10157 /* Look for `:'. */
10158 if (!c_parser_require (parser, CPP_COLON,
10159 "expected %<:%>"))
10161 t = error_mark_node;
10162 break;
10164 if (!c_parser_next_token_is (parser, CPP_CLOSE_SQUARE))
10166 length = c_parser_expression (parser).value;
10167 mark_exp_read (length);
10170 /* Look for the closing `]'. */
10171 if (!c_parser_require (parser, CPP_CLOSE_SQUARE,
10172 "expected %<]%>"))
10174 t = error_mark_node;
10175 break;
10178 if (kind == OMP_CLAUSE__CACHE_)
10180 if (TREE_CODE (low_bound) != INTEGER_CST
10181 && !TREE_READONLY (low_bound))
10183 error_at (clause_loc,
10184 "%qD is not a constant", low_bound);
10185 t = error_mark_node;
10188 if (TREE_CODE (length) != INTEGER_CST
10189 && !TREE_READONLY (length))
10191 error_at (clause_loc,
10192 "%qD is not a constant", length);
10193 t = error_mark_node;
10197 t = tree_cons (low_bound, length, t);
10199 break;
10200 default:
10201 break;
10204 if (t != error_mark_node)
10206 tree u = build_omp_clause (clause_loc, kind);
10207 OMP_CLAUSE_DECL (u) = t;
10208 OMP_CLAUSE_CHAIN (u) = list;
10209 list = u;
10212 else
10213 list = tree_cons (t, NULL_TREE, list);
10215 if (c_parser_next_token_is_not (parser, CPP_COMMA))
10216 break;
10218 c_parser_consume_token (parser);
10221 return list;
10224 /* Similarly, but expect leading and trailing parenthesis. This is a very
10225 common case for OpenACC and OpenMP clauses. */
10227 static tree
10228 c_parser_omp_var_list_parens (c_parser *parser, enum omp_clause_code kind,
10229 tree list)
10231 /* The clauses location. */
10232 location_t loc = c_parser_peek_token (parser)->location;
10234 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
10236 list = c_parser_omp_variable_list (parser, loc, kind, list);
10237 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
10239 return list;
10242 /* OpenACC 2.0:
10243 copy ( variable-list )
10244 copyin ( variable-list )
10245 copyout ( variable-list )
10246 create ( variable-list )
10247 delete ( variable-list )
10248 present ( variable-list )
10249 present_or_copy ( variable-list )
10250 pcopy ( variable-list )
10251 present_or_copyin ( variable-list )
10252 pcopyin ( variable-list )
10253 present_or_copyout ( variable-list )
10254 pcopyout ( variable-list )
10255 present_or_create ( variable-list )
10256 pcreate ( variable-list ) */
10258 static tree
10259 c_parser_oacc_data_clause (c_parser *parser, pragma_omp_clause c_kind,
10260 tree list)
10262 enum gomp_map_kind kind;
10263 switch (c_kind)
10265 case PRAGMA_OACC_CLAUSE_COPY:
10266 kind = GOMP_MAP_FORCE_TOFROM;
10267 break;
10268 case PRAGMA_OACC_CLAUSE_COPYIN:
10269 kind = GOMP_MAP_FORCE_TO;
10270 break;
10271 case PRAGMA_OACC_CLAUSE_COPYOUT:
10272 kind = GOMP_MAP_FORCE_FROM;
10273 break;
10274 case PRAGMA_OACC_CLAUSE_CREATE:
10275 kind = GOMP_MAP_FORCE_ALLOC;
10276 break;
10277 case PRAGMA_OACC_CLAUSE_DELETE:
10278 kind = GOMP_MAP_FORCE_DEALLOC;
10279 break;
10280 case PRAGMA_OACC_CLAUSE_DEVICE:
10281 kind = GOMP_MAP_FORCE_TO;
10282 break;
10283 case PRAGMA_OACC_CLAUSE_HOST:
10284 case PRAGMA_OACC_CLAUSE_SELF:
10285 kind = GOMP_MAP_FORCE_FROM;
10286 break;
10287 case PRAGMA_OACC_CLAUSE_PRESENT:
10288 kind = GOMP_MAP_FORCE_PRESENT;
10289 break;
10290 case PRAGMA_OACC_CLAUSE_PRESENT_OR_COPY:
10291 kind = GOMP_MAP_TOFROM;
10292 break;
10293 case PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYIN:
10294 kind = GOMP_MAP_TO;
10295 break;
10296 case PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYOUT:
10297 kind = GOMP_MAP_FROM;
10298 break;
10299 case PRAGMA_OACC_CLAUSE_PRESENT_OR_CREATE:
10300 kind = GOMP_MAP_ALLOC;
10301 break;
10302 default:
10303 gcc_unreachable ();
10305 tree nl, c;
10306 nl = c_parser_omp_var_list_parens (parser, OMP_CLAUSE_MAP, list);
10308 for (c = nl; c != list; c = OMP_CLAUSE_CHAIN (c))
10309 OMP_CLAUSE_SET_MAP_KIND (c, kind);
10311 return nl;
10314 /* OpenACC 2.0:
10315 deviceptr ( variable-list ) */
10317 static tree
10318 c_parser_oacc_data_clause_deviceptr (c_parser *parser, tree list)
10320 location_t loc = c_parser_peek_token (parser)->location;
10321 tree vars, t;
10323 /* Can't use OMP_CLAUSE_MAP here (that is, can't use the generic
10324 c_parser_oacc_data_clause), as for PRAGMA_OACC_CLAUSE_DEVICEPTR,
10325 variable-list must only allow for pointer variables. */
10326 vars = c_parser_omp_var_list_parens (parser, OMP_CLAUSE_ERROR, NULL);
10327 for (t = vars; t && t; t = TREE_CHAIN (t))
10329 tree v = TREE_PURPOSE (t);
10331 /* FIXME diagnostics: Ideally we should keep individual
10332 locations for all the variables in the var list to make the
10333 following errors more precise. Perhaps
10334 c_parser_omp_var_list_parens() should construct a list of
10335 locations to go along with the var list. */
10337 if (TREE_CODE (v) != VAR_DECL)
10338 error_at (loc, "%qD is not a variable", v);
10339 else if (TREE_TYPE (v) == error_mark_node)
10341 else if (!POINTER_TYPE_P (TREE_TYPE (v)))
10342 error_at (loc, "%qD is not a pointer variable", v);
10344 tree u = build_omp_clause (loc, OMP_CLAUSE_MAP);
10345 OMP_CLAUSE_SET_MAP_KIND (u, GOMP_MAP_FORCE_DEVICEPTR);
10346 OMP_CLAUSE_DECL (u) = v;
10347 OMP_CLAUSE_CHAIN (u) = list;
10348 list = u;
10351 return list;
10354 /* OpenACC 2.0, OpenMP 3.0:
10355 collapse ( constant-expression ) */
10357 static tree
10358 c_parser_omp_clause_collapse (c_parser *parser, tree list)
10360 tree c, num = error_mark_node;
10361 HOST_WIDE_INT n;
10362 location_t loc;
10364 check_no_duplicate_clause (list, OMP_CLAUSE_COLLAPSE, "collapse");
10366 loc = c_parser_peek_token (parser)->location;
10367 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
10369 num = c_parser_expr_no_commas (parser, NULL).value;
10370 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
10372 if (num == error_mark_node)
10373 return list;
10374 mark_exp_read (num);
10375 num = c_fully_fold (num, false, NULL);
10376 if (!INTEGRAL_TYPE_P (TREE_TYPE (num))
10377 || !tree_fits_shwi_p (num)
10378 || (n = tree_to_shwi (num)) <= 0
10379 || (int) n != n)
10381 error_at (loc,
10382 "collapse argument needs positive constant integer expression");
10383 return list;
10385 c = build_omp_clause (loc, OMP_CLAUSE_COLLAPSE);
10386 OMP_CLAUSE_COLLAPSE_EXPR (c) = num;
10387 OMP_CLAUSE_CHAIN (c) = list;
10388 return c;
10391 /* OpenMP 2.5:
10392 copyin ( variable-list ) */
10394 static tree
10395 c_parser_omp_clause_copyin (c_parser *parser, tree list)
10397 return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_COPYIN, list);
10400 /* OpenMP 2.5:
10401 copyprivate ( variable-list ) */
10403 static tree
10404 c_parser_omp_clause_copyprivate (c_parser *parser, tree list)
10406 return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_COPYPRIVATE, list);
10409 /* OpenMP 2.5:
10410 default ( shared | none ) */
10412 static tree
10413 c_parser_omp_clause_default (c_parser *parser, tree list)
10415 enum omp_clause_default_kind kind = OMP_CLAUSE_DEFAULT_UNSPECIFIED;
10416 location_t loc = c_parser_peek_token (parser)->location;
10417 tree c;
10419 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
10420 return list;
10421 if (c_parser_next_token_is (parser, CPP_NAME))
10423 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
10425 switch (p[0])
10427 case 'n':
10428 if (strcmp ("none", p) != 0)
10429 goto invalid_kind;
10430 kind = OMP_CLAUSE_DEFAULT_NONE;
10431 break;
10433 case 's':
10434 if (strcmp ("shared", p) != 0)
10435 goto invalid_kind;
10436 kind = OMP_CLAUSE_DEFAULT_SHARED;
10437 break;
10439 default:
10440 goto invalid_kind;
10443 c_parser_consume_token (parser);
10445 else
10447 invalid_kind:
10448 c_parser_error (parser, "expected %<none%> or %<shared%>");
10450 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
10452 if (kind == OMP_CLAUSE_DEFAULT_UNSPECIFIED)
10453 return list;
10455 check_no_duplicate_clause (list, OMP_CLAUSE_DEFAULT, "default");
10456 c = build_omp_clause (loc, OMP_CLAUSE_DEFAULT);
10457 OMP_CLAUSE_CHAIN (c) = list;
10458 OMP_CLAUSE_DEFAULT_KIND (c) = kind;
10460 return c;
10463 /* OpenMP 2.5:
10464 firstprivate ( variable-list ) */
10466 static tree
10467 c_parser_omp_clause_firstprivate (c_parser *parser, tree list)
10469 return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_FIRSTPRIVATE, list);
10472 /* OpenMP 3.1:
10473 final ( expression ) */
10475 static tree
10476 c_parser_omp_clause_final (c_parser *parser, tree list)
10478 location_t loc = c_parser_peek_token (parser)->location;
10479 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
10481 tree t = c_parser_paren_condition (parser);
10482 tree c;
10484 check_no_duplicate_clause (list, OMP_CLAUSE_FINAL, "final");
10486 c = build_omp_clause (loc, OMP_CLAUSE_FINAL);
10487 OMP_CLAUSE_FINAL_EXPR (c) = t;
10488 OMP_CLAUSE_CHAIN (c) = list;
10489 list = c;
10491 else
10492 c_parser_error (parser, "expected %<(%>");
10494 return list;
10497 /* OpenACC, OpenMP 2.5:
10498 if ( expression ) */
10500 static tree
10501 c_parser_omp_clause_if (c_parser *parser, tree list)
10503 location_t loc = c_parser_peek_token (parser)->location;
10504 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
10506 tree t = c_parser_paren_condition (parser);
10507 tree c;
10509 check_no_duplicate_clause (list, OMP_CLAUSE_IF, "if");
10511 c = build_omp_clause (loc, OMP_CLAUSE_IF);
10512 OMP_CLAUSE_IF_EXPR (c) = t;
10513 OMP_CLAUSE_CHAIN (c) = list;
10514 list = c;
10516 else
10517 c_parser_error (parser, "expected %<(%>");
10519 return list;
10522 /* OpenMP 2.5:
10523 lastprivate ( variable-list ) */
10525 static tree
10526 c_parser_omp_clause_lastprivate (c_parser *parser, tree list)
10528 return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_LASTPRIVATE, list);
10531 /* OpenMP 3.1:
10532 mergeable */
10534 static tree
10535 c_parser_omp_clause_mergeable (c_parser *parser ATTRIBUTE_UNUSED, tree list)
10537 tree c;
10539 /* FIXME: Should we allow duplicates? */
10540 check_no_duplicate_clause (list, OMP_CLAUSE_MERGEABLE, "mergeable");
10542 c = build_omp_clause (c_parser_peek_token (parser)->location,
10543 OMP_CLAUSE_MERGEABLE);
10544 OMP_CLAUSE_CHAIN (c) = list;
10546 return c;
10549 /* OpenMP 2.5:
10550 nowait */
10552 static tree
10553 c_parser_omp_clause_nowait (c_parser *parser ATTRIBUTE_UNUSED, tree list)
10555 tree c;
10556 location_t loc = c_parser_peek_token (parser)->location;
10558 check_no_duplicate_clause (list, OMP_CLAUSE_NOWAIT, "nowait");
10560 c = build_omp_clause (loc, OMP_CLAUSE_NOWAIT);
10561 OMP_CLAUSE_CHAIN (c) = list;
10562 return c;
10565 /* OpenACC:
10566 num_gangs ( expression ) */
10568 static tree
10569 c_parser_omp_clause_num_gangs (c_parser *parser, tree list)
10571 location_t num_gangs_loc = c_parser_peek_token (parser)->location;
10572 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
10574 location_t expr_loc = c_parser_peek_token (parser)->location;
10575 tree c, t = c_parser_expression (parser).value;
10576 mark_exp_read (t);
10577 t = c_fully_fold (t, false, NULL);
10579 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
10581 if (!INTEGRAL_TYPE_P (TREE_TYPE (t)))
10583 c_parser_error (parser, "expected integer expression");
10584 return list;
10587 /* Attempt to statically determine when the number isn't positive. */
10588 c = fold_build2_loc (expr_loc, LE_EXPR, boolean_type_node, t,
10589 build_int_cst (TREE_TYPE (t), 0));
10590 if (CAN_HAVE_LOCATION_P (c))
10591 SET_EXPR_LOCATION (c, expr_loc);
10592 if (c == boolean_true_node)
10594 warning_at (expr_loc, 0,
10595 "%<num_gangs%> value must be positive");
10596 t = integer_one_node;
10599 check_no_duplicate_clause (list, OMP_CLAUSE_NUM_GANGS, "num_gangs");
10601 c = build_omp_clause (num_gangs_loc, OMP_CLAUSE_NUM_GANGS);
10602 OMP_CLAUSE_NUM_GANGS_EXPR (c) = t;
10603 OMP_CLAUSE_CHAIN (c) = list;
10604 list = c;
10607 return list;
10610 /* OpenMP 2.5:
10611 num_threads ( expression ) */
10613 static tree
10614 c_parser_omp_clause_num_threads (c_parser *parser, tree list)
10616 location_t num_threads_loc = c_parser_peek_token (parser)->location;
10617 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
10619 location_t expr_loc = c_parser_peek_token (parser)->location;
10620 tree c, t = c_parser_expression (parser).value;
10621 mark_exp_read (t);
10622 t = c_fully_fold (t, false, NULL);
10624 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
10626 if (!INTEGRAL_TYPE_P (TREE_TYPE (t)))
10628 c_parser_error (parser, "expected integer expression");
10629 return list;
10632 /* Attempt to statically determine when the number isn't positive. */
10633 c = fold_build2_loc (expr_loc, LE_EXPR, boolean_type_node, t,
10634 build_int_cst (TREE_TYPE (t), 0));
10635 if (CAN_HAVE_LOCATION_P (c))
10636 SET_EXPR_LOCATION (c, expr_loc);
10637 if (c == boolean_true_node)
10639 warning_at (expr_loc, 0,
10640 "%<num_threads%> value must be positive");
10641 t = integer_one_node;
10644 check_no_duplicate_clause (list, OMP_CLAUSE_NUM_THREADS, "num_threads");
10646 c = build_omp_clause (num_threads_loc, OMP_CLAUSE_NUM_THREADS);
10647 OMP_CLAUSE_NUM_THREADS_EXPR (c) = t;
10648 OMP_CLAUSE_CHAIN (c) = list;
10649 list = c;
10652 return list;
10655 /* OpenACC:
10656 num_workers ( expression ) */
10658 static tree
10659 c_parser_omp_clause_num_workers (c_parser *parser, tree list)
10661 location_t num_workers_loc = c_parser_peek_token (parser)->location;
10662 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
10664 location_t expr_loc = c_parser_peek_token (parser)->location;
10665 tree c, t = c_parser_expression (parser).value;
10666 mark_exp_read (t);
10667 t = c_fully_fold (t, false, NULL);
10669 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
10671 if (!INTEGRAL_TYPE_P (TREE_TYPE (t)))
10673 c_parser_error (parser, "expected integer expression");
10674 return list;
10677 /* Attempt to statically determine when the number isn't positive. */
10678 c = fold_build2_loc (expr_loc, LE_EXPR, boolean_type_node, t,
10679 build_int_cst (TREE_TYPE (t), 0));
10680 if (CAN_HAVE_LOCATION_P (c))
10681 SET_EXPR_LOCATION (c, expr_loc);
10682 if (c == boolean_true_node)
10684 warning_at (expr_loc, 0,
10685 "%<num_workers%> value must be positive");
10686 t = integer_one_node;
10689 check_no_duplicate_clause (list, OMP_CLAUSE_NUM_WORKERS, "num_workers");
10691 c = build_omp_clause (num_workers_loc, OMP_CLAUSE_NUM_WORKERS);
10692 OMP_CLAUSE_NUM_WORKERS_EXPR (c) = t;
10693 OMP_CLAUSE_CHAIN (c) = list;
10694 list = c;
10697 return list;
10700 /* OpenACC:
10701 async [( int-expr )] */
10703 static tree
10704 c_parser_oacc_clause_async (c_parser *parser, tree list)
10706 tree c, t;
10707 location_t loc = c_parser_peek_token (parser)->location;
10709 t = build_int_cst (integer_type_node, GOMP_ASYNC_NOVAL);
10711 if (c_parser_peek_token (parser)->type == CPP_OPEN_PAREN)
10713 c_parser_consume_token (parser);
10715 t = c_parser_expression (parser).value;
10716 if (!INTEGRAL_TYPE_P (TREE_TYPE (t)))
10717 c_parser_error (parser, "expected integer expression");
10718 else if (t == error_mark_node
10719 || !c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
10720 return list;
10722 else
10723 t = c_fully_fold (t, false, NULL);
10725 check_no_duplicate_clause (list, OMP_CLAUSE_ASYNC, "async");
10727 c = build_omp_clause (loc, OMP_CLAUSE_ASYNC);
10728 OMP_CLAUSE_ASYNC_EXPR (c) = t;
10729 OMP_CLAUSE_CHAIN (c) = list;
10730 list = c;
10732 return list;
10735 /* OpenACC:
10736 wait ( int-expr-list ) */
10738 static tree
10739 c_parser_oacc_clause_wait (c_parser *parser, tree list)
10741 location_t clause_loc = c_parser_peek_token (parser)->location;
10743 if (c_parser_peek_token (parser)->type == CPP_OPEN_PAREN)
10744 list = c_parser_oacc_wait_list (parser, clause_loc, list);
10746 return list;
10749 /* OpenMP 2.5:
10750 ordered */
10752 static tree
10753 c_parser_omp_clause_ordered (c_parser *parser, tree list)
10755 tree c;
10757 check_no_duplicate_clause (list, OMP_CLAUSE_ORDERED, "ordered");
10759 c = build_omp_clause (c_parser_peek_token (parser)->location,
10760 OMP_CLAUSE_ORDERED);
10761 OMP_CLAUSE_CHAIN (c) = list;
10763 return c;
10766 /* OpenMP 2.5:
10767 private ( variable-list ) */
10769 static tree
10770 c_parser_omp_clause_private (c_parser *parser, tree list)
10772 return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_PRIVATE, list);
10775 /* OpenMP 2.5:
10776 reduction ( reduction-operator : variable-list )
10778 reduction-operator:
10779 One of: + * - & ^ | && ||
10781 OpenMP 3.1:
10783 reduction-operator:
10784 One of: + * - & ^ | && || max min
10786 OpenMP 4.0:
10788 reduction-operator:
10789 One of: + * - & ^ | && ||
10790 identifier */
10792 static tree
10793 c_parser_omp_clause_reduction (c_parser *parser, tree list)
10795 location_t clause_loc = c_parser_peek_token (parser)->location;
10796 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
10798 enum tree_code code = ERROR_MARK;
10799 tree reduc_id = NULL_TREE;
10801 switch (c_parser_peek_token (parser)->type)
10803 case CPP_PLUS:
10804 code = PLUS_EXPR;
10805 break;
10806 case CPP_MULT:
10807 code = MULT_EXPR;
10808 break;
10809 case CPP_MINUS:
10810 code = MINUS_EXPR;
10811 break;
10812 case CPP_AND:
10813 code = BIT_AND_EXPR;
10814 break;
10815 case CPP_XOR:
10816 code = BIT_XOR_EXPR;
10817 break;
10818 case CPP_OR:
10819 code = BIT_IOR_EXPR;
10820 break;
10821 case CPP_AND_AND:
10822 code = TRUTH_ANDIF_EXPR;
10823 break;
10824 case CPP_OR_OR:
10825 code = TRUTH_ORIF_EXPR;
10826 break;
10827 case CPP_NAME:
10829 const char *p
10830 = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
10831 if (strcmp (p, "min") == 0)
10833 code = MIN_EXPR;
10834 break;
10836 if (strcmp (p, "max") == 0)
10838 code = MAX_EXPR;
10839 break;
10841 reduc_id = c_parser_peek_token (parser)->value;
10842 break;
10844 default:
10845 c_parser_error (parser,
10846 "expected %<+%>, %<*%>, %<-%>, %<&%>, "
10847 "%<^%>, %<|%>, %<&&%>, %<||%>, %<min%> or %<max%>");
10848 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 0);
10849 return list;
10851 c_parser_consume_token (parser);
10852 reduc_id = c_omp_reduction_id (code, reduc_id);
10853 if (c_parser_require (parser, CPP_COLON, "expected %<:%>"))
10855 tree nl, c;
10857 nl = c_parser_omp_variable_list (parser, clause_loc,
10858 OMP_CLAUSE_REDUCTION, list);
10859 for (c = nl; c != list; c = OMP_CLAUSE_CHAIN (c))
10861 tree type = TREE_TYPE (OMP_CLAUSE_DECL (c));
10862 OMP_CLAUSE_REDUCTION_CODE (c) = code;
10863 if (code == ERROR_MARK
10864 || !(INTEGRAL_TYPE_P (type)
10865 || TREE_CODE (type) == REAL_TYPE
10866 || TREE_CODE (type) == COMPLEX_TYPE))
10867 OMP_CLAUSE_REDUCTION_PLACEHOLDER (c)
10868 = c_omp_reduction_lookup (reduc_id,
10869 TYPE_MAIN_VARIANT (type));
10872 list = nl;
10874 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
10876 return list;
10879 /* OpenMP 2.5:
10880 schedule ( schedule-kind )
10881 schedule ( schedule-kind , expression )
10883 schedule-kind:
10884 static | dynamic | guided | runtime | auto
10887 static tree
10888 c_parser_omp_clause_schedule (c_parser *parser, tree list)
10890 tree c, t;
10891 location_t loc = c_parser_peek_token (parser)->location;
10893 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
10894 return list;
10896 c = build_omp_clause (loc, OMP_CLAUSE_SCHEDULE);
10898 if (c_parser_next_token_is (parser, CPP_NAME))
10900 tree kind = c_parser_peek_token (parser)->value;
10901 const char *p = IDENTIFIER_POINTER (kind);
10903 switch (p[0])
10905 case 'd':
10906 if (strcmp ("dynamic", p) != 0)
10907 goto invalid_kind;
10908 OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_DYNAMIC;
10909 break;
10911 case 'g':
10912 if (strcmp ("guided", p) != 0)
10913 goto invalid_kind;
10914 OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_GUIDED;
10915 break;
10917 case 'r':
10918 if (strcmp ("runtime", p) != 0)
10919 goto invalid_kind;
10920 OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_RUNTIME;
10921 break;
10923 default:
10924 goto invalid_kind;
10927 else if (c_parser_next_token_is_keyword (parser, RID_STATIC))
10928 OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_STATIC;
10929 else if (c_parser_next_token_is_keyword (parser, RID_AUTO))
10930 OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_AUTO;
10931 else
10932 goto invalid_kind;
10934 c_parser_consume_token (parser);
10935 if (c_parser_next_token_is (parser, CPP_COMMA))
10937 location_t here;
10938 c_parser_consume_token (parser);
10940 here = c_parser_peek_token (parser)->location;
10941 t = c_parser_expr_no_commas (parser, NULL).value;
10942 mark_exp_read (t);
10943 t = c_fully_fold (t, false, NULL);
10945 if (OMP_CLAUSE_SCHEDULE_KIND (c) == OMP_CLAUSE_SCHEDULE_RUNTIME)
10946 error_at (here, "schedule %<runtime%> does not take "
10947 "a %<chunk_size%> parameter");
10948 else if (OMP_CLAUSE_SCHEDULE_KIND (c) == OMP_CLAUSE_SCHEDULE_AUTO)
10949 error_at (here,
10950 "schedule %<auto%> does not take "
10951 "a %<chunk_size%> parameter");
10952 else if (TREE_CODE (TREE_TYPE (t)) == INTEGER_TYPE)
10953 OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (c) = t;
10954 else
10955 c_parser_error (parser, "expected integer expression");
10957 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
10959 else
10960 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
10961 "expected %<,%> or %<)%>");
10963 check_no_duplicate_clause (list, OMP_CLAUSE_SCHEDULE, "schedule");
10964 OMP_CLAUSE_CHAIN (c) = list;
10965 return c;
10967 invalid_kind:
10968 c_parser_error (parser, "invalid schedule kind");
10969 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 0);
10970 return list;
10973 /* OpenMP 2.5:
10974 shared ( variable-list ) */
10976 static tree
10977 c_parser_omp_clause_shared (c_parser *parser, tree list)
10979 return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_SHARED, list);
10982 /* OpenMP 3.0:
10983 untied */
10985 static tree
10986 c_parser_omp_clause_untied (c_parser *parser ATTRIBUTE_UNUSED, tree list)
10988 tree c;
10990 /* FIXME: Should we allow duplicates? */
10991 check_no_duplicate_clause (list, OMP_CLAUSE_UNTIED, "untied");
10993 c = build_omp_clause (c_parser_peek_token (parser)->location,
10994 OMP_CLAUSE_UNTIED);
10995 OMP_CLAUSE_CHAIN (c) = list;
10997 return c;
11000 /* OpenACC:
11001 vector_length ( expression ) */
11003 static tree
11004 c_parser_omp_clause_vector_length (c_parser *parser, tree list)
11006 location_t vector_length_loc = c_parser_peek_token (parser)->location;
11007 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
11009 location_t expr_loc = c_parser_peek_token (parser)->location;
11010 tree c, t = c_parser_expression (parser).value;
11011 mark_exp_read (t);
11012 t = c_fully_fold (t, false, NULL);
11014 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
11016 if (!INTEGRAL_TYPE_P (TREE_TYPE (t)))
11018 c_parser_error (parser, "expected integer expression");
11019 return list;
11022 /* Attempt to statically determine when the number isn't positive. */
11023 c = fold_build2_loc (expr_loc, LE_EXPR, boolean_type_node, t,
11024 build_int_cst (TREE_TYPE (t), 0));
11025 if (CAN_HAVE_LOCATION_P (c))
11026 SET_EXPR_LOCATION (c, expr_loc);
11027 if (c == boolean_true_node)
11029 warning_at (expr_loc, 0,
11030 "%<vector_length%> value must be positive");
11031 t = integer_one_node;
11034 check_no_duplicate_clause (list, OMP_CLAUSE_VECTOR_LENGTH, "vector_length");
11036 c = build_omp_clause (vector_length_loc, OMP_CLAUSE_VECTOR_LENGTH);
11037 OMP_CLAUSE_VECTOR_LENGTH_EXPR (c) = t;
11038 OMP_CLAUSE_CHAIN (c) = list;
11039 list = c;
11042 return list;
11045 /* OpenMP 4.0:
11046 inbranch
11047 notinbranch */
11049 static tree
11050 c_parser_omp_clause_branch (c_parser *parser ATTRIBUTE_UNUSED,
11051 enum omp_clause_code code, tree list)
11053 check_no_duplicate_clause (list, code, omp_clause_code_name[code]);
11055 tree c = build_omp_clause (c_parser_peek_token (parser)->location, code);
11056 OMP_CLAUSE_CHAIN (c) = list;
11058 return c;
11061 /* OpenMP 4.0:
11062 parallel
11064 sections
11065 taskgroup */
11067 static tree
11068 c_parser_omp_clause_cancelkind (c_parser *parser ATTRIBUTE_UNUSED,
11069 enum omp_clause_code code, tree list)
11071 tree c = build_omp_clause (c_parser_peek_token (parser)->location, code);
11072 OMP_CLAUSE_CHAIN (c) = list;
11074 return c;
11077 /* OpenMP 4.0:
11078 num_teams ( expression ) */
11080 static tree
11081 c_parser_omp_clause_num_teams (c_parser *parser, tree list)
11083 location_t num_teams_loc = c_parser_peek_token (parser)->location;
11084 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
11086 location_t expr_loc = c_parser_peek_token (parser)->location;
11087 tree c, t = c_parser_expression (parser).value;
11088 mark_exp_read (t);
11089 t = c_fully_fold (t, false, NULL);
11091 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
11093 if (!INTEGRAL_TYPE_P (TREE_TYPE (t)))
11095 c_parser_error (parser, "expected integer expression");
11096 return list;
11099 /* Attempt to statically determine when the number isn't positive. */
11100 c = fold_build2_loc (expr_loc, LE_EXPR, boolean_type_node, t,
11101 build_int_cst (TREE_TYPE (t), 0));
11102 if (CAN_HAVE_LOCATION_P (c))
11103 SET_EXPR_LOCATION (c, expr_loc);
11104 if (c == boolean_true_node)
11106 warning_at (expr_loc, 0, "%<num_teams%> value must be positive");
11107 t = integer_one_node;
11110 check_no_duplicate_clause (list, OMP_CLAUSE_NUM_TEAMS, "num_teams");
11112 c = build_omp_clause (num_teams_loc, OMP_CLAUSE_NUM_TEAMS);
11113 OMP_CLAUSE_NUM_TEAMS_EXPR (c) = t;
11114 OMP_CLAUSE_CHAIN (c) = list;
11115 list = c;
11118 return list;
11121 /* OpenMP 4.0:
11122 thread_limit ( expression ) */
11124 static tree
11125 c_parser_omp_clause_thread_limit (c_parser *parser, tree list)
11127 location_t num_thread_limit_loc = c_parser_peek_token (parser)->location;
11128 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
11130 location_t expr_loc = c_parser_peek_token (parser)->location;
11131 tree c, t = c_parser_expression (parser).value;
11132 mark_exp_read (t);
11133 t = c_fully_fold (t, false, NULL);
11135 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
11137 if (!INTEGRAL_TYPE_P (TREE_TYPE (t)))
11139 c_parser_error (parser, "expected integer expression");
11140 return list;
11143 /* Attempt to statically determine when the number isn't positive. */
11144 c = fold_build2_loc (expr_loc, LE_EXPR, boolean_type_node, t,
11145 build_int_cst (TREE_TYPE (t), 0));
11146 if (CAN_HAVE_LOCATION_P (c))
11147 SET_EXPR_LOCATION (c, expr_loc);
11148 if (c == boolean_true_node)
11150 warning_at (expr_loc, 0, "%<thread_limit%> value must be positive");
11151 t = integer_one_node;
11154 check_no_duplicate_clause (list, OMP_CLAUSE_THREAD_LIMIT,
11155 "thread_limit");
11157 c = build_omp_clause (num_thread_limit_loc, OMP_CLAUSE_THREAD_LIMIT);
11158 OMP_CLAUSE_THREAD_LIMIT_EXPR (c) = t;
11159 OMP_CLAUSE_CHAIN (c) = list;
11160 list = c;
11163 return list;
11166 /* OpenMP 4.0:
11167 aligned ( variable-list )
11168 aligned ( variable-list : constant-expression ) */
11170 static tree
11171 c_parser_omp_clause_aligned (c_parser *parser, tree list)
11173 location_t clause_loc = c_parser_peek_token (parser)->location;
11174 tree nl, c;
11176 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
11177 return list;
11179 nl = c_parser_omp_variable_list (parser, clause_loc,
11180 OMP_CLAUSE_ALIGNED, list);
11182 if (c_parser_next_token_is (parser, CPP_COLON))
11184 c_parser_consume_token (parser);
11185 tree alignment = c_parser_expr_no_commas (parser, NULL).value;
11186 mark_exp_read (alignment);
11187 alignment = c_fully_fold (alignment, false, NULL);
11188 if (!INTEGRAL_TYPE_P (TREE_TYPE (alignment))
11189 && TREE_CODE (alignment) != INTEGER_CST
11190 && tree_int_cst_sgn (alignment) != 1)
11192 error_at (clause_loc, "%<aligned%> clause alignment expression must "
11193 "be positive constant integer expression");
11194 alignment = NULL_TREE;
11197 for (c = nl; c != list; c = OMP_CLAUSE_CHAIN (c))
11198 OMP_CLAUSE_ALIGNED_ALIGNMENT (c) = alignment;
11201 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
11202 return nl;
11205 /* OpenMP 4.0:
11206 linear ( variable-list )
11207 linear ( variable-list : expression ) */
11209 static tree
11210 c_parser_omp_clause_linear (c_parser *parser, tree list, bool is_cilk_simd_fn)
11212 location_t clause_loc = c_parser_peek_token (parser)->location;
11213 tree nl, c, step;
11215 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
11216 return list;
11218 nl = c_parser_omp_variable_list (parser, clause_loc,
11219 OMP_CLAUSE_LINEAR, list);
11221 if (c_parser_next_token_is (parser, CPP_COLON))
11223 c_parser_consume_token (parser);
11224 step = c_parser_expression (parser).value;
11225 mark_exp_read (step);
11226 step = c_fully_fold (step, false, NULL);
11227 if (is_cilk_simd_fn && TREE_CODE (step) == PARM_DECL)
11229 sorry ("using parameters for %<linear%> step is not supported yet");
11230 step = integer_one_node;
11232 if (!INTEGRAL_TYPE_P (TREE_TYPE (step)))
11234 error_at (clause_loc, "%<linear%> clause step expression must "
11235 "be integral");
11236 step = integer_one_node;
11240 else
11241 step = integer_one_node;
11243 for (c = nl; c != list; c = OMP_CLAUSE_CHAIN (c))
11245 OMP_CLAUSE_LINEAR_STEP (c) = step;
11248 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
11249 return nl;
11252 /* OpenMP 4.0:
11253 safelen ( constant-expression ) */
11255 static tree
11256 c_parser_omp_clause_safelen (c_parser *parser, tree list)
11258 location_t clause_loc = c_parser_peek_token (parser)->location;
11259 tree c, t;
11261 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
11262 return list;
11264 t = c_parser_expr_no_commas (parser, NULL).value;
11265 mark_exp_read (t);
11266 t = c_fully_fold (t, false, NULL);
11267 if (!INTEGRAL_TYPE_P (TREE_TYPE (t))
11268 && TREE_CODE (t) != INTEGER_CST
11269 && tree_int_cst_sgn (t) != 1)
11271 error_at (clause_loc, "%<safelen%> clause expression must "
11272 "be positive constant integer expression");
11273 t = NULL_TREE;
11276 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
11277 if (t == NULL_TREE || t == error_mark_node)
11278 return list;
11280 check_no_duplicate_clause (list, OMP_CLAUSE_SAFELEN, "safelen");
11282 c = build_omp_clause (clause_loc, OMP_CLAUSE_SAFELEN);
11283 OMP_CLAUSE_SAFELEN_EXPR (c) = t;
11284 OMP_CLAUSE_CHAIN (c) = list;
11285 return c;
11288 /* OpenMP 4.0:
11289 simdlen ( constant-expression ) */
11291 static tree
11292 c_parser_omp_clause_simdlen (c_parser *parser, tree list)
11294 location_t clause_loc = c_parser_peek_token (parser)->location;
11295 tree c, t;
11297 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
11298 return list;
11300 t = c_parser_expr_no_commas (parser, NULL).value;
11301 mark_exp_read (t);
11302 t = c_fully_fold (t, false, NULL);
11303 if (!INTEGRAL_TYPE_P (TREE_TYPE (t))
11304 && TREE_CODE (t) != INTEGER_CST
11305 && tree_int_cst_sgn (t) != 1)
11307 error_at (clause_loc, "%<simdlen%> clause expression must "
11308 "be positive constant integer expression");
11309 t = NULL_TREE;
11312 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
11313 if (t == NULL_TREE || t == error_mark_node)
11314 return list;
11316 check_no_duplicate_clause (list, OMP_CLAUSE_SIMDLEN, "simdlen");
11318 c = build_omp_clause (clause_loc, OMP_CLAUSE_SIMDLEN);
11319 OMP_CLAUSE_SIMDLEN_EXPR (c) = t;
11320 OMP_CLAUSE_CHAIN (c) = list;
11321 return c;
11324 /* OpenMP 4.0:
11325 depend ( depend-kind: variable-list )
11327 depend-kind:
11328 in | out | inout */
11330 static tree
11331 c_parser_omp_clause_depend (c_parser *parser, tree list)
11333 location_t clause_loc = c_parser_peek_token (parser)->location;
11334 enum omp_clause_depend_kind kind = OMP_CLAUSE_DEPEND_INOUT;
11335 tree nl, c;
11337 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
11338 return list;
11340 if (c_parser_next_token_is (parser, CPP_NAME))
11342 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
11343 if (strcmp ("in", p) == 0)
11344 kind = OMP_CLAUSE_DEPEND_IN;
11345 else if (strcmp ("inout", p) == 0)
11346 kind = OMP_CLAUSE_DEPEND_INOUT;
11347 else if (strcmp ("out", p) == 0)
11348 kind = OMP_CLAUSE_DEPEND_OUT;
11349 else
11350 goto invalid_kind;
11352 else
11353 goto invalid_kind;
11355 c_parser_consume_token (parser);
11356 if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
11357 goto resync_fail;
11359 nl = c_parser_omp_variable_list (parser, clause_loc,
11360 OMP_CLAUSE_DEPEND, list);
11362 for (c = nl; c != list; c = OMP_CLAUSE_CHAIN (c))
11363 OMP_CLAUSE_DEPEND_KIND (c) = kind;
11365 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
11366 return nl;
11368 invalid_kind:
11369 c_parser_error (parser, "invalid depend kind");
11370 resync_fail:
11371 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
11372 return list;
11375 /* OpenMP 4.0:
11376 map ( map-kind: variable-list )
11377 map ( variable-list )
11379 map-kind:
11380 alloc | to | from | tofrom */
11382 static tree
11383 c_parser_omp_clause_map (c_parser *parser, tree list)
11385 location_t clause_loc = c_parser_peek_token (parser)->location;
11386 enum gomp_map_kind kind = GOMP_MAP_TOFROM;
11387 tree nl, c;
11389 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
11390 return list;
11392 if (c_parser_next_token_is (parser, CPP_NAME)
11393 && c_parser_peek_2nd_token (parser)->type == CPP_COLON)
11395 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
11396 if (strcmp ("alloc", p) == 0)
11397 kind = GOMP_MAP_ALLOC;
11398 else if (strcmp ("to", p) == 0)
11399 kind = GOMP_MAP_TO;
11400 else if (strcmp ("from", p) == 0)
11401 kind = GOMP_MAP_FROM;
11402 else if (strcmp ("tofrom", p) == 0)
11403 kind = GOMP_MAP_TOFROM;
11404 else
11406 c_parser_error (parser, "invalid map kind");
11407 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
11408 "expected %<)%>");
11409 return list;
11411 c_parser_consume_token (parser);
11412 c_parser_consume_token (parser);
11415 nl = c_parser_omp_variable_list (parser, clause_loc, OMP_CLAUSE_MAP, list);
11417 for (c = nl; c != list; c = OMP_CLAUSE_CHAIN (c))
11418 OMP_CLAUSE_SET_MAP_KIND (c, kind);
11420 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
11421 return nl;
11424 /* OpenMP 4.0:
11425 device ( expression ) */
11427 static tree
11428 c_parser_omp_clause_device (c_parser *parser, tree list)
11430 location_t clause_loc = c_parser_peek_token (parser)->location;
11431 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
11433 tree c, t = c_parser_expr_no_commas (parser, NULL).value;
11434 mark_exp_read (t);
11435 t = c_fully_fold (t, false, NULL);
11437 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
11439 if (!INTEGRAL_TYPE_P (TREE_TYPE (t)))
11441 c_parser_error (parser, "expected integer expression");
11442 return list;
11445 check_no_duplicate_clause (list, OMP_CLAUSE_DEVICE, "device");
11447 c = build_omp_clause (clause_loc, OMP_CLAUSE_DEVICE);
11448 OMP_CLAUSE_DEVICE_ID (c) = t;
11449 OMP_CLAUSE_CHAIN (c) = list;
11450 list = c;
11453 return list;
11456 /* OpenMP 4.0:
11457 dist_schedule ( static )
11458 dist_schedule ( static , expression ) */
11460 static tree
11461 c_parser_omp_clause_dist_schedule (c_parser *parser, tree list)
11463 tree c, t = NULL_TREE;
11464 location_t loc = c_parser_peek_token (parser)->location;
11466 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
11467 return list;
11469 if (!c_parser_next_token_is_keyword (parser, RID_STATIC))
11471 c_parser_error (parser, "invalid dist_schedule kind");
11472 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
11473 "expected %<)%>");
11474 return list;
11477 c_parser_consume_token (parser);
11478 if (c_parser_next_token_is (parser, CPP_COMMA))
11480 c_parser_consume_token (parser);
11482 t = c_parser_expr_no_commas (parser, NULL).value;
11483 mark_exp_read (t);
11484 t = c_fully_fold (t, false, NULL);
11485 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
11487 else
11488 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
11489 "expected %<,%> or %<)%>");
11491 check_no_duplicate_clause (list, OMP_CLAUSE_SCHEDULE, "schedule");
11492 if (t == error_mark_node)
11493 return list;
11495 c = build_omp_clause (loc, OMP_CLAUSE_DIST_SCHEDULE);
11496 OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (c) = t;
11497 OMP_CLAUSE_CHAIN (c) = list;
11498 return c;
11501 /* OpenMP 4.0:
11502 proc_bind ( proc-bind-kind )
11504 proc-bind-kind:
11505 master | close | spread */
11507 static tree
11508 c_parser_omp_clause_proc_bind (c_parser *parser, tree list)
11510 location_t clause_loc = c_parser_peek_token (parser)->location;
11511 enum omp_clause_proc_bind_kind kind;
11512 tree c;
11514 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
11515 return list;
11517 if (c_parser_next_token_is (parser, CPP_NAME))
11519 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
11520 if (strcmp ("master", p) == 0)
11521 kind = OMP_CLAUSE_PROC_BIND_MASTER;
11522 else if (strcmp ("close", p) == 0)
11523 kind = OMP_CLAUSE_PROC_BIND_CLOSE;
11524 else if (strcmp ("spread", p) == 0)
11525 kind = OMP_CLAUSE_PROC_BIND_SPREAD;
11526 else
11527 goto invalid_kind;
11529 else
11530 goto invalid_kind;
11532 c_parser_consume_token (parser);
11533 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
11534 c = build_omp_clause (clause_loc, OMP_CLAUSE_PROC_BIND);
11535 OMP_CLAUSE_PROC_BIND_KIND (c) = kind;
11536 OMP_CLAUSE_CHAIN (c) = list;
11537 return c;
11539 invalid_kind:
11540 c_parser_error (parser, "invalid proc_bind kind");
11541 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
11542 return list;
11545 /* OpenMP 4.0:
11546 to ( variable-list ) */
11548 static tree
11549 c_parser_omp_clause_to (c_parser *parser, tree list)
11551 return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_TO, list);
11554 /* OpenMP 4.0:
11555 from ( variable-list ) */
11557 static tree
11558 c_parser_omp_clause_from (c_parser *parser, tree list)
11560 return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_FROM, list);
11563 /* OpenMP 4.0:
11564 uniform ( variable-list ) */
11566 static tree
11567 c_parser_omp_clause_uniform (c_parser *parser, tree list)
11569 /* The clauses location. */
11570 location_t loc = c_parser_peek_token (parser)->location;
11572 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
11574 list = c_parser_omp_variable_list (parser, loc, OMP_CLAUSE_UNIFORM,
11575 list);
11576 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
11578 return list;
11581 /* Parse all OpenACC clauses. The set clauses allowed by the directive
11582 is a bitmask in MASK. Return the list of clauses found. */
11584 static tree
11585 c_parser_oacc_all_clauses (c_parser *parser, omp_clause_mask mask,
11586 const char *where, bool finish_p = true)
11588 tree clauses = NULL;
11589 bool first = true;
11591 while (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL))
11593 location_t here;
11594 pragma_omp_clause c_kind;
11595 const char *c_name;
11596 tree prev = clauses;
11598 if (!first && c_parser_next_token_is (parser, CPP_COMMA))
11599 c_parser_consume_token (parser);
11601 here = c_parser_peek_token (parser)->location;
11602 c_kind = c_parser_omp_clause_name (parser);
11604 switch (c_kind)
11606 case PRAGMA_OACC_CLAUSE_ASYNC:
11607 clauses = c_parser_oacc_clause_async (parser, clauses);
11608 c_name = "async";
11609 break;
11610 case PRAGMA_OACC_CLAUSE_COLLAPSE:
11611 clauses = c_parser_omp_clause_collapse (parser, clauses);
11612 c_name = "collapse";
11613 break;
11614 case PRAGMA_OACC_CLAUSE_COPY:
11615 clauses = c_parser_oacc_data_clause (parser, c_kind, clauses);
11616 c_name = "copy";
11617 break;
11618 case PRAGMA_OACC_CLAUSE_COPYIN:
11619 clauses = c_parser_oacc_data_clause (parser, c_kind, clauses);
11620 c_name = "copyin";
11621 break;
11622 case PRAGMA_OACC_CLAUSE_COPYOUT:
11623 clauses = c_parser_oacc_data_clause (parser, c_kind, clauses);
11624 c_name = "copyout";
11625 break;
11626 case PRAGMA_OACC_CLAUSE_CREATE:
11627 clauses = c_parser_oacc_data_clause (parser, c_kind, clauses);
11628 c_name = "create";
11629 break;
11630 case PRAGMA_OACC_CLAUSE_DELETE:
11631 clauses = c_parser_oacc_data_clause (parser, c_kind, clauses);
11632 c_name = "delete";
11633 break;
11634 case PRAGMA_OACC_CLAUSE_DEVICE:
11635 clauses = c_parser_oacc_data_clause (parser, c_kind, clauses);
11636 c_name = "device";
11637 break;
11638 case PRAGMA_OACC_CLAUSE_DEVICEPTR:
11639 clauses = c_parser_oacc_data_clause_deviceptr (parser, clauses);
11640 c_name = "deviceptr";
11641 break;
11642 case PRAGMA_OACC_CLAUSE_FIRSTPRIVATE:
11643 clauses = c_parser_omp_clause_firstprivate (parser, clauses);
11644 c_name = "firstprivate";
11645 break;
11646 case PRAGMA_OACC_CLAUSE_HOST:
11647 clauses = c_parser_oacc_data_clause (parser, c_kind, clauses);
11648 c_name = "host";
11649 break;
11650 case PRAGMA_OACC_CLAUSE_IF:
11651 clauses = c_parser_omp_clause_if (parser, clauses);
11652 c_name = "if";
11653 break;
11654 case PRAGMA_OACC_CLAUSE_NUM_GANGS:
11655 clauses = c_parser_omp_clause_num_gangs (parser, clauses);
11656 c_name = "num_gangs";
11657 break;
11658 case PRAGMA_OACC_CLAUSE_NUM_WORKERS:
11659 clauses = c_parser_omp_clause_num_workers (parser, clauses);
11660 c_name = "num_workers";
11661 break;
11662 case PRAGMA_OACC_CLAUSE_PRESENT:
11663 clauses = c_parser_oacc_data_clause (parser, c_kind, clauses);
11664 c_name = "present";
11665 break;
11666 case PRAGMA_OACC_CLAUSE_PRESENT_OR_COPY:
11667 clauses = c_parser_oacc_data_clause (parser, c_kind, clauses);
11668 c_name = "present_or_copy";
11669 break;
11670 case PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYIN:
11671 clauses = c_parser_oacc_data_clause (parser, c_kind, clauses);
11672 c_name = "present_or_copyin";
11673 break;
11674 case PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYOUT:
11675 clauses = c_parser_oacc_data_clause (parser, c_kind, clauses);
11676 c_name = "present_or_copyout";
11677 break;
11678 case PRAGMA_OACC_CLAUSE_PRESENT_OR_CREATE:
11679 clauses = c_parser_oacc_data_clause (parser, c_kind, clauses);
11680 c_name = "present_or_create";
11681 break;
11682 case PRAGMA_OACC_CLAUSE_PRIVATE:
11683 clauses = c_parser_omp_clause_private (parser, clauses);
11684 c_name = "private";
11685 break;
11686 case PRAGMA_OACC_CLAUSE_REDUCTION:
11687 clauses = c_parser_omp_clause_reduction (parser, clauses);
11688 c_name = "reduction";
11689 break;
11690 case PRAGMA_OACC_CLAUSE_SELF:
11691 clauses = c_parser_oacc_data_clause (parser, c_kind, clauses);
11692 c_name = "self";
11693 break;
11694 case PRAGMA_OACC_CLAUSE_VECTOR_LENGTH:
11695 clauses = c_parser_omp_clause_vector_length (parser, clauses);
11696 c_name = "vector_length";
11697 break;
11698 case PRAGMA_OACC_CLAUSE_WAIT:
11699 clauses = c_parser_oacc_clause_wait (parser, clauses);
11700 c_name = "wait";
11701 break;
11702 default:
11703 c_parser_error (parser, "expected %<#pragma acc%> clause");
11704 goto saw_error;
11707 first = false;
11709 if (((mask >> c_kind) & 1) == 0 && !parser->error)
11711 /* Remove the invalid clause(s) from the list to avoid
11712 confusing the rest of the compiler. */
11713 clauses = prev;
11714 error_at (here, "%qs is not valid for %qs", c_name, where);
11718 saw_error:
11719 c_parser_skip_to_pragma_eol (parser);
11721 if (finish_p)
11722 return c_finish_omp_clauses (clauses);
11724 return clauses;
11727 /* Parse all OpenMP clauses. The set clauses allowed by the directive
11728 is a bitmask in MASK. Return the list of clauses found. */
11730 static tree
11731 c_parser_omp_all_clauses (c_parser *parser, omp_clause_mask mask,
11732 const char *where, bool finish_p = true)
11734 tree clauses = NULL;
11735 bool first = true, cilk_simd_fn = false;
11737 while (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL))
11739 location_t here;
11740 pragma_omp_clause c_kind;
11741 const char *c_name;
11742 tree prev = clauses;
11744 if (!first && c_parser_next_token_is (parser, CPP_COMMA))
11745 c_parser_consume_token (parser);
11747 here = c_parser_peek_token (parser)->location;
11748 c_kind = c_parser_omp_clause_name (parser);
11750 switch (c_kind)
11752 case PRAGMA_OMP_CLAUSE_COLLAPSE:
11753 clauses = c_parser_omp_clause_collapse (parser, clauses);
11754 c_name = "collapse";
11755 break;
11756 case PRAGMA_OMP_CLAUSE_COPYIN:
11757 clauses = c_parser_omp_clause_copyin (parser, clauses);
11758 c_name = "copyin";
11759 break;
11760 case PRAGMA_OMP_CLAUSE_COPYPRIVATE:
11761 clauses = c_parser_omp_clause_copyprivate (parser, clauses);
11762 c_name = "copyprivate";
11763 break;
11764 case PRAGMA_OMP_CLAUSE_DEFAULT:
11765 clauses = c_parser_omp_clause_default (parser, clauses);
11766 c_name = "default";
11767 break;
11768 case PRAGMA_OMP_CLAUSE_FIRSTPRIVATE:
11769 clauses = c_parser_omp_clause_firstprivate (parser, clauses);
11770 c_name = "firstprivate";
11771 break;
11772 case PRAGMA_OMP_CLAUSE_FINAL:
11773 clauses = c_parser_omp_clause_final (parser, clauses);
11774 c_name = "final";
11775 break;
11776 case PRAGMA_OMP_CLAUSE_IF:
11777 clauses = c_parser_omp_clause_if (parser, clauses);
11778 c_name = "if";
11779 break;
11780 case PRAGMA_OMP_CLAUSE_LASTPRIVATE:
11781 clauses = c_parser_omp_clause_lastprivate (parser, clauses);
11782 c_name = "lastprivate";
11783 break;
11784 case PRAGMA_OMP_CLAUSE_MERGEABLE:
11785 clauses = c_parser_omp_clause_mergeable (parser, clauses);
11786 c_name = "mergeable";
11787 break;
11788 case PRAGMA_OMP_CLAUSE_NOWAIT:
11789 clauses = c_parser_omp_clause_nowait (parser, clauses);
11790 c_name = "nowait";
11791 break;
11792 case PRAGMA_OMP_CLAUSE_NUM_THREADS:
11793 clauses = c_parser_omp_clause_num_threads (parser, clauses);
11794 c_name = "num_threads";
11795 break;
11796 case PRAGMA_OMP_CLAUSE_ORDERED:
11797 clauses = c_parser_omp_clause_ordered (parser, clauses);
11798 c_name = "ordered";
11799 break;
11800 case PRAGMA_OMP_CLAUSE_PRIVATE:
11801 clauses = c_parser_omp_clause_private (parser, clauses);
11802 c_name = "private";
11803 break;
11804 case PRAGMA_OMP_CLAUSE_REDUCTION:
11805 clauses = c_parser_omp_clause_reduction (parser, clauses);
11806 c_name = "reduction";
11807 break;
11808 case PRAGMA_OMP_CLAUSE_SCHEDULE:
11809 clauses = c_parser_omp_clause_schedule (parser, clauses);
11810 c_name = "schedule";
11811 break;
11812 case PRAGMA_OMP_CLAUSE_SHARED:
11813 clauses = c_parser_omp_clause_shared (parser, clauses);
11814 c_name = "shared";
11815 break;
11816 case PRAGMA_OMP_CLAUSE_UNTIED:
11817 clauses = c_parser_omp_clause_untied (parser, clauses);
11818 c_name = "untied";
11819 break;
11820 case PRAGMA_OMP_CLAUSE_INBRANCH:
11821 case PRAGMA_CILK_CLAUSE_MASK:
11822 clauses = c_parser_omp_clause_branch (parser, OMP_CLAUSE_INBRANCH,
11823 clauses);
11824 c_name = "inbranch";
11825 break;
11826 case PRAGMA_OMP_CLAUSE_NOTINBRANCH:
11827 case PRAGMA_CILK_CLAUSE_NOMASK:
11828 clauses = c_parser_omp_clause_branch (parser, OMP_CLAUSE_NOTINBRANCH,
11829 clauses);
11830 c_name = "notinbranch";
11831 break;
11832 case PRAGMA_OMP_CLAUSE_PARALLEL:
11833 clauses
11834 = c_parser_omp_clause_cancelkind (parser, OMP_CLAUSE_PARALLEL,
11835 clauses);
11836 c_name = "parallel";
11837 if (!first)
11839 clause_not_first:
11840 error_at (here, "%qs must be the first clause of %qs",
11841 c_name, where);
11842 clauses = prev;
11844 break;
11845 case PRAGMA_OMP_CLAUSE_FOR:
11846 clauses
11847 = c_parser_omp_clause_cancelkind (parser, OMP_CLAUSE_FOR,
11848 clauses);
11849 c_name = "for";
11850 if (!first)
11851 goto clause_not_first;
11852 break;
11853 case PRAGMA_OMP_CLAUSE_SECTIONS:
11854 clauses
11855 = c_parser_omp_clause_cancelkind (parser, OMP_CLAUSE_SECTIONS,
11856 clauses);
11857 c_name = "sections";
11858 if (!first)
11859 goto clause_not_first;
11860 break;
11861 case PRAGMA_OMP_CLAUSE_TASKGROUP:
11862 clauses
11863 = c_parser_omp_clause_cancelkind (parser, OMP_CLAUSE_TASKGROUP,
11864 clauses);
11865 c_name = "taskgroup";
11866 if (!first)
11867 goto clause_not_first;
11868 break;
11869 case PRAGMA_OMP_CLAUSE_TO:
11870 clauses = c_parser_omp_clause_to (parser, clauses);
11871 c_name = "to";
11872 break;
11873 case PRAGMA_OMP_CLAUSE_FROM:
11874 clauses = c_parser_omp_clause_from (parser, clauses);
11875 c_name = "from";
11876 break;
11877 case PRAGMA_OMP_CLAUSE_UNIFORM:
11878 clauses = c_parser_omp_clause_uniform (parser, clauses);
11879 c_name = "uniform";
11880 break;
11881 case PRAGMA_OMP_CLAUSE_NUM_TEAMS:
11882 clauses = c_parser_omp_clause_num_teams (parser, clauses);
11883 c_name = "num_teams";
11884 break;
11885 case PRAGMA_OMP_CLAUSE_THREAD_LIMIT:
11886 clauses = c_parser_omp_clause_thread_limit (parser, clauses);
11887 c_name = "thread_limit";
11888 break;
11889 case PRAGMA_OMP_CLAUSE_ALIGNED:
11890 clauses = c_parser_omp_clause_aligned (parser, clauses);
11891 c_name = "aligned";
11892 break;
11893 case PRAGMA_OMP_CLAUSE_LINEAR:
11894 if (((mask >> PRAGMA_CILK_CLAUSE_VECTORLENGTH) & 1) != 0)
11895 cilk_simd_fn = true;
11896 clauses = c_parser_omp_clause_linear (parser, clauses, cilk_simd_fn);
11897 c_name = "linear";
11898 break;
11899 case PRAGMA_OMP_CLAUSE_DEPEND:
11900 clauses = c_parser_omp_clause_depend (parser, clauses);
11901 c_name = "depend";
11902 break;
11903 case PRAGMA_OMP_CLAUSE_MAP:
11904 clauses = c_parser_omp_clause_map (parser, clauses);
11905 c_name = "map";
11906 break;
11907 case PRAGMA_OMP_CLAUSE_DEVICE:
11908 clauses = c_parser_omp_clause_device (parser, clauses);
11909 c_name = "device";
11910 break;
11911 case PRAGMA_OMP_CLAUSE_DIST_SCHEDULE:
11912 clauses = c_parser_omp_clause_dist_schedule (parser, clauses);
11913 c_name = "dist_schedule";
11914 break;
11915 case PRAGMA_OMP_CLAUSE_PROC_BIND:
11916 clauses = c_parser_omp_clause_proc_bind (parser, clauses);
11917 c_name = "proc_bind";
11918 break;
11919 case PRAGMA_OMP_CLAUSE_SAFELEN:
11920 clauses = c_parser_omp_clause_safelen (parser, clauses);
11921 c_name = "safelen";
11922 break;
11923 case PRAGMA_CILK_CLAUSE_VECTORLENGTH:
11924 clauses = c_parser_cilk_clause_vectorlength (parser, clauses, true);
11925 c_name = "simdlen";
11926 break;
11927 case PRAGMA_OMP_CLAUSE_SIMDLEN:
11928 clauses = c_parser_omp_clause_simdlen (parser, clauses);
11929 c_name = "simdlen";
11930 break;
11931 default:
11932 c_parser_error (parser, "expected %<#pragma omp%> clause");
11933 goto saw_error;
11936 first = false;
11938 if (((mask >> c_kind) & 1) == 0 && !parser->error)
11940 /* Remove the invalid clause(s) from the list to avoid
11941 confusing the rest of the compiler. */
11942 clauses = prev;
11943 error_at (here, "%qs is not valid for %qs", c_name, where);
11947 saw_error:
11948 c_parser_skip_to_pragma_eol (parser);
11950 if (finish_p)
11951 return c_finish_omp_clauses (clauses);
11953 return clauses;
11956 /* OpenACC 2.0, OpenMP 2.5:
11957 structured-block:
11958 statement
11960 In practice, we're also interested in adding the statement to an
11961 outer node. So it is convenient if we work around the fact that
11962 c_parser_statement calls add_stmt. */
11964 static tree
11965 c_parser_omp_structured_block (c_parser *parser)
11967 tree stmt = push_stmt_list ();
11968 c_parser_statement (parser);
11969 return pop_stmt_list (stmt);
11972 /* OpenACC 2.0:
11973 # pragma acc cache (variable-list) new-line
11975 LOC is the location of the #pragma token.
11978 static tree
11979 c_parser_oacc_cache (location_t loc, c_parser *parser)
11981 tree stmt, clauses;
11983 clauses = c_parser_omp_var_list_parens (parser, OMP_CLAUSE__CACHE_, NULL);
11984 clauses = c_finish_omp_clauses (clauses);
11986 c_parser_skip_to_pragma_eol (parser);
11988 stmt = make_node (OACC_CACHE);
11989 TREE_TYPE (stmt) = void_type_node;
11990 OACC_CACHE_CLAUSES (stmt) = clauses;
11991 SET_EXPR_LOCATION (stmt, loc);
11992 add_stmt (stmt);
11994 return stmt;
11997 /* OpenACC 2.0:
11998 # pragma acc data oacc-data-clause[optseq] new-line
11999 structured-block
12001 LOC is the location of the #pragma token.
12004 #define OACC_DATA_CLAUSE_MASK \
12005 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_COPY) \
12006 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_COPYIN) \
12007 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_COPYOUT) \
12008 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_CREATE) \
12009 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_DEVICEPTR) \
12010 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_IF) \
12011 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT) \
12012 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_COPY) \
12013 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYIN) \
12014 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYOUT) \
12015 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_CREATE) )
12017 static tree
12018 c_parser_oacc_data (location_t loc, c_parser *parser)
12020 tree stmt, clauses, block;
12022 clauses = c_parser_oacc_all_clauses (parser, OACC_DATA_CLAUSE_MASK,
12023 "#pragma acc data");
12025 block = c_begin_omp_parallel ();
12026 add_stmt (c_parser_omp_structured_block (parser));
12028 stmt = c_finish_oacc_data (loc, clauses, block);
12030 return stmt;
12033 /* OpenACC 2.0:
12034 # pragma acc kernels oacc-kernels-clause[optseq] new-line
12035 structured-block
12037 LOC is the location of the #pragma token.
12040 #define OACC_KERNELS_CLAUSE_MASK \
12041 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_ASYNC) \
12042 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_COPY) \
12043 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_COPYIN) \
12044 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_COPYOUT) \
12045 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_CREATE) \
12046 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_DEVICEPTR) \
12047 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_IF) \
12048 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT) \
12049 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_COPY) \
12050 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYIN) \
12051 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYOUT) \
12052 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_CREATE) \
12053 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_WAIT) )
12055 static tree
12056 c_parser_oacc_kernels (location_t loc, c_parser *parser, char *p_name)
12058 tree stmt, clauses = NULL_TREE, block;
12060 strcat (p_name, " kernels");
12062 if (c_parser_next_token_is (parser, CPP_NAME))
12064 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
12065 if (strcmp (p, "loop") == 0)
12067 c_parser_consume_token (parser);
12068 block = c_begin_omp_parallel ();
12069 c_parser_oacc_loop (loc, parser, p_name);
12070 stmt = c_finish_oacc_kernels (loc, clauses, block);
12071 OACC_KERNELS_COMBINED (stmt) = 1;
12072 return stmt;
12076 clauses = c_parser_oacc_all_clauses (parser, OACC_KERNELS_CLAUSE_MASK,
12077 p_name);
12079 block = c_begin_omp_parallel ();
12080 add_stmt (c_parser_omp_structured_block (parser));
12082 stmt = c_finish_oacc_kernels (loc, clauses, block);
12084 return stmt;
12087 /* OpenACC 2.0:
12088 # pragma acc enter data oacc-enter-data-clause[optseq] new-line
12092 # pragma acc exit data oacc-exit-data-clause[optseq] new-line
12095 LOC is the location of the #pragma token.
12098 #define OACC_ENTER_DATA_CLAUSE_MASK \
12099 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_IF) \
12100 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_ASYNC) \
12101 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_COPYIN) \
12102 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_CREATE) \
12103 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYIN) \
12104 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_CREATE) \
12105 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_WAIT) )
12107 #define OACC_EXIT_DATA_CLAUSE_MASK \
12108 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_IF) \
12109 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_ASYNC) \
12110 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_COPYOUT) \
12111 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_DELETE) \
12112 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_WAIT) )
12114 static void
12115 c_parser_oacc_enter_exit_data (c_parser *parser, bool enter)
12117 location_t loc = c_parser_peek_token (parser)->location;
12118 tree clauses, stmt;
12120 c_parser_consume_pragma (parser);
12122 if (!c_parser_next_token_is (parser, CPP_NAME))
12124 c_parser_error (parser, enter
12125 ? "expected %<data%> in %<#pragma acc enter data%>"
12126 : "expected %<data%> in %<#pragma acc exit data%>");
12127 c_parser_skip_to_pragma_eol (parser);
12128 return;
12131 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
12132 if (strcmp (p, "data") != 0)
12134 c_parser_error (parser, "invalid pragma");
12135 c_parser_skip_to_pragma_eol (parser);
12136 return;
12139 c_parser_consume_token (parser);
12141 if (enter)
12142 clauses = c_parser_oacc_all_clauses (parser, OACC_ENTER_DATA_CLAUSE_MASK,
12143 "#pragma acc enter data");
12144 else
12145 clauses = c_parser_oacc_all_clauses (parser, OACC_EXIT_DATA_CLAUSE_MASK,
12146 "#pragma acc exit data");
12148 if (find_omp_clause (clauses, OMP_CLAUSE_MAP) == NULL_TREE)
12150 error_at (loc, enter
12151 ? "%<#pragma acc enter data%> has no data movement clause"
12152 : "%<#pragma acc exit data%> has no data movement clause");
12153 return;
12156 stmt = enter ? make_node (OACC_ENTER_DATA) : make_node (OACC_EXIT_DATA);;
12157 TREE_TYPE (stmt) = void_type_node;
12158 if (enter)
12159 OACC_ENTER_DATA_CLAUSES (stmt) = clauses;
12160 else
12161 OACC_EXIT_DATA_CLAUSES (stmt) = clauses;
12162 SET_EXPR_LOCATION (stmt, loc);
12163 add_stmt (stmt);
12167 /* OpenACC 2.0:
12169 # pragma acc loop oacc-loop-clause[optseq] new-line
12170 structured-block
12172 LOC is the location of the #pragma token.
12175 #define OACC_LOOP_CLAUSE_MASK \
12176 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_COLLAPSE) \
12177 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_REDUCTION) )
12179 static tree
12180 c_parser_oacc_loop (location_t loc, c_parser *parser, char *p_name)
12182 tree stmt, clauses, block;
12184 strcat (p_name, " loop");
12186 clauses = c_parser_oacc_all_clauses (parser, OACC_LOOP_CLAUSE_MASK, p_name);
12188 block = c_begin_compound_stmt (true);
12189 stmt = c_parser_omp_for_loop (loc, parser, OACC_LOOP, clauses, NULL);
12190 block = c_end_compound_stmt (loc, block, true);
12191 add_stmt (block);
12193 return stmt;
12196 /* OpenACC 2.0:
12197 # pragma acc parallel oacc-parallel-clause[optseq] new-line
12198 structured-block
12200 LOC is the location of the #pragma token.
12203 #define OACC_PARALLEL_CLAUSE_MASK \
12204 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_ASYNC) \
12205 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_COPY) \
12206 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_COPYIN) \
12207 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_COPYOUT) \
12208 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_CREATE) \
12209 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_DEVICEPTR) \
12210 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_IF) \
12211 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_NUM_GANGS) \
12212 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_NUM_WORKERS) \
12213 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT) \
12214 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_COPY) \
12215 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYIN) \
12216 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYOUT) \
12217 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_CREATE) \
12218 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_REDUCTION) \
12219 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_VECTOR_LENGTH) \
12220 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_WAIT) )
12222 static tree
12223 c_parser_oacc_parallel (location_t loc, c_parser *parser, char *p_name)
12225 tree stmt, clauses = NULL_TREE, block;
12227 strcat (p_name, " parallel");
12229 if (c_parser_next_token_is (parser, CPP_NAME))
12231 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
12232 if (strcmp (p, "loop") == 0)
12234 c_parser_consume_token (parser);
12235 block = c_begin_omp_parallel ();
12236 c_parser_oacc_loop (loc, parser, p_name);
12237 stmt = c_finish_oacc_parallel (loc, clauses, block);
12238 OACC_PARALLEL_COMBINED (stmt) = 1;
12239 return stmt;
12243 clauses = c_parser_oacc_all_clauses (parser, OACC_PARALLEL_CLAUSE_MASK,
12244 p_name);
12246 block = c_begin_omp_parallel ();
12247 add_stmt (c_parser_omp_structured_block (parser));
12249 stmt = c_finish_oacc_parallel (loc, clauses, block);
12251 return stmt;
12254 /* OpenACC 2.0:
12255 # pragma acc update oacc-update-clause[optseq] new-line
12258 #define OACC_UPDATE_CLAUSE_MASK \
12259 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_ASYNC) \
12260 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_DEVICE) \
12261 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_HOST) \
12262 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_IF) \
12263 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_SELF) \
12264 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_WAIT) )
12266 static void
12267 c_parser_oacc_update (c_parser *parser)
12269 location_t loc = c_parser_peek_token (parser)->location;
12271 c_parser_consume_pragma (parser);
12273 tree clauses = c_parser_oacc_all_clauses (parser, OACC_UPDATE_CLAUSE_MASK,
12274 "#pragma acc update");
12275 if (find_omp_clause (clauses, OMP_CLAUSE_MAP) == NULL_TREE)
12277 error_at (loc,
12278 "%<#pragma acc update%> must contain at least one "
12279 "%<device%> or %<host/self%> clause");
12280 return;
12283 if (parser->error)
12284 return;
12286 tree stmt = make_node (OACC_UPDATE);
12287 TREE_TYPE (stmt) = void_type_node;
12288 OACC_UPDATE_CLAUSES (stmt) = clauses;
12289 SET_EXPR_LOCATION (stmt, loc);
12290 add_stmt (stmt);
12293 /* OpenACC 2.0:
12294 # pragma acc wait [(intseq)] oacc-wait-clause[optseq] new-line
12296 LOC is the location of the #pragma token.
12299 #define OACC_WAIT_CLAUSE_MASK \
12300 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_ASYNC) )
12302 static tree
12303 c_parser_oacc_wait (location_t loc, c_parser *parser, char *p_name)
12305 tree clauses, list = NULL_TREE, stmt = NULL_TREE;
12307 if (c_parser_peek_token (parser)->type == CPP_OPEN_PAREN)
12308 list = c_parser_oacc_wait_list (parser, loc, list);
12310 strcpy (p_name, " wait");
12311 clauses = c_parser_oacc_all_clauses (parser, OACC_WAIT_CLAUSE_MASK, p_name);
12312 stmt = c_finish_oacc_wait (loc, list, clauses);
12314 return stmt;
12317 /* OpenMP 2.5:
12318 # pragma omp atomic new-line
12319 expression-stmt
12321 expression-stmt:
12322 x binop= expr | x++ | ++x | x-- | --x
12323 binop:
12324 +, *, -, /, &, ^, |, <<, >>
12326 where x is an lvalue expression with scalar type.
12328 OpenMP 3.1:
12329 # pragma omp atomic new-line
12330 update-stmt
12332 # pragma omp atomic read new-line
12333 read-stmt
12335 # pragma omp atomic write new-line
12336 write-stmt
12338 # pragma omp atomic update new-line
12339 update-stmt
12341 # pragma omp atomic capture new-line
12342 capture-stmt
12344 # pragma omp atomic capture new-line
12345 capture-block
12347 read-stmt:
12348 v = x
12349 write-stmt:
12350 x = expr
12351 update-stmt:
12352 expression-stmt | x = x binop expr
12353 capture-stmt:
12354 v = expression-stmt
12355 capture-block:
12356 { v = x; update-stmt; } | { update-stmt; v = x; }
12358 OpenMP 4.0:
12359 update-stmt:
12360 expression-stmt | x = x binop expr | x = expr binop x
12361 capture-stmt:
12362 v = update-stmt
12363 capture-block:
12364 { v = x; update-stmt; } | { update-stmt; v = x; } | { v = x; x = expr; }
12366 where x and v are lvalue expressions with scalar type.
12368 LOC is the location of the #pragma token. */
12370 static void
12371 c_parser_omp_atomic (location_t loc, c_parser *parser)
12373 tree lhs = NULL_TREE, rhs = NULL_TREE, v = NULL_TREE;
12374 tree lhs1 = NULL_TREE, rhs1 = NULL_TREE;
12375 tree stmt, orig_lhs, unfolded_lhs = NULL_TREE, unfolded_lhs1 = NULL_TREE;
12376 enum tree_code code = OMP_ATOMIC, opcode = NOP_EXPR;
12377 struct c_expr expr;
12378 location_t eloc;
12379 bool structured_block = false;
12380 bool swapped = false;
12381 bool seq_cst = false;
12383 if (c_parser_next_token_is (parser, CPP_NAME))
12385 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
12386 if (!strcmp (p, "seq_cst"))
12388 seq_cst = true;
12389 c_parser_consume_token (parser);
12390 if (c_parser_next_token_is (parser, CPP_COMMA)
12391 && c_parser_peek_2nd_token (parser)->type == CPP_NAME)
12392 c_parser_consume_token (parser);
12395 if (c_parser_next_token_is (parser, CPP_NAME))
12397 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
12399 if (!strcmp (p, "read"))
12400 code = OMP_ATOMIC_READ;
12401 else if (!strcmp (p, "write"))
12402 code = NOP_EXPR;
12403 else if (!strcmp (p, "update"))
12404 code = OMP_ATOMIC;
12405 else if (!strcmp (p, "capture"))
12406 code = OMP_ATOMIC_CAPTURE_NEW;
12407 else
12408 p = NULL;
12409 if (p)
12410 c_parser_consume_token (parser);
12412 if (!seq_cst)
12414 if (c_parser_next_token_is (parser, CPP_COMMA)
12415 && c_parser_peek_2nd_token (parser)->type == CPP_NAME)
12416 c_parser_consume_token (parser);
12418 if (c_parser_next_token_is (parser, CPP_NAME))
12420 const char *p
12421 = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
12422 if (!strcmp (p, "seq_cst"))
12424 seq_cst = true;
12425 c_parser_consume_token (parser);
12429 c_parser_skip_to_pragma_eol (parser);
12431 switch (code)
12433 case OMP_ATOMIC_READ:
12434 case NOP_EXPR: /* atomic write */
12435 v = c_parser_unary_expression (parser).value;
12436 v = c_fully_fold (v, false, NULL);
12437 if (v == error_mark_node)
12438 goto saw_error;
12439 loc = c_parser_peek_token (parser)->location;
12440 if (!c_parser_require (parser, CPP_EQ, "expected %<=%>"))
12441 goto saw_error;
12442 if (code == NOP_EXPR)
12443 lhs = c_parser_expression (parser).value;
12444 else
12445 lhs = c_parser_unary_expression (parser).value;
12446 lhs = c_fully_fold (lhs, false, NULL);
12447 if (lhs == error_mark_node)
12448 goto saw_error;
12449 if (code == NOP_EXPR)
12451 /* atomic write is represented by OMP_ATOMIC with NOP_EXPR
12452 opcode. */
12453 code = OMP_ATOMIC;
12454 rhs = lhs;
12455 lhs = v;
12456 v = NULL_TREE;
12458 goto done;
12459 case OMP_ATOMIC_CAPTURE_NEW:
12460 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
12462 c_parser_consume_token (parser);
12463 structured_block = true;
12465 else
12467 v = c_parser_unary_expression (parser).value;
12468 v = c_fully_fold (v, false, NULL);
12469 if (v == error_mark_node)
12470 goto saw_error;
12471 if (!c_parser_require (parser, CPP_EQ, "expected %<=%>"))
12472 goto saw_error;
12474 break;
12475 default:
12476 break;
12479 /* For structured_block case we don't know yet whether
12480 old or new x should be captured. */
12481 restart:
12482 eloc = c_parser_peek_token (parser)->location;
12483 expr = c_parser_unary_expression (parser);
12484 lhs = expr.value;
12485 expr = default_function_array_conversion (eloc, expr);
12486 unfolded_lhs = expr.value;
12487 lhs = c_fully_fold (lhs, false, NULL);
12488 orig_lhs = lhs;
12489 switch (TREE_CODE (lhs))
12491 case ERROR_MARK:
12492 saw_error:
12493 c_parser_skip_to_end_of_block_or_statement (parser);
12494 if (structured_block)
12496 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
12497 c_parser_consume_token (parser);
12498 else if (code == OMP_ATOMIC_CAPTURE_NEW)
12500 c_parser_skip_to_end_of_block_or_statement (parser);
12501 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
12502 c_parser_consume_token (parser);
12505 return;
12507 case POSTINCREMENT_EXPR:
12508 if (code == OMP_ATOMIC_CAPTURE_NEW && !structured_block)
12509 code = OMP_ATOMIC_CAPTURE_OLD;
12510 /* FALLTHROUGH */
12511 case PREINCREMENT_EXPR:
12512 lhs = TREE_OPERAND (lhs, 0);
12513 unfolded_lhs = NULL_TREE;
12514 opcode = PLUS_EXPR;
12515 rhs = integer_one_node;
12516 break;
12518 case POSTDECREMENT_EXPR:
12519 if (code == OMP_ATOMIC_CAPTURE_NEW && !structured_block)
12520 code = OMP_ATOMIC_CAPTURE_OLD;
12521 /* FALLTHROUGH */
12522 case PREDECREMENT_EXPR:
12523 lhs = TREE_OPERAND (lhs, 0);
12524 unfolded_lhs = NULL_TREE;
12525 opcode = MINUS_EXPR;
12526 rhs = integer_one_node;
12527 break;
12529 case COMPOUND_EXPR:
12530 if (TREE_CODE (TREE_OPERAND (lhs, 0)) == SAVE_EXPR
12531 && TREE_CODE (TREE_OPERAND (lhs, 1)) == COMPOUND_EXPR
12532 && TREE_CODE (TREE_OPERAND (TREE_OPERAND (lhs, 1), 0)) == MODIFY_EXPR
12533 && TREE_OPERAND (TREE_OPERAND (lhs, 1), 1) == TREE_OPERAND (lhs, 0)
12534 && TREE_CODE (TREE_TYPE (TREE_OPERAND (TREE_OPERAND
12535 (TREE_OPERAND (lhs, 1), 0), 0)))
12536 == BOOLEAN_TYPE)
12537 /* Undo effects of boolean_increment for post {in,de}crement. */
12538 lhs = TREE_OPERAND (TREE_OPERAND (lhs, 1), 0);
12539 /* FALLTHRU */
12540 case MODIFY_EXPR:
12541 if (TREE_CODE (lhs) == MODIFY_EXPR
12542 && TREE_CODE (TREE_TYPE (TREE_OPERAND (lhs, 0))) == BOOLEAN_TYPE)
12544 /* Undo effects of boolean_increment. */
12545 if (integer_onep (TREE_OPERAND (lhs, 1)))
12547 /* This is pre or post increment. */
12548 rhs = TREE_OPERAND (lhs, 1);
12549 lhs = TREE_OPERAND (lhs, 0);
12550 unfolded_lhs = NULL_TREE;
12551 opcode = NOP_EXPR;
12552 if (code == OMP_ATOMIC_CAPTURE_NEW
12553 && !structured_block
12554 && TREE_CODE (orig_lhs) == COMPOUND_EXPR)
12555 code = OMP_ATOMIC_CAPTURE_OLD;
12556 break;
12558 if (TREE_CODE (TREE_OPERAND (lhs, 1)) == TRUTH_NOT_EXPR
12559 && TREE_OPERAND (lhs, 0)
12560 == TREE_OPERAND (TREE_OPERAND (lhs, 1), 0))
12562 /* This is pre or post decrement. */
12563 rhs = TREE_OPERAND (lhs, 1);
12564 lhs = TREE_OPERAND (lhs, 0);
12565 unfolded_lhs = NULL_TREE;
12566 opcode = NOP_EXPR;
12567 if (code == OMP_ATOMIC_CAPTURE_NEW
12568 && !structured_block
12569 && TREE_CODE (orig_lhs) == COMPOUND_EXPR)
12570 code = OMP_ATOMIC_CAPTURE_OLD;
12571 break;
12574 /* FALLTHRU */
12575 default:
12576 switch (c_parser_peek_token (parser)->type)
12578 case CPP_MULT_EQ:
12579 opcode = MULT_EXPR;
12580 break;
12581 case CPP_DIV_EQ:
12582 opcode = TRUNC_DIV_EXPR;
12583 break;
12584 case CPP_PLUS_EQ:
12585 opcode = PLUS_EXPR;
12586 break;
12587 case CPP_MINUS_EQ:
12588 opcode = MINUS_EXPR;
12589 break;
12590 case CPP_LSHIFT_EQ:
12591 opcode = LSHIFT_EXPR;
12592 break;
12593 case CPP_RSHIFT_EQ:
12594 opcode = RSHIFT_EXPR;
12595 break;
12596 case CPP_AND_EQ:
12597 opcode = BIT_AND_EXPR;
12598 break;
12599 case CPP_OR_EQ:
12600 opcode = BIT_IOR_EXPR;
12601 break;
12602 case CPP_XOR_EQ:
12603 opcode = BIT_XOR_EXPR;
12604 break;
12605 case CPP_EQ:
12606 c_parser_consume_token (parser);
12607 eloc = c_parser_peek_token (parser)->location;
12608 expr = c_parser_expr_no_commas (parser, NULL, unfolded_lhs);
12609 rhs1 = expr.value;
12610 switch (TREE_CODE (rhs1))
12612 case MULT_EXPR:
12613 case TRUNC_DIV_EXPR:
12614 case RDIV_EXPR:
12615 case PLUS_EXPR:
12616 case MINUS_EXPR:
12617 case LSHIFT_EXPR:
12618 case RSHIFT_EXPR:
12619 case BIT_AND_EXPR:
12620 case BIT_IOR_EXPR:
12621 case BIT_XOR_EXPR:
12622 if (c_tree_equal (TREE_OPERAND (rhs1, 0), unfolded_lhs))
12624 opcode = TREE_CODE (rhs1);
12625 rhs = c_fully_fold (TREE_OPERAND (rhs1, 1), false, NULL);
12626 rhs1 = c_fully_fold (TREE_OPERAND (rhs1, 0), false, NULL);
12627 goto stmt_done;
12629 if (c_tree_equal (TREE_OPERAND (rhs1, 1), unfolded_lhs))
12631 opcode = TREE_CODE (rhs1);
12632 rhs = c_fully_fold (TREE_OPERAND (rhs1, 0), false, NULL);
12633 rhs1 = c_fully_fold (TREE_OPERAND (rhs1, 1), false, NULL);
12634 swapped = !commutative_tree_code (opcode);
12635 goto stmt_done;
12637 break;
12638 case ERROR_MARK:
12639 goto saw_error;
12640 default:
12641 break;
12643 if (c_parser_peek_token (parser)->type == CPP_SEMICOLON)
12645 if (structured_block && code == OMP_ATOMIC_CAPTURE_NEW)
12647 code = OMP_ATOMIC_CAPTURE_OLD;
12648 v = lhs;
12649 lhs = NULL_TREE;
12650 expr = default_function_array_read_conversion (eloc, expr);
12651 unfolded_lhs1 = expr.value;
12652 lhs1 = c_fully_fold (unfolded_lhs1, false, NULL);
12653 rhs1 = NULL_TREE;
12654 c_parser_consume_token (parser);
12655 goto restart;
12657 if (structured_block)
12659 opcode = NOP_EXPR;
12660 expr = default_function_array_read_conversion (eloc, expr);
12661 rhs = c_fully_fold (expr.value, false, NULL);
12662 rhs1 = NULL_TREE;
12663 goto stmt_done;
12666 c_parser_error (parser, "invalid form of %<#pragma omp atomic%>");
12667 goto saw_error;
12668 default:
12669 c_parser_error (parser,
12670 "invalid operator for %<#pragma omp atomic%>");
12671 goto saw_error;
12674 /* Arrange to pass the location of the assignment operator to
12675 c_finish_omp_atomic. */
12676 loc = c_parser_peek_token (parser)->location;
12677 c_parser_consume_token (parser);
12678 eloc = c_parser_peek_token (parser)->location;
12679 expr = c_parser_expression (parser);
12680 expr = default_function_array_read_conversion (eloc, expr);
12681 rhs = expr.value;
12682 rhs = c_fully_fold (rhs, false, NULL);
12683 break;
12685 stmt_done:
12686 if (structured_block && code == OMP_ATOMIC_CAPTURE_NEW)
12688 if (!c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>"))
12689 goto saw_error;
12690 v = c_parser_unary_expression (parser).value;
12691 v = c_fully_fold (v, false, NULL);
12692 if (v == error_mark_node)
12693 goto saw_error;
12694 if (!c_parser_require (parser, CPP_EQ, "expected %<=%>"))
12695 goto saw_error;
12696 eloc = c_parser_peek_token (parser)->location;
12697 expr = c_parser_unary_expression (parser);
12698 lhs1 = expr.value;
12699 expr = default_function_array_read_conversion (eloc, expr);
12700 unfolded_lhs1 = expr.value;
12701 lhs1 = c_fully_fold (lhs1, false, NULL);
12702 if (lhs1 == error_mark_node)
12703 goto saw_error;
12705 if (structured_block)
12707 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
12708 c_parser_require (parser, CPP_CLOSE_BRACE, "expected %<}%>");
12710 done:
12711 if (unfolded_lhs && unfolded_lhs1
12712 && !c_tree_equal (unfolded_lhs, unfolded_lhs1))
12714 error ("%<#pragma omp atomic capture%> uses two different "
12715 "expressions for memory");
12716 stmt = error_mark_node;
12718 else
12719 stmt = c_finish_omp_atomic (loc, code, opcode, lhs, rhs, v, lhs1, rhs1,
12720 swapped, seq_cst);
12721 if (stmt != error_mark_node)
12722 add_stmt (stmt);
12724 if (!structured_block)
12725 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
12729 /* OpenMP 2.5:
12730 # pragma omp barrier new-line
12733 static void
12734 c_parser_omp_barrier (c_parser *parser)
12736 location_t loc = c_parser_peek_token (parser)->location;
12737 c_parser_consume_pragma (parser);
12738 c_parser_skip_to_pragma_eol (parser);
12740 c_finish_omp_barrier (loc);
12743 /* OpenMP 2.5:
12744 # pragma omp critical [(name)] new-line
12745 structured-block
12747 LOC is the location of the #pragma itself. */
12749 static tree
12750 c_parser_omp_critical (location_t loc, c_parser *parser)
12752 tree stmt, name = NULL;
12754 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
12756 c_parser_consume_token (parser);
12757 if (c_parser_next_token_is (parser, CPP_NAME))
12759 name = c_parser_peek_token (parser)->value;
12760 c_parser_consume_token (parser);
12761 c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>");
12763 else
12764 c_parser_error (parser, "expected identifier");
12766 else if (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL))
12767 c_parser_error (parser, "expected %<(%> or end of line");
12768 c_parser_skip_to_pragma_eol (parser);
12770 stmt = c_parser_omp_structured_block (parser);
12771 return c_finish_omp_critical (loc, stmt, name);
12774 /* OpenMP 2.5:
12775 # pragma omp flush flush-vars[opt] new-line
12777 flush-vars:
12778 ( variable-list ) */
12780 static void
12781 c_parser_omp_flush (c_parser *parser)
12783 location_t loc = c_parser_peek_token (parser)->location;
12784 c_parser_consume_pragma (parser);
12785 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
12786 c_parser_omp_var_list_parens (parser, OMP_CLAUSE_ERROR, NULL);
12787 else if (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL))
12788 c_parser_error (parser, "expected %<(%> or end of line");
12789 c_parser_skip_to_pragma_eol (parser);
12791 c_finish_omp_flush (loc);
12794 /* Parse the restricted form of loop statements allowed by OpenACC and OpenMP.
12795 The real trick here is to determine the loop control variable early
12796 so that we can push a new decl if necessary to make it private.
12797 LOC is the location of the "acc" or "omp" in "#pragma acc" or "#pragma omp",
12798 respectively. */
12800 static tree
12801 c_parser_omp_for_loop (location_t loc, c_parser *parser, enum tree_code code,
12802 tree clauses, tree *cclauses)
12804 tree decl, cond, incr, save_break, save_cont, body, init, stmt, cl;
12805 tree declv, condv, incrv, initv, ret = NULL;
12806 bool fail = false, open_brace_parsed = false;
12807 int i, collapse = 1, nbraces = 0;
12808 location_t for_loc;
12809 vec<tree, va_gc> *for_block = make_tree_vector ();
12811 for (cl = clauses; cl; cl = OMP_CLAUSE_CHAIN (cl))
12812 if (OMP_CLAUSE_CODE (cl) == OMP_CLAUSE_COLLAPSE)
12813 collapse = tree_to_shwi (OMP_CLAUSE_COLLAPSE_EXPR (cl));
12815 gcc_assert (collapse >= 1);
12817 declv = make_tree_vec (collapse);
12818 initv = make_tree_vec (collapse);
12819 condv = make_tree_vec (collapse);
12820 incrv = make_tree_vec (collapse);
12822 if (code != CILK_FOR
12823 && !c_parser_next_token_is_keyword (parser, RID_FOR))
12825 c_parser_error (parser, "for statement expected");
12826 return NULL;
12828 if (code == CILK_FOR
12829 && !c_parser_next_token_is_keyword (parser, RID_CILK_FOR))
12831 c_parser_error (parser, "_Cilk_for statement expected");
12832 return NULL;
12834 for_loc = c_parser_peek_token (parser)->location;
12835 c_parser_consume_token (parser);
12837 for (i = 0; i < collapse; i++)
12839 int bracecount = 0;
12841 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
12842 goto pop_scopes;
12844 /* Parse the initialization declaration or expression. */
12845 if (c_parser_next_tokens_start_declaration (parser))
12847 if (i > 0)
12848 vec_safe_push (for_block, c_begin_compound_stmt (true));
12849 c_parser_declaration_or_fndef (parser, true, true, true, true, true,
12850 NULL, vNULL);
12851 decl = check_for_loop_decls (for_loc, flag_isoc99);
12852 if (decl == NULL)
12853 goto error_init;
12854 if (DECL_INITIAL (decl) == error_mark_node)
12855 decl = error_mark_node;
12856 init = decl;
12858 else if (c_parser_next_token_is (parser, CPP_NAME)
12859 && c_parser_peek_2nd_token (parser)->type == CPP_EQ)
12861 struct c_expr decl_exp;
12862 struct c_expr init_exp;
12863 location_t init_loc;
12865 decl_exp = c_parser_postfix_expression (parser);
12866 decl = decl_exp.value;
12868 c_parser_require (parser, CPP_EQ, "expected %<=%>");
12870 init_loc = c_parser_peek_token (parser)->location;
12871 init_exp = c_parser_expr_no_commas (parser, NULL);
12872 init_exp = default_function_array_read_conversion (init_loc,
12873 init_exp);
12874 init = build_modify_expr (init_loc, decl, decl_exp.original_type,
12875 NOP_EXPR, init_loc, init_exp.value,
12876 init_exp.original_type);
12877 init = c_process_expr_stmt (init_loc, init);
12879 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
12881 else
12883 error_init:
12884 c_parser_error (parser,
12885 "expected iteration declaration or initialization");
12886 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
12887 "expected %<)%>");
12888 fail = true;
12889 goto parse_next;
12892 /* Parse the loop condition. */
12893 cond = NULL_TREE;
12894 if (c_parser_next_token_is_not (parser, CPP_SEMICOLON))
12896 location_t cond_loc = c_parser_peek_token (parser)->location;
12897 struct c_expr cond_expr
12898 = c_parser_binary_expression (parser, NULL, NULL_TREE);
12900 cond = cond_expr.value;
12901 cond = c_objc_common_truthvalue_conversion (cond_loc, cond);
12902 cond = c_fully_fold (cond, false, NULL);
12903 switch (cond_expr.original_code)
12905 case GT_EXPR:
12906 case GE_EXPR:
12907 case LT_EXPR:
12908 case LE_EXPR:
12909 break;
12910 case NE_EXPR:
12911 if (code == CILK_SIMD || code == CILK_FOR)
12912 break;
12913 /* FALLTHRU. */
12914 default:
12915 /* Can't be cond = error_mark_node, because we want to preserve
12916 the location until c_finish_omp_for. */
12917 cond = build1 (NOP_EXPR, boolean_type_node, error_mark_node);
12918 break;
12920 protected_set_expr_location (cond, cond_loc);
12922 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
12924 /* Parse the increment expression. */
12925 incr = NULL_TREE;
12926 if (c_parser_next_token_is_not (parser, CPP_CLOSE_PAREN))
12928 location_t incr_loc = c_parser_peek_token (parser)->location;
12930 incr = c_process_expr_stmt (incr_loc,
12931 c_parser_expression (parser).value);
12933 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
12935 if (decl == NULL || decl == error_mark_node || init == error_mark_node)
12936 fail = true;
12937 else
12939 TREE_VEC_ELT (declv, i) = decl;
12940 TREE_VEC_ELT (initv, i) = init;
12941 TREE_VEC_ELT (condv, i) = cond;
12942 TREE_VEC_ELT (incrv, i) = incr;
12945 parse_next:
12946 if (i == collapse - 1)
12947 break;
12949 /* FIXME: OpenMP 3.0 draft isn't very clear on what exactly is allowed
12950 in between the collapsed for loops to be still considered perfectly
12951 nested. Hopefully the final version clarifies this.
12952 For now handle (multiple) {'s and empty statements. */
12955 if (c_parser_next_token_is_keyword (parser, RID_FOR))
12957 c_parser_consume_token (parser);
12958 break;
12960 else if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
12962 c_parser_consume_token (parser);
12963 bracecount++;
12965 else if (bracecount
12966 && c_parser_next_token_is (parser, CPP_SEMICOLON))
12967 c_parser_consume_token (parser);
12968 else
12970 c_parser_error (parser, "not enough perfectly nested loops");
12971 if (bracecount)
12973 open_brace_parsed = true;
12974 bracecount--;
12976 fail = true;
12977 collapse = 0;
12978 break;
12981 while (1);
12983 nbraces += bracecount;
12986 save_break = c_break_label;
12987 if (code == CILK_SIMD)
12988 c_break_label = build_int_cst (size_type_node, 2);
12989 else
12990 c_break_label = size_one_node;
12991 save_cont = c_cont_label;
12992 c_cont_label = NULL_TREE;
12993 body = push_stmt_list ();
12995 if (open_brace_parsed)
12997 location_t here = c_parser_peek_token (parser)->location;
12998 stmt = c_begin_compound_stmt (true);
12999 c_parser_compound_statement_nostart (parser);
13000 add_stmt (c_end_compound_stmt (here, stmt, true));
13002 else
13003 add_stmt (c_parser_c99_block_statement (parser));
13004 if (c_cont_label)
13006 tree t = build1 (LABEL_EXPR, void_type_node, c_cont_label);
13007 SET_EXPR_LOCATION (t, loc);
13008 add_stmt (t);
13011 body = pop_stmt_list (body);
13012 c_break_label = save_break;
13013 c_cont_label = save_cont;
13015 while (nbraces)
13017 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
13019 c_parser_consume_token (parser);
13020 nbraces--;
13022 else if (c_parser_next_token_is (parser, CPP_SEMICOLON))
13023 c_parser_consume_token (parser);
13024 else
13026 c_parser_error (parser, "collapsed loops not perfectly nested");
13027 while (nbraces)
13029 location_t here = c_parser_peek_token (parser)->location;
13030 stmt = c_begin_compound_stmt (true);
13031 add_stmt (body);
13032 c_parser_compound_statement_nostart (parser);
13033 body = c_end_compound_stmt (here, stmt, true);
13034 nbraces--;
13036 goto pop_scopes;
13040 /* Only bother calling c_finish_omp_for if we haven't already generated
13041 an error from the initialization parsing. */
13042 if (!fail)
13044 stmt = c_finish_omp_for (loc, code, declv, initv, condv,
13045 incrv, body, NULL);
13046 if (stmt)
13048 if (cclauses != NULL
13049 && cclauses[C_OMP_CLAUSE_SPLIT_PARALLEL] != NULL)
13051 tree *c;
13052 for (c = &cclauses[C_OMP_CLAUSE_SPLIT_PARALLEL]; *c ; )
13053 if (OMP_CLAUSE_CODE (*c) != OMP_CLAUSE_FIRSTPRIVATE
13054 && OMP_CLAUSE_CODE (*c) != OMP_CLAUSE_LASTPRIVATE)
13055 c = &OMP_CLAUSE_CHAIN (*c);
13056 else
13058 for (i = 0; i < collapse; i++)
13059 if (TREE_VEC_ELT (declv, i) == OMP_CLAUSE_DECL (*c))
13060 break;
13061 if (i == collapse)
13062 c = &OMP_CLAUSE_CHAIN (*c);
13063 else if (OMP_CLAUSE_CODE (*c) == OMP_CLAUSE_FIRSTPRIVATE)
13065 error_at (loc,
13066 "iteration variable %qD should not be firstprivate",
13067 OMP_CLAUSE_DECL (*c));
13068 *c = OMP_CLAUSE_CHAIN (*c);
13070 else
13072 /* Copy lastprivate (decl) clause to OMP_FOR_CLAUSES,
13073 change it to shared (decl) in
13074 OMP_PARALLEL_CLAUSES. */
13075 tree l = build_omp_clause (OMP_CLAUSE_LOCATION (*c),
13076 OMP_CLAUSE_LASTPRIVATE);
13077 OMP_CLAUSE_DECL (l) = OMP_CLAUSE_DECL (*c);
13078 if (code == OMP_SIMD)
13080 OMP_CLAUSE_CHAIN (l)
13081 = cclauses[C_OMP_CLAUSE_SPLIT_FOR];
13082 cclauses[C_OMP_CLAUSE_SPLIT_FOR] = l;
13084 else
13086 OMP_CLAUSE_CHAIN (l) = clauses;
13087 clauses = l;
13089 OMP_CLAUSE_SET_CODE (*c, OMP_CLAUSE_SHARED);
13093 OMP_FOR_CLAUSES (stmt) = clauses;
13095 ret = stmt;
13097 pop_scopes:
13098 while (!for_block->is_empty ())
13100 /* FIXME diagnostics: LOC below should be the actual location of
13101 this particular for block. We need to build a list of
13102 locations to go along with FOR_BLOCK. */
13103 stmt = c_end_compound_stmt (loc, for_block->pop (), true);
13104 add_stmt (stmt);
13106 release_tree_vector (for_block);
13107 return ret;
13110 /* Helper function for OpenMP parsing, split clauses and call
13111 finish_omp_clauses on each of the set of clauses afterwards. */
13113 static void
13114 omp_split_clauses (location_t loc, enum tree_code code,
13115 omp_clause_mask mask, tree clauses, tree *cclauses)
13117 int i;
13118 c_omp_split_clauses (loc, code, mask, clauses, cclauses);
13119 for (i = 0; i < C_OMP_CLAUSE_SPLIT_COUNT; i++)
13120 if (cclauses[i])
13121 cclauses[i] = c_finish_omp_clauses (cclauses[i]);
13124 /* OpenMP 4.0:
13125 #pragma omp simd simd-clause[optseq] new-line
13126 for-loop
13128 LOC is the location of the #pragma token.
13131 #define OMP_SIMD_CLAUSE_MASK \
13132 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_SAFELEN) \
13133 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_LINEAR) \
13134 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_ALIGNED) \
13135 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRIVATE) \
13136 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_LASTPRIVATE) \
13137 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_REDUCTION) \
13138 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_COLLAPSE))
13140 static tree
13141 c_parser_omp_simd (location_t loc, c_parser *parser,
13142 char *p_name, omp_clause_mask mask, tree *cclauses)
13144 tree block, clauses, ret;
13146 strcat (p_name, " simd");
13147 mask |= OMP_SIMD_CLAUSE_MASK;
13148 mask &= ~(OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_ORDERED);
13150 clauses = c_parser_omp_all_clauses (parser, mask, p_name, cclauses == NULL);
13151 if (cclauses)
13153 omp_split_clauses (loc, OMP_SIMD, mask, clauses, cclauses);
13154 clauses = cclauses[C_OMP_CLAUSE_SPLIT_SIMD];
13157 block = c_begin_compound_stmt (true);
13158 ret = c_parser_omp_for_loop (loc, parser, OMP_SIMD, clauses, cclauses);
13159 block = c_end_compound_stmt (loc, block, true);
13160 add_stmt (block);
13162 return ret;
13165 /* OpenMP 2.5:
13166 #pragma omp for for-clause[optseq] new-line
13167 for-loop
13169 OpenMP 4.0:
13170 #pragma omp for simd for-simd-clause[optseq] new-line
13171 for-loop
13173 LOC is the location of the #pragma token.
13176 #define OMP_FOR_CLAUSE_MASK \
13177 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRIVATE) \
13178 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE) \
13179 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_LASTPRIVATE) \
13180 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_REDUCTION) \
13181 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_ORDERED) \
13182 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_SCHEDULE) \
13183 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_COLLAPSE) \
13184 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOWAIT))
13186 static tree
13187 c_parser_omp_for (location_t loc, c_parser *parser,
13188 char *p_name, omp_clause_mask mask, tree *cclauses)
13190 tree block, clauses, ret;
13192 strcat (p_name, " for");
13193 mask |= OMP_FOR_CLAUSE_MASK;
13194 if (cclauses)
13195 mask &= ~(OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOWAIT);
13197 if (c_parser_next_token_is (parser, CPP_NAME))
13199 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
13201 if (strcmp (p, "simd") == 0)
13203 tree cclauses_buf[C_OMP_CLAUSE_SPLIT_COUNT];
13204 if (cclauses == NULL)
13205 cclauses = cclauses_buf;
13207 c_parser_consume_token (parser);
13208 if (!flag_openmp) /* flag_openmp_simd */
13209 return c_parser_omp_simd (loc, parser, p_name, mask, cclauses);
13210 block = c_begin_compound_stmt (true);
13211 ret = c_parser_omp_simd (loc, parser, p_name, mask, cclauses);
13212 block = c_end_compound_stmt (loc, block, true);
13213 if (ret == NULL_TREE)
13214 return ret;
13215 ret = make_node (OMP_FOR);
13216 TREE_TYPE (ret) = void_type_node;
13217 OMP_FOR_BODY (ret) = block;
13218 OMP_FOR_CLAUSES (ret) = cclauses[C_OMP_CLAUSE_SPLIT_FOR];
13219 SET_EXPR_LOCATION (ret, loc);
13220 add_stmt (ret);
13221 return ret;
13224 if (!flag_openmp) /* flag_openmp_simd */
13226 c_parser_skip_to_pragma_eol (parser);
13227 return NULL_TREE;
13230 clauses = c_parser_omp_all_clauses (parser, mask, p_name, cclauses == NULL);
13231 if (cclauses)
13233 omp_split_clauses (loc, OMP_FOR, mask, clauses, cclauses);
13234 clauses = cclauses[C_OMP_CLAUSE_SPLIT_FOR];
13237 block = c_begin_compound_stmt (true);
13238 ret = c_parser_omp_for_loop (loc, parser, OMP_FOR, clauses, cclauses);
13239 block = c_end_compound_stmt (loc, block, true);
13240 add_stmt (block);
13242 return ret;
13245 /* OpenMP 2.5:
13246 # pragma omp master new-line
13247 structured-block
13249 LOC is the location of the #pragma token.
13252 static tree
13253 c_parser_omp_master (location_t loc, c_parser *parser)
13255 c_parser_skip_to_pragma_eol (parser);
13256 return c_finish_omp_master (loc, c_parser_omp_structured_block (parser));
13259 /* OpenMP 2.5:
13260 # pragma omp ordered new-line
13261 structured-block
13263 LOC is the location of the #pragma itself.
13266 static tree
13267 c_parser_omp_ordered (location_t loc, c_parser *parser)
13269 c_parser_skip_to_pragma_eol (parser);
13270 return c_finish_omp_ordered (loc, c_parser_omp_structured_block (parser));
13273 /* OpenMP 2.5:
13275 section-scope:
13276 { section-sequence }
13278 section-sequence:
13279 section-directive[opt] structured-block
13280 section-sequence section-directive structured-block
13282 SECTIONS_LOC is the location of the #pragma omp sections. */
13284 static tree
13285 c_parser_omp_sections_scope (location_t sections_loc, c_parser *parser)
13287 tree stmt, substmt;
13288 bool error_suppress = false;
13289 location_t loc;
13291 loc = c_parser_peek_token (parser)->location;
13292 if (!c_parser_require (parser, CPP_OPEN_BRACE, "expected %<{%>"))
13294 /* Avoid skipping until the end of the block. */
13295 parser->error = false;
13296 return NULL_TREE;
13299 stmt = push_stmt_list ();
13301 if (c_parser_peek_token (parser)->pragma_kind != PRAGMA_OMP_SECTION)
13303 substmt = c_parser_omp_structured_block (parser);
13304 substmt = build1 (OMP_SECTION, void_type_node, substmt);
13305 SET_EXPR_LOCATION (substmt, loc);
13306 add_stmt (substmt);
13309 while (1)
13311 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
13312 break;
13313 if (c_parser_next_token_is (parser, CPP_EOF))
13314 break;
13316 loc = c_parser_peek_token (parser)->location;
13317 if (c_parser_peek_token (parser)->pragma_kind == PRAGMA_OMP_SECTION)
13319 c_parser_consume_pragma (parser);
13320 c_parser_skip_to_pragma_eol (parser);
13321 error_suppress = false;
13323 else if (!error_suppress)
13325 error_at (loc, "expected %<#pragma omp section%> or %<}%>");
13326 error_suppress = true;
13329 substmt = c_parser_omp_structured_block (parser);
13330 substmt = build1 (OMP_SECTION, void_type_node, substmt);
13331 SET_EXPR_LOCATION (substmt, loc);
13332 add_stmt (substmt);
13334 c_parser_skip_until_found (parser, CPP_CLOSE_BRACE,
13335 "expected %<#pragma omp section%> or %<}%>");
13337 substmt = pop_stmt_list (stmt);
13339 stmt = make_node (OMP_SECTIONS);
13340 SET_EXPR_LOCATION (stmt, sections_loc);
13341 TREE_TYPE (stmt) = void_type_node;
13342 OMP_SECTIONS_BODY (stmt) = substmt;
13344 return add_stmt (stmt);
13347 /* OpenMP 2.5:
13348 # pragma omp sections sections-clause[optseq] newline
13349 sections-scope
13351 LOC is the location of the #pragma token.
13354 #define OMP_SECTIONS_CLAUSE_MASK \
13355 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRIVATE) \
13356 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE) \
13357 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_LASTPRIVATE) \
13358 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_REDUCTION) \
13359 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOWAIT))
13361 static tree
13362 c_parser_omp_sections (location_t loc, c_parser *parser,
13363 char *p_name, omp_clause_mask mask, tree *cclauses)
13365 tree block, clauses, ret;
13367 strcat (p_name, " sections");
13368 mask |= OMP_SECTIONS_CLAUSE_MASK;
13369 if (cclauses)
13370 mask &= ~(OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOWAIT);
13372 clauses = c_parser_omp_all_clauses (parser, mask, p_name, cclauses == NULL);
13373 if (cclauses)
13375 omp_split_clauses (loc, OMP_SECTIONS, mask, clauses, cclauses);
13376 clauses = cclauses[C_OMP_CLAUSE_SPLIT_SECTIONS];
13379 block = c_begin_compound_stmt (true);
13380 ret = c_parser_omp_sections_scope (loc, parser);
13381 if (ret)
13382 OMP_SECTIONS_CLAUSES (ret) = clauses;
13383 block = c_end_compound_stmt (loc, block, true);
13384 add_stmt (block);
13386 return ret;
13389 /* OpenMP 2.5:
13390 # pragma omp parallel parallel-clause[optseq] new-line
13391 structured-block
13392 # pragma omp parallel for parallel-for-clause[optseq] new-line
13393 structured-block
13394 # pragma omp parallel sections parallel-sections-clause[optseq] new-line
13395 structured-block
13397 OpenMP 4.0:
13398 # pragma omp parallel for simd parallel-for-simd-clause[optseq] new-line
13399 structured-block
13401 LOC is the location of the #pragma token.
13404 #define OMP_PARALLEL_CLAUSE_MASK \
13405 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IF) \
13406 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRIVATE) \
13407 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE) \
13408 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEFAULT) \
13409 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_SHARED) \
13410 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_COPYIN) \
13411 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_REDUCTION) \
13412 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NUM_THREADS) \
13413 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PROC_BIND))
13415 static tree
13416 c_parser_omp_parallel (location_t loc, c_parser *parser,
13417 char *p_name, omp_clause_mask mask, tree *cclauses)
13419 tree stmt, clauses, block;
13421 strcat (p_name, " parallel");
13422 mask |= OMP_PARALLEL_CLAUSE_MASK;
13424 if (c_parser_next_token_is_keyword (parser, RID_FOR))
13426 tree cclauses_buf[C_OMP_CLAUSE_SPLIT_COUNT];
13427 if (cclauses == NULL)
13428 cclauses = cclauses_buf;
13430 c_parser_consume_token (parser);
13431 if (!flag_openmp) /* flag_openmp_simd */
13432 return c_parser_omp_for (loc, parser, p_name, mask, cclauses);
13433 block = c_begin_omp_parallel ();
13434 tree ret = c_parser_omp_for (loc, parser, p_name, mask, cclauses);
13435 stmt
13436 = c_finish_omp_parallel (loc, cclauses[C_OMP_CLAUSE_SPLIT_PARALLEL],
13437 block);
13438 if (ret == NULL_TREE)
13439 return ret;
13440 OMP_PARALLEL_COMBINED (stmt) = 1;
13441 return stmt;
13443 else if (cclauses)
13445 error_at (loc, "expected %<for%> after %qs", p_name);
13446 c_parser_skip_to_pragma_eol (parser);
13447 return NULL_TREE;
13449 else if (!flag_openmp) /* flag_openmp_simd */
13451 c_parser_skip_to_pragma_eol (parser);
13452 return NULL_TREE;
13454 else if (c_parser_next_token_is (parser, CPP_NAME))
13456 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
13457 if (strcmp (p, "sections") == 0)
13459 tree cclauses_buf[C_OMP_CLAUSE_SPLIT_COUNT];
13460 if (cclauses == NULL)
13461 cclauses = cclauses_buf;
13463 c_parser_consume_token (parser);
13464 block = c_begin_omp_parallel ();
13465 c_parser_omp_sections (loc, parser, p_name, mask, cclauses);
13466 stmt = c_finish_omp_parallel (loc,
13467 cclauses[C_OMP_CLAUSE_SPLIT_PARALLEL],
13468 block);
13469 OMP_PARALLEL_COMBINED (stmt) = 1;
13470 return stmt;
13474 clauses = c_parser_omp_all_clauses (parser, mask, p_name, cclauses == NULL);
13476 block = c_begin_omp_parallel ();
13477 c_parser_statement (parser);
13478 stmt = c_finish_omp_parallel (loc, clauses, block);
13480 return stmt;
13483 /* OpenMP 2.5:
13484 # pragma omp single single-clause[optseq] new-line
13485 structured-block
13487 LOC is the location of the #pragma.
13490 #define OMP_SINGLE_CLAUSE_MASK \
13491 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRIVATE) \
13492 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE) \
13493 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_COPYPRIVATE) \
13494 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOWAIT))
13496 static tree
13497 c_parser_omp_single (location_t loc, c_parser *parser)
13499 tree stmt = make_node (OMP_SINGLE);
13500 SET_EXPR_LOCATION (stmt, loc);
13501 TREE_TYPE (stmt) = void_type_node;
13503 OMP_SINGLE_CLAUSES (stmt)
13504 = c_parser_omp_all_clauses (parser, OMP_SINGLE_CLAUSE_MASK,
13505 "#pragma omp single");
13506 OMP_SINGLE_BODY (stmt) = c_parser_omp_structured_block (parser);
13508 return add_stmt (stmt);
13511 /* OpenMP 3.0:
13512 # pragma omp task task-clause[optseq] new-line
13514 LOC is the location of the #pragma.
13517 #define OMP_TASK_CLAUSE_MASK \
13518 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IF) \
13519 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_UNTIED) \
13520 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEFAULT) \
13521 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRIVATE) \
13522 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE) \
13523 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_SHARED) \
13524 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FINAL) \
13525 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_MERGEABLE) \
13526 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEPEND))
13528 static tree
13529 c_parser_omp_task (location_t loc, c_parser *parser)
13531 tree clauses, block;
13533 clauses = c_parser_omp_all_clauses (parser, OMP_TASK_CLAUSE_MASK,
13534 "#pragma omp task");
13536 block = c_begin_omp_task ();
13537 c_parser_statement (parser);
13538 return c_finish_omp_task (loc, clauses, block);
13541 /* OpenMP 3.0:
13542 # pragma omp taskwait new-line
13545 static void
13546 c_parser_omp_taskwait (c_parser *parser)
13548 location_t loc = c_parser_peek_token (parser)->location;
13549 c_parser_consume_pragma (parser);
13550 c_parser_skip_to_pragma_eol (parser);
13552 c_finish_omp_taskwait (loc);
13555 /* OpenMP 3.1:
13556 # pragma omp taskyield new-line
13559 static void
13560 c_parser_omp_taskyield (c_parser *parser)
13562 location_t loc = c_parser_peek_token (parser)->location;
13563 c_parser_consume_pragma (parser);
13564 c_parser_skip_to_pragma_eol (parser);
13566 c_finish_omp_taskyield (loc);
13569 /* OpenMP 4.0:
13570 # pragma omp taskgroup new-line
13573 static tree
13574 c_parser_omp_taskgroup (c_parser *parser)
13576 location_t loc = c_parser_peek_token (parser)->location;
13577 c_parser_skip_to_pragma_eol (parser);
13578 return c_finish_omp_taskgroup (loc, c_parser_omp_structured_block (parser));
13581 /* OpenMP 4.0:
13582 # pragma omp cancel cancel-clause[optseq] new-line
13584 LOC is the location of the #pragma.
13587 #define OMP_CANCEL_CLAUSE_MASK \
13588 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PARALLEL) \
13589 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FOR) \
13590 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_SECTIONS) \
13591 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_TASKGROUP) \
13592 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IF))
13594 static void
13595 c_parser_omp_cancel (c_parser *parser)
13597 location_t loc = c_parser_peek_token (parser)->location;
13599 c_parser_consume_pragma (parser);
13600 tree clauses = c_parser_omp_all_clauses (parser, OMP_CANCEL_CLAUSE_MASK,
13601 "#pragma omp cancel");
13603 c_finish_omp_cancel (loc, clauses);
13606 /* OpenMP 4.0:
13607 # pragma omp cancellation point cancelpt-clause[optseq] new-line
13609 LOC is the location of the #pragma.
13612 #define OMP_CANCELLATION_POINT_CLAUSE_MASK \
13613 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PARALLEL) \
13614 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FOR) \
13615 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_SECTIONS) \
13616 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_TASKGROUP))
13618 static void
13619 c_parser_omp_cancellation_point (c_parser *parser)
13621 location_t loc = c_parser_peek_token (parser)->location;
13622 tree clauses;
13623 bool point_seen = false;
13625 c_parser_consume_pragma (parser);
13626 if (c_parser_next_token_is (parser, CPP_NAME))
13628 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
13629 if (strcmp (p, "point") == 0)
13631 c_parser_consume_token (parser);
13632 point_seen = true;
13635 if (!point_seen)
13637 c_parser_error (parser, "expected %<point%>");
13638 c_parser_skip_to_pragma_eol (parser);
13639 return;
13642 clauses
13643 = c_parser_omp_all_clauses (parser, OMP_CANCELLATION_POINT_CLAUSE_MASK,
13644 "#pragma omp cancellation point");
13646 c_finish_omp_cancellation_point (loc, clauses);
13649 /* OpenMP 4.0:
13650 #pragma omp distribute distribute-clause[optseq] new-line
13651 for-loop */
13653 #define OMP_DISTRIBUTE_CLAUSE_MASK \
13654 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRIVATE) \
13655 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE) \
13656 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DIST_SCHEDULE)\
13657 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_COLLAPSE))
13659 static tree
13660 c_parser_omp_distribute (location_t loc, c_parser *parser,
13661 char *p_name, omp_clause_mask mask, tree *cclauses)
13663 tree clauses, block, ret;
13665 strcat (p_name, " distribute");
13666 mask |= OMP_DISTRIBUTE_CLAUSE_MASK;
13668 if (c_parser_next_token_is (parser, CPP_NAME))
13670 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
13671 bool simd = false;
13672 bool parallel = false;
13674 if (strcmp (p, "simd") == 0)
13675 simd = true;
13676 else
13677 parallel = strcmp (p, "parallel") == 0;
13678 if (parallel || simd)
13680 tree cclauses_buf[C_OMP_CLAUSE_SPLIT_COUNT];
13681 if (cclauses == NULL)
13682 cclauses = cclauses_buf;
13683 c_parser_consume_token (parser);
13684 if (!flag_openmp) /* flag_openmp_simd */
13686 if (simd)
13687 return c_parser_omp_simd (loc, parser, p_name, mask, cclauses);
13688 else
13689 return c_parser_omp_parallel (loc, parser, p_name, mask,
13690 cclauses);
13692 block = c_begin_compound_stmt (true);
13693 if (simd)
13694 ret = c_parser_omp_simd (loc, parser, p_name, mask, cclauses);
13695 else
13696 ret = c_parser_omp_parallel (loc, parser, p_name, mask, cclauses);
13697 block = c_end_compound_stmt (loc, block, true);
13698 if (ret == NULL)
13699 return ret;
13700 ret = make_node (OMP_DISTRIBUTE);
13701 TREE_TYPE (ret) = void_type_node;
13702 OMP_FOR_BODY (ret) = block;
13703 OMP_FOR_CLAUSES (ret) = cclauses[C_OMP_CLAUSE_SPLIT_DISTRIBUTE];
13704 SET_EXPR_LOCATION (ret, loc);
13705 add_stmt (ret);
13706 return ret;
13709 if (!flag_openmp) /* flag_openmp_simd */
13711 c_parser_skip_to_pragma_eol (parser);
13712 return NULL_TREE;
13715 clauses = c_parser_omp_all_clauses (parser, mask, p_name, cclauses == NULL);
13716 if (cclauses)
13718 omp_split_clauses (loc, OMP_DISTRIBUTE, mask, clauses, cclauses);
13719 clauses = cclauses[C_OMP_CLAUSE_SPLIT_DISTRIBUTE];
13722 block = c_begin_compound_stmt (true);
13723 ret = c_parser_omp_for_loop (loc, parser, OMP_DISTRIBUTE, clauses, NULL);
13724 block = c_end_compound_stmt (loc, block, true);
13725 add_stmt (block);
13727 return ret;
13730 /* OpenMP 4.0:
13731 # pragma omp teams teams-clause[optseq] new-line
13732 structured-block */
13734 #define OMP_TEAMS_CLAUSE_MASK \
13735 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRIVATE) \
13736 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE) \
13737 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_SHARED) \
13738 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_REDUCTION) \
13739 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NUM_TEAMS) \
13740 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_THREAD_LIMIT) \
13741 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEFAULT))
13743 static tree
13744 c_parser_omp_teams (location_t loc, c_parser *parser,
13745 char *p_name, omp_clause_mask mask, tree *cclauses)
13747 tree clauses, block, ret;
13749 strcat (p_name, " teams");
13750 mask |= OMP_TEAMS_CLAUSE_MASK;
13752 if (c_parser_next_token_is (parser, CPP_NAME))
13754 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
13755 if (strcmp (p, "distribute") == 0)
13757 tree cclauses_buf[C_OMP_CLAUSE_SPLIT_COUNT];
13758 if (cclauses == NULL)
13759 cclauses = cclauses_buf;
13761 c_parser_consume_token (parser);
13762 if (!flag_openmp) /* flag_openmp_simd */
13763 return c_parser_omp_distribute (loc, parser, p_name, mask, cclauses);
13764 block = c_begin_compound_stmt (true);
13765 ret = c_parser_omp_distribute (loc, parser, p_name, mask, cclauses);
13766 block = c_end_compound_stmt (loc, block, true);
13767 if (ret == NULL)
13768 return ret;
13769 clauses = cclauses[C_OMP_CLAUSE_SPLIT_TEAMS];
13770 ret = make_node (OMP_TEAMS);
13771 TREE_TYPE (ret) = void_type_node;
13772 OMP_TEAMS_CLAUSES (ret) = clauses;
13773 OMP_TEAMS_BODY (ret) = block;
13774 return add_stmt (ret);
13777 if (!flag_openmp) /* flag_openmp_simd */
13779 c_parser_skip_to_pragma_eol (parser);
13780 return NULL_TREE;
13783 clauses = c_parser_omp_all_clauses (parser, mask, p_name, cclauses == NULL);
13784 if (cclauses)
13786 omp_split_clauses (loc, OMP_TEAMS, mask, clauses, cclauses);
13787 clauses = cclauses[C_OMP_CLAUSE_SPLIT_TEAMS];
13790 tree stmt = make_node (OMP_TEAMS);
13791 TREE_TYPE (stmt) = void_type_node;
13792 OMP_TEAMS_CLAUSES (stmt) = clauses;
13793 OMP_TEAMS_BODY (stmt) = c_parser_omp_structured_block (parser);
13795 return add_stmt (stmt);
13798 /* OpenMP 4.0:
13799 # pragma omp target data target-data-clause[optseq] new-line
13800 structured-block */
13802 #define OMP_TARGET_DATA_CLAUSE_MASK \
13803 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEVICE) \
13804 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_MAP) \
13805 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IF))
13807 static tree
13808 c_parser_omp_target_data (location_t loc, c_parser *parser)
13810 tree stmt = make_node (OMP_TARGET_DATA);
13811 TREE_TYPE (stmt) = void_type_node;
13813 OMP_TARGET_DATA_CLAUSES (stmt)
13814 = c_parser_omp_all_clauses (parser, OMP_TARGET_DATA_CLAUSE_MASK,
13815 "#pragma omp target data");
13816 keep_next_level ();
13817 tree block = c_begin_compound_stmt (true);
13818 add_stmt (c_parser_omp_structured_block (parser));
13819 OMP_TARGET_DATA_BODY (stmt) = c_end_compound_stmt (loc, block, true);
13821 SET_EXPR_LOCATION (stmt, loc);
13822 return add_stmt (stmt);
13825 /* OpenMP 4.0:
13826 # pragma omp target update target-update-clause[optseq] new-line */
13828 #define OMP_TARGET_UPDATE_CLAUSE_MASK \
13829 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FROM) \
13830 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_TO) \
13831 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEVICE) \
13832 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IF))
13834 static bool
13835 c_parser_omp_target_update (location_t loc, c_parser *parser,
13836 enum pragma_context context)
13838 if (context == pragma_stmt)
13840 error_at (loc,
13841 "%<#pragma omp target update%> may only be "
13842 "used in compound statements");
13843 c_parser_skip_to_pragma_eol (parser);
13844 return false;
13847 tree clauses
13848 = c_parser_omp_all_clauses (parser, OMP_TARGET_UPDATE_CLAUSE_MASK,
13849 "#pragma omp target update");
13850 if (find_omp_clause (clauses, OMP_CLAUSE_TO) == NULL_TREE
13851 && find_omp_clause (clauses, OMP_CLAUSE_FROM) == NULL_TREE)
13853 error_at (loc,
13854 "%<#pragma omp target update must contain at least one "
13855 "%<from%> or %<to%> clauses");
13856 return false;
13859 tree stmt = make_node (OMP_TARGET_UPDATE);
13860 TREE_TYPE (stmt) = void_type_node;
13861 OMP_TARGET_UPDATE_CLAUSES (stmt) = clauses;
13862 SET_EXPR_LOCATION (stmt, loc);
13863 add_stmt (stmt);
13864 return false;
13867 /* OpenMP 4.0:
13868 # pragma omp target target-clause[optseq] new-line
13869 structured-block */
13871 #define OMP_TARGET_CLAUSE_MASK \
13872 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEVICE) \
13873 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_MAP) \
13874 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IF))
13876 static bool
13877 c_parser_omp_target (c_parser *parser, enum pragma_context context)
13879 location_t loc = c_parser_peek_token (parser)->location;
13880 c_parser_consume_pragma (parser);
13882 if (context != pragma_stmt && context != pragma_compound)
13884 c_parser_error (parser, "expected declaration specifiers");
13885 c_parser_skip_to_pragma_eol (parser);
13886 return false;
13889 if (c_parser_next_token_is (parser, CPP_NAME))
13891 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
13893 if (strcmp (p, "teams") == 0)
13895 tree cclauses[C_OMP_CLAUSE_SPLIT_COUNT];
13896 char p_name[sizeof ("#pragma omp target teams distribute "
13897 "parallel for simd")];
13899 c_parser_consume_token (parser);
13900 strcpy (p_name, "#pragma omp target");
13901 if (!flag_openmp) /* flag_openmp_simd */
13903 tree stmt = c_parser_omp_teams (loc, parser, p_name,
13904 OMP_TARGET_CLAUSE_MASK,
13905 cclauses);
13906 return stmt != NULL_TREE;
13908 keep_next_level ();
13909 tree block = c_begin_compound_stmt (true);
13910 tree ret = c_parser_omp_teams (loc, parser, p_name,
13911 OMP_TARGET_CLAUSE_MASK, cclauses);
13912 block = c_end_compound_stmt (loc, block, true);
13913 if (ret == NULL_TREE)
13914 return false;
13915 tree stmt = make_node (OMP_TARGET);
13916 TREE_TYPE (stmt) = void_type_node;
13917 OMP_TARGET_CLAUSES (stmt) = cclauses[C_OMP_CLAUSE_SPLIT_TARGET];
13918 OMP_TARGET_BODY (stmt) = block;
13919 add_stmt (stmt);
13920 return true;
13922 else if (!flag_openmp) /* flag_openmp_simd */
13924 c_parser_skip_to_pragma_eol (parser);
13925 return false;
13927 else if (strcmp (p, "data") == 0)
13929 c_parser_consume_token (parser);
13930 c_parser_omp_target_data (loc, parser);
13931 return true;
13933 else if (strcmp (p, "update") == 0)
13935 c_parser_consume_token (parser);
13936 return c_parser_omp_target_update (loc, parser, context);
13940 tree stmt = make_node (OMP_TARGET);
13941 TREE_TYPE (stmt) = void_type_node;
13943 OMP_TARGET_CLAUSES (stmt)
13944 = c_parser_omp_all_clauses (parser, OMP_TARGET_CLAUSE_MASK,
13945 "#pragma omp target");
13946 keep_next_level ();
13947 tree block = c_begin_compound_stmt (true);
13948 add_stmt (c_parser_omp_structured_block (parser));
13949 OMP_TARGET_BODY (stmt) = c_end_compound_stmt (loc, block, true);
13951 SET_EXPR_LOCATION (stmt, loc);
13952 add_stmt (stmt);
13953 return true;
13956 /* OpenMP 4.0:
13957 # pragma omp declare simd declare-simd-clauses[optseq] new-line */
13959 #define OMP_DECLARE_SIMD_CLAUSE_MASK \
13960 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_SIMDLEN) \
13961 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_LINEAR) \
13962 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_ALIGNED) \
13963 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_UNIFORM) \
13964 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_INBRANCH) \
13965 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOTINBRANCH))
13967 static void
13968 c_parser_omp_declare_simd (c_parser *parser, enum pragma_context context)
13970 vec<c_token> clauses = vNULL;
13971 while (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL))
13973 c_token *token = c_parser_peek_token (parser);
13974 if (token->type == CPP_EOF)
13976 c_parser_skip_to_pragma_eol (parser);
13977 clauses.release ();
13978 return;
13980 clauses.safe_push (*token);
13981 c_parser_consume_token (parser);
13983 clauses.safe_push (*c_parser_peek_token (parser));
13984 c_parser_skip_to_pragma_eol (parser);
13986 while (c_parser_next_token_is (parser, CPP_PRAGMA))
13988 if (c_parser_peek_token (parser)->pragma_kind
13989 != PRAGMA_OMP_DECLARE_REDUCTION
13990 || c_parser_peek_2nd_token (parser)->type != CPP_NAME
13991 || strcmp (IDENTIFIER_POINTER
13992 (c_parser_peek_2nd_token (parser)->value),
13993 "simd") != 0)
13995 c_parser_error (parser,
13996 "%<#pragma omp declare simd%> must be followed by "
13997 "function declaration or definition or another "
13998 "%<#pragma omp declare simd%>");
13999 clauses.release ();
14000 return;
14002 c_parser_consume_pragma (parser);
14003 while (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL))
14005 c_token *token = c_parser_peek_token (parser);
14006 if (token->type == CPP_EOF)
14008 c_parser_skip_to_pragma_eol (parser);
14009 clauses.release ();
14010 return;
14012 clauses.safe_push (*token);
14013 c_parser_consume_token (parser);
14015 clauses.safe_push (*c_parser_peek_token (parser));
14016 c_parser_skip_to_pragma_eol (parser);
14019 /* Make sure nothing tries to read past the end of the tokens. */
14020 c_token eof_token;
14021 memset (&eof_token, 0, sizeof (eof_token));
14022 eof_token.type = CPP_EOF;
14023 clauses.safe_push (eof_token);
14024 clauses.safe_push (eof_token);
14026 switch (context)
14028 case pragma_external:
14029 if (c_parser_next_token_is (parser, CPP_KEYWORD)
14030 && c_parser_peek_token (parser)->keyword == RID_EXTENSION)
14032 int ext = disable_extension_diagnostics ();
14034 c_parser_consume_token (parser);
14035 while (c_parser_next_token_is (parser, CPP_KEYWORD)
14036 && c_parser_peek_token (parser)->keyword == RID_EXTENSION);
14037 c_parser_declaration_or_fndef (parser, true, true, true, false, true,
14038 NULL, clauses);
14039 restore_extension_diagnostics (ext);
14041 else
14042 c_parser_declaration_or_fndef (parser, true, true, true, false, true,
14043 NULL, clauses);
14044 break;
14045 case pragma_struct:
14046 case pragma_param:
14047 c_parser_error (parser, "%<#pragma omp declare simd%> must be followed by "
14048 "function declaration or definition");
14049 break;
14050 case pragma_compound:
14051 case pragma_stmt:
14052 if (c_parser_next_token_is (parser, CPP_KEYWORD)
14053 && c_parser_peek_token (parser)->keyword == RID_EXTENSION)
14055 int ext = disable_extension_diagnostics ();
14057 c_parser_consume_token (parser);
14058 while (c_parser_next_token_is (parser, CPP_KEYWORD)
14059 && c_parser_peek_token (parser)->keyword == RID_EXTENSION);
14060 if (c_parser_next_tokens_start_declaration (parser))
14062 c_parser_declaration_or_fndef (parser, true, true, true, true,
14063 true, NULL, clauses);
14064 restore_extension_diagnostics (ext);
14065 break;
14067 restore_extension_diagnostics (ext);
14069 else if (c_parser_next_tokens_start_declaration (parser))
14071 c_parser_declaration_or_fndef (parser, true, true, true, true, true,
14072 NULL, clauses);
14073 break;
14075 c_parser_error (parser, "%<#pragma omp declare simd%> must be followed by "
14076 "function declaration or definition");
14077 break;
14078 default:
14079 gcc_unreachable ();
14081 clauses.release ();
14084 /* Finalize #pragma omp declare simd clauses after FNDECL has been parsed,
14085 and put that into "omp declare simd" attribute. */
14087 static void
14088 c_finish_omp_declare_simd (c_parser *parser, tree fndecl, tree parms,
14089 vec<c_token> clauses)
14091 if (flag_cilkplus
14092 && clauses.exists () && !vec_safe_is_empty (parser->cilk_simd_fn_tokens))
14094 error ("%<#pragma omp declare simd%> cannot be used in the same "
14095 "function marked as a Cilk Plus SIMD-enabled function");
14096 vec_free (parser->cilk_simd_fn_tokens);
14097 return;
14100 /* Normally first token is CPP_NAME "simd". CPP_EOF there indicates
14101 error has been reported and CPP_PRAGMA that c_finish_omp_declare_simd
14102 has already processed the tokens. */
14103 if (clauses.exists () && clauses[0].type == CPP_EOF)
14104 return;
14105 if (fndecl == NULL_TREE || TREE_CODE (fndecl) != FUNCTION_DECL)
14107 error ("%<#pragma omp declare simd%> not immediately followed by "
14108 "a function declaration or definition");
14109 clauses[0].type = CPP_EOF;
14110 return;
14112 if (clauses.exists () && clauses[0].type != CPP_NAME)
14114 error_at (DECL_SOURCE_LOCATION (fndecl),
14115 "%<#pragma omp declare simd%> not immediately followed by "
14116 "a single function declaration or definition");
14117 clauses[0].type = CPP_EOF;
14118 return;
14121 if (parms == NULL_TREE)
14122 parms = DECL_ARGUMENTS (fndecl);
14124 unsigned int tokens_avail = parser->tokens_avail;
14125 gcc_assert (parser->tokens == &parser->tokens_buf[0]);
14126 bool is_cilkplus_cilk_simd_fn = false;
14128 if (flag_cilkplus && !vec_safe_is_empty (parser->cilk_simd_fn_tokens))
14130 parser->tokens = parser->cilk_simd_fn_tokens->address ();
14131 parser->tokens_avail = vec_safe_length (parser->cilk_simd_fn_tokens);
14132 is_cilkplus_cilk_simd_fn = true;
14134 else
14136 parser->tokens = clauses.address ();
14137 parser->tokens_avail = clauses.length ();
14140 /* c_parser_omp_declare_simd pushed 2 extra CPP_EOF tokens at the end. */
14141 while (parser->tokens_avail > 3)
14143 c_token *token = c_parser_peek_token (parser);
14144 if (!is_cilkplus_cilk_simd_fn)
14145 gcc_assert (token->type == CPP_NAME
14146 && strcmp (IDENTIFIER_POINTER (token->value), "simd") == 0);
14147 else
14148 gcc_assert (token->type == CPP_NAME
14149 && is_cilkplus_vector_p (token->value));
14150 c_parser_consume_token (parser);
14151 parser->in_pragma = true;
14153 tree c = NULL_TREE;
14154 if (is_cilkplus_cilk_simd_fn)
14155 c = c_parser_omp_all_clauses (parser, CILK_SIMD_FN_CLAUSE_MASK,
14156 "SIMD-enabled functions attribute");
14157 else
14158 c = c_parser_omp_all_clauses (parser, OMP_DECLARE_SIMD_CLAUSE_MASK,
14159 "#pragma omp declare simd");
14160 c = c_omp_declare_simd_clauses_to_numbers (parms, c);
14161 if (c != NULL_TREE)
14162 c = tree_cons (NULL_TREE, c, NULL_TREE);
14163 if (is_cilkplus_cilk_simd_fn)
14165 tree k = build_tree_list (get_identifier ("cilk simd function"),
14166 NULL_TREE);
14167 TREE_CHAIN (k) = DECL_ATTRIBUTES (fndecl);
14168 DECL_ATTRIBUTES (fndecl) = k;
14170 c = build_tree_list (get_identifier ("omp declare simd"), c);
14171 TREE_CHAIN (c) = DECL_ATTRIBUTES (fndecl);
14172 DECL_ATTRIBUTES (fndecl) = c;
14175 parser->tokens = &parser->tokens_buf[0];
14176 parser->tokens_avail = tokens_avail;
14177 if (clauses.exists ())
14178 clauses[0].type = CPP_PRAGMA;
14180 if (!vec_safe_is_empty (parser->cilk_simd_fn_tokens))
14181 vec_free (parser->cilk_simd_fn_tokens);
14185 /* OpenMP 4.0:
14186 # pragma omp declare target new-line
14187 declarations and definitions
14188 # pragma omp end declare target new-line */
14190 static void
14191 c_parser_omp_declare_target (c_parser *parser)
14193 c_parser_skip_to_pragma_eol (parser);
14194 current_omp_declare_target_attribute++;
14197 static void
14198 c_parser_omp_end_declare_target (c_parser *parser)
14200 location_t loc = c_parser_peek_token (parser)->location;
14201 c_parser_consume_pragma (parser);
14202 if (c_parser_next_token_is (parser, CPP_NAME)
14203 && strcmp (IDENTIFIER_POINTER (c_parser_peek_token (parser)->value),
14204 "declare") == 0)
14206 c_parser_consume_token (parser);
14207 if (c_parser_next_token_is (parser, CPP_NAME)
14208 && strcmp (IDENTIFIER_POINTER (c_parser_peek_token (parser)->value),
14209 "target") == 0)
14210 c_parser_consume_token (parser);
14211 else
14213 c_parser_error (parser, "expected %<target%>");
14214 c_parser_skip_to_pragma_eol (parser);
14215 return;
14218 else
14220 c_parser_error (parser, "expected %<declare%>");
14221 c_parser_skip_to_pragma_eol (parser);
14222 return;
14224 c_parser_skip_to_pragma_eol (parser);
14225 if (!current_omp_declare_target_attribute)
14226 error_at (loc, "%<#pragma omp end declare target%> without corresponding "
14227 "%<#pragma omp declare target%>");
14228 else
14229 current_omp_declare_target_attribute--;
14233 /* OpenMP 4.0
14234 #pragma omp declare reduction (reduction-id : typename-list : expression) \
14235 initializer-clause[opt] new-line
14237 initializer-clause:
14238 initializer (omp_priv = initializer)
14239 initializer (function-name (argument-list)) */
14241 static void
14242 c_parser_omp_declare_reduction (c_parser *parser, enum pragma_context context)
14244 unsigned int tokens_avail = 0, i;
14245 vec<tree> types = vNULL;
14246 vec<c_token> clauses = vNULL;
14247 enum tree_code reduc_code = ERROR_MARK;
14248 tree reduc_id = NULL_TREE;
14249 tree type;
14250 location_t rloc = c_parser_peek_token (parser)->location;
14252 if (context == pragma_struct || context == pragma_param)
14254 error ("%<#pragma omp declare reduction%> not at file or block scope");
14255 goto fail;
14258 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
14259 goto fail;
14261 switch (c_parser_peek_token (parser)->type)
14263 case CPP_PLUS:
14264 reduc_code = PLUS_EXPR;
14265 break;
14266 case CPP_MULT:
14267 reduc_code = MULT_EXPR;
14268 break;
14269 case CPP_MINUS:
14270 reduc_code = MINUS_EXPR;
14271 break;
14272 case CPP_AND:
14273 reduc_code = BIT_AND_EXPR;
14274 break;
14275 case CPP_XOR:
14276 reduc_code = BIT_XOR_EXPR;
14277 break;
14278 case CPP_OR:
14279 reduc_code = BIT_IOR_EXPR;
14280 break;
14281 case CPP_AND_AND:
14282 reduc_code = TRUTH_ANDIF_EXPR;
14283 break;
14284 case CPP_OR_OR:
14285 reduc_code = TRUTH_ORIF_EXPR;
14286 break;
14287 case CPP_NAME:
14288 const char *p;
14289 p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
14290 if (strcmp (p, "min") == 0)
14292 reduc_code = MIN_EXPR;
14293 break;
14295 if (strcmp (p, "max") == 0)
14297 reduc_code = MAX_EXPR;
14298 break;
14300 reduc_id = c_parser_peek_token (parser)->value;
14301 break;
14302 default:
14303 c_parser_error (parser,
14304 "expected %<+%>, %<*%>, %<-%>, %<&%>, "
14305 "%<^%>, %<|%>, %<&&%>, %<||%>, %<min%> or identifier");
14306 goto fail;
14309 tree orig_reduc_id, reduc_decl;
14310 orig_reduc_id = reduc_id;
14311 reduc_id = c_omp_reduction_id (reduc_code, reduc_id);
14312 reduc_decl = c_omp_reduction_decl (reduc_id);
14313 c_parser_consume_token (parser);
14315 if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
14316 goto fail;
14318 while (true)
14320 location_t loc = c_parser_peek_token (parser)->location;
14321 struct c_type_name *ctype = c_parser_type_name (parser);
14322 if (ctype != NULL)
14324 type = groktypename (ctype, NULL, NULL);
14325 if (type == error_mark_node)
14327 else if ((INTEGRAL_TYPE_P (type)
14328 || TREE_CODE (type) == REAL_TYPE
14329 || TREE_CODE (type) == COMPLEX_TYPE)
14330 && orig_reduc_id == NULL_TREE)
14331 error_at (loc, "predeclared arithmetic type in "
14332 "%<#pragma omp declare reduction%>");
14333 else if (TREE_CODE (type) == FUNCTION_TYPE
14334 || TREE_CODE (type) == ARRAY_TYPE)
14335 error_at (loc, "function or array type in "
14336 "%<#pragma omp declare reduction%>");
14337 else if (TYPE_QUALS_NO_ADDR_SPACE (type))
14338 error_at (loc, "const, volatile or restrict qualified type in "
14339 "%<#pragma omp declare reduction%>");
14340 else
14342 tree t;
14343 for (t = DECL_INITIAL (reduc_decl); t; t = TREE_CHAIN (t))
14344 if (comptypes (TREE_PURPOSE (t), type))
14346 error_at (loc, "redeclaration of %qs "
14347 "%<#pragma omp declare reduction%> for "
14348 "type %qT",
14349 IDENTIFIER_POINTER (reduc_id)
14350 + sizeof ("omp declare reduction ") - 1,
14351 type);
14352 location_t ploc
14353 = DECL_SOURCE_LOCATION (TREE_VEC_ELT (TREE_VALUE (t),
14354 0));
14355 error_at (ploc, "previous %<#pragma omp declare "
14356 "reduction%>");
14357 break;
14359 if (t == NULL_TREE)
14360 types.safe_push (type);
14362 if (c_parser_next_token_is (parser, CPP_COMMA))
14363 c_parser_consume_token (parser);
14364 else
14365 break;
14367 else
14368 break;
14371 if (!c_parser_require (parser, CPP_COLON, "expected %<:%>")
14372 || types.is_empty ())
14374 fail:
14375 clauses.release ();
14376 types.release ();
14377 while (true)
14379 c_token *token = c_parser_peek_token (parser);
14380 if (token->type == CPP_EOF || token->type == CPP_PRAGMA_EOL)
14381 break;
14382 c_parser_consume_token (parser);
14384 c_parser_skip_to_pragma_eol (parser);
14385 return;
14388 if (types.length () > 1)
14390 while (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL))
14392 c_token *token = c_parser_peek_token (parser);
14393 if (token->type == CPP_EOF)
14394 goto fail;
14395 clauses.safe_push (*token);
14396 c_parser_consume_token (parser);
14398 clauses.safe_push (*c_parser_peek_token (parser));
14399 c_parser_skip_to_pragma_eol (parser);
14401 /* Make sure nothing tries to read past the end of the tokens. */
14402 c_token eof_token;
14403 memset (&eof_token, 0, sizeof (eof_token));
14404 eof_token.type = CPP_EOF;
14405 clauses.safe_push (eof_token);
14406 clauses.safe_push (eof_token);
14409 int errs = errorcount;
14410 FOR_EACH_VEC_ELT (types, i, type)
14412 tokens_avail = parser->tokens_avail;
14413 gcc_assert (parser->tokens == &parser->tokens_buf[0]);
14414 if (!clauses.is_empty ())
14416 parser->tokens = clauses.address ();
14417 parser->tokens_avail = clauses.length ();
14418 parser->in_pragma = true;
14421 bool nested = current_function_decl != NULL_TREE;
14422 if (nested)
14423 c_push_function_context ();
14424 tree fndecl = build_decl (BUILTINS_LOCATION, FUNCTION_DECL,
14425 reduc_id, default_function_type);
14426 current_function_decl = fndecl;
14427 allocate_struct_function (fndecl, true);
14428 push_scope ();
14429 tree stmt = push_stmt_list ();
14430 /* Intentionally BUILTINS_LOCATION, so that -Wshadow doesn't
14431 warn about these. */
14432 tree omp_out = build_decl (BUILTINS_LOCATION, VAR_DECL,
14433 get_identifier ("omp_out"), type);
14434 DECL_ARTIFICIAL (omp_out) = 1;
14435 DECL_CONTEXT (omp_out) = fndecl;
14436 pushdecl (omp_out);
14437 tree omp_in = build_decl (BUILTINS_LOCATION, VAR_DECL,
14438 get_identifier ("omp_in"), type);
14439 DECL_ARTIFICIAL (omp_in) = 1;
14440 DECL_CONTEXT (omp_in) = fndecl;
14441 pushdecl (omp_in);
14442 struct c_expr combiner = c_parser_expression (parser);
14443 struct c_expr initializer;
14444 tree omp_priv = NULL_TREE, omp_orig = NULL_TREE;
14445 bool bad = false;
14446 initializer.value = error_mark_node;
14447 if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
14448 bad = true;
14449 else if (c_parser_next_token_is (parser, CPP_NAME)
14450 && strcmp (IDENTIFIER_POINTER
14451 (c_parser_peek_token (parser)->value),
14452 "initializer") == 0)
14454 c_parser_consume_token (parser);
14455 pop_scope ();
14456 push_scope ();
14457 omp_priv = build_decl (BUILTINS_LOCATION, VAR_DECL,
14458 get_identifier ("omp_priv"), type);
14459 DECL_ARTIFICIAL (omp_priv) = 1;
14460 DECL_INITIAL (omp_priv) = error_mark_node;
14461 DECL_CONTEXT (omp_priv) = fndecl;
14462 pushdecl (omp_priv);
14463 omp_orig = build_decl (BUILTINS_LOCATION, VAR_DECL,
14464 get_identifier ("omp_orig"), type);
14465 DECL_ARTIFICIAL (omp_orig) = 1;
14466 DECL_CONTEXT (omp_orig) = fndecl;
14467 pushdecl (omp_orig);
14468 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
14469 bad = true;
14470 else if (!c_parser_next_token_is (parser, CPP_NAME))
14472 c_parser_error (parser, "expected %<omp_priv%> or "
14473 "function-name");
14474 bad = true;
14476 else if (strcmp (IDENTIFIER_POINTER
14477 (c_parser_peek_token (parser)->value),
14478 "omp_priv") != 0)
14480 if (c_parser_peek_2nd_token (parser)->type != CPP_OPEN_PAREN
14481 || c_parser_peek_token (parser)->id_kind != C_ID_ID)
14483 c_parser_error (parser, "expected function-name %<(%>");
14484 bad = true;
14486 else
14487 initializer = c_parser_postfix_expression (parser);
14488 if (initializer.value
14489 && TREE_CODE (initializer.value) == CALL_EXPR)
14491 int j;
14492 tree c = initializer.value;
14493 for (j = 0; j < call_expr_nargs (c); j++)
14494 if (TREE_CODE (CALL_EXPR_ARG (c, j)) == ADDR_EXPR
14495 && TREE_OPERAND (CALL_EXPR_ARG (c, j), 0) == omp_priv)
14496 break;
14497 if (j == call_expr_nargs (c))
14498 error ("one of the initializer call arguments should be "
14499 "%<&omp_priv%>");
14502 else
14504 c_parser_consume_token (parser);
14505 if (!c_parser_require (parser, CPP_EQ, "expected %<=%>"))
14506 bad = true;
14507 else
14509 tree st = push_stmt_list ();
14510 start_init (omp_priv, NULL_TREE, 0);
14511 location_t loc = c_parser_peek_token (parser)->location;
14512 struct c_expr init = c_parser_initializer (parser);
14513 finish_init ();
14514 finish_decl (omp_priv, loc, init.value,
14515 init.original_type, NULL_TREE);
14516 pop_stmt_list (st);
14519 if (!bad
14520 && !c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
14521 bad = true;
14524 if (!bad)
14526 c_parser_skip_to_pragma_eol (parser);
14528 tree t = tree_cons (type, make_tree_vec (omp_priv ? 6 : 3),
14529 DECL_INITIAL (reduc_decl));
14530 DECL_INITIAL (reduc_decl) = t;
14531 DECL_SOURCE_LOCATION (omp_out) = rloc;
14532 TREE_VEC_ELT (TREE_VALUE (t), 0) = omp_out;
14533 TREE_VEC_ELT (TREE_VALUE (t), 1) = omp_in;
14534 TREE_VEC_ELT (TREE_VALUE (t), 2) = combiner.value;
14535 walk_tree (&combiner.value, c_check_omp_declare_reduction_r,
14536 &TREE_VEC_ELT (TREE_VALUE (t), 0), NULL);
14537 if (omp_priv)
14539 DECL_SOURCE_LOCATION (omp_priv) = rloc;
14540 TREE_VEC_ELT (TREE_VALUE (t), 3) = omp_priv;
14541 TREE_VEC_ELT (TREE_VALUE (t), 4) = omp_orig;
14542 TREE_VEC_ELT (TREE_VALUE (t), 5) = initializer.value;
14543 walk_tree (&initializer.value, c_check_omp_declare_reduction_r,
14544 &TREE_VEC_ELT (TREE_VALUE (t), 3), NULL);
14545 walk_tree (&DECL_INITIAL (omp_priv),
14546 c_check_omp_declare_reduction_r,
14547 &TREE_VEC_ELT (TREE_VALUE (t), 3), NULL);
14551 pop_stmt_list (stmt);
14552 pop_scope ();
14553 if (cfun->language != NULL)
14555 ggc_free (cfun->language);
14556 cfun->language = NULL;
14558 set_cfun (NULL);
14559 current_function_decl = NULL_TREE;
14560 if (nested)
14561 c_pop_function_context ();
14563 if (!clauses.is_empty ())
14565 parser->tokens = &parser->tokens_buf[0];
14566 parser->tokens_avail = tokens_avail;
14568 if (bad)
14569 goto fail;
14570 if (errs != errorcount)
14571 break;
14574 clauses.release ();
14575 types.release ();
14579 /* OpenMP 4.0
14580 #pragma omp declare simd declare-simd-clauses[optseq] new-line
14581 #pragma omp declare reduction (reduction-id : typename-list : expression) \
14582 initializer-clause[opt] new-line
14583 #pragma omp declare target new-line */
14585 static void
14586 c_parser_omp_declare (c_parser *parser, enum pragma_context context)
14588 c_parser_consume_pragma (parser);
14589 if (c_parser_next_token_is (parser, CPP_NAME))
14591 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
14592 if (strcmp (p, "simd") == 0)
14594 /* c_parser_consume_token (parser); done in
14595 c_parser_omp_declare_simd. */
14596 c_parser_omp_declare_simd (parser, context);
14597 return;
14599 if (strcmp (p, "reduction") == 0)
14601 c_parser_consume_token (parser);
14602 c_parser_omp_declare_reduction (parser, context);
14603 return;
14605 if (!flag_openmp) /* flag_openmp_simd */
14607 c_parser_skip_to_pragma_eol (parser);
14608 return;
14610 if (strcmp (p, "target") == 0)
14612 c_parser_consume_token (parser);
14613 c_parser_omp_declare_target (parser);
14614 return;
14618 c_parser_error (parser, "expected %<simd%> or %<reduction%> "
14619 "or %<target%>");
14620 c_parser_skip_to_pragma_eol (parser);
14623 /* Main entry point to parsing most OpenMP pragmas. */
14625 static void
14626 c_parser_omp_construct (c_parser *parser)
14628 enum pragma_kind p_kind;
14629 location_t loc;
14630 tree stmt;
14631 char p_name[sizeof "#pragma omp teams distribute parallel for simd"];
14632 omp_clause_mask mask (0);
14634 loc = c_parser_peek_token (parser)->location;
14635 p_kind = c_parser_peek_token (parser)->pragma_kind;
14636 c_parser_consume_pragma (parser);
14638 switch (p_kind)
14640 case PRAGMA_OACC_CACHE:
14641 strcpy (p_name, "#pragma acc");
14642 stmt = c_parser_oacc_cache (loc, parser);
14643 break;
14644 case PRAGMA_OACC_DATA:
14645 stmt = c_parser_oacc_data (loc, parser);
14646 break;
14647 case PRAGMA_OACC_KERNELS:
14648 strcpy (p_name, "#pragma acc");
14649 stmt = c_parser_oacc_kernels (loc, parser, p_name);
14650 break;
14651 case PRAGMA_OACC_LOOP:
14652 strcpy (p_name, "#pragma acc");
14653 stmt = c_parser_oacc_loop (loc, parser, p_name);
14654 break;
14655 case PRAGMA_OACC_PARALLEL:
14656 strcpy (p_name, "#pragma acc");
14657 stmt = c_parser_oacc_parallel (loc, parser, p_name);
14658 break;
14659 case PRAGMA_OACC_WAIT:
14660 strcpy (p_name, "#pragma wait");
14661 stmt = c_parser_oacc_wait (loc, parser, p_name);
14662 break;
14663 case PRAGMA_OMP_ATOMIC:
14664 c_parser_omp_atomic (loc, parser);
14665 return;
14666 case PRAGMA_OMP_CRITICAL:
14667 stmt = c_parser_omp_critical (loc, parser);
14668 break;
14669 case PRAGMA_OMP_DISTRIBUTE:
14670 strcpy (p_name, "#pragma omp");
14671 stmt = c_parser_omp_distribute (loc, parser, p_name, mask, NULL);
14672 break;
14673 case PRAGMA_OMP_FOR:
14674 strcpy (p_name, "#pragma omp");
14675 stmt = c_parser_omp_for (loc, parser, p_name, mask, NULL);
14676 break;
14677 case PRAGMA_OMP_MASTER:
14678 stmt = c_parser_omp_master (loc, parser);
14679 break;
14680 case PRAGMA_OMP_ORDERED:
14681 stmt = c_parser_omp_ordered (loc, parser);
14682 break;
14683 case PRAGMA_OMP_PARALLEL:
14684 strcpy (p_name, "#pragma omp");
14685 stmt = c_parser_omp_parallel (loc, parser, p_name, mask, NULL);
14686 break;
14687 case PRAGMA_OMP_SECTIONS:
14688 strcpy (p_name, "#pragma omp");
14689 stmt = c_parser_omp_sections (loc, parser, p_name, mask, NULL);
14690 break;
14691 case PRAGMA_OMP_SIMD:
14692 strcpy (p_name, "#pragma omp");
14693 stmt = c_parser_omp_simd (loc, parser, p_name, mask, NULL);
14694 break;
14695 case PRAGMA_OMP_SINGLE:
14696 stmt = c_parser_omp_single (loc, parser);
14697 break;
14698 case PRAGMA_OMP_TASK:
14699 stmt = c_parser_omp_task (loc, parser);
14700 break;
14701 case PRAGMA_OMP_TASKGROUP:
14702 stmt = c_parser_omp_taskgroup (parser);
14703 break;
14704 case PRAGMA_OMP_TEAMS:
14705 strcpy (p_name, "#pragma omp");
14706 stmt = c_parser_omp_teams (loc, parser, p_name, mask, NULL);
14707 break;
14708 default:
14709 gcc_unreachable ();
14712 if (stmt)
14713 gcc_assert (EXPR_LOCATION (stmt) != UNKNOWN_LOCATION);
14717 /* OpenMP 2.5:
14718 # pragma omp threadprivate (variable-list) */
14720 static void
14721 c_parser_omp_threadprivate (c_parser *parser)
14723 tree vars, t;
14724 location_t loc;
14726 c_parser_consume_pragma (parser);
14727 loc = c_parser_peek_token (parser)->location;
14728 vars = c_parser_omp_var_list_parens (parser, OMP_CLAUSE_ERROR, NULL);
14730 /* Mark every variable in VARS to be assigned thread local storage. */
14731 for (t = vars; t; t = TREE_CHAIN (t))
14733 tree v = TREE_PURPOSE (t);
14735 /* FIXME diagnostics: Ideally we should keep individual
14736 locations for all the variables in the var list to make the
14737 following errors more precise. Perhaps
14738 c_parser_omp_var_list_parens() should construct a list of
14739 locations to go along with the var list. */
14741 /* If V had already been marked threadprivate, it doesn't matter
14742 whether it had been used prior to this point. */
14743 if (TREE_CODE (v) != VAR_DECL)
14744 error_at (loc, "%qD is not a variable", v);
14745 else if (TREE_USED (v) && !C_DECL_THREADPRIVATE_P (v))
14746 error_at (loc, "%qE declared %<threadprivate%> after first use", v);
14747 else if (! TREE_STATIC (v) && ! DECL_EXTERNAL (v))
14748 error_at (loc, "automatic variable %qE cannot be %<threadprivate%>", v);
14749 else if (TREE_TYPE (v) == error_mark_node)
14751 else if (! COMPLETE_TYPE_P (TREE_TYPE (v)))
14752 error_at (loc, "%<threadprivate%> %qE has incomplete type", v);
14753 else
14755 if (! DECL_THREAD_LOCAL_P (v))
14757 set_decl_tls_model (v, decl_default_tls_model (v));
14758 /* If rtl has been already set for this var, call
14759 make_decl_rtl once again, so that encode_section_info
14760 has a chance to look at the new decl flags. */
14761 if (DECL_RTL_SET_P (v))
14762 make_decl_rtl (v);
14764 C_DECL_THREADPRIVATE_P (v) = 1;
14768 c_parser_skip_to_pragma_eol (parser);
14771 /* Cilk Plus <#pragma simd> parsing routines. */
14773 /* Helper function for c_parser_pragma. Perform some sanity checking
14774 for <#pragma simd> constructs. Returns FALSE if there was a
14775 problem. */
14777 static bool
14778 c_parser_cilk_verify_simd (c_parser *parser,
14779 enum pragma_context context)
14781 if (!flag_cilkplus)
14783 warning (0, "pragma simd ignored because -fcilkplus is not enabled");
14784 c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL);
14785 return false;
14787 if (context == pragma_external)
14789 c_parser_error (parser,"pragma simd must be inside a function");
14790 c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL);
14791 return false;
14793 return true;
14796 /* Cilk Plus:
14797 This function is shared by SIMD-enabled functions and #pragma simd.
14798 If IS_SIMD_FN is true then it is parsing a SIMD-enabled function and
14799 CLAUSES is unused. The main purpose of this function is to parse a
14800 vectorlength attribute or clause and check for parse errors.
14801 When IS_SIMD_FN is true then the function is merely caching the tokens
14802 in PARSER->CILK_SIMD_FN_TOKENS. If errors are found then the token
14803 cache is cleared since there is no reason to continue.
14804 Syntax:
14805 vectorlength ( constant-expression ) */
14807 static tree
14808 c_parser_cilk_clause_vectorlength (c_parser *parser, tree clauses,
14809 bool is_simd_fn)
14811 if (is_simd_fn)
14812 check_no_duplicate_clause (clauses, OMP_CLAUSE_SIMDLEN, "vectorlength");
14813 else
14814 /* The vectorlength clause behaves exactly like OpenMP's safelen
14815 clause. Represent it in OpenMP terms. */
14816 check_no_duplicate_clause (clauses, OMP_CLAUSE_SAFELEN, "vectorlength");
14818 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
14819 return clauses;
14821 location_t loc = c_parser_peek_token (parser)->location;
14822 tree expr = c_parser_expr_no_commas (parser, NULL).value;
14823 expr = c_fully_fold (expr, false, NULL);
14825 /* If expr is an error_mark_node then the above function would have
14826 emitted an error. No reason to do it twice. */
14827 if (expr == error_mark_node)
14829 else if (!TREE_TYPE (expr)
14830 || !TREE_CONSTANT (expr)
14831 || !INTEGRAL_TYPE_P (TREE_TYPE (expr)))
14833 error_at (loc, "vectorlength must be an integer constant");
14834 else if (wi::exact_log2 (expr) == -1)
14835 error_at (loc, "vectorlength must be a power of 2");
14836 else
14838 if (is_simd_fn)
14840 tree u = build_omp_clause (loc, OMP_CLAUSE_SIMDLEN);
14841 OMP_CLAUSE_SIMDLEN_EXPR (u) = expr;
14842 OMP_CLAUSE_CHAIN (u) = clauses;
14843 clauses = u;
14845 else
14847 tree u = build_omp_clause (loc, OMP_CLAUSE_SAFELEN);
14848 OMP_CLAUSE_SAFELEN_EXPR (u) = expr;
14849 OMP_CLAUSE_CHAIN (u) = clauses;
14850 clauses = u;
14854 c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>");
14856 return clauses;
14859 /* Cilk Plus:
14860 linear ( simd-linear-variable-list )
14862 simd-linear-variable-list:
14863 simd-linear-variable
14864 simd-linear-variable-list , simd-linear-variable
14866 simd-linear-variable:
14867 id-expression
14868 id-expression : simd-linear-step
14870 simd-linear-step:
14871 conditional-expression */
14873 static tree
14874 c_parser_cilk_clause_linear (c_parser *parser, tree clauses)
14876 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
14877 return clauses;
14879 location_t loc = c_parser_peek_token (parser)->location;
14881 if (c_parser_next_token_is_not (parser, CPP_NAME)
14882 || c_parser_peek_token (parser)->id_kind != C_ID_ID)
14883 c_parser_error (parser, "expected identifier");
14885 while (c_parser_next_token_is (parser, CPP_NAME)
14886 && c_parser_peek_token (parser)->id_kind == C_ID_ID)
14888 tree var = lookup_name (c_parser_peek_token (parser)->value);
14890 if (var == NULL)
14892 undeclared_variable (c_parser_peek_token (parser)->location,
14893 c_parser_peek_token (parser)->value);
14894 c_parser_consume_token (parser);
14896 else if (var == error_mark_node)
14897 c_parser_consume_token (parser);
14898 else
14900 tree step = integer_one_node;
14902 /* Parse the linear step if present. */
14903 if (c_parser_peek_2nd_token (parser)->type == CPP_COLON)
14905 c_parser_consume_token (parser);
14906 c_parser_consume_token (parser);
14908 tree expr = c_parser_expr_no_commas (parser, NULL).value;
14909 expr = c_fully_fold (expr, false, NULL);
14911 if (TREE_TYPE (expr)
14912 && INTEGRAL_TYPE_P (TREE_TYPE (expr))
14913 && (TREE_CONSTANT (expr)
14914 || DECL_P (expr)))
14915 step = expr;
14916 else
14917 c_parser_error (parser,
14918 "step size must be an integer constant "
14919 "expression or an integer variable");
14921 else
14922 c_parser_consume_token (parser);
14924 /* Use OMP_CLAUSE_LINEAR, which has the same semantics. */
14925 tree u = build_omp_clause (loc, OMP_CLAUSE_LINEAR);
14926 OMP_CLAUSE_DECL (u) = var;
14927 OMP_CLAUSE_LINEAR_STEP (u) = step;
14928 OMP_CLAUSE_CHAIN (u) = clauses;
14929 clauses = u;
14932 if (c_parser_next_token_is_not (parser, CPP_COMMA))
14933 break;
14935 c_parser_consume_token (parser);
14938 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
14940 return clauses;
14943 /* Returns the name of the next clause. If the clause is not
14944 recognized SIMD_OMP_CLAUSE_NONE is returned and the next token is
14945 not consumed. Otherwise, the appropriate pragma_simd_clause is
14946 returned and the token is consumed. */
14948 static pragma_omp_clause
14949 c_parser_cilk_clause_name (c_parser *parser)
14951 pragma_omp_clause result;
14952 c_token *token = c_parser_peek_token (parser);
14954 if (!token->value || token->type != CPP_NAME)
14955 return PRAGMA_CILK_CLAUSE_NONE;
14957 const char *p = IDENTIFIER_POINTER (token->value);
14959 if (!strcmp (p, "vectorlength"))
14960 result = PRAGMA_CILK_CLAUSE_VECTORLENGTH;
14961 else if (!strcmp (p, "linear"))
14962 result = PRAGMA_CILK_CLAUSE_LINEAR;
14963 else if (!strcmp (p, "private"))
14964 result = PRAGMA_CILK_CLAUSE_PRIVATE;
14965 else if (!strcmp (p, "firstprivate"))
14966 result = PRAGMA_CILK_CLAUSE_FIRSTPRIVATE;
14967 else if (!strcmp (p, "lastprivate"))
14968 result = PRAGMA_CILK_CLAUSE_LASTPRIVATE;
14969 else if (!strcmp (p, "reduction"))
14970 result = PRAGMA_CILK_CLAUSE_REDUCTION;
14971 else
14972 return PRAGMA_CILK_CLAUSE_NONE;
14974 c_parser_consume_token (parser);
14975 return result;
14978 /* Parse all #<pragma simd> clauses. Return the list of clauses
14979 found. */
14981 static tree
14982 c_parser_cilk_all_clauses (c_parser *parser)
14984 tree clauses = NULL;
14986 while (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL))
14988 pragma_omp_clause c_kind;
14990 c_kind = c_parser_cilk_clause_name (parser);
14992 switch (c_kind)
14994 case PRAGMA_CILK_CLAUSE_VECTORLENGTH:
14995 clauses = c_parser_cilk_clause_vectorlength (parser, clauses, false);
14996 break;
14997 case PRAGMA_CILK_CLAUSE_LINEAR:
14998 clauses = c_parser_cilk_clause_linear (parser, clauses);
14999 break;
15000 case PRAGMA_CILK_CLAUSE_PRIVATE:
15001 /* Use the OpenMP counterpart. */
15002 clauses = c_parser_omp_clause_private (parser, clauses);
15003 break;
15004 case PRAGMA_CILK_CLAUSE_FIRSTPRIVATE:
15005 /* Use the OpenMP counterpart. */
15006 clauses = c_parser_omp_clause_firstprivate (parser, clauses);
15007 break;
15008 case PRAGMA_CILK_CLAUSE_LASTPRIVATE:
15009 /* Use the OpenMP counterpart. */
15010 clauses = c_parser_omp_clause_lastprivate (parser, clauses);
15011 break;
15012 case PRAGMA_CILK_CLAUSE_REDUCTION:
15013 /* Use the OpenMP counterpart. */
15014 clauses = c_parser_omp_clause_reduction (parser, clauses);
15015 break;
15016 default:
15017 c_parser_error (parser, "expected %<#pragma simd%> clause");
15018 goto saw_error;
15022 saw_error:
15023 c_parser_skip_to_pragma_eol (parser);
15024 return c_finish_cilk_clauses (clauses);
15027 /* This function helps parse the grainsize pragma for a _Cilk_for statement.
15028 Here is the correct syntax of this pragma:
15029 #pragma cilk grainsize = <EXP>
15032 static void
15033 c_parser_cilk_grainsize (c_parser *parser)
15035 extern tree convert_to_integer (tree, tree);
15037 /* consume the 'grainsize' keyword. */
15038 c_parser_consume_pragma (parser);
15040 if (c_parser_require (parser, CPP_EQ, "expected %<=%>") != 0)
15042 struct c_expr g_expr = c_parser_binary_expression (parser, NULL, NULL);
15043 if (g_expr.value == error_mark_node)
15045 c_parser_skip_to_pragma_eol (parser);
15046 return;
15048 tree grain = convert_to_integer (long_integer_type_node,
15049 c_fully_fold (g_expr.value, false,
15050 NULL));
15051 c_parser_skip_to_pragma_eol (parser);
15052 c_token *token = c_parser_peek_token (parser);
15053 if (token && token->type == CPP_KEYWORD
15054 && token->keyword == RID_CILK_FOR)
15056 if (grain == NULL_TREE || grain == error_mark_node)
15057 grain = integer_zero_node;
15058 c_parser_cilk_for (parser, grain);
15060 else
15061 warning (0, "%<#pragma cilk grainsize%> is not followed by "
15062 "%<_Cilk_for%>");
15064 else
15065 c_parser_skip_to_pragma_eol (parser);
15068 /* Main entry point for parsing Cilk Plus <#pragma simd> for loops. */
15070 static void
15071 c_parser_cilk_simd (c_parser *parser)
15073 tree clauses = c_parser_cilk_all_clauses (parser);
15074 tree block = c_begin_compound_stmt (true);
15075 location_t loc = c_parser_peek_token (parser)->location;
15076 c_parser_omp_for_loop (loc, parser, CILK_SIMD, clauses, NULL);
15077 block = c_end_compound_stmt (loc, block, true);
15078 add_stmt (block);
15081 /* Create an artificial decl with TYPE and emit initialization of it with
15082 INIT. */
15084 static tree
15085 c_get_temp_regvar (tree type, tree init)
15087 location_t loc = EXPR_LOCATION (init);
15088 tree decl = build_decl (loc, VAR_DECL, NULL_TREE, type);
15089 DECL_ARTIFICIAL (decl) = 1;
15090 DECL_IGNORED_P (decl) = 1;
15091 pushdecl (decl);
15092 tree t = build2 (INIT_EXPR, type, decl, init);
15093 add_stmt (t);
15094 return decl;
15097 /* Main entry point for parsing Cilk Plus _Cilk_for loops.
15098 GRAIN is the grain value passed in through pragma or 0. */
15100 static void
15101 c_parser_cilk_for (c_parser *parser, tree grain)
15103 tree clauses = build_omp_clause (EXPR_LOCATION (grain), OMP_CLAUSE_SCHEDULE);
15104 OMP_CLAUSE_SCHEDULE_KIND (clauses) = OMP_CLAUSE_SCHEDULE_CILKFOR;
15105 OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clauses) = grain;
15106 clauses = c_finish_omp_clauses (clauses);
15108 tree block = c_begin_compound_stmt (true);
15109 tree sb = push_stmt_list ();
15110 location_t loc = c_parser_peek_token (parser)->location;
15111 tree omp_for = c_parser_omp_for_loop (loc, parser, CILK_FOR, clauses, NULL);
15112 sb = pop_stmt_list (sb);
15114 if (omp_for)
15116 tree omp_par = make_node (OMP_PARALLEL);
15117 TREE_TYPE (omp_par) = void_type_node;
15118 OMP_PARALLEL_CLAUSES (omp_par) = NULL_TREE;
15119 tree bind = build3 (BIND_EXPR, void_type_node, NULL, NULL, NULL);
15120 TREE_SIDE_EFFECTS (bind) = 1;
15121 BIND_EXPR_BODY (bind) = sb;
15122 OMP_PARALLEL_BODY (omp_par) = bind;
15123 if (OMP_FOR_PRE_BODY (omp_for))
15125 add_stmt (OMP_FOR_PRE_BODY (omp_for));
15126 OMP_FOR_PRE_BODY (omp_for) = NULL_TREE;
15128 tree init = TREE_VEC_ELT (OMP_FOR_INIT (omp_for), 0);
15129 tree decl = TREE_OPERAND (init, 0);
15130 tree cond = TREE_VEC_ELT (OMP_FOR_COND (omp_for), 0);
15131 tree incr = TREE_VEC_ELT (OMP_FOR_INCR (omp_for), 0);
15132 tree t = TREE_OPERAND (cond, 1), c, clauses = NULL_TREE;
15133 if (TREE_CODE (t) != INTEGER_CST)
15135 TREE_OPERAND (cond, 1) = c_get_temp_regvar (TREE_TYPE (t), t);
15136 c = build_omp_clause (input_location, OMP_CLAUSE_FIRSTPRIVATE);
15137 OMP_CLAUSE_DECL (c) = TREE_OPERAND (cond, 1);
15138 OMP_CLAUSE_CHAIN (c) = clauses;
15139 clauses = c;
15141 if (TREE_CODE (incr) == MODIFY_EXPR)
15143 t = TREE_OPERAND (TREE_OPERAND (incr, 1), 1);
15144 if (TREE_CODE (t) != INTEGER_CST)
15146 TREE_OPERAND (TREE_OPERAND (incr, 1), 1)
15147 = c_get_temp_regvar (TREE_TYPE (t), t);
15148 c = build_omp_clause (input_location, OMP_CLAUSE_FIRSTPRIVATE);
15149 OMP_CLAUSE_DECL (c) = TREE_OPERAND (TREE_OPERAND (incr, 1), 1);
15150 OMP_CLAUSE_CHAIN (c) = clauses;
15151 clauses = c;
15154 t = TREE_OPERAND (init, 1);
15155 if (TREE_CODE (t) != INTEGER_CST)
15157 TREE_OPERAND (init, 1) = c_get_temp_regvar (TREE_TYPE (t), t);
15158 c = build_omp_clause (input_location, OMP_CLAUSE_FIRSTPRIVATE);
15159 OMP_CLAUSE_DECL (c) = TREE_OPERAND (init, 1);
15160 OMP_CLAUSE_CHAIN (c) = clauses;
15161 clauses = c;
15163 c = build_omp_clause (input_location, OMP_CLAUSE_PRIVATE);
15164 OMP_CLAUSE_DECL (c) = decl;
15165 OMP_CLAUSE_CHAIN (c) = clauses;
15166 clauses = c;
15167 c = build_omp_clause (input_location, OMP_CLAUSE__CILK_FOR_COUNT_);
15168 OMP_CLAUSE_OPERAND (c, 0)
15169 = cilk_for_number_of_iterations (omp_for);
15170 OMP_CLAUSE_CHAIN (c) = clauses;
15171 OMP_PARALLEL_CLAUSES (omp_par) = c_finish_omp_clauses (c);
15172 add_stmt (omp_par);
15175 block = c_end_compound_stmt (loc, block, true);
15176 add_stmt (block);
15180 /* Parse a transaction attribute (GCC Extension).
15182 transaction-attribute:
15183 attributes
15184 [ [ any-word ] ]
15186 The transactional memory language description is written for C++,
15187 and uses the C++0x attribute syntax. For compatibility, allow the
15188 bracket style for transactions in C as well. */
15190 static tree
15191 c_parser_transaction_attributes (c_parser *parser)
15193 tree attr_name, attr = NULL;
15195 if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
15196 return c_parser_attributes (parser);
15198 if (!c_parser_next_token_is (parser, CPP_OPEN_SQUARE))
15199 return NULL_TREE;
15200 c_parser_consume_token (parser);
15201 if (!c_parser_require (parser, CPP_OPEN_SQUARE, "expected %<[%>"))
15202 goto error1;
15204 attr_name = c_parser_attribute_any_word (parser);
15205 if (attr_name)
15207 c_parser_consume_token (parser);
15208 attr = build_tree_list (attr_name, NULL_TREE);
15210 else
15211 c_parser_error (parser, "expected identifier");
15213 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, "expected %<]%>");
15214 error1:
15215 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, "expected %<]%>");
15216 return attr;
15219 /* Parse a __transaction_atomic or __transaction_relaxed statement
15220 (GCC Extension).
15222 transaction-statement:
15223 __transaction_atomic transaction-attribute[opt] compound-statement
15224 __transaction_relaxed compound-statement
15226 Note that the only valid attribute is: "outer".
15229 static tree
15230 c_parser_transaction (c_parser *parser, enum rid keyword)
15232 unsigned int old_in = parser->in_transaction;
15233 unsigned int this_in = 1, new_in;
15234 location_t loc = c_parser_peek_token (parser)->location;
15235 tree stmt, attrs;
15237 gcc_assert ((keyword == RID_TRANSACTION_ATOMIC
15238 || keyword == RID_TRANSACTION_RELAXED)
15239 && c_parser_next_token_is_keyword (parser, keyword));
15240 c_parser_consume_token (parser);
15242 if (keyword == RID_TRANSACTION_RELAXED)
15243 this_in |= TM_STMT_ATTR_RELAXED;
15244 else
15246 attrs = c_parser_transaction_attributes (parser);
15247 if (attrs)
15248 this_in |= parse_tm_stmt_attr (attrs, TM_STMT_ATTR_OUTER);
15251 /* Keep track if we're in the lexical scope of an outer transaction. */
15252 new_in = this_in | (old_in & TM_STMT_ATTR_OUTER);
15254 parser->in_transaction = new_in;
15255 stmt = c_parser_compound_statement (parser);
15256 parser->in_transaction = old_in;
15258 if (flag_tm)
15259 stmt = c_finish_transaction (loc, stmt, this_in);
15260 else
15261 error_at (loc, (keyword == RID_TRANSACTION_ATOMIC ?
15262 "%<__transaction_atomic%> without transactional memory support enabled"
15263 : "%<__transaction_relaxed %> "
15264 "without transactional memory support enabled"));
15266 return stmt;
15269 /* Parse a __transaction_atomic or __transaction_relaxed expression
15270 (GCC Extension).
15272 transaction-expression:
15273 __transaction_atomic ( expression )
15274 __transaction_relaxed ( expression )
15277 static struct c_expr
15278 c_parser_transaction_expression (c_parser *parser, enum rid keyword)
15280 struct c_expr ret;
15281 unsigned int old_in = parser->in_transaction;
15282 unsigned int this_in = 1;
15283 location_t loc = c_parser_peek_token (parser)->location;
15284 tree attrs;
15286 gcc_assert ((keyword == RID_TRANSACTION_ATOMIC
15287 || keyword == RID_TRANSACTION_RELAXED)
15288 && c_parser_next_token_is_keyword (parser, keyword));
15289 c_parser_consume_token (parser);
15291 if (keyword == RID_TRANSACTION_RELAXED)
15292 this_in |= TM_STMT_ATTR_RELAXED;
15293 else
15295 attrs = c_parser_transaction_attributes (parser);
15296 if (attrs)
15297 this_in |= parse_tm_stmt_attr (attrs, 0);
15300 parser->in_transaction = this_in;
15301 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
15303 tree expr = c_parser_expression (parser).value;
15304 ret.original_type = TREE_TYPE (expr);
15305 ret.value = build1 (TRANSACTION_EXPR, ret.original_type, expr);
15306 if (this_in & TM_STMT_ATTR_RELAXED)
15307 TRANSACTION_EXPR_RELAXED (ret.value) = 1;
15308 SET_EXPR_LOCATION (ret.value, loc);
15309 ret.original_code = TRANSACTION_EXPR;
15310 if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
15312 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
15313 goto error;
15316 else
15318 error:
15319 ret.value = error_mark_node;
15320 ret.original_code = ERROR_MARK;
15321 ret.original_type = NULL;
15323 parser->in_transaction = old_in;
15325 if (!flag_tm)
15326 error_at (loc, (keyword == RID_TRANSACTION_ATOMIC ?
15327 "%<__transaction_atomic%> without transactional memory support enabled"
15328 : "%<__transaction_relaxed %> "
15329 "without transactional memory support enabled"));
15331 return ret;
15334 /* Parse a __transaction_cancel statement (GCC Extension).
15336 transaction-cancel-statement:
15337 __transaction_cancel transaction-attribute[opt] ;
15339 Note that the only valid attribute is "outer".
15342 static tree
15343 c_parser_transaction_cancel (c_parser *parser)
15345 location_t loc = c_parser_peek_token (parser)->location;
15346 tree attrs;
15347 bool is_outer = false;
15349 gcc_assert (c_parser_next_token_is_keyword (parser, RID_TRANSACTION_CANCEL));
15350 c_parser_consume_token (parser);
15352 attrs = c_parser_transaction_attributes (parser);
15353 if (attrs)
15354 is_outer = (parse_tm_stmt_attr (attrs, TM_STMT_ATTR_OUTER) != 0);
15356 if (!flag_tm)
15358 error_at (loc, "%<__transaction_cancel%> without "
15359 "transactional memory support enabled");
15360 goto ret_error;
15362 else if (parser->in_transaction & TM_STMT_ATTR_RELAXED)
15364 error_at (loc, "%<__transaction_cancel%> within a "
15365 "%<__transaction_relaxed%>");
15366 goto ret_error;
15368 else if (is_outer)
15370 if ((parser->in_transaction & TM_STMT_ATTR_OUTER) == 0
15371 && !is_tm_may_cancel_outer (current_function_decl))
15373 error_at (loc, "outer %<__transaction_cancel%> not "
15374 "within outer %<__transaction_atomic%>");
15375 error_at (loc, " or a %<transaction_may_cancel_outer%> function");
15376 goto ret_error;
15379 else if (parser->in_transaction == 0)
15381 error_at (loc, "%<__transaction_cancel%> not within "
15382 "%<__transaction_atomic%>");
15383 goto ret_error;
15386 return add_stmt (build_tm_abort_call (loc, is_outer));
15388 ret_error:
15389 return build1 (NOP_EXPR, void_type_node, error_mark_node);
15392 /* Parse a single source file. */
15394 void
15395 c_parse_file (void)
15397 /* Use local storage to begin. If the first token is a pragma, parse it.
15398 If it is #pragma GCC pch_preprocess, then this will load a PCH file
15399 which will cause garbage collection. */
15400 c_parser tparser;
15402 memset (&tparser, 0, sizeof tparser);
15403 tparser.tokens = &tparser.tokens_buf[0];
15404 the_parser = &tparser;
15406 if (c_parser_peek_token (&tparser)->pragma_kind == PRAGMA_GCC_PCH_PREPROCESS)
15407 c_parser_pragma_pch_preprocess (&tparser);
15409 the_parser = ggc_alloc<c_parser> ();
15410 *the_parser = tparser;
15411 if (tparser.tokens == &tparser.tokens_buf[0])
15412 the_parser->tokens = &the_parser->tokens_buf[0];
15414 /* Initialize EH, if we've been told to do so. */
15415 if (flag_exceptions)
15416 using_eh_for_cleanups ();
15418 c_parser_translation_unit (the_parser);
15419 the_parser = NULL;
15422 /* This function parses Cilk Plus array notation. The starting index is
15423 passed in INITIAL_INDEX and the array name is passes in ARRAY_VALUE. The
15424 return value of this function is a tree_node called VALUE_TREE of type
15425 ARRAY_NOTATION_REF. */
15427 static tree
15428 c_parser_array_notation (location_t loc, c_parser *parser, tree initial_index,
15429 tree array_value)
15431 c_token *token = NULL;
15432 tree start_index = NULL_TREE, end_index = NULL_TREE, stride = NULL_TREE;
15433 tree value_tree = NULL_TREE, type = NULL_TREE, array_type = NULL_TREE;
15434 tree array_type_domain = NULL_TREE;
15436 if (array_value == error_mark_node || initial_index == error_mark_node)
15438 /* No need to continue. If either of these 2 were true, then an error
15439 must be emitted already. Thus, no need to emit them twice. */
15440 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, NULL);
15441 return error_mark_node;
15444 array_type = TREE_TYPE (array_value);
15445 gcc_assert (array_type);
15446 if (TREE_CODE (array_type) != ARRAY_TYPE
15447 && TREE_CODE (array_type) != POINTER_TYPE)
15449 error_at (loc, "base of array section must be pointer or array type");
15450 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, NULL);
15451 return error_mark_node;
15453 type = TREE_TYPE (array_type);
15454 token = c_parser_peek_token (parser);
15456 if (token->type == CPP_EOF)
15458 c_parser_error (parser, "expected %<:%> or numeral");
15459 return value_tree;
15461 else if (token->type == CPP_COLON)
15463 if (!initial_index)
15465 /* If we are here, then we have a case like this A[:]. */
15466 c_parser_consume_token (parser);
15467 if (TREE_CODE (array_type) == POINTER_TYPE)
15469 error_at (loc, "start-index and length fields necessary for "
15470 "using array notations in pointers");
15471 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, NULL);
15472 return error_mark_node;
15474 if (TREE_CODE (array_type) == FUNCTION_TYPE)
15476 error_at (loc, "array notations cannot be used with function "
15477 "type");
15478 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, NULL);
15479 return error_mark_node;
15481 array_type_domain = TYPE_DOMAIN (array_type);
15483 if (!array_type_domain)
15485 error_at (loc, "start-index and length fields necessary for "
15486 "using array notations in dimensionless arrays");
15487 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, NULL);
15488 return error_mark_node;
15491 start_index = TYPE_MINVAL (array_type_domain);
15492 start_index = fold_build1 (CONVERT_EXPR, ptrdiff_type_node,
15493 start_index);
15494 if (!TYPE_MAXVAL (array_type_domain)
15495 || !TREE_CONSTANT (TYPE_MAXVAL (array_type_domain)))
15497 error_at (loc, "start-index and length fields necessary for "
15498 "using array notations in variable-length arrays");
15499 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, NULL);
15500 return error_mark_node;
15502 end_index = TYPE_MAXVAL (array_type_domain);
15503 end_index = fold_build2 (PLUS_EXPR, TREE_TYPE (end_index),
15504 end_index, integer_one_node);
15505 end_index = fold_build1 (CONVERT_EXPR, ptrdiff_type_node, end_index);
15506 stride = build_int_cst (integer_type_node, 1);
15507 stride = fold_build1 (CONVERT_EXPR, ptrdiff_type_node, stride);
15509 else if (initial_index != error_mark_node)
15511 /* If we are here, then there should be 2 possibilities:
15512 1. Array [EXPR : EXPR]
15513 2. Array [EXPR : EXPR : EXPR]
15515 start_index = initial_index;
15517 if (TREE_CODE (array_type) == FUNCTION_TYPE)
15519 error_at (loc, "array notations cannot be used with function "
15520 "type");
15521 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, NULL);
15522 return error_mark_node;
15524 c_parser_consume_token (parser); /* consume the ':' */
15525 struct c_expr ce = c_parser_expression (parser);
15526 ce = convert_lvalue_to_rvalue (loc, ce, false, false);
15527 end_index = ce.value;
15528 if (!end_index || end_index == error_mark_node)
15530 c_parser_skip_to_end_of_block_or_statement (parser);
15531 return error_mark_node;
15533 if (c_parser_peek_token (parser)->type == CPP_COLON)
15535 c_parser_consume_token (parser);
15536 ce = c_parser_expression (parser);
15537 ce = convert_lvalue_to_rvalue (loc, ce, false, false);
15538 stride = ce.value;
15539 if (!stride || stride == error_mark_node)
15541 c_parser_skip_to_end_of_block_or_statement (parser);
15542 return error_mark_node;
15546 else
15547 c_parser_error (parser, "expected array notation expression");
15549 else
15550 c_parser_error (parser, "expected array notation expression");
15552 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, "expected %<]%>");
15554 value_tree = build_array_notation_ref (loc, array_value, start_index,
15555 end_index, stride, type);
15556 if (value_tree != error_mark_node)
15557 SET_EXPR_LOCATION (value_tree, loc);
15558 return value_tree;
15561 #include "gt-c-c-parser.h"