1 /* Parser for C and Objective-C. 2 Copyright (C) 1987-2017 Free Software Foundation, Inc. 3 4 Parser actions based on the old Bison parser; structure somewhat 5 influenced by and fragments based on the C++ parser. 6 7 This file is part of GCC. 8 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. 13 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. 18 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/>. */ 22 23 /* TODO: 24 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. 28 29 Add testcases covering every input symbol in every state in old and 30 new parsers. 31 32 Include full syntax for GNU C, including erroneous cases accepted 33 with error messages, in syntax productions in comments. 34 35 Make more diagnostics in the front end generally take an explicit 36 location rather than implicitly using input_location. */ 37 38 #include "config.h" 39 #include "system.h" 40 #include "coretypes.h" 41 #include "target.h" 42 #include "function.h" 43 #include "c-tree.h" 44 #include "timevar.h" 45 #include "stringpool.h" 46 #include "cgraph.h" 47 #include "attribs.h" 48 #include "stor-layout.h" 49 #include "varasm.h" 50 #include "trans-mem.h" 51 #include "c-family/c-pragma.h" 52 #include "c-lang.h" 53 #include "c-family/c-objc.h" 54 #include "plugin.h" 55 #include "omp-general.h" 56 #include "omp-offload.h" 57 #include "builtins.h" 58 #include "gomp-constants.h" 59 #include "c-family/c-indentation.h" 60 #include "gimple-expr.h" 61 #include "context.h" 62 #include "gcc-rich-location.h" 63 #include "c-parser.h" 64 #include "gimple-parser.h" 65 #include "read-rtl-function.h" 66 #include "run-rtl-passes.h" 67 #include "intl.h" 68 69 /* We need to walk over decls with incomplete struct/union/enum types 70 after parsing the whole translation unit. 71 In finish_decl(), if the decl is static, has incomplete 72 struct/union/enum type, it is appeneded to incomplete_record_decls. 73 In c_parser_translation_unit(), we iterate over incomplete_record_decls 74 and report error if any of the decls are still incomplete. */ 75 76 vec<tree> incomplete_record_decls; 77 78 void 79 set_c_expr_source_range (c_expr *expr, 80 location_t start, location_t finish) 81 { 82 expr->src_range.m_start = start; 83 expr->src_range.m_finish = finish; 84 if (expr->value) 85 set_source_range (expr->value, start, finish); 86 } 87 88 void 89 set_c_expr_source_range (c_expr *expr, 90 source_range src_range) 91 { 92 expr->src_range = src_range; 93 if (expr->value) 94 set_source_range (expr->value, src_range); 95 } 96 97 98 /* Initialization routine for this file. */ 99 100 void 101 c_parse_init (void) 102 { 103 /* The only initialization required is of the reserved word 104 identifiers. */ 105 unsigned int i; 106 tree id; 107 int mask = 0; 108 109 /* Make sure RID_MAX hasn't grown past the 8 bits used to hold the keyword in 110 the c_token structure. */ 111 gcc_assert (RID_MAX <= 255); 112 113 mask |= D_CXXONLY; 114 if (!flag_isoc99) 115 mask |= D_C99; 116 if (flag_no_asm) 117 { 118 mask |= D_ASM | D_EXT; 119 if (!flag_isoc99) 120 mask |= D_EXT89; 121 } 122 if (!c_dialect_objc ()) 123 mask |= D_OBJC | D_CXX_OBJC; 124 125 ridpointers = ggc_cleared_vec_alloc<tree> ((int) RID_MAX); 126 for (i = 0; i < num_c_common_reswords; i++) 127 { 128 /* If a keyword is disabled, do not enter it into the table 129 and so create a canonical spelling that isn't a keyword. */ 130 if (c_common_reswords[i].disable & mask) 131 { 132 if (warn_cxx_compat 133 && (c_common_reswords[i].disable & D_CXXWARN)) 134 { 135 id = get_identifier (c_common_reswords[i].word); 136 C_SET_RID_CODE (id, RID_CXX_COMPAT_WARN); 137 C_IS_RESERVED_WORD (id) = 1; 138 } 139 continue; 140 } 141 142 id = get_identifier (c_common_reswords[i].word); 143 C_SET_RID_CODE (id, c_common_reswords[i].rid); 144 C_IS_RESERVED_WORD (id) = 1; 145 ridpointers [(int) c_common_reswords[i].rid] = id; 146 } 147 148 for (i = 0; i < NUM_INT_N_ENTS; i++) 149 { 150 /* We always create the symbols but they aren't always supported. */ 151 char name[50]; 152 sprintf (name, "__int%d", int_n_data[i].bitsize); 153 id = get_identifier (name); 154 C_SET_RID_CODE (id, RID_FIRST_INT_N + i); 155 C_IS_RESERVED_WORD (id) = 1; 156 } 157 } 158 159 /* A parser structure recording information about the state and 160 context of parsing. Includes lexer information with up to two 161 tokens of look-ahead; more are not needed for C. */ 162 struct GTY(()) c_parser { 163 /* The look-ahead tokens. */ 164 c_token * GTY((skip)) tokens; 165 /* Buffer for look-ahead tokens. */ 166 c_token tokens_buf[4]; 167 /* How many look-ahead tokens are available (0 - 4, or 168 more if parsing from pre-lexed tokens). */ 169 unsigned int tokens_avail; 170 /* True if a syntax error is being recovered from; false otherwise. 171 c_parser_error sets this flag. It should clear this flag when 172 enough tokens have been consumed to recover from the error. */ 173 BOOL_BITFIELD error : 1; 174 /* True if we're processing a pragma, and shouldn't automatically 175 consume CPP_PRAGMA_EOL. */ 176 BOOL_BITFIELD in_pragma : 1; 177 /* True if we're parsing the outermost block of an if statement. */ 178 BOOL_BITFIELD in_if_block : 1; 179 /* True if we want to lex an untranslated string. */ 180 BOOL_BITFIELD lex_untranslated_string : 1; 181 182 /* Objective-C specific parser/lexer information. */ 183 184 /* True if we are in a context where the Objective-C "PQ" keywords 185 are considered keywords. */ 186 BOOL_BITFIELD objc_pq_context : 1; 187 /* True if we are parsing a (potential) Objective-C foreach 188 statement. This is set to true after we parsed 'for (' and while 189 we wait for 'in' or ';' to decide if it's a standard C for loop or an 190 Objective-C foreach loop. */ 191 BOOL_BITFIELD objc_could_be_foreach_context : 1; 192 /* The following flag is needed to contextualize Objective-C lexical 193 analysis. In some cases (e.g., 'int NSObject;'), it is 194 undesirable to bind an identifier to an Objective-C class, even 195 if a class with that name exists. */ 196 BOOL_BITFIELD objc_need_raw_identifier : 1; 197 /* Nonzero if we're processing a __transaction statement. The value 198 is 1 | TM_STMT_ATTR_*. */ 199 unsigned int in_transaction : 4; 200 /* True if we are in a context where the Objective-C "Property attribute" 201 keywords are valid. */ 202 BOOL_BITFIELD objc_property_attr_context : 1; 203 204 /* Cilk Plus specific parser/lexer information. */ 205 206 /* Buffer to hold all the tokens from parsing the vector attribute for the 207 SIMD-enabled functions (formerly known as elemental functions). */ 208 vec <c_token, va_gc> *cilk_simd_fn_tokens; 209 }; 210 211 /* Return a pointer to the Nth token in PARSERs tokens_buf. */ 212 213 c_token * 214 c_parser_tokens_buf (c_parser *parser, unsigned n) 215 { 216 return &parser->tokens_buf[n]; 217 } 218 219 /* Return the error state of PARSER. */ 220 221 bool 222 c_parser_error (c_parser *parser) 223 { 224 return parser->error; 225 } 226 227 /* Set the error state of PARSER to ERR. */ 228 229 void 230 c_parser_set_error (c_parser *parser, bool err) 231 { 232 parser->error = err; 233 } 234 235 236 /* The actual parser and external interface. ??? Does this need to be 237 garbage-collected? */ 238 239 static GTY (()) c_parser *the_parser; 240 241 /* Read in and lex a single token, storing it in *TOKEN. */ 242 243 static void 244 c_lex_one_token (c_parser *parser, c_token *token) 245 { 246 timevar_push (TV_LEX); 247 248 token->type = c_lex_with_flags (&token->value, &token->location, 249 &token->flags, 250 (parser->lex_untranslated_string 251 ? C_LEX_STRING_NO_TRANSLATE : 0)); 252 token->id_kind = C_ID_NONE; 253 token->keyword = RID_MAX; 254 token->pragma_kind = PRAGMA_NONE; 255 256 switch (token->type) 257 { 258 case CPP_NAME: 259 { 260 tree decl; 261 262 bool objc_force_identifier = parser->objc_need_raw_identifier; 263 if (c_dialect_objc ()) 264 parser->objc_need_raw_identifier = false; 265 266 if (C_IS_RESERVED_WORD (token->value)) 267 { 268 enum rid rid_code = C_RID_CODE (token->value); 269 270 if (rid_code == RID_CXX_COMPAT_WARN) 271 { 272 warning_at (token->location, 273 OPT_Wc___compat, 274 "identifier %qE conflicts with C++ keyword", 275 token->value); 276 } 277 else if (rid_code >= RID_FIRST_ADDR_SPACE 278 && rid_code <= RID_LAST_ADDR_SPACE) 279 { 280 addr_space_t as; 281 as = (addr_space_t) (rid_code - RID_FIRST_ADDR_SPACE); 282 targetm.addr_space.diagnose_usage (as, token->location); 283 token->id_kind = C_ID_ADDRSPACE; 284 token->keyword = rid_code; 285 break; 286 } 287 else if (c_dialect_objc () && OBJC_IS_PQ_KEYWORD (rid_code)) 288 { 289 /* We found an Objective-C "pq" keyword (in, out, 290 inout, bycopy, byref, oneway). They need special 291 care because the interpretation depends on the 292 context. */ 293 if (parser->objc_pq_context) 294 { 295 token->type = CPP_KEYWORD; 296 token->keyword = rid_code; 297 break; 298 } 299 else if (parser->objc_could_be_foreach_context 300 && rid_code == RID_IN) 301 { 302 /* We are in Objective-C, inside a (potential) 303 foreach context (which means after having 304 parsed 'for (', but before having parsed ';'), 305 and we found 'in'. We consider it the keyword 306 which terminates the declaration at the 307 beginning of a foreach-statement. Note that 308 this means you can't use 'in' for anything else 309 in that context; in particular, in Objective-C 310 you can't use 'in' as the name of the running 311 variable in a C for loop. We could potentially 312 try to add code here to disambiguate, but it 313 seems a reasonable limitation. */ 314 token->type = CPP_KEYWORD; 315 token->keyword = rid_code; 316 break; 317 } 318 /* Else, "pq" keywords outside of the "pq" context are 319 not keywords, and we fall through to the code for 320 normal tokens. */ 321 } 322 else if (c_dialect_objc () && OBJC_IS_PATTR_KEYWORD (rid_code)) 323 { 324 /* We found an Objective-C "property attribute" 325 keyword (getter, setter, readonly, etc). These are 326 only valid in the property context. */ 327 if (parser->objc_property_attr_context) 328 { 329 token->type = CPP_KEYWORD; 330 token->keyword = rid_code; 331 break; 332 } 333 /* Else they are not special keywords. 334 */ 335 } 336 else if (c_dialect_objc () 337 && (OBJC_IS_AT_KEYWORD (rid_code) 338 || OBJC_IS_CXX_KEYWORD (rid_code))) 339 { 340 /* We found one of the Objective-C "@" keywords (defs, 341 selector, synchronized, etc) or one of the 342 Objective-C "cxx" keywords (class, private, 343 protected, public, try, catch, throw) without a 344 preceding '@' sign. Do nothing and fall through to 345 the code for normal tokens (in C++ we would still 346 consider the CXX ones keywords, but not in C). */ 347 ; 348 } 349 else 350 { 351 token->type = CPP_KEYWORD; 352 token->keyword = rid_code; 353 break; 354 } 355 } 356 357 decl = lookup_name (token->value); 358 if (decl) 359 { 360 if (TREE_CODE (decl) == TYPE_DECL) 361 { 362 token->id_kind = C_ID_TYPENAME; 363 break; 364 } 365 } 366 else if (c_dialect_objc ()) 367 { 368 tree objc_interface_decl = objc_is_class_name (token->value); 369 /* Objective-C class names are in the same namespace as 370 variables and typedefs, and hence are shadowed by local 371 declarations. */ 372 if (objc_interface_decl 373 && (!objc_force_identifier || global_bindings_p ())) 374 { 375 token->value = objc_interface_decl; 376 token->id_kind = C_ID_CLASSNAME; 377 break; 378 } 379 } 380 token->id_kind = C_ID_ID; 381 } 382 break; 383 case CPP_AT_NAME: 384 /* This only happens in Objective-C; it must be a keyword. */ 385 token->type = CPP_KEYWORD; 386 switch (C_RID_CODE (token->value)) 387 { 388 /* Replace 'class' with '@class', 'private' with '@private', 389 etc. This prevents confusion with the C++ keyword 390 'class', and makes the tokens consistent with other 391 Objective-C 'AT' keywords. For example '@class' is 392 reported as RID_AT_CLASS which is consistent with 393 '@synchronized', which is reported as 394 RID_AT_SYNCHRONIZED. 395 */ 396 case RID_CLASS: token->keyword = RID_AT_CLASS; break; 397 case RID_PRIVATE: token->keyword = RID_AT_PRIVATE; break; 398 case RID_PROTECTED: token->keyword = RID_AT_PROTECTED; break; 399 case RID_PUBLIC: token->keyword = RID_AT_PUBLIC; break; 400 case RID_THROW: token->keyword = RID_AT_THROW; break; 401 case RID_TRY: token->keyword = RID_AT_TRY; break; 402 case RID_CATCH: token->keyword = RID_AT_CATCH; break; 403 case RID_SYNCHRONIZED: token->keyword = RID_AT_SYNCHRONIZED; break; 404 default: token->keyword = C_RID_CODE (token->value); 405 } 406 break; 407 case CPP_COLON: 408 case CPP_COMMA: 409 case CPP_CLOSE_PAREN: 410 case CPP_SEMICOLON: 411 /* These tokens may affect the interpretation of any identifiers 412 following, if doing Objective-C. */ 413 if (c_dialect_objc ()) 414 parser->objc_need_raw_identifier = false; 415 break; 416 case CPP_PRAGMA: 417 /* We smuggled the cpp_token->u.pragma value in an INTEGER_CST. */ 418 token->pragma_kind = (enum pragma_kind) TREE_INT_CST_LOW (token->value); 419 token->value = NULL; 420 break; 421 default: 422 break; 423 } 424 timevar_pop (TV_LEX); 425 } 426 427 /* Return a pointer to the next token from PARSER, reading it in if 428 necessary. */ 429 430 c_token * 431 c_parser_peek_token (c_parser *parser) 432 { 433 if (parser->tokens_avail == 0) 434 { 435 c_lex_one_token (parser, &parser->tokens[0]); 436 parser->tokens_avail = 1; 437 } 438 return &parser->tokens[0]; 439 } 440 441 /* Return a pointer to the next-but-one token from PARSER, reading it 442 in if necessary. The next token is already read in. */ 443 444 c_token * 445 c_parser_peek_2nd_token (c_parser *parser) 446 { 447 if (parser->tokens_avail >= 2) 448 return &parser->tokens[1]; 449 gcc_assert (parser->tokens_avail == 1); 450 gcc_assert (parser->tokens[0].type != CPP_EOF); 451 gcc_assert (parser->tokens[0].type != CPP_PRAGMA_EOL); 452 c_lex_one_token (parser, &parser->tokens[1]); 453 parser->tokens_avail = 2; 454 return &parser->tokens[1]; 455 } 456 457 /* Return a pointer to the Nth token from PARSER, reading it 458 in if necessary. The N-1th token is already read in. */ 459 460 c_token * 461 c_parser_peek_nth_token (c_parser *parser, unsigned int n) 462 { 463 /* N is 1-based, not zero-based. */ 464 gcc_assert (n > 0); 465 466 if (parser->tokens_avail >= n) 467 return &parser->tokens[n - 1]; 468 gcc_assert (parser->tokens_avail == n - 1); 469 c_lex_one_token (parser, &parser->tokens[n - 1]); 470 parser->tokens_avail = n; 471 return &parser->tokens[n - 1]; 472 } 473 474 bool 475 c_keyword_starts_typename (enum rid keyword) 476 { 477 switch (keyword) 478 { 479 case RID_UNSIGNED: 480 case RID_LONG: 481 case RID_SHORT: 482 case RID_SIGNED: 483 case RID_COMPLEX: 484 case RID_INT: 485 case RID_CHAR: 486 case RID_FLOAT: 487 case RID_DOUBLE: 488 case RID_VOID: 489 case RID_DFLOAT32: 490 case RID_DFLOAT64: 491 case RID_DFLOAT128: 492 CASE_RID_FLOATN_NX: 493 case RID_BOOL: 494 case RID_ENUM: 495 case RID_STRUCT: 496 case RID_UNION: 497 case RID_TYPEOF: 498 case RID_CONST: 499 case RID_ATOMIC: 500 case RID_VOLATILE: 501 case RID_RESTRICT: 502 case RID_ATTRIBUTE: 503 case RID_FRACT: 504 case RID_ACCUM: 505 case RID_SAT: 506 case RID_AUTO_TYPE: 507 return true; 508 default: 509 if (keyword >= RID_FIRST_INT_N 510 && keyword < RID_FIRST_INT_N + NUM_INT_N_ENTS 511 && int_n_enabled_p[keyword - RID_FIRST_INT_N]) 512 return true; 513 return false; 514 } 515 } 516 517 /* Return true if TOKEN can start a type name, 518 false otherwise. */ 519 bool 520 c_token_starts_typename (c_token *token) 521 { 522 switch (token->type) 523 { 524 case CPP_NAME: 525 switch (token->id_kind) 526 { 527 case C_ID_ID: 528 return false; 529 case C_ID_ADDRSPACE: 530 return true; 531 case C_ID_TYPENAME: 532 return true; 533 case C_ID_CLASSNAME: 534 gcc_assert (c_dialect_objc ()); 535 return true; 536 default: 537 gcc_unreachable (); 538 } 539 case CPP_KEYWORD: 540 return c_keyword_starts_typename (token->keyword); 541 case CPP_LESS: 542 if (c_dialect_objc ()) 543 return true; 544 return false; 545 default: 546 return false; 547 } 548 } 549 550 /* Return true if the next token from PARSER can start a type name, 551 false otherwise. LA specifies how to do lookahead in order to 552 detect unknown type names. If unsure, pick CLA_PREFER_ID. */ 553 554 static inline bool 555 c_parser_next_tokens_start_typename (c_parser *parser, enum c_lookahead_kind la) 556 { 557 c_token *token = c_parser_peek_token (parser); 558 if (c_token_starts_typename (token)) 559 return true; 560 561 /* Try a bit harder to detect an unknown typename. */ 562 if (la != cla_prefer_id 563 && token->type == CPP_NAME 564 && token->id_kind == C_ID_ID 565 566 /* Do not try too hard when we could have "object in array". */ 567 && !parser->objc_could_be_foreach_context 568 569 && (la == cla_prefer_type 570 || c_parser_peek_2nd_token (parser)->type == CPP_NAME 571 || c_parser_peek_2nd_token (parser)->type == CPP_MULT) 572 573 /* Only unknown identifiers. */ 574 && !lookup_name (token->value)) 575 return true; 576 577 return false; 578 } 579 580 /* Return true if TOKEN is a type qualifier, false otherwise. */ 581 static bool 582 c_token_is_qualifier (c_token *token) 583 { 584 switch (token->type) 585 { 586 case CPP_NAME: 587 switch (token->id_kind) 588 { 589 case C_ID_ADDRSPACE: 590 return true; 591 default: 592 return false; 593 } 594 case CPP_KEYWORD: 595 switch (token->keyword) 596 { 597 case RID_CONST: 598 case RID_VOLATILE: 599 case RID_RESTRICT: 600 case RID_ATTRIBUTE: 601 case RID_ATOMIC: 602 return true; 603 default: 604 return false; 605 } 606 case CPP_LESS: 607 return false; 608 default: 609 gcc_unreachable (); 610 } 611 } 612 613 /* Return true if the next token from PARSER is a type qualifier, 614 false otherwise. */ 615 static inline bool 616 c_parser_next_token_is_qualifier (c_parser *parser) 617 { 618 c_token *token = c_parser_peek_token (parser); 619 return c_token_is_qualifier (token); 620 } 621 622 /* Return true if TOKEN can start declaration specifiers, false 623 otherwise. */ 624 static bool 625 c_token_starts_declspecs (c_token *token) 626 { 627 switch (token->type) 628 { 629 case CPP_NAME: 630 switch (token->id_kind) 631 { 632 case C_ID_ID: 633 return false; 634 case C_ID_ADDRSPACE: 635 return true; 636 case C_ID_TYPENAME: 637 return true; 638 case C_ID_CLASSNAME: 639 gcc_assert (c_dialect_objc ()); 640 return true; 641 default: 642 gcc_unreachable (); 643 } 644 case CPP_KEYWORD: 645 switch (token->keyword) 646 { 647 case RID_STATIC: 648 case RID_EXTERN: 649 case RID_REGISTER: 650 case RID_TYPEDEF: 651 case RID_INLINE: 652 case RID_NORETURN: 653 case RID_AUTO: 654 case RID_THREAD: 655 case RID_UNSIGNED: 656 case RID_LONG: 657 case RID_SHORT: 658 case RID_SIGNED: 659 case RID_COMPLEX: 660 case RID_INT: 661 case RID_CHAR: 662 case RID_FLOAT: 663 case RID_DOUBLE: 664 case RID_VOID: 665 case RID_DFLOAT32: 666 case RID_DFLOAT64: 667 case RID_DFLOAT128: 668 CASE_RID_FLOATN_NX: 669 case RID_BOOL: 670 case RID_ENUM: 671 case RID_STRUCT: 672 case RID_UNION: 673 case RID_TYPEOF: 674 case RID_CONST: 675 case RID_VOLATILE: 676 case RID_RESTRICT: 677 case RID_ATTRIBUTE: 678 case RID_FRACT: 679 case RID_ACCUM: 680 case RID_SAT: 681 case RID_ALIGNAS: 682 case RID_ATOMIC: 683 case RID_AUTO_TYPE: 684 return true; 685 default: 686 if (token->keyword >= RID_FIRST_INT_N 687 && token->keyword < RID_FIRST_INT_N + NUM_INT_N_ENTS 688 && int_n_enabled_p[token->keyword - RID_FIRST_INT_N]) 689 return true; 690 return false; 691 } 692 case CPP_LESS: 693 if (c_dialect_objc ()) 694 return true; 695 return false; 696 default: 697 return false; 698 } 699 } 700 701 702 /* Return true if TOKEN can start declaration specifiers or a static 703 assertion, false otherwise. */ 704 static bool 705 c_token_starts_declaration (c_token *token) 706 { 707 if (c_token_starts_declspecs (token) 708 || token->keyword == RID_STATIC_ASSERT) 709 return true; 710 else 711 return false; 712 } 713 714 /* Return true if the next token from PARSER can start declaration 715 specifiers, false otherwise. */ 716 bool 717 c_parser_next_token_starts_declspecs (c_parser *parser) 718 { 719 c_token *token = c_parser_peek_token (parser); 720 721 /* In Objective-C, a classname normally starts a declspecs unless it 722 is immediately followed by a dot. In that case, it is the 723 Objective-C 2.0 "dot-syntax" for class objects, ie, calls the 724 setter/getter on the class. c_token_starts_declspecs() can't 725 differentiate between the two cases because it only checks the 726 current token, so we have a special check here. */ 727 if (c_dialect_objc () 728 && token->type == CPP_NAME 729 && token->id_kind == C_ID_CLASSNAME 730 && c_parser_peek_2nd_token (parser)->type == CPP_DOT) 731 return false; 732 733 return c_token_starts_declspecs (token); 734 } 735 736 /* Return true if the next tokens from PARSER can start declaration 737 specifiers or a static assertion, false otherwise. */ 738 bool 739 c_parser_next_tokens_start_declaration (c_parser *parser) 740 { 741 c_token *token = c_parser_peek_token (parser); 742 743 /* Same as above. */ 744 if (c_dialect_objc () 745 && token->type == CPP_NAME 746 && token->id_kind == C_ID_CLASSNAME 747 && c_parser_peek_2nd_token (parser)->type == CPP_DOT) 748 return false; 749 750 /* Labels do not start declarations. */ 751 if (token->type == CPP_NAME 752 && c_parser_peek_2nd_token (parser)->type == CPP_COLON) 753 return false; 754 755 if (c_token_starts_declaration (token)) 756 return true; 757 758 if (c_parser_next_tokens_start_typename (parser, cla_nonabstract_decl)) 759 return true; 760 761 return false; 762 } 763 764 /* Consume the next token from PARSER. */ 765 766 void 767 c_parser_consume_token (c_parser *parser) 768 { 769 gcc_assert (parser->tokens_avail >= 1); 770 gcc_assert (parser->tokens[0].type != CPP_EOF); 771 gcc_assert (!parser->in_pragma || parser->tokens[0].type != CPP_PRAGMA_EOL); 772 gcc_assert (parser->error || parser->tokens[0].type != CPP_PRAGMA); 773 if (parser->tokens != &parser->tokens_buf[0]) 774 parser->tokens++; 775 else if (parser->tokens_avail == 2) 776 parser->tokens[0] = parser->tokens[1]; 777 parser->tokens_avail--; 778 } 779 780 /* Expect the current token to be a #pragma. Consume it and remember 781 that we've begun parsing a pragma. */ 782 783 static void 784 c_parser_consume_pragma (c_parser *parser) 785 { 786 gcc_assert (!parser->in_pragma); 787 gcc_assert (parser->tokens_avail >= 1); 788 gcc_assert (parser->tokens[0].type == CPP_PRAGMA); 789 if (parser->tokens != &parser->tokens_buf[0]) 790 parser->tokens++; 791 else if (parser->tokens_avail == 2) 792 parser->tokens[0] = parser->tokens[1]; 793 parser->tokens_avail--; 794 parser->in_pragma = true; 795 } 796 797 /* Update the global input_location from TOKEN. */ 798 static inline void 799 c_parser_set_source_position_from_token (c_token *token) 800 { 801 if (token->type != CPP_EOF) 802 { 803 input_location = token->location; 804 } 805 } 806 807 /* Helper function for c_parser_error. 808 Having peeked a token of kind TOK1_KIND that might signify 809 a conflict marker, peek successor tokens to determine 810 if we actually do have a conflict marker. 811 Specifically, we consider a run of 7 '<', '=' or '>' characters 812 at the start of a line as a conflict marker. 813 These come through the lexer as three pairs and a single, 814 e.g. three CPP_LSHIFT ("<<") and a CPP_LESS ('<'). 815 If it returns true, *OUT_LOC is written to with the location/range 816 of the marker. */ 817 818 static bool 819 c_parser_peek_conflict_marker (c_parser *parser, enum cpp_ttype tok1_kind, 820 location_t *out_loc) 821 { 822 c_token *token2 = c_parser_peek_2nd_token (parser); 823 if (token2->type != tok1_kind) 824 return false; 825 c_token *token3 = c_parser_peek_nth_token (parser, 3); 826 if (token3->type != tok1_kind) 827 return false; 828 c_token *token4 = c_parser_peek_nth_token (parser, 4); 829 if (token4->type != conflict_marker_get_final_tok_kind (tok1_kind)) 830 return false; 831 832 /* It must be at the start of the line. */ 833 location_t start_loc = c_parser_peek_token (parser)->location; 834 if (LOCATION_COLUMN (start_loc) != 1) 835 return false; 836 837 /* We have a conflict marker. Construct a location of the form: 838 <<<<<<< 839 ^~~~~~~ 840 with start == caret, finishing at the end of the marker. */ 841 location_t finish_loc = get_finish (token4->location); 842 *out_loc = make_location (start_loc, start_loc, finish_loc); 843 844 return true; 845 } 846 847 /* Issue a diagnostic of the form 848 FILE:LINE: MESSAGE before TOKEN 849 where TOKEN is the next token in the input stream of PARSER. 850 MESSAGE (specified by the caller) is usually of the form "expected 851 OTHER-TOKEN". 852 853 Do not issue a diagnostic if still recovering from an error. 854 855 ??? This is taken from the C++ parser, but building up messages in 856 this way is not i18n-friendly and some other approach should be 857 used. */ 858 859 void 860 c_parser_error (c_parser *parser, const char *gmsgid) 861 { 862 c_token *token = c_parser_peek_token (parser); 863 if (parser->error) 864 return; 865 parser->error = true; 866 if (!gmsgid) 867 return; 868 869 /* If this is actually a conflict marker, report it as such. */ 870 if (token->type == CPP_LSHIFT 871 || token->type == CPP_RSHIFT 872 || token->type == CPP_EQ_EQ) 873 { 874 location_t loc; 875 if (c_parser_peek_conflict_marker (parser, token->type, &loc)) 876 { 877 error_at (loc, "version control conflict marker in file"); 878 return; 879 } 880 } 881 882 /* This diagnostic makes more sense if it is tagged to the line of 883 the token we just peeked at. */ 884 c_parser_set_source_position_from_token (token); 885 c_parse_error (gmsgid, 886 /* Because c_parse_error does not understand 887 CPP_KEYWORD, keywords are treated like 888 identifiers. */ 889 (token->type == CPP_KEYWORD ? CPP_NAME : token->type), 890 /* ??? The C parser does not save the cpp flags of a 891 token, we need to pass 0 here and we will not get 892 the source spelling of some tokens but rather the 893 canonical spelling. */ 894 token->value, /*flags=*/0); 895 } 896 897 /* If the next token is of the indicated TYPE, consume it. Otherwise, 898 issue the error MSGID. If MSGID is NULL then a message has already 899 been produced and no message will be produced this time. Returns 900 true if found, false otherwise. */ 901 902 bool 903 c_parser_require (c_parser *parser, 904 enum cpp_ttype type, 905 const char *msgid) 906 { 907 if (c_parser_next_token_is (parser, type)) 908 { 909 c_parser_consume_token (parser); 910 return true; 911 } 912 else 913 { 914 c_parser_error (parser, msgid); 915 return false; 916 } 917 } 918 919 /* If the next token is the indicated keyword, consume it. Otherwise, 920 issue the error MSGID. Returns true if found, false otherwise. */ 921 922 static bool 923 c_parser_require_keyword (c_parser *parser, 924 enum rid keyword, 925 const char *msgid) 926 { 927 if (c_parser_next_token_is_keyword (parser, keyword)) 928 { 929 c_parser_consume_token (parser); 930 return true; 931 } 932 else 933 { 934 c_parser_error (parser, msgid); 935 return false; 936 } 937 } 938 939 /* Like c_parser_require, except that tokens will be skipped until the 940 desired token is found. An error message is still produced if the 941 next token is not as expected. If MSGID is NULL then a message has 942 already been produced and no message will be produced this 943 time. */ 944 945 void 946 c_parser_skip_until_found (c_parser *parser, 947 enum cpp_ttype type, 948 const char *msgid) 949 { 950 unsigned nesting_depth = 0; 951 952 if (c_parser_require (parser, type, msgid)) 953 return; 954 955 /* Skip tokens until the desired token is found. */ 956 while (true) 957 { 958 /* Peek at the next token. */ 959 c_token *token = c_parser_peek_token (parser); 960 /* If we've reached the token we want, consume it and stop. */ 961 if (token->type == type && !nesting_depth) 962 { 963 c_parser_consume_token (parser); 964 break; 965 } 966 967 /* If we've run out of tokens, stop. */ 968 if (token->type == CPP_EOF) 969 return; 970 if (token->type == CPP_PRAGMA_EOL && parser->in_pragma) 971 return; 972 if (token->type == CPP_OPEN_BRACE 973 || token->type == CPP_OPEN_PAREN 974 || token->type == CPP_OPEN_SQUARE) 975 ++nesting_depth; 976 else if (token->type == CPP_CLOSE_BRACE 977 || token->type == CPP_CLOSE_PAREN 978 || token->type == CPP_CLOSE_SQUARE) 979 { 980 if (nesting_depth-- == 0) 981 break; 982 } 983 /* Consume this token. */ 984 c_parser_consume_token (parser); 985 } 986 parser->error = false; 987 } 988 989 /* Skip tokens until the end of a parameter is found, but do not 990 consume the comma, semicolon or closing delimiter. */ 991 992 static void 993 c_parser_skip_to_end_of_parameter (c_parser *parser) 994 { 995 unsigned nesting_depth = 0; 996 997 while (true) 998 { 999 c_token *token = c_parser_peek_token (parser); 1000 if ((token->type == CPP_COMMA || token->type == CPP_SEMICOLON) 1001 && !nesting_depth) 1002 break; 1003 /* If we've run out of tokens, stop. */ 1004 if (token->type == CPP_EOF) 1005 return; 1006 if (token->type == CPP_PRAGMA_EOL && parser->in_pragma) 1007 return; 1008 if (token->type == CPP_OPEN_BRACE 1009 || token->type == CPP_OPEN_PAREN 1010 || token->type == CPP_OPEN_SQUARE) 1011 ++nesting_depth; 1012 else if (token->type == CPP_CLOSE_BRACE 1013 || token->type == CPP_CLOSE_PAREN 1014 || token->type == CPP_CLOSE_SQUARE) 1015 { 1016 if (nesting_depth-- == 0) 1017 break; 1018 } 1019 /* Consume this token. */ 1020 c_parser_consume_token (parser); 1021 } 1022 parser->error = false; 1023 } 1024 1025 /* Expect to be at the end of the pragma directive and consume an 1026 end of line marker. */ 1027 1028 static void 1029 c_parser_skip_to_pragma_eol (c_parser *parser, bool error_if_not_eol = true) 1030 { 1031 gcc_assert (parser->in_pragma); 1032 parser->in_pragma = false; 1033 1034 if (error_if_not_eol && c_parser_peek_token (parser)->type != CPP_PRAGMA_EOL) 1035 c_parser_error (parser, "expected end of line"); 1036 1037 cpp_ttype token_type; 1038 do 1039 { 1040 c_token *token = c_parser_peek_token (parser); 1041 token_type = token->type; 1042 if (token_type == CPP_EOF) 1043 break; 1044 c_parser_consume_token (parser); 1045 } 1046 while (token_type != CPP_PRAGMA_EOL); 1047 1048 parser->error = false; 1049 } 1050 1051 /* Skip tokens until we have consumed an entire block, or until we 1052 have consumed a non-nested ';'. */ 1053 1054 static void 1055 c_parser_skip_to_end_of_block_or_statement (c_parser *parser) 1056 { 1057 unsigned nesting_depth = 0; 1058 bool save_error = parser->error; 1059 1060 while (true) 1061 { 1062 c_token *token; 1063 1064 /* Peek at the next token. */ 1065 token = c_parser_peek_token (parser); 1066 1067 switch (token->type) 1068 { 1069 case CPP_EOF: 1070 return; 1071 1072 case CPP_PRAGMA_EOL: 1073 if (parser->in_pragma) 1074 return; 1075 break; 1076 1077 case CPP_SEMICOLON: 1078 /* If the next token is a ';', we have reached the 1079 end of the statement. */ 1080 if (!nesting_depth) 1081 { 1082 /* Consume the ';'. */ 1083 c_parser_consume_token (parser); 1084 goto finished; 1085 } 1086 break; 1087 1088 case CPP_CLOSE_BRACE: 1089 /* If the next token is a non-nested '}', then we have 1090 reached the end of the current block. */ 1091 if (nesting_depth == 0 || --nesting_depth == 0) 1092 { 1093 c_parser_consume_token (parser); 1094 goto finished; 1095 } 1096 break; 1097 1098 case CPP_OPEN_BRACE: 1099 /* If it the next token is a '{', then we are entering a new 1100 block. Consume the entire block. */ 1101 ++nesting_depth; 1102 break; 1103 1104 case CPP_PRAGMA: 1105 /* If we see a pragma, consume the whole thing at once. We 1106 have some safeguards against consuming pragmas willy-nilly. 1107 Normally, we'd expect to be here with parser->error set, 1108 which disables these safeguards. But it's possible to get 1109 here for secondary error recovery, after parser->error has 1110 been cleared. */ 1111 c_parser_consume_pragma (parser); 1112 c_parser_skip_to_pragma_eol (parser); 1113 parser->error = save_error; 1114 continue; 1115 1116 default: 1117 break; 1118 } 1119 1120 c_parser_consume_token (parser); 1121 } 1122 1123 finished: 1124 parser->error = false; 1125 } 1126 1127 /* CPP's options (initialized by c-opts.c). */ 1128 extern cpp_options *cpp_opts; 1129 1130 /* Save the warning flags which are controlled by __extension__. */ 1131 1132 static inline int 1133 disable_extension_diagnostics (void) 1134 { 1135 int ret = (pedantic 1136 | (warn_pointer_arith << 1) 1137 | (warn_traditional << 2) 1138 | (flag_iso << 3) 1139 | (warn_long_long << 4) 1140 | (warn_cxx_compat << 5) 1141 | (warn_overlength_strings << 6) 1142 /* warn_c90_c99_compat has three states: -1/0/1, so we must 1143 play tricks to properly restore it. */ 1144 | ((warn_c90_c99_compat == 1) << 7) 1145 | ((warn_c90_c99_compat == -1) << 8) 1146 /* Similarly for warn_c99_c11_compat. */ 1147 | ((warn_c99_c11_compat == 1) << 9) 1148 | ((warn_c99_c11_compat == -1) << 10) 1149 ); 1150 cpp_opts->cpp_pedantic = pedantic = 0; 1151 warn_pointer_arith = 0; 1152 cpp_opts->cpp_warn_traditional = warn_traditional = 0; 1153 flag_iso = 0; 1154 cpp_opts->cpp_warn_long_long = warn_long_long = 0; 1155 warn_cxx_compat = 0; 1156 warn_overlength_strings = 0; 1157 warn_c90_c99_compat = 0; 1158 warn_c99_c11_compat = 0; 1159 return ret; 1160 } 1161 1162 /* Restore the warning flags which are controlled by __extension__. 1163 FLAGS is the return value from disable_extension_diagnostics. */ 1164 1165 static inline void 1166 restore_extension_diagnostics (int flags) 1167 { 1168 cpp_opts->cpp_pedantic = pedantic = flags & 1; 1169 warn_pointer_arith = (flags >> 1) & 1; 1170 cpp_opts->cpp_warn_traditional = warn_traditional = (flags >> 2) & 1; 1171 flag_iso = (flags >> 3) & 1; 1172 cpp_opts->cpp_warn_long_long = warn_long_long = (flags >> 4) & 1; 1173 warn_cxx_compat = (flags >> 5) & 1; 1174 warn_overlength_strings = (flags >> 6) & 1; 1175 /* See above for why is this needed. */ 1176 warn_c90_c99_compat = (flags >> 7) & 1 ? 1 : ((flags >> 8) & 1 ? -1 : 0); 1177 warn_c99_c11_compat = (flags >> 9) & 1 ? 1 : ((flags >> 10) & 1 ? -1 : 0); 1178 } 1179 1180 /* Helper data structure for parsing #pragma acc routine. */ 1181 struct oacc_routine_data { 1182 bool error_seen; /* Set if error has been reported. */ 1183 bool fndecl_seen; /* Set if one fn decl/definition has been seen already. */ 1184 tree clauses; 1185 location_t loc; 1186 }; 1187 1188 static void c_parser_external_declaration (c_parser *); 1189 static void c_parser_asm_definition (c_parser *); 1190 static void c_parser_declaration_or_fndef (c_parser *, bool, bool, bool, 1191 bool, bool, tree *, vec<c_token>, 1192 struct oacc_routine_data * = NULL, 1193 bool * = NULL); 1194 static void c_parser_static_assert_declaration_no_semi (c_parser *); 1195 static void c_parser_static_assert_declaration (c_parser *); 1196 static struct c_typespec c_parser_enum_specifier (c_parser *); 1197 static struct c_typespec c_parser_struct_or_union_specifier (c_parser *); 1198 static tree c_parser_struct_declaration (c_parser *); 1199 static struct c_typespec c_parser_typeof_specifier (c_parser *); 1200 static tree c_parser_alignas_specifier (c_parser *); 1201 static struct c_declarator *c_parser_direct_declarator (c_parser *, bool, 1202 c_dtr_syn, bool *); 1203 static struct c_declarator *c_parser_direct_declarator_inner (c_parser *, 1204 bool, 1205 struct c_declarator *); 1206 static struct c_arg_info *c_parser_parms_declarator (c_parser *, bool, tree); 1207 static struct c_arg_info *c_parser_parms_list_declarator (c_parser *, tree, 1208 tree); 1209 static struct c_parm *c_parser_parameter_declaration (c_parser *, tree); 1210 static tree c_parser_simple_asm_expr (c_parser *); 1211 static tree c_parser_attributes (c_parser *); 1212 static struct c_expr c_parser_initializer (c_parser *); 1213 static struct c_expr c_parser_braced_init (c_parser *, tree, bool, 1214 struct obstack *); 1215 static void c_parser_initelt (c_parser *, struct obstack *); 1216 static void c_parser_initval (c_parser *, struct c_expr *, 1217 struct obstack *); 1218 static tree c_parser_compound_statement (c_parser *); 1219 static void c_parser_compound_statement_nostart (c_parser *); 1220 static void c_parser_label (c_parser *); 1221 static void c_parser_statement (c_parser *, bool *); 1222 static void c_parser_statement_after_labels (c_parser *, bool *, 1223 vec<tree> * = NULL); 1224 static void c_parser_if_statement (c_parser *, bool *, vec<tree> *); 1225 static void c_parser_switch_statement (c_parser *, bool *); 1226 static void c_parser_while_statement (c_parser *, bool, bool *); 1227 static void c_parser_do_statement (c_parser *, bool); 1228 static void c_parser_for_statement (c_parser *, bool, bool *); 1229 static tree c_parser_asm_statement (c_parser *); 1230 static tree c_parser_asm_operands (c_parser *); 1231 static tree c_parser_asm_goto_operands (c_parser *); 1232 static tree c_parser_asm_clobbers (c_parser *); 1233 static struct c_expr c_parser_expr_no_commas (c_parser *, struct c_expr *, 1234 tree = NULL_TREE); 1235 static struct c_expr c_parser_conditional_expression (c_parser *, 1236 struct c_expr *, tree); 1237 static struct c_expr c_parser_binary_expression (c_parser *, struct c_expr *, 1238 tree); 1239 static struct c_expr c_parser_cast_expression (c_parser *, struct c_expr *); 1240 static struct c_expr c_parser_unary_expression (c_parser *); 1241 static struct c_expr c_parser_sizeof_expression (c_parser *); 1242 static struct c_expr c_parser_alignof_expression (c_parser *); 1243 static struct c_expr c_parser_postfix_expression (c_parser *); 1244 static struct c_expr c_parser_postfix_expression_after_paren_type (c_parser *, 1245 struct c_type_name *, 1246 location_t); 1247 static struct c_expr c_parser_postfix_expression_after_primary (c_parser *, 1248 location_t loc, 1249 struct c_expr); 1250 static tree c_parser_transaction (c_parser *, enum rid); 1251 static struct c_expr c_parser_transaction_expression (c_parser *, enum rid); 1252 static tree c_parser_transaction_cancel (c_parser *); 1253 static struct c_expr c_parser_expression (c_parser *); 1254 static struct c_expr c_parser_expression_conv (c_parser *); 1255 static vec<tree, va_gc> *c_parser_expr_list (c_parser *, bool, bool, 1256 vec<tree, va_gc> **, location_t *, 1257 tree *, vec<location_t> *, 1258 unsigned int * = NULL); 1259 static void c_parser_oacc_declare (c_parser *); 1260 static void c_parser_oacc_enter_exit_data (c_parser *, bool); 1261 static void c_parser_oacc_update (c_parser *); 1262 static void c_parser_omp_construct (c_parser *, bool *); 1263 static void c_parser_omp_threadprivate (c_parser *); 1264 static void c_parser_omp_barrier (c_parser *); 1265 static void c_parser_omp_flush (c_parser *); 1266 static tree c_parser_omp_for_loop (location_t, c_parser *, enum tree_code, 1267 tree, tree *, bool *); 1268 static void c_parser_omp_taskwait (c_parser *); 1269 static void c_parser_omp_taskyield (c_parser *); 1270 static void c_parser_omp_cancel (c_parser *); 1271 1272 enum pragma_context { pragma_external, pragma_struct, pragma_param, 1273 pragma_stmt, pragma_compound }; 1274 static bool c_parser_pragma (c_parser *, enum pragma_context, bool *); 1275 static void c_parser_omp_cancellation_point (c_parser *, enum pragma_context); 1276 static bool c_parser_omp_target (c_parser *, enum pragma_context, bool *); 1277 static void c_parser_omp_end_declare_target (c_parser *); 1278 static void c_parser_omp_declare (c_parser *, enum pragma_context); 1279 static bool c_parser_omp_ordered (c_parser *, enum pragma_context, bool *); 1280 static void c_parser_oacc_routine (c_parser *, enum pragma_context); 1281 1282 /* These Objective-C parser functions are only ever called when 1283 compiling Objective-C. */ 1284 static void c_parser_objc_class_definition (c_parser *, tree); 1285 static void c_parser_objc_class_instance_variables (c_parser *); 1286 static void c_parser_objc_class_declaration (c_parser *); 1287 static void c_parser_objc_alias_declaration (c_parser *); 1288 static void c_parser_objc_protocol_definition (c_parser *, tree); 1289 static bool c_parser_objc_method_type (c_parser *); 1290 static void c_parser_objc_method_definition (c_parser *); 1291 static void c_parser_objc_methodprotolist (c_parser *); 1292 static void c_parser_objc_methodproto (c_parser *); 1293 static tree c_parser_objc_method_decl (c_parser *, bool, tree *, tree *); 1294 static tree c_parser_objc_type_name (c_parser *); 1295 static tree c_parser_objc_protocol_refs (c_parser *); 1296 static void c_parser_objc_try_catch_finally_statement (c_parser *); 1297 static void c_parser_objc_synchronized_statement (c_parser *); 1298 static tree c_parser_objc_selector (c_parser *); 1299 static tree c_parser_objc_selector_arg (c_parser *); 1300 static tree c_parser_objc_receiver (c_parser *); 1301 static tree c_parser_objc_message_args (c_parser *); 1302 static tree c_parser_objc_keywordexpr (c_parser *); 1303 static void c_parser_objc_at_property_declaration (c_parser *); 1304 static void c_parser_objc_at_synthesize_declaration (c_parser *); 1305 static void c_parser_objc_at_dynamic_declaration (c_parser *); 1306 static bool c_parser_objc_diagnose_bad_element_prefix 1307 (c_parser *, struct c_declspecs *); 1308 1309 /* Cilk Plus supporting routines. */ 1310 static void c_parser_cilk_simd (c_parser *, bool *); 1311 static void c_parser_cilk_for (c_parser *, tree, bool *); 1312 static bool c_parser_cilk_verify_simd (c_parser *, enum pragma_context); 1313 static tree c_parser_array_notation (location_t, c_parser *, tree, tree); 1314 static tree c_parser_cilk_clause_vectorlength (c_parser *, tree, bool); 1315 static void c_parser_cilk_grainsize (c_parser *, bool *); 1316 1317 static void c_parser_parse_rtl_body (c_parser *parser, char *start_with_pass); 1318 1319 /* Parse a translation unit (C90 6.7, C99 6.9, C11 6.9). 1320 1321 translation-unit: 1322 external-declarations 1323 1324 external-declarations: 1325 external-declaration 1326 external-declarations external-declaration 1327 1328 GNU extensions: 1329 1330 translation-unit: 1331 empty 1332 */ 1333 1334 static void 1335 c_parser_translation_unit (c_parser *parser) 1336 { 1337 if (c_parser_next_token_is (parser, CPP_EOF)) 1338 { 1339 pedwarn (c_parser_peek_token (parser)->location, OPT_Wpedantic, 1340 "ISO C forbids an empty translation unit"); 1341 } 1342 else 1343 { 1344 void *obstack_position = obstack_alloc (&parser_obstack, 0); 1345 mark_valid_location_for_stdc_pragma (false); 1346 do 1347 { 1348 ggc_collect (); 1349 c_parser_external_declaration (parser); 1350 obstack_free (&parser_obstack, obstack_position); 1351 } 1352 while (c_parser_next_token_is_not (parser, CPP_EOF)); 1353 } 1354 1355 unsigned int i; 1356 tree decl; 1357 FOR_EACH_VEC_ELT (incomplete_record_decls, i, decl) 1358 if (DECL_SIZE (decl) == NULL_TREE && TREE_TYPE (decl) != error_mark_node) 1359 error ("storage size of %q+D isn%'t known", decl); 1360 } 1361 1362 /* Parse an external declaration (C90 6.7, C99 6.9, C11 6.9). 1363 1364 external-declaration: 1365 function-definition 1366 declaration 1367 1368 GNU extensions: 1369 1370 external-declaration: 1371 asm-definition 1372 ; 1373 __extension__ external-declaration 1374 1375 Objective-C: 1376 1377 external-declaration: 1378 objc-class-definition 1379 objc-class-declaration 1380 objc-alias-declaration 1381 objc-protocol-definition 1382 objc-method-definition 1383 @end 1384 */ 1385 1386 static void 1387 c_parser_external_declaration (c_parser *parser) 1388 { 1389 int ext; 1390 switch (c_parser_peek_token (parser)->type) 1391 { 1392 case CPP_KEYWORD: 1393 switch (c_parser_peek_token (parser)->keyword) 1394 { 1395 case RID_EXTENSION: 1396 ext = disable_extension_diagnostics (); 1397 c_parser_consume_token (parser); 1398 c_parser_external_declaration (parser); 1399 restore_extension_diagnostics (ext); 1400 break; 1401 case RID_ASM: 1402 c_parser_asm_definition (parser); 1403 break; 1404 case RID_AT_INTERFACE: 1405 case RID_AT_IMPLEMENTATION: 1406 gcc_assert (c_dialect_objc ()); 1407 c_parser_objc_class_definition (parser, NULL_TREE); 1408 break; 1409 case RID_AT_CLASS: 1410 gcc_assert (c_dialect_objc ()); 1411 c_parser_objc_class_declaration (parser); 1412 break; 1413 case RID_AT_ALIAS: 1414 gcc_assert (c_dialect_objc ()); 1415 c_parser_objc_alias_declaration (parser); 1416 break; 1417 case RID_AT_PROTOCOL: 1418 gcc_assert (c_dialect_objc ()); 1419 c_parser_objc_protocol_definition (parser, NULL_TREE); 1420 break; 1421 case RID_AT_PROPERTY: 1422 gcc_assert (c_dialect_objc ()); 1423 c_parser_objc_at_property_declaration (parser); 1424 break; 1425 case RID_AT_SYNTHESIZE: 1426 gcc_assert (c_dialect_objc ()); 1427 c_parser_objc_at_synthesize_declaration (parser); 1428 break; 1429 case RID_AT_DYNAMIC: 1430 gcc_assert (c_dialect_objc ()); 1431 c_parser_objc_at_dynamic_declaration (parser); 1432 break; 1433 case RID_AT_END: 1434 gcc_assert (c_dialect_objc ()); 1435 c_parser_consume_token (parser); 1436 objc_finish_implementation (); 1437 break; 1438 default: 1439 goto decl_or_fndef; 1440 } 1441 break; 1442 case CPP_SEMICOLON: 1443 pedwarn (c_parser_peek_token (parser)->location, OPT_Wpedantic, 1444 "ISO C does not allow extra %<;%> outside of a function"); 1445 c_parser_consume_token (parser); 1446 break; 1447 case CPP_PRAGMA: 1448 mark_valid_location_for_stdc_pragma (true); 1449 c_parser_pragma (parser, pragma_external, NULL); 1450 mark_valid_location_for_stdc_pragma (false); 1451 break; 1452 case CPP_PLUS: 1453 case CPP_MINUS: 1454 if (c_dialect_objc ()) 1455 { 1456 c_parser_objc_method_definition (parser); 1457 break; 1458 } 1459 /* Else fall through, and yield a syntax error trying to parse 1460 as a declaration or function definition. */ 1461 /* FALLTHRU */ 1462 default: 1463 decl_or_fndef: 1464 /* A declaration or a function definition (or, in Objective-C, 1465 an @interface or @protocol with prefix attributes). We can 1466 only tell which after parsing the declaration specifiers, if 1467 any, and the first declarator. */ 1468 c_parser_declaration_or_fndef (parser, true, true, true, false, true, 1469 NULL, vNULL); 1470 break; 1471 } 1472 } 1473 1474 static void c_finish_omp_declare_simd (c_parser *, tree, tree, vec<c_token>); 1475 static void c_finish_oacc_routine (struct oacc_routine_data *, tree, bool); 1476 1477 /* Parse a declaration or function definition (C90 6.5, 6.7.1, C99 1478 6.7, 6.9.1, C11 6.7, 6.9.1). If FNDEF_OK is true, a function definition 1479 is accepted; otherwise (old-style parameter declarations) only other 1480 declarations are accepted. If STATIC_ASSERT_OK is true, a static 1481 assertion is accepted; otherwise (old-style parameter declarations) 1482 it is not. If NESTED is true, we are inside a function or parsing 1483 old-style parameter declarations; any functions encountered are 1484 nested functions and declaration specifiers are required; otherwise 1485 we are at top level and functions are normal functions and 1486 declaration specifiers may be optional. If EMPTY_OK is true, empty 1487 declarations are OK (subject to all other constraints); otherwise 1488 (old-style parameter declarations) they are diagnosed. If 1489 START_ATTR_OK is true, the declaration specifiers may start with 1490 attributes; otherwise they may not. 1491 OBJC_FOREACH_OBJECT_DECLARATION can be used to get back the parsed 1492 declaration when parsing an Objective-C foreach statement. 1493 FALLTHRU_ATTR_P is used to signal whether this function parsed 1494 "__attribute__((fallthrough));". 1495 1496 declaration: 1497 declaration-specifiers init-declarator-list[opt] ; 1498 static_assert-declaration 1499 1500 function-definition: 1501 declaration-specifiers[opt] declarator declaration-list[opt] 1502 compound-statement 1503 1504 declaration-list: 1505 declaration 1506 declaration-list declaration 1507 1508 init-declarator-list: 1509 init-declarator 1510 init-declarator-list , init-declarator 1511 1512 init-declarator: 1513 declarator simple-asm-expr[opt] attributes[opt] 1514 declarator simple-asm-expr[opt] attributes[opt] = initializer 1515 1516 GNU extensions: 1517 1518 nested-function-definition: 1519 declaration-specifiers declarator declaration-list[opt] 1520 compound-statement 1521 1522 attribute ; 1523 1524 Objective-C: 1525 attributes objc-class-definition 1526 attributes objc-category-definition 1527 attributes objc-protocol-definition 1528 1529 The simple-asm-expr and attributes are GNU extensions. 1530 1531 This function does not handle __extension__; that is handled in its 1532 callers. ??? Following the old parser, __extension__ may start 1533 external declarations, declarations in functions and declarations 1534 at the start of "for" loops, but not old-style parameter 1535 declarations. 1536 1537 C99 requires declaration specifiers in a function definition; the 1538 absence is diagnosed through the diagnosis of implicit int. In GNU 1539 C we also allow but diagnose declarations without declaration 1540 specifiers, but only at top level (elsewhere they conflict with 1541 other syntax). 1542 1543 In Objective-C, declarations of the looping variable in a foreach 1544 statement are exceptionally terminated by 'in' (for example, 'for 1545 (NSObject *object in array) { ... }'). 1546 1547 OpenMP: 1548 1549 declaration: 1550 threadprivate-directive 1551 1552 GIMPLE: 1553 1554 gimple-function-definition: 1555 declaration-specifiers[opt] __GIMPLE (gimple-or-rtl-pass-list) declarator 1556 declaration-list[opt] compound-statement 1557 1558 rtl-function-definition: 1559 declaration-specifiers[opt] __RTL (gimple-or-rtl-pass-list) declarator 1560 declaration-list[opt] compound-statement */ 1561 1562 static void 1563 c_parser_declaration_or_fndef (c_parser *parser, bool fndef_ok, 1564 bool static_assert_ok, bool empty_ok, 1565 bool nested, bool start_attr_ok, 1566 tree *objc_foreach_object_declaration, 1567 vec<c_token> omp_declare_simd_clauses, 1568 struct oacc_routine_data *oacc_routine_data, 1569 bool *fallthru_attr_p) 1570 { 1571 struct c_declspecs *specs; 1572 tree prefix_attrs; 1573 tree all_prefix_attrs; 1574 bool diagnosed_no_specs = false; 1575 location_t here = c_parser_peek_token (parser)->location; 1576 1577 if (static_assert_ok 1578 && c_parser_next_token_is_keyword (parser, RID_STATIC_ASSERT)) 1579 { 1580 c_parser_static_assert_declaration (parser); 1581 return; 1582 } 1583 specs = build_null_declspecs (); 1584 1585 /* Try to detect an unknown type name when we have "A B" or "A *B". */ 1586 if (c_parser_peek_token (parser)->type == CPP_NAME 1587 && c_parser_peek_token (parser)->id_kind == C_ID_ID 1588 && (c_parser_peek_2nd_token (parser)->type == CPP_NAME 1589 || c_parser_peek_2nd_token (parser)->type == CPP_MULT) 1590 && (!nested || !lookup_name (c_parser_peek_token (parser)->value))) 1591 { 1592 tree name = c_parser_peek_token (parser)->value; 1593 1594 /* Issue a warning about NAME being an unknown type name, perhaps 1595 with some kind of hint. 1596 If the user forgot a "struct" etc, suggest inserting 1597 it. Otherwise, attempt to look for misspellings. */ 1598 gcc_rich_location richloc (here); 1599 if (tag_exists_p (RECORD_TYPE, name)) 1600 { 1601 /* This is not C++ with its implicit typedef. */ 1602 richloc.add_fixit_insert_before ("struct "); 1603 error_at_rich_loc (&richloc, 1604 "unknown type name %qE;" 1605 " use %<struct%> keyword to refer to the type", 1606 name); 1607 } 1608 else if (tag_exists_p (UNION_TYPE, name)) 1609 { 1610 richloc.add_fixit_insert_before ("union "); 1611 error_at_rich_loc (&richloc, 1612 "unknown type name %qE;" 1613 " use %<union%> keyword to refer to the type", 1614 name); 1615 } 1616 else if (tag_exists_p (ENUMERAL_TYPE, name)) 1617 { 1618 richloc.add_fixit_insert_before ("enum "); 1619 error_at_rich_loc (&richloc, 1620 "unknown type name %qE;" 1621 " use %<enum%> keyword to refer to the type", 1622 name); 1623 } 1624 else 1625 { 1626 const char *hint = lookup_name_fuzzy (name, FUZZY_LOOKUP_TYPENAME); 1627 if (hint) 1628 { 1629 richloc.add_fixit_replace (hint); 1630 error_at_rich_loc (&richloc, 1631 "unknown type name %qE; did you mean %qs?", 1632 name, hint); 1633 } 1634 else 1635 error_at (here, "unknown type name %qE", name); 1636 } 1637 1638 /* Parse declspecs normally to get a correct pointer type, but avoid 1639 a further "fails to be a type name" error. Refuse nested functions 1640 since it is not how the user likely wants us to recover. */ 1641 c_parser_peek_token (parser)->type = CPP_KEYWORD; 1642 c_parser_peek_token (parser)->keyword = RID_VOID; 1643 c_parser_peek_token (parser)->value = error_mark_node; 1644 fndef_ok = !nested; 1645 } 1646 1647 c_parser_declspecs (parser, specs, true, true, start_attr_ok, 1648 true, true, cla_nonabstract_decl); 1649 if (parser->error) 1650 { 1651 c_parser_skip_to_end_of_block_or_statement (parser); 1652 return; 1653 } 1654 if (nested && !specs->declspecs_seen_p) 1655 { 1656 c_parser_error (parser, "expected declaration specifiers"); 1657 c_parser_skip_to_end_of_block_or_statement (parser); 1658 return; 1659 } 1660 1661 finish_declspecs (specs); 1662 bool auto_type_p = specs->typespec_word == cts_auto_type; 1663 if (c_parser_next_token_is (parser, CPP_SEMICOLON)) 1664 { 1665 if (auto_type_p) 1666 error_at (here, "%<__auto_type%> in empty declaration"); 1667 else if (specs->typespec_kind == ctsk_none 1668 && attribute_fallthrough_p (specs->attrs)) 1669 { 1670 if (fallthru_attr_p != NULL) 1671 *fallthru_attr_p = true; 1672 tree fn = build_call_expr_internal_loc (here, IFN_FALLTHROUGH, 1673 void_type_node, 0); 1674 add_stmt (fn); 1675 } 1676 else if (empty_ok) 1677 shadow_tag (specs); 1678 else 1679 { 1680 shadow_tag_warned (specs, 1); 1681 pedwarn (here, 0, "empty declaration"); 1682 } 1683 c_parser_consume_token (parser); 1684 if (oacc_routine_data) 1685 c_finish_oacc_routine (oacc_routine_data, NULL_TREE, false); 1686 return; 1687 } 1688 1689 /* Provide better error recovery. Note that a type name here is usually 1690 better diagnosed as a redeclaration. */ 1691 if (empty_ok 1692 && specs->typespec_kind == ctsk_tagdef 1693 && c_parser_next_token_starts_declspecs (parser) 1694 && !c_parser_next_token_is (parser, CPP_NAME)) 1695 { 1696 c_parser_error (parser, "expected %<;%>, identifier or %<(%>"); 1697 parser->error = false; 1698 shadow_tag_warned (specs, 1); 1699 return; 1700 } 1701 else if (c_dialect_objc () && !auto_type_p) 1702 { 1703 /* Prefix attributes are an error on method decls. */ 1704 switch (c_parser_peek_token (parser)->type) 1705 { 1706 case CPP_PLUS: 1707 case CPP_MINUS: 1708 if (c_parser_objc_diagnose_bad_element_prefix (parser, specs)) 1709 return; 1710 if (specs->attrs) 1711 { 1712 warning_at (c_parser_peek_token (parser)->location, 1713 OPT_Wattributes, 1714 "prefix attributes are ignored for methods"); 1715 specs->attrs = NULL_TREE; 1716 } 1717 if (fndef_ok) 1718 c_parser_objc_method_definition (parser); 1719 else 1720 c_parser_objc_methodproto (parser); 1721 return; 1722 break; 1723 default: 1724 break; 1725 } 1726 /* This is where we parse 'attributes @interface ...', 1727 'attributes @implementation ...', 'attributes @protocol ...' 1728 (where attributes could be, for example, __attribute__ 1729 ((deprecated)). 1730 */ 1731 switch (c_parser_peek_token (parser)->keyword) 1732 { 1733 case RID_AT_INTERFACE: 1734 { 1735 if (c_parser_objc_diagnose_bad_element_prefix (parser, specs)) 1736 return; 1737 c_parser_objc_class_definition (parser, specs->attrs); 1738 return; 1739 } 1740 break; 1741 case RID_AT_IMPLEMENTATION: 1742 { 1743 if (c_parser_objc_diagnose_bad_element_prefix (parser, specs)) 1744 return; 1745 if (specs->attrs) 1746 { 1747 warning_at (c_parser_peek_token (parser)->location, 1748 OPT_Wattributes, 1749 "prefix attributes are ignored for implementations"); 1750 specs->attrs = NULL_TREE; 1751 } 1752 c_parser_objc_class_definition (parser, NULL_TREE); 1753 return; 1754 } 1755 break; 1756 case RID_AT_PROTOCOL: 1757 { 1758 if (c_parser_objc_diagnose_bad_element_prefix (parser, specs)) 1759 return; 1760 c_parser_objc_protocol_definition (parser, specs->attrs); 1761 return; 1762 } 1763 break; 1764 case RID_AT_ALIAS: 1765 case RID_AT_CLASS: 1766 case RID_AT_END: 1767 case RID_AT_PROPERTY: 1768 if (specs->attrs) 1769 { 1770 c_parser_error (parser, "unexpected attribute"); 1771 specs->attrs = NULL; 1772 } 1773 break; 1774 default: 1775 break; 1776 } 1777 } 1778 else if (attribute_fallthrough_p (specs->attrs)) 1779 warning_at (here, OPT_Wattributes, 1780 "%<fallthrough%> attribute not followed by %<;%>"); 1781 1782 pending_xref_error (); 1783 prefix_attrs = specs->attrs; 1784 all_prefix_attrs = prefix_attrs; 1785 specs->attrs = NULL_TREE; 1786 while (true) 1787 { 1788 struct c_declarator *declarator; 1789 bool dummy = false; 1790 timevar_id_t tv; 1791 tree fnbody = NULL_TREE; 1792 /* Declaring either one or more declarators (in which case we 1793 should diagnose if there were no declaration specifiers) or a 1794 function definition (in which case the diagnostic for 1795 implicit int suffices). */ 1796 declarator = c_parser_declarator (parser, 1797 specs->typespec_kind != ctsk_none, 1798 C_DTR_NORMAL, &dummy); 1799 if (declarator == NULL) 1800 { 1801 if (omp_declare_simd_clauses.exists () 1802 || !vec_safe_is_empty (parser->cilk_simd_fn_tokens)) 1803 c_finish_omp_declare_simd (parser, NULL_TREE, NULL_TREE, 1804 omp_declare_simd_clauses); 1805 if (oacc_routine_data) 1806 c_finish_oacc_routine (oacc_routine_data, NULL_TREE, false); 1807 c_parser_skip_to_end_of_block_or_statement (parser); 1808 return; 1809 } 1810 if (auto_type_p && declarator->kind != cdk_id) 1811 { 1812 error_at (here, 1813 "%<__auto_type%> requires a plain identifier" 1814 " as declarator"); 1815 c_parser_skip_to_end_of_block_or_statement (parser); 1816 return; 1817 } 1818 if (c_parser_next_token_is (parser, CPP_EQ) 1819 || c_parser_next_token_is (parser, CPP_COMMA) 1820 || c_parser_next_token_is (parser, CPP_SEMICOLON) 1821 || c_parser_next_token_is_keyword (parser, RID_ASM) 1822 || c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE) 1823 || c_parser_next_token_is_keyword (parser, RID_IN)) 1824 { 1825 tree asm_name = NULL_TREE; 1826 tree postfix_attrs = NULL_TREE; 1827 if (!diagnosed_no_specs && !specs->declspecs_seen_p) 1828 { 1829 diagnosed_no_specs = true; 1830 pedwarn (here, 0, "data definition has no type or storage class"); 1831 } 1832 /* Having seen a data definition, there cannot now be a 1833 function definition. */ 1834 fndef_ok = false; 1835 if (c_parser_next_token_is_keyword (parser, RID_ASM)) 1836 asm_name = c_parser_simple_asm_expr (parser); 1837 if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE)) 1838 { 1839 postfix_attrs = c_parser_attributes (parser); 1840 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE)) 1841 { 1842 /* This means there is an attribute specifier after 1843 the declarator in a function definition. Provide 1844 some more information for the user. */ 1845 error_at (here, "attributes should be specified before the " 1846 "declarator in a function definition"); 1847 c_parser_skip_to_end_of_block_or_statement (parser); 1848 return; 1849 } 1850 } 1851 if (c_parser_next_token_is (parser, CPP_EQ)) 1852 { 1853 tree d; 1854 struct c_expr init; 1855 location_t init_loc; 1856 c_parser_consume_token (parser); 1857 if (auto_type_p) 1858 { 1859 init_loc = c_parser_peek_token (parser)->location; 1860 rich_location richloc (line_table, init_loc); 1861 start_init (NULL_TREE, asm_name, global_bindings_p (), &richloc); 1862 /* A parameter is initialized, which is invalid. Don't 1863 attempt to instrument the initializer. */ 1864 int flag_sanitize_save = flag_sanitize; 1865 if (nested && !empty_ok) 1866 flag_sanitize = 0; 1867 init = c_parser_expr_no_commas (parser, NULL); 1868 flag_sanitize = flag_sanitize_save; 1869 if (TREE_CODE (init.value) == COMPONENT_REF 1870 && DECL_C_BIT_FIELD (TREE_OPERAND (init.value, 1))) 1871 error_at (here, 1872 "%<__auto_type%> used with a bit-field" 1873 " initializer"); 1874 init = convert_lvalue_to_rvalue (init_loc, init, true, true); 1875 tree init_type = TREE_TYPE (init.value); 1876 /* As with typeof, remove all qualifiers from atomic types. */ 1877 if (init_type != error_mark_node && TYPE_ATOMIC (init_type)) 1878 init_type 1879 = c_build_qualified_type (init_type, TYPE_UNQUALIFIED); 1880 bool vm_type = variably_modified_type_p (init_type, 1881 NULL_TREE); 1882 if (vm_type) 1883 init.value = c_save_expr (init.value); 1884 finish_init (); 1885 specs->typespec_kind = ctsk_typeof; 1886 specs->locations[cdw_typedef] = init_loc; 1887 specs->typedef_p = true; 1888 specs->type = init_type; 1889 if (vm_type) 1890 { 1891 bool maybe_const = true; 1892 tree type_expr = c_fully_fold (init.value, false, 1893 &maybe_const); 1894 specs->expr_const_operands &= maybe_const; 1895 if (specs->expr) 1896 specs->expr = build2 (COMPOUND_EXPR, 1897 TREE_TYPE (type_expr), 1898 specs->expr, type_expr); 1899 else 1900 specs->expr = type_expr; 1901 } 1902 d = start_decl (declarator, specs, true, 1903 chainon (postfix_attrs, all_prefix_attrs)); 1904 if (!d) 1905 d = error_mark_node; 1906 if (omp_declare_simd_clauses.exists () 1907 || !vec_safe_is_empty (parser->cilk_simd_fn_tokens)) 1908 c_finish_omp_declare_simd (parser, d, NULL_TREE, 1909 omp_declare_simd_clauses); 1910 } 1911 else 1912 { 1913 /* The declaration of the variable is in effect while 1914 its initializer is parsed. */ 1915 d = start_decl (declarator, specs, true, 1916 chainon (postfix_attrs, all_prefix_attrs)); 1917 if (!d) 1918 d = error_mark_node; 1919 if (omp_declare_simd_clauses.exists () 1920 || !vec_safe_is_empty (parser->cilk_simd_fn_tokens)) 1921 c_finish_omp_declare_simd (parser, d, NULL_TREE, 1922 omp_declare_simd_clauses); 1923 init_loc = c_parser_peek_token (parser)->location; 1924 rich_location richloc (line_table, init_loc); 1925 start_init (d, asm_name, global_bindings_p (), &richloc); 1926 /* A parameter is initialized, which is invalid. Don't 1927 attempt to instrument the initializer. */ 1928 int flag_sanitize_save = flag_sanitize; 1929 if (TREE_CODE (d) == PARM_DECL) 1930 flag_sanitize = 0; 1931 init = c_parser_initializer (parser); 1932 flag_sanitize = flag_sanitize_save; 1933 finish_init (); 1934 } 1935 if (oacc_routine_data) 1936 c_finish_oacc_routine (oacc_routine_data, d, false); 1937 if (d != error_mark_node) 1938 { 1939 maybe_warn_string_init (init_loc, TREE_TYPE (d), init); 1940 finish_decl (d, init_loc, init.value, 1941 init.original_type, asm_name); 1942 } 1943 } 1944 else 1945 { 1946 if (auto_type_p) 1947 { 1948 error_at (here, 1949 "%<__auto_type%> requires an initialized " 1950 "data declaration"); 1951 c_parser_skip_to_end_of_block_or_statement (parser); 1952 return; 1953 } 1954 tree d = start_decl (declarator, specs, false, 1955 chainon (postfix_attrs, 1956 all_prefix_attrs)); 1957 if (omp_declare_simd_clauses.exists () 1958 || !vec_safe_is_empty (parser->cilk_simd_fn_tokens)) 1959 { 1960 tree parms = NULL_TREE; 1961 if (d && TREE_CODE (d) == FUNCTION_DECL) 1962 { 1963 struct c_declarator *ce = declarator; 1964 while (ce != NULL) 1965 if (ce->kind == cdk_function) 1966 { 1967 parms = ce->u.arg_info->parms; 1968 break; 1969 } 1970 else 1971 ce = ce->declarator; 1972 } 1973 if (parms) 1974 temp_store_parm_decls (d, parms); 1975 c_finish_omp_declare_simd (parser, d, parms, 1976 omp_declare_simd_clauses); 1977 if (parms) 1978 temp_pop_parm_decls (); 1979 } 1980 if (oacc_routine_data) 1981 c_finish_oacc_routine (oacc_routine_data, d, false); 1982 if (d) 1983 finish_decl (d, UNKNOWN_LOCATION, NULL_TREE, 1984 NULL_TREE, asm_name); 1985 1986 if (c_parser_next_token_is_keyword (parser, RID_IN)) 1987 { 1988 if (d) 1989 *objc_foreach_object_declaration = d; 1990 else 1991 *objc_foreach_object_declaration = error_mark_node; 1992 } 1993 } 1994 if (c_parser_next_token_is (parser, CPP_COMMA)) 1995 { 1996 if (auto_type_p) 1997 { 1998 error_at (here, 1999 "%<__auto_type%> may only be used with" 2000 " a single declarator"); 2001 c_parser_skip_to_end_of_block_or_statement (parser); 2002 return; 2003 } 2004 c_parser_consume_token (parser); 2005 if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE)) 2006 all_prefix_attrs = chainon (c_parser_attributes (parser), 2007 prefix_attrs); 2008 else 2009 all_prefix_attrs = prefix_attrs; 2010 continue; 2011 } 2012 else if (c_parser_next_token_is (parser, CPP_SEMICOLON)) 2013 { 2014 c_parser_consume_token (parser); 2015 return; 2016 } 2017 else if (c_parser_next_token_is_keyword (parser, RID_IN)) 2018 { 2019 /* This can only happen in Objective-C: we found the 2020 'in' that terminates the declaration inside an 2021 Objective-C foreach statement. Do not consume the 2022 token, so that the caller can use it to determine 2023 that this indeed is a foreach context. */ 2024 return; 2025 } 2026 else 2027 { 2028 c_parser_error (parser, "expected %<,%> or %<;%>"); 2029 c_parser_skip_to_end_of_block_or_statement (parser); 2030 return; 2031 } 2032 } 2033 else if (auto_type_p) 2034 { 2035 error_at (here, 2036 "%<__auto_type%> requires an initialized data declaration"); 2037 c_parser_skip_to_end_of_block_or_statement (parser); 2038 return; 2039 } 2040 else if (!fndef_ok) 2041 { 2042 c_parser_error (parser, "expected %<=%>, %<,%>, %<;%>, " 2043 "%<asm%> or %<__attribute__%>"); 2044 c_parser_skip_to_end_of_block_or_statement (parser); 2045 return; 2046 } 2047 /* Function definition (nested or otherwise). */ 2048 if (nested) 2049 { 2050 pedwarn (here, OPT_Wpedantic, "ISO C forbids nested functions"); 2051 c_push_function_context (); 2052 } 2053 if (!start_function (specs, declarator, all_prefix_attrs)) 2054 { 2055 /* This can appear in many cases looking nothing like a 2056 function definition, so we don't give a more specific 2057 error suggesting there was one. */ 2058 c_parser_error (parser, "expected %<=%>, %<,%>, %<;%>, %<asm%> " 2059 "or %<__attribute__%>"); 2060 if (nested) 2061 c_pop_function_context (); 2062 break; 2063 } 2064 2065 if (DECL_DECLARED_INLINE_P (current_function_decl)) 2066 tv = TV_PARSE_INLINE; 2067 else 2068 tv = TV_PARSE_FUNC; 2069 auto_timevar at (g_timer, tv); 2070 2071 /* Parse old-style parameter declarations. ??? Attributes are 2072 not allowed to start declaration specifiers here because of a 2073 syntax conflict between a function declaration with attribute 2074 suffix and a function definition with an attribute prefix on 2075 first old-style parameter declaration. Following the old 2076 parser, they are not accepted on subsequent old-style 2077 parameter declarations either. However, there is no 2078 ambiguity after the first declaration, nor indeed on the 2079 first as long as we don't allow postfix attributes after a 2080 declarator with a nonempty identifier list in a definition; 2081 and postfix attributes have never been accepted here in 2082 function definitions either. */ 2083 while (c_parser_next_token_is_not (parser, CPP_EOF) 2084 && c_parser_next_token_is_not (parser, CPP_OPEN_BRACE)) 2085 c_parser_declaration_or_fndef (parser, false, false, false, 2086 true, false, NULL, vNULL); 2087 store_parm_decls (); 2088 if (omp_declare_simd_clauses.exists () 2089 || !vec_safe_is_empty (parser->cilk_simd_fn_tokens)) 2090 c_finish_omp_declare_simd (parser, current_function_decl, NULL_TREE, 2091 omp_declare_simd_clauses); 2092 if (oacc_routine_data) 2093 c_finish_oacc_routine (oacc_routine_data, current_function_decl, true); 2094 DECL_STRUCT_FUNCTION (current_function_decl)->function_start_locus 2095 = c_parser_peek_token (parser)->location; 2096 2097 /* If the definition was marked with __GIMPLE then parse the 2098 function body as GIMPLE. */ 2099 if (specs->gimple_p) 2100 { 2101 cfun->pass_startwith = specs->gimple_or_rtl_pass; 2102 bool saved = in_late_binary_op; 2103 in_late_binary_op = true; 2104 c_parser_parse_gimple_body (parser); 2105 in_late_binary_op = saved; 2106 } 2107 /* Similarly, if it was marked with __RTL, use the RTL parser now, 2108 consuming the function body. */ 2109 else if (specs->rtl_p) 2110 { 2111 c_parser_parse_rtl_body (parser, specs->gimple_or_rtl_pass); 2112 2113 /* Normally, store_parm_decls sets next_is_function_body, 2114 anticipating a function body. We need a push_scope/pop_scope 2115 pair to flush out this state, or subsequent function parsing 2116 will go wrong. */ 2117 push_scope (); 2118 pop_scope (); 2119 2120 finish_function (); 2121 return; 2122 } 2123 else 2124 { 2125 fnbody = c_parser_compound_statement (parser); 2126 if (flag_cilkplus && contains_array_notation_expr (fnbody)) 2127 fnbody = expand_array_notation_exprs (fnbody); 2128 } 2129 tree fndecl = current_function_decl; 2130 if (nested) 2131 { 2132 tree decl = current_function_decl; 2133 /* Mark nested functions as needing static-chain initially. 2134 lower_nested_functions will recompute it but the 2135 DECL_STATIC_CHAIN flag is also used before that happens, 2136 by initializer_constant_valid_p. See gcc.dg/nested-fn-2.c. */ 2137 DECL_STATIC_CHAIN (decl) = 1; 2138 add_stmt (fnbody); 2139 finish_function (); 2140 c_pop_function_context (); 2141 add_stmt (build_stmt (DECL_SOURCE_LOCATION (decl), DECL_EXPR, decl)); 2142 } 2143 else 2144 { 2145 if (fnbody) 2146 add_stmt (fnbody); 2147 finish_function (); 2148 } 2149 /* Get rid of the empty stmt list for GIMPLE. */ 2150 if (specs->gimple_p) 2151 DECL_SAVED_TREE (fndecl) = NULL_TREE; 2152 2153 break; 2154 } 2155 } 2156 2157 /* Parse an asm-definition (asm() outside a function body). This is a 2158 GNU extension. 2159 2160 asm-definition: 2161 simple-asm-expr ; 2162 */ 2163 2164 static void 2165 c_parser_asm_definition (c_parser *parser) 2166 { 2167 tree asm_str = c_parser_simple_asm_expr (parser); 2168 if (asm_str) 2169 symtab->finalize_toplevel_asm (asm_str); 2170 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>"); 2171 } 2172 2173 /* Parse a static assertion (C11 6.7.10). 2174 2175 static_assert-declaration: 2176 static_assert-declaration-no-semi ; 2177 */ 2178 2179 static void 2180 c_parser_static_assert_declaration (c_parser *parser) 2181 { 2182 c_parser_static_assert_declaration_no_semi (parser); 2183 if (parser->error 2184 || !c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>")) 2185 c_parser_skip_to_end_of_block_or_statement (parser); 2186 } 2187 2188 /* Parse a static assertion (C11 6.7.10), without the trailing 2189 semicolon. 2190 2191 static_assert-declaration-no-semi: 2192 _Static_assert ( constant-expression , string-literal ) 2193 */ 2194 2195 static void 2196 c_parser_static_assert_declaration_no_semi (c_parser *parser) 2197 { 2198 location_t assert_loc, value_loc; 2199 tree value; 2200 tree string; 2201 2202 gcc_assert (c_parser_next_token_is_keyword (parser, RID_STATIC_ASSERT)); 2203 assert_loc = c_parser_peek_token (parser)->location; 2204 if (flag_isoc99) 2205 pedwarn_c99 (assert_loc, OPT_Wpedantic, 2206 "ISO C99 does not support %<_Static_assert%>"); 2207 else 2208 pedwarn_c99 (assert_loc, OPT_Wpedantic, 2209 "ISO C90 does not support %<_Static_assert%>"); 2210 c_parser_consume_token (parser); 2211 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 2212 return; 2213 location_t value_tok_loc = c_parser_peek_token (parser)->location; 2214 value = c_parser_expr_no_commas (parser, NULL).value; 2215 value_loc = EXPR_LOC_OR_LOC (value, value_tok_loc); 2216 parser->lex_untranslated_string = true; 2217 if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>")) 2218 { 2219 parser->lex_untranslated_string = false; 2220 return; 2221 } 2222 switch (c_parser_peek_token (parser)->type) 2223 { 2224 case CPP_STRING: 2225 case CPP_STRING16: 2226 case CPP_STRING32: 2227 case CPP_WSTRING: 2228 case CPP_UTF8STRING: 2229 string = c_parser_peek_token (parser)->value; 2230 c_parser_consume_token (parser); 2231 parser->lex_untranslated_string = false; 2232 break; 2233 default: 2234 c_parser_error (parser, "expected string literal"); 2235 parser->lex_untranslated_string = false; 2236 return; 2237 } 2238 c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 2239 2240 if (!INTEGRAL_TYPE_P (TREE_TYPE (value))) 2241 { 2242 error_at (value_loc, "expression in static assertion is not an integer"); 2243 return; 2244 } 2245 if (TREE_CODE (value) != INTEGER_CST) 2246 { 2247 value = c_fully_fold (value, false, NULL); 2248 /* Strip no-op conversions. */ 2249 STRIP_TYPE_NOPS (value); 2250 if (TREE_CODE (value) == INTEGER_CST) 2251 pedwarn (value_loc, OPT_Wpedantic, "expression in static assertion " 2252 "is not an integer constant expression"); 2253 } 2254 if (TREE_CODE (value) != INTEGER_CST) 2255 { 2256 error_at (value_loc, "expression in static assertion is not constant"); 2257 return; 2258 } 2259 constant_expression_warning (value); 2260 if (integer_zerop (value)) 2261 error_at (assert_loc, "static assertion failed: %E", string); 2262 } 2263 2264 /* Parse some declaration specifiers (possibly none) (C90 6.5, C99 2265 6.7, C11 6.7), adding them to SPECS (which may already include some). 2266 Storage class specifiers are accepted iff SCSPEC_OK; type 2267 specifiers are accepted iff TYPESPEC_OK; alignment specifiers are 2268 accepted iff ALIGNSPEC_OK; attributes are accepted at the start 2269 iff START_ATTR_OK; __auto_type is accepted iff AUTO_TYPE_OK. 2270 2271 declaration-specifiers: 2272 storage-class-specifier declaration-specifiers[opt] 2273 type-specifier declaration-specifiers[opt] 2274 type-qualifier declaration-specifiers[opt] 2275 function-specifier declaration-specifiers[opt] 2276 alignment-specifier declaration-specifiers[opt] 2277 2278 Function specifiers (inline) are from C99, and are currently 2279 handled as storage class specifiers, as is __thread. Alignment 2280 specifiers are from C11. 2281 2282 C90 6.5.1, C99 6.7.1, C11 6.7.1: 2283 storage-class-specifier: 2284 typedef 2285 extern 2286 static 2287 auto 2288 register 2289 _Thread_local 2290 2291 (_Thread_local is new in C11.) 2292 2293 C99 6.7.4, C11 6.7.4: 2294 function-specifier: 2295 inline 2296 _Noreturn 2297 2298 (_Noreturn is new in C11.) 2299 2300 C90 6.5.2, C99 6.7.2, C11 6.7.2: 2301 type-specifier: 2302 void 2303 char 2304 short 2305 int 2306 long 2307 float 2308 double 2309 signed 2310 unsigned 2311 _Bool 2312 _Complex 2313 [_Imaginary removed in C99 TC2] 2314 struct-or-union-specifier 2315 enum-specifier 2316 typedef-name 2317 atomic-type-specifier 2318 2319 (_Bool and _Complex are new in C99.) 2320 (atomic-type-specifier is new in C11.) 2321 2322 C90 6.5.3, C99 6.7.3, C11 6.7.3: 2323 2324 type-qualifier: 2325 const 2326 restrict 2327 volatile 2328 address-space-qualifier 2329 _Atomic 2330 2331 (restrict is new in C99.) 2332 (_Atomic is new in C11.) 2333 2334 GNU extensions: 2335 2336 declaration-specifiers: 2337 attributes declaration-specifiers[opt] 2338 2339 type-qualifier: 2340 address-space 2341 2342 address-space: 2343 identifier recognized by the target 2344 2345 storage-class-specifier: 2346 __thread 2347 2348 type-specifier: 2349 typeof-specifier 2350 __auto_type 2351 __intN 2352 _Decimal32 2353 _Decimal64 2354 _Decimal128 2355 _Fract 2356 _Accum 2357 _Sat 2358 2359 (_Fract, _Accum, and _Sat are new from ISO/IEC DTR 18037: 2360 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1169.pdf) 2361 2362 atomic-type-specifier 2363 _Atomic ( type-name ) 2364 2365 Objective-C: 2366 2367 type-specifier: 2368 class-name objc-protocol-refs[opt] 2369 typedef-name objc-protocol-refs 2370 objc-protocol-refs 2371 */ 2372 2373 void 2374 c_parser_declspecs (c_parser *parser, struct c_declspecs *specs, 2375 bool scspec_ok, bool typespec_ok, bool start_attr_ok, 2376 bool alignspec_ok, bool auto_type_ok, 2377 enum c_lookahead_kind la) 2378 { 2379 bool attrs_ok = start_attr_ok; 2380 bool seen_type = specs->typespec_kind != ctsk_none; 2381 2382 if (!typespec_ok) 2383 gcc_assert (la == cla_prefer_id); 2384 2385 while (c_parser_next_token_is (parser, CPP_NAME) 2386 || c_parser_next_token_is (parser, CPP_KEYWORD) 2387 || (c_dialect_objc () && c_parser_next_token_is (parser, CPP_LESS))) 2388 { 2389 struct c_typespec t; 2390 tree attrs; 2391 tree align; 2392 location_t loc = c_parser_peek_token (parser)->location; 2393 2394 /* If we cannot accept a type, exit if the next token must start 2395 one. Also, if we already have seen a tagged definition, 2396 a typename would be an error anyway and likely the user 2397 has simply forgotten a semicolon, so we exit. */ 2398 if ((!typespec_ok || specs->typespec_kind == ctsk_tagdef) 2399 && c_parser_next_tokens_start_typename (parser, la) 2400 && !c_parser_next_token_is_qualifier (parser)) 2401 break; 2402 2403 if (c_parser_next_token_is (parser, CPP_NAME)) 2404 { 2405 c_token *name_token = c_parser_peek_token (parser); 2406 tree value = name_token->value; 2407 c_id_kind kind = name_token->id_kind; 2408 2409 if (kind == C_ID_ADDRSPACE) 2410 { 2411 addr_space_t as 2412 = name_token->keyword - RID_FIRST_ADDR_SPACE; 2413 declspecs_add_addrspace (name_token->location, specs, as); 2414 c_parser_consume_token (parser); 2415 attrs_ok = true; 2416 continue; 2417 } 2418 2419 gcc_assert (!c_parser_next_token_is_qualifier (parser)); 2420 2421 /* If we cannot accept a type, and the next token must start one, 2422 exit. Do the same if we already have seen a tagged definition, 2423 since it would be an error anyway and likely the user has simply 2424 forgotten a semicolon. */ 2425 if (seen_type || !c_parser_next_tokens_start_typename (parser, la)) 2426 break; 2427 2428 /* Now at an unknown typename (C_ID_ID), a C_ID_TYPENAME or 2429 a C_ID_CLASSNAME. */ 2430 c_parser_consume_token (parser); 2431 seen_type = true; 2432 attrs_ok = true; 2433 if (kind == C_ID_ID) 2434 { 2435 error_at (loc, "unknown type name %qE", value); 2436 t.kind = ctsk_typedef; 2437 t.spec = error_mark_node; 2438 } 2439 else if (kind == C_ID_TYPENAME 2440 && (!c_dialect_objc () 2441 || c_parser_next_token_is_not (parser, CPP_LESS))) 2442 { 2443 t.kind = ctsk_typedef; 2444 /* For a typedef name, record the meaning, not the name. 2445 In case of 'foo foo, bar;'. */ 2446 t.spec = lookup_name (value); 2447 } 2448 else 2449 { 2450 tree proto = NULL_TREE; 2451 gcc_assert (c_dialect_objc ()); 2452 t.kind = ctsk_objc; 2453 if (c_parser_next_token_is (parser, CPP_LESS)) 2454 proto = c_parser_objc_protocol_refs (parser); 2455 t.spec = objc_get_protocol_qualified_type (value, proto); 2456 } 2457 t.expr = NULL_TREE; 2458 t.expr_const_operands = true; 2459 declspecs_add_type (name_token->location, specs, t); 2460 continue; 2461 } 2462 if (c_parser_next_token_is (parser, CPP_LESS)) 2463 { 2464 /* Make "<SomeProtocol>" equivalent to "id <SomeProtocol>" - 2465 nisse@lysator.liu.se. */ 2466 tree proto; 2467 gcc_assert (c_dialect_objc ()); 2468 if (!typespec_ok || seen_type) 2469 break; 2470 proto = c_parser_objc_protocol_refs (parser); 2471 t.kind = ctsk_objc; 2472 t.spec = objc_get_protocol_qualified_type (NULL_TREE, proto); 2473 t.expr = NULL_TREE; 2474 t.expr_const_operands = true; 2475 declspecs_add_type (loc, specs, t); 2476 continue; 2477 } 2478 gcc_assert (c_parser_next_token_is (parser, CPP_KEYWORD)); 2479 switch (c_parser_peek_token (parser)->keyword) 2480 { 2481 case RID_STATIC: 2482 case RID_EXTERN: 2483 case RID_REGISTER: 2484 case RID_TYPEDEF: 2485 case RID_INLINE: 2486 case RID_NORETURN: 2487 case RID_AUTO: 2488 case RID_THREAD: 2489 if (!scspec_ok) 2490 goto out; 2491 attrs_ok = true; 2492 /* TODO: Distinguish between function specifiers (inline, noreturn) 2493 and storage class specifiers, either here or in 2494 declspecs_add_scspec. */ 2495 declspecs_add_scspec (loc, specs, 2496 c_parser_peek_token (parser)->value); 2497 c_parser_consume_token (parser); 2498 break; 2499 case RID_AUTO_TYPE: 2500 if (!auto_type_ok) 2501 goto out; 2502 /* Fall through. */ 2503 case RID_UNSIGNED: 2504 case RID_LONG: 2505 case RID_SHORT: 2506 case RID_SIGNED: 2507 case RID_COMPLEX: 2508 case RID_INT: 2509 case RID_CHAR: 2510 case RID_FLOAT: 2511 case RID_DOUBLE: 2512 case RID_VOID: 2513 case RID_DFLOAT32: 2514 case RID_DFLOAT64: 2515 case RID_DFLOAT128: 2516 CASE_RID_FLOATN_NX: 2517 case RID_BOOL: 2518 case RID_FRACT: 2519 case RID_ACCUM: 2520 case RID_SAT: 2521 case RID_INT_N_0: 2522 case RID_INT_N_1: 2523 case RID_INT_N_2: 2524 case RID_INT_N_3: 2525 if (!typespec_ok) 2526 goto out; 2527 attrs_ok = true; 2528 seen_type = true; 2529 if (c_dialect_objc ()) 2530 parser->objc_need_raw_identifier = true; 2531 t.kind = ctsk_resword; 2532 t.spec = c_parser_peek_token (parser)->value; 2533 t.expr = NULL_TREE; 2534 t.expr_const_operands = true; 2535 declspecs_add_type (loc, specs, t); 2536 c_parser_consume_token (parser); 2537 break; 2538 case RID_ENUM: 2539 if (!typespec_ok) 2540 goto out; 2541 attrs_ok = true; 2542 seen_type = true; 2543 t = c_parser_enum_specifier (parser); 2544 invoke_plugin_callbacks (PLUGIN_FINISH_TYPE, t.spec); 2545 declspecs_add_type (loc, specs, t); 2546 break; 2547 case RID_STRUCT: 2548 case RID_UNION: 2549 if (!typespec_ok) 2550 goto out; 2551 attrs_ok = true; 2552 seen_type = true; 2553 t = c_parser_struct_or_union_specifier (parser); 2554 invoke_plugin_callbacks (PLUGIN_FINISH_TYPE, t.spec); 2555 declspecs_add_type (loc, specs, t); 2556 break; 2557 case RID_TYPEOF: 2558 /* ??? The old parser rejected typeof after other type 2559 specifiers, but is a syntax error the best way of 2560 handling this? */ 2561 if (!typespec_ok || seen_type) 2562 goto out; 2563 attrs_ok = true; 2564 seen_type = true; 2565 t = c_parser_typeof_specifier (parser); 2566 declspecs_add_type (loc, specs, t); 2567 break; 2568 case RID_ATOMIC: 2569 /* C parser handling of Objective-C constructs needs 2570 checking for correct lvalue-to-rvalue conversions, and 2571 the code in build_modify_expr handling various 2572 Objective-C cases, and that in build_unary_op handling 2573 Objective-C cases for increment / decrement, also needs 2574 updating; uses of TYPE_MAIN_VARIANT in objc_compare_types 2575 and objc_types_are_equivalent may also need updates. */ 2576 if (c_dialect_objc ()) 2577 sorry ("%<_Atomic%> in Objective-C"); 2578 if (flag_isoc99) 2579 pedwarn_c99 (loc, OPT_Wpedantic, 2580 "ISO C99 does not support the %<_Atomic%> qualifier"); 2581 else 2582 pedwarn_c99 (loc, OPT_Wpedantic, 2583 "ISO C90 does not support the %<_Atomic%> qualifier"); 2584 attrs_ok = true; 2585 tree value; 2586 value = c_parser_peek_token (parser)->value; 2587 c_parser_consume_token (parser); 2588 if (typespec_ok && c_parser_next_token_is (parser, CPP_OPEN_PAREN)) 2589 { 2590 /* _Atomic ( type-name ). */ 2591 seen_type = true; 2592 c_parser_consume_token (parser); 2593 struct c_type_name *type = c_parser_type_name (parser); 2594 t.kind = ctsk_typeof; 2595 t.spec = error_mark_node; 2596 t.expr = NULL_TREE; 2597 t.expr_const_operands = true; 2598 if (type != NULL) 2599 t.spec = groktypename (type, &t.expr, 2600 &t.expr_const_operands); 2601 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 2602 "expected %<)%>"); 2603 if (t.spec != error_mark_node) 2604 { 2605 if (TREE_CODE (t.spec) == ARRAY_TYPE) 2606 error_at (loc, "%<_Atomic%>-qualified array type"); 2607 else if (TREE_CODE (t.spec) == FUNCTION_TYPE) 2608 error_at (loc, "%<_Atomic%>-qualified function type"); 2609 else if (TYPE_QUALS (t.spec) != TYPE_UNQUALIFIED) 2610 error_at (loc, "%<_Atomic%> applied to a qualified type"); 2611 else 2612 t.spec = c_build_qualified_type (t.spec, TYPE_QUAL_ATOMIC); 2613 } 2614 declspecs_add_type (loc, specs, t); 2615 } 2616 else 2617 declspecs_add_qual (loc, specs, value); 2618 break; 2619 case RID_CONST: 2620 case RID_VOLATILE: 2621 case RID_RESTRICT: 2622 attrs_ok = true; 2623 declspecs_add_qual (loc, specs, c_parser_peek_token (parser)->value); 2624 c_parser_consume_token (parser); 2625 break; 2626 case RID_ATTRIBUTE: 2627 if (!attrs_ok) 2628 goto out; 2629 attrs = c_parser_attributes (parser); 2630 declspecs_add_attrs (loc, specs, attrs); 2631 break; 2632 case RID_ALIGNAS: 2633 if (!alignspec_ok) 2634 goto out; 2635 align = c_parser_alignas_specifier (parser); 2636 declspecs_add_alignas (loc, specs, align); 2637 break; 2638 case RID_GIMPLE: 2639 if (! flag_gimple) 2640 error_at (loc, "%<__GIMPLE%> only valid with -fgimple"); 2641 c_parser_consume_token (parser); 2642 specs->gimple_p = true; 2643 specs->locations[cdw_gimple] = loc; 2644 specs->gimple_or_rtl_pass = c_parser_gimple_or_rtl_pass_list (parser); 2645 break; 2646 case RID_RTL: 2647 c_parser_consume_token (parser); 2648 specs->rtl_p = true; 2649 specs->locations[cdw_rtl] = loc; 2650 specs->gimple_or_rtl_pass = c_parser_gimple_or_rtl_pass_list (parser); 2651 break; 2652 default: 2653 goto out; 2654 } 2655 } 2656 out: ; 2657 } 2658 2659 /* Parse an enum specifier (C90 6.5.2.2, C99 6.7.2.2, C11 6.7.2.2). 2660 2661 enum-specifier: 2662 enum attributes[opt] identifier[opt] { enumerator-list } attributes[opt] 2663 enum attributes[opt] identifier[opt] { enumerator-list , } attributes[opt] 2664 enum attributes[opt] identifier 2665 2666 The form with trailing comma is new in C99. The forms with 2667 attributes are GNU extensions. In GNU C, we accept any expression 2668 without commas in the syntax (assignment expressions, not just 2669 conditional expressions); assignment expressions will be diagnosed 2670 as non-constant. 2671 2672 enumerator-list: 2673 enumerator 2674 enumerator-list , enumerator 2675 2676 enumerator: 2677 enumeration-constant 2678 enumeration-constant = constant-expression 2679 2680 GNU Extensions: 2681 2682 enumerator: 2683 enumeration-constant attributes[opt] 2684 enumeration-constant attributes[opt] = constant-expression 2685 2686 */ 2687 2688 static struct c_typespec 2689 c_parser_enum_specifier (c_parser *parser) 2690 { 2691 struct c_typespec ret; 2692 tree attrs; 2693 tree ident = NULL_TREE; 2694 location_t enum_loc; 2695 location_t ident_loc = UNKNOWN_LOCATION; /* Quiet warning. */ 2696 gcc_assert (c_parser_next_token_is_keyword (parser, RID_ENUM)); 2697 c_parser_consume_token (parser); 2698 attrs = c_parser_attributes (parser); 2699 enum_loc = c_parser_peek_token (parser)->location; 2700 /* Set the location in case we create a decl now. */ 2701 c_parser_set_source_position_from_token (c_parser_peek_token (parser)); 2702 if (c_parser_next_token_is (parser, CPP_NAME)) 2703 { 2704 ident = c_parser_peek_token (parser)->value; 2705 ident_loc = c_parser_peek_token (parser)->location; 2706 enum_loc = ident_loc; 2707 c_parser_consume_token (parser); 2708 } 2709 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE)) 2710 { 2711 /* Parse an enum definition. */ 2712 struct c_enum_contents the_enum; 2713 tree type; 2714 tree postfix_attrs; 2715 /* We chain the enumerators in reverse order, then put them in 2716 forward order at the end. */ 2717 tree values; 2718 timevar_push (TV_PARSE_ENUM); 2719 type = start_enum (enum_loc, &the_enum, ident); 2720 values = NULL_TREE; 2721 c_parser_consume_token (parser); 2722 while (true) 2723 { 2724 tree enum_id; 2725 tree enum_value; 2726 tree enum_decl; 2727 bool seen_comma; 2728 c_token *token; 2729 location_t comma_loc = UNKNOWN_LOCATION; /* Quiet warning. */ 2730 location_t decl_loc, value_loc; 2731 if (c_parser_next_token_is_not (parser, CPP_NAME)) 2732 { 2733 /* Give a nicer error for "enum {}". */ 2734 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE) 2735 && !parser->error) 2736 { 2737 error_at (c_parser_peek_token (parser)->location, 2738 "empty enum is invalid"); 2739 parser->error = true; 2740 } 2741 else 2742 c_parser_error (parser, "expected identifier"); 2743 c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL); 2744 values = error_mark_node; 2745 break; 2746 } 2747 token = c_parser_peek_token (parser); 2748 enum_id = token->value; 2749 /* Set the location in case we create a decl now. */ 2750 c_parser_set_source_position_from_token (token); 2751 decl_loc = value_loc = token->location; 2752 c_parser_consume_token (parser); 2753 /* Parse any specified attributes. */ 2754 tree enum_attrs = c_parser_attributes (parser); 2755 if (c_parser_next_token_is (parser, CPP_EQ)) 2756 { 2757 c_parser_consume_token (parser); 2758 value_loc = c_parser_peek_token (parser)->location; 2759 enum_value = c_parser_expr_no_commas (parser, NULL).value; 2760 } 2761 else 2762 enum_value = NULL_TREE; 2763 enum_decl = build_enumerator (decl_loc, value_loc, 2764 &the_enum, enum_id, enum_value); 2765 if (enum_attrs) 2766 decl_attributes (&TREE_PURPOSE (enum_decl), enum_attrs, 0); 2767 TREE_CHAIN (enum_decl) = values; 2768 values = enum_decl; 2769 seen_comma = false; 2770 if (c_parser_next_token_is (parser, CPP_COMMA)) 2771 { 2772 comma_loc = c_parser_peek_token (parser)->location; 2773 seen_comma = true; 2774 c_parser_consume_token (parser); 2775 } 2776 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE)) 2777 { 2778 if (seen_comma) 2779 pedwarn_c90 (comma_loc, OPT_Wpedantic, 2780 "comma at end of enumerator list"); 2781 c_parser_consume_token (parser); 2782 break; 2783 } 2784 if (!seen_comma) 2785 { 2786 c_parser_error (parser, "expected %<,%> or %<}%>"); 2787 c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL); 2788 values = error_mark_node; 2789 break; 2790 } 2791 } 2792 postfix_attrs = c_parser_attributes (parser); 2793 ret.spec = finish_enum (type, nreverse (values), 2794 chainon (attrs, postfix_attrs)); 2795 ret.kind = ctsk_tagdef; 2796 ret.expr = NULL_TREE; 2797 ret.expr_const_operands = true; 2798 timevar_pop (TV_PARSE_ENUM); 2799 return ret; 2800 } 2801 else if (!ident) 2802 { 2803 c_parser_error (parser, "expected %<{%>"); 2804 ret.spec = error_mark_node; 2805 ret.kind = ctsk_tagref; 2806 ret.expr = NULL_TREE; 2807 ret.expr_const_operands = true; 2808 return ret; 2809 } 2810 ret = parser_xref_tag (ident_loc, ENUMERAL_TYPE, ident); 2811 /* In ISO C, enumerated types can be referred to only if already 2812 defined. */ 2813 if (pedantic && !COMPLETE_TYPE_P (ret.spec)) 2814 { 2815 gcc_assert (ident); 2816 pedwarn (enum_loc, OPT_Wpedantic, 2817 "ISO C forbids forward references to %<enum%> types"); 2818 } 2819 return ret; 2820 } 2821 2822 /* Parse a struct or union specifier (C90 6.5.2.1, C99 6.7.2.1, C11 6.7.2.1). 2823 2824 struct-or-union-specifier: 2825 struct-or-union attributes[opt] identifier[opt] 2826 { struct-contents } attributes[opt] 2827 struct-or-union attributes[opt] identifier 2828 2829 struct-contents: 2830 struct-declaration-list 2831 2832 struct-declaration-list: 2833 struct-declaration ; 2834 struct-declaration-list struct-declaration ; 2835 2836 GNU extensions: 2837 2838 struct-contents: 2839 empty 2840 struct-declaration 2841 struct-declaration-list struct-declaration 2842 2843 struct-declaration-list: 2844 struct-declaration-list ; 2845 ; 2846 2847 (Note that in the syntax here, unlike that in ISO C, the semicolons 2848 are included here rather than in struct-declaration, in order to 2849 describe the syntax with extra semicolons and missing semicolon at 2850 end.) 2851 2852 Objective-C: 2853 2854 struct-declaration-list: 2855 @defs ( class-name ) 2856 2857 (Note this does not include a trailing semicolon, but can be 2858 followed by further declarations, and gets a pedwarn-if-pedantic 2859 when followed by a semicolon.) */ 2860 2861 static struct c_typespec 2862 c_parser_struct_or_union_specifier (c_parser *parser) 2863 { 2864 struct c_typespec ret; 2865 tree attrs; 2866 tree ident = NULL_TREE; 2867 location_t struct_loc; 2868 location_t ident_loc = UNKNOWN_LOCATION; 2869 enum tree_code code; 2870 switch (c_parser_peek_token (parser)->keyword) 2871 { 2872 case RID_STRUCT: 2873 code = RECORD_TYPE; 2874 break; 2875 case RID_UNION: 2876 code = UNION_TYPE; 2877 break; 2878 default: 2879 gcc_unreachable (); 2880 } 2881 struct_loc = c_parser_peek_token (parser)->location; 2882 c_parser_consume_token (parser); 2883 attrs = c_parser_attributes (parser); 2884 2885 /* Set the location in case we create a decl now. */ 2886 c_parser_set_source_position_from_token (c_parser_peek_token (parser)); 2887 2888 if (c_parser_next_token_is (parser, CPP_NAME)) 2889 { 2890 ident = c_parser_peek_token (parser)->value; 2891 ident_loc = c_parser_peek_token (parser)->location; 2892 struct_loc = ident_loc; 2893 c_parser_consume_token (parser); 2894 } 2895 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE)) 2896 { 2897 /* Parse a struct or union definition. Start the scope of the 2898 tag before parsing components. */ 2899 struct c_struct_parse_info *struct_info; 2900 tree type = start_struct (struct_loc, code, ident, &struct_info); 2901 tree postfix_attrs; 2902 /* We chain the components in reverse order, then put them in 2903 forward order at the end. Each struct-declaration may 2904 declare multiple components (comma-separated), so we must use 2905 chainon to join them, although when parsing each 2906 struct-declaration we can use TREE_CHAIN directly. 2907 2908 The theory behind all this is that there will be more 2909 semicolon separated fields than comma separated fields, and 2910 so we'll be minimizing the number of node traversals required 2911 by chainon. */ 2912 tree contents; 2913 timevar_push (TV_PARSE_STRUCT); 2914 contents = NULL_TREE; 2915 c_parser_consume_token (parser); 2916 /* Handle the Objective-C @defs construct, 2917 e.g. foo(sizeof(struct{ @defs(ClassName) }));. */ 2918 if (c_parser_next_token_is_keyword (parser, RID_AT_DEFS)) 2919 { 2920 tree name; 2921 gcc_assert (c_dialect_objc ()); 2922 c_parser_consume_token (parser); 2923 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 2924 goto end_at_defs; 2925 if (c_parser_next_token_is (parser, CPP_NAME) 2926 && c_parser_peek_token (parser)->id_kind == C_ID_CLASSNAME) 2927 { 2928 name = c_parser_peek_token (parser)->value; 2929 c_parser_consume_token (parser); 2930 } 2931 else 2932 { 2933 c_parser_error (parser, "expected class name"); 2934 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL); 2935 goto end_at_defs; 2936 } 2937 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 2938 "expected %<)%>"); 2939 contents = nreverse (objc_get_class_ivars (name)); 2940 } 2941 end_at_defs: 2942 /* Parse the struct-declarations and semicolons. Problems with 2943 semicolons are diagnosed here; empty structures are diagnosed 2944 elsewhere. */ 2945 while (true) 2946 { 2947 tree decls; 2948 /* Parse any stray semicolon. */ 2949 if (c_parser_next_token_is (parser, CPP_SEMICOLON)) 2950 { 2951 pedwarn (c_parser_peek_token (parser)->location, OPT_Wpedantic, 2952 "extra semicolon in struct or union specified"); 2953 c_parser_consume_token (parser); 2954 continue; 2955 } 2956 /* Stop if at the end of the struct or union contents. */ 2957 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE)) 2958 { 2959 c_parser_consume_token (parser); 2960 break; 2961 } 2962 /* Accept #pragmas at struct scope. */ 2963 if (c_parser_next_token_is (parser, CPP_PRAGMA)) 2964 { 2965 c_parser_pragma (parser, pragma_struct, NULL); 2966 continue; 2967 } 2968 /* Parse some comma-separated declarations, but not the 2969 trailing semicolon if any. */ 2970 decls = c_parser_struct_declaration (parser); 2971 contents = chainon (decls, contents); 2972 /* If no semicolon follows, either we have a parse error or 2973 are at the end of the struct or union and should 2974 pedwarn. */ 2975 if (c_parser_next_token_is (parser, CPP_SEMICOLON)) 2976 c_parser_consume_token (parser); 2977 else 2978 { 2979 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE)) 2980 pedwarn (c_parser_peek_token (parser)->location, 0, 2981 "no semicolon at end of struct or union"); 2982 else if (parser->error 2983 || !c_parser_next_token_starts_declspecs (parser)) 2984 { 2985 c_parser_error (parser, "expected %<;%>"); 2986 c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL); 2987 break; 2988 } 2989 2990 /* If we come here, we have already emitted an error 2991 for an expected `;', identifier or `(', and we also 2992 recovered already. Go on with the next field. */ 2993 } 2994 } 2995 postfix_attrs = c_parser_attributes (parser); 2996 ret.spec = finish_struct (struct_loc, type, nreverse (contents), 2997 chainon (attrs, postfix_attrs), struct_info); 2998 ret.kind = ctsk_tagdef; 2999 ret.expr = NULL_TREE; 3000 ret.expr_const_operands = true; 3001 timevar_pop (TV_PARSE_STRUCT); 3002 return ret; 3003 } 3004 else if (!ident) 3005 { 3006 c_parser_error (parser, "expected %<{%>"); 3007 ret.spec = error_mark_node; 3008 ret.kind = ctsk_tagref; 3009 ret.expr = NULL_TREE; 3010 ret.expr_const_operands = true; 3011 return ret; 3012 } 3013 ret = parser_xref_tag (ident_loc, code, ident); 3014 return ret; 3015 } 3016 3017 /* Parse a struct-declaration (C90 6.5.2.1, C99 6.7.2.1, C11 6.7.2.1), 3018 *without* the trailing semicolon. 3019 3020 struct-declaration: 3021 specifier-qualifier-list struct-declarator-list 3022 static_assert-declaration-no-semi 3023 3024 specifier-qualifier-list: 3025 type-specifier specifier-qualifier-list[opt] 3026 type-qualifier specifier-qualifier-list[opt] 3027 attributes specifier-qualifier-list[opt] 3028 3029 struct-declarator-list: 3030 struct-declarator 3031 struct-declarator-list , attributes[opt] struct-declarator 3032 3033 struct-declarator: 3034 declarator attributes[opt] 3035 declarator[opt] : constant-expression attributes[opt] 3036 3037 GNU extensions: 3038 3039 struct-declaration: 3040 __extension__ struct-declaration 3041 specifier-qualifier-list 3042 3043 Unlike the ISO C syntax, semicolons are handled elsewhere. The use 3044 of attributes where shown is a GNU extension. In GNU C, we accept 3045 any expression without commas in the syntax (assignment 3046 expressions, not just conditional expressions); assignment 3047 expressions will be diagnosed as non-constant. */ 3048 3049 static tree 3050 c_parser_struct_declaration (c_parser *parser) 3051 { 3052 struct c_declspecs *specs; 3053 tree prefix_attrs; 3054 tree all_prefix_attrs; 3055 tree decls; 3056 location_t decl_loc; 3057 if (c_parser_next_token_is_keyword (parser, RID_EXTENSION)) 3058 { 3059 int ext; 3060 tree decl; 3061 ext = disable_extension_diagnostics (); 3062 c_parser_consume_token (parser); 3063 decl = c_parser_struct_declaration (parser); 3064 restore_extension_diagnostics (ext); 3065 return decl; 3066 } 3067 if (c_parser_next_token_is_keyword (parser, RID_STATIC_ASSERT)) 3068 { 3069 c_parser_static_assert_declaration_no_semi (parser); 3070 return NULL_TREE; 3071 } 3072 specs = build_null_declspecs (); 3073 decl_loc = c_parser_peek_token (parser)->location; 3074 /* Strictly by the standard, we shouldn't allow _Alignas here, 3075 but it appears to have been intended to allow it there, so 3076 we're keeping it as it is until WG14 reaches a conclusion 3077 of N1731. 3078 <http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1731.pdf> */ 3079 c_parser_declspecs (parser, specs, false, true, true, 3080 true, false, cla_nonabstract_decl); 3081 if (parser->error) 3082 return NULL_TREE; 3083 if (!specs->declspecs_seen_p) 3084 { 3085 c_parser_error (parser, "expected specifier-qualifier-list"); 3086 return NULL_TREE; 3087 } 3088 finish_declspecs (specs); 3089 if (c_parser_next_token_is (parser, CPP_SEMICOLON) 3090 || c_parser_next_token_is (parser, CPP_CLOSE_BRACE)) 3091 { 3092 tree ret; 3093 if (specs->typespec_kind == ctsk_none) 3094 { 3095 pedwarn (decl_loc, OPT_Wpedantic, 3096 "ISO C forbids member declarations with no members"); 3097 shadow_tag_warned (specs, pedantic); 3098 ret = NULL_TREE; 3099 } 3100 else 3101 { 3102 /* Support for unnamed structs or unions as members of 3103 structs or unions (which is [a] useful and [b] supports 3104 MS P-SDK). */ 3105 tree attrs = NULL; 3106 3107 ret = grokfield (c_parser_peek_token (parser)->location, 3108 build_id_declarator (NULL_TREE), specs, 3109 NULL_TREE, &attrs); 3110 if (ret) 3111 decl_attributes (&ret, attrs, 0); 3112 } 3113 return ret; 3114 } 3115 3116 /* Provide better error recovery. Note that a type name here is valid, 3117 and will be treated as a field name. */ 3118 if (specs->typespec_kind == ctsk_tagdef 3119 && TREE_CODE (specs->type) != ENUMERAL_TYPE 3120 && c_parser_next_token_starts_declspecs (parser) 3121 && !c_parser_next_token_is (parser, CPP_NAME)) 3122 { 3123 c_parser_error (parser, "expected %<;%>, identifier or %<(%>"); 3124 parser->error = false; 3125 return NULL_TREE; 3126 } 3127 3128 pending_xref_error (); 3129 prefix_attrs = specs->attrs; 3130 all_prefix_attrs = prefix_attrs; 3131 specs->attrs = NULL_TREE; 3132 decls = NULL_TREE; 3133 while (true) 3134 { 3135 /* Declaring one or more declarators or un-named bit-fields. */ 3136 struct c_declarator *declarator; 3137 bool dummy = false; 3138 if (c_parser_next_token_is (parser, CPP_COLON)) 3139 declarator = build_id_declarator (NULL_TREE); 3140 else 3141 declarator = c_parser_declarator (parser, 3142 specs->typespec_kind != ctsk_none, 3143 C_DTR_NORMAL, &dummy); 3144 if (declarator == NULL) 3145 { 3146 c_parser_skip_to_end_of_block_or_statement (parser); 3147 break; 3148 } 3149 if (c_parser_next_token_is (parser, CPP_COLON) 3150 || c_parser_next_token_is (parser, CPP_COMMA) 3151 || c_parser_next_token_is (parser, CPP_SEMICOLON) 3152 || c_parser_next_token_is (parser, CPP_CLOSE_BRACE) 3153 || c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE)) 3154 { 3155 tree postfix_attrs = NULL_TREE; 3156 tree width = NULL_TREE; 3157 tree d; 3158 if (c_parser_next_token_is (parser, CPP_COLON)) 3159 { 3160 c_parser_consume_token (parser); 3161 width = c_parser_expr_no_commas (parser, NULL).value; 3162 } 3163 if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE)) 3164 postfix_attrs = c_parser_attributes (parser); 3165 d = grokfield (c_parser_peek_token (parser)->location, 3166 declarator, specs, width, &all_prefix_attrs); 3167 decl_attributes (&d, chainon (postfix_attrs, 3168 all_prefix_attrs), 0); 3169 DECL_CHAIN (d) = decls; 3170 decls = d; 3171 if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE)) 3172 all_prefix_attrs = chainon (c_parser_attributes (parser), 3173 prefix_attrs); 3174 else 3175 all_prefix_attrs = prefix_attrs; 3176 if (c_parser_next_token_is (parser, CPP_COMMA)) 3177 c_parser_consume_token (parser); 3178 else if (c_parser_next_token_is (parser, CPP_SEMICOLON) 3179 || c_parser_next_token_is (parser, CPP_CLOSE_BRACE)) 3180 { 3181 /* Semicolon consumed in caller. */ 3182 break; 3183 } 3184 else 3185 { 3186 c_parser_error (parser, "expected %<,%>, %<;%> or %<}%>"); 3187 break; 3188 } 3189 } 3190 else 3191 { 3192 c_parser_error (parser, 3193 "expected %<:%>, %<,%>, %<;%>, %<}%> or " 3194 "%<__attribute__%>"); 3195 break; 3196 } 3197 } 3198 return decls; 3199 } 3200 3201 /* Parse a typeof specifier (a GNU extension). 3202 3203 typeof-specifier: 3204 typeof ( expression ) 3205 typeof ( type-name ) 3206 */ 3207 3208 static struct c_typespec 3209 c_parser_typeof_specifier (c_parser *parser) 3210 { 3211 struct c_typespec ret; 3212 ret.kind = ctsk_typeof; 3213 ret.spec = error_mark_node; 3214 ret.expr = NULL_TREE; 3215 ret.expr_const_operands = true; 3216 gcc_assert (c_parser_next_token_is_keyword (parser, RID_TYPEOF)); 3217 c_parser_consume_token (parser); 3218 c_inhibit_evaluation_warnings++; 3219 in_typeof++; 3220 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 3221 { 3222 c_inhibit_evaluation_warnings--; 3223 in_typeof--; 3224 return ret; 3225 } 3226 if (c_parser_next_tokens_start_typename (parser, cla_prefer_id)) 3227 { 3228 struct c_type_name *type = c_parser_type_name (parser); 3229 c_inhibit_evaluation_warnings--; 3230 in_typeof--; 3231 if (type != NULL) 3232 { 3233 ret.spec = groktypename (type, &ret.expr, &ret.expr_const_operands); 3234 pop_maybe_used (variably_modified_type_p (ret.spec, NULL_TREE)); 3235 } 3236 } 3237 else 3238 { 3239 bool was_vm; 3240 location_t here = c_parser_peek_token (parser)->location; 3241 struct c_expr expr = c_parser_expression (parser); 3242 c_inhibit_evaluation_warnings--; 3243 in_typeof--; 3244 if (TREE_CODE (expr.value) == COMPONENT_REF 3245 && DECL_C_BIT_FIELD (TREE_OPERAND (expr.value, 1))) 3246 error_at (here, "%<typeof%> applied to a bit-field"); 3247 mark_exp_read (expr.value); 3248 ret.spec = TREE_TYPE (expr.value); 3249 was_vm = variably_modified_type_p (ret.spec, NULL_TREE); 3250 /* This is returned with the type so that when the type is 3251 evaluated, this can be evaluated. */ 3252 if (was_vm) 3253 ret.expr = c_fully_fold (expr.value, false, &ret.expr_const_operands); 3254 pop_maybe_used (was_vm); 3255 /* For use in macros such as those in <stdatomic.h>, remove all 3256 qualifiers from atomic types. (const can be an issue for more macros 3257 using typeof than just the <stdatomic.h> ones.) */ 3258 if (ret.spec != error_mark_node && TYPE_ATOMIC (ret.spec)) 3259 ret.spec = c_build_qualified_type (ret.spec, TYPE_UNQUALIFIED); 3260 } 3261 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 3262 return ret; 3263 } 3264 3265 /* Parse an alignment-specifier. 3266 3267 C11 6.7.5: 3268 3269 alignment-specifier: 3270 _Alignas ( type-name ) 3271 _Alignas ( constant-expression ) 3272 */ 3273 3274 static tree 3275 c_parser_alignas_specifier (c_parser * parser) 3276 { 3277 tree ret = error_mark_node; 3278 location_t loc = c_parser_peek_token (parser)->location; 3279 gcc_assert (c_parser_next_token_is_keyword (parser, RID_ALIGNAS)); 3280 c_parser_consume_token (parser); 3281 if (flag_isoc99) 3282 pedwarn_c99 (loc, OPT_Wpedantic, 3283 "ISO C99 does not support %<_Alignas%>"); 3284 else 3285 pedwarn_c99 (loc, OPT_Wpedantic, 3286 "ISO C90 does not support %<_Alignas%>"); 3287 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 3288 return ret; 3289 if (c_parser_next_tokens_start_typename (parser, cla_prefer_id)) 3290 { 3291 struct c_type_name *type = c_parser_type_name (parser); 3292 if (type != NULL) 3293 ret = c_sizeof_or_alignof_type (loc, groktypename (type, NULL, NULL), 3294 false, true, 1); 3295 } 3296 else 3297 ret = c_parser_expr_no_commas (parser, NULL).value; 3298 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 3299 return ret; 3300 } 3301 3302 /* Parse a declarator, possibly an abstract declarator (C90 6.5.4, 3303 6.5.5, C99 6.7.5, 6.7.6, C11 6.7.6, 6.7.7). If TYPE_SEEN_P then 3304 a typedef name may be redeclared; otherwise it may not. KIND 3305 indicates which kind of declarator is wanted. Returns a valid 3306 declarator except in the case of a syntax error in which case NULL is 3307 returned. *SEEN_ID is set to true if an identifier being declared is 3308 seen; this is used to diagnose bad forms of abstract array declarators 3309 and to determine whether an identifier list is syntactically permitted. 3310 3311 declarator: 3312 pointer[opt] direct-declarator 3313 3314 direct-declarator: 3315 identifier 3316 ( attributes[opt] declarator ) 3317 direct-declarator array-declarator 3318 direct-declarator ( parameter-type-list ) 3319 direct-declarator ( identifier-list[opt] ) 3320 3321 pointer: 3322 * type-qualifier-list[opt] 3323 * type-qualifier-list[opt] pointer 3324 3325 type-qualifier-list: 3326 type-qualifier 3327 attributes 3328 type-qualifier-list type-qualifier 3329 type-qualifier-list attributes 3330 3331 array-declarator: 3332 [ type-qualifier-list[opt] assignment-expression[opt] ] 3333 [ static type-qualifier-list[opt] assignment-expression ] 3334 [ type-qualifier-list static assignment-expression ] 3335 [ type-qualifier-list[opt] * ] 3336 3337 parameter-type-list: 3338 parameter-list 3339 parameter-list , ... 3340 3341 parameter-list: 3342 parameter-declaration 3343 parameter-list , parameter-declaration 3344 3345 parameter-declaration: 3346 declaration-specifiers declarator attributes[opt] 3347 declaration-specifiers abstract-declarator[opt] attributes[opt] 3348 3349 identifier-list: 3350 identifier 3351 identifier-list , identifier 3352 3353 abstract-declarator: 3354 pointer 3355 pointer[opt] direct-abstract-declarator 3356 3357 direct-abstract-declarator: 3358 ( attributes[opt] abstract-declarator ) 3359 direct-abstract-declarator[opt] array-declarator 3360 direct-abstract-declarator[opt] ( parameter-type-list[opt] ) 3361 3362 GNU extensions: 3363 3364 direct-declarator: 3365 direct-declarator ( parameter-forward-declarations 3366 parameter-type-list[opt] ) 3367 3368 direct-abstract-declarator: 3369 direct-abstract-declarator[opt] ( parameter-forward-declarations 3370 parameter-type-list[opt] ) 3371 3372 parameter-forward-declarations: 3373 parameter-list ; 3374 parameter-forward-declarations parameter-list ; 3375 3376 The uses of attributes shown above are GNU extensions. 3377 3378 Some forms of array declarator are not included in C99 in the 3379 syntax for abstract declarators; these are disallowed elsewhere. 3380 This may be a defect (DR#289). 3381 3382 This function also accepts an omitted abstract declarator as being 3383 an abstract declarator, although not part of the formal syntax. */ 3384 3385 struct c_declarator * 3386 c_parser_declarator (c_parser *parser, bool type_seen_p, c_dtr_syn kind, 3387 bool *seen_id) 3388 { 3389 /* Parse any initial pointer part. */ 3390 if (c_parser_next_token_is (parser, CPP_MULT)) 3391 { 3392 struct c_declspecs *quals_attrs = build_null_declspecs (); 3393 struct c_declarator *inner; 3394 c_parser_consume_token (parser); 3395 c_parser_declspecs (parser, quals_attrs, false, false, true, 3396 false, false, cla_prefer_id); 3397 inner = c_parser_declarator (parser, type_seen_p, kind, seen_id); 3398 if (inner == NULL) 3399 return NULL; 3400 else 3401 return make_pointer_declarator (quals_attrs, inner); 3402 } 3403 /* Now we have a direct declarator, direct abstract declarator or 3404 nothing (which counts as a direct abstract declarator here). */ 3405 return c_parser_direct_declarator (parser, type_seen_p, kind, seen_id); 3406 } 3407 3408 /* Parse a direct declarator or direct abstract declarator; arguments 3409 as c_parser_declarator. */ 3410 3411 static struct c_declarator * 3412 c_parser_direct_declarator (c_parser *parser, bool type_seen_p, c_dtr_syn kind, 3413 bool *seen_id) 3414 { 3415 /* The direct declarator must start with an identifier (possibly 3416 omitted) or a parenthesized declarator (possibly abstract). In 3417 an ordinary declarator, initial parentheses must start a 3418 parenthesized declarator. In an abstract declarator or parameter 3419 declarator, they could start a parenthesized declarator or a 3420 parameter list. To tell which, the open parenthesis and any 3421 following attributes must be read. If a declaration specifier 3422 follows, then it is a parameter list; if the specifier is a 3423 typedef name, there might be an ambiguity about redeclaring it, 3424 which is resolved in the direction of treating it as a typedef 3425 name. If a close parenthesis follows, it is also an empty 3426 parameter list, as the syntax does not permit empty abstract 3427 declarators. Otherwise, it is a parenthesized declarator (in 3428 which case the analysis may be repeated inside it, recursively). 3429 3430 ??? There is an ambiguity in a parameter declaration "int 3431 (__attribute__((foo)) x)", where x is not a typedef name: it 3432 could be an abstract declarator for a function, or declare x with 3433 parentheses. The proper resolution of this ambiguity needs 3434 documenting. At present we follow an accident of the old 3435 parser's implementation, whereby the first parameter must have 3436 some declaration specifiers other than just attributes. Thus as 3437 a parameter declaration it is treated as a parenthesized 3438 parameter named x, and as an abstract declarator it is 3439 rejected. 3440 3441 ??? Also following the old parser, attributes inside an empty 3442 parameter list are ignored, making it a list not yielding a 3443 prototype, rather than giving an error or making it have one 3444 parameter with implicit type int. 3445 3446 ??? Also following the old parser, typedef names may be 3447 redeclared in declarators, but not Objective-C class names. */ 3448 3449 if (kind != C_DTR_ABSTRACT 3450 && c_parser_next_token_is (parser, CPP_NAME) 3451 && ((type_seen_p 3452 && (c_parser_peek_token (parser)->id_kind == C_ID_TYPENAME 3453 || c_parser_peek_token (parser)->id_kind == C_ID_CLASSNAME)) 3454 || c_parser_peek_token (parser)->id_kind == C_ID_ID)) 3455 { 3456 struct c_declarator *inner 3457 = build_id_declarator (c_parser_peek_token (parser)->value); 3458 *seen_id = true; 3459 inner->id_loc = c_parser_peek_token (parser)->location; 3460 c_parser_consume_token (parser); 3461 return c_parser_direct_declarator_inner (parser, *seen_id, inner); 3462 } 3463 3464 if (kind != C_DTR_NORMAL 3465 && c_parser_next_token_is (parser, CPP_OPEN_SQUARE)) 3466 { 3467 struct c_declarator *inner = build_id_declarator (NULL_TREE); 3468 inner->id_loc = c_parser_peek_token (parser)->location; 3469 return c_parser_direct_declarator_inner (parser, *seen_id, inner); 3470 } 3471 3472 /* Either we are at the end of an abstract declarator, or we have 3473 parentheses. */ 3474 3475 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)) 3476 { 3477 tree attrs; 3478 struct c_declarator *inner; 3479 c_parser_consume_token (parser); 3480 attrs = c_parser_attributes (parser); 3481 if (kind != C_DTR_NORMAL 3482 && (c_parser_next_token_starts_declspecs (parser) 3483 || c_parser_next_token_is (parser, CPP_CLOSE_PAREN))) 3484 { 3485 struct c_arg_info *args 3486 = c_parser_parms_declarator (parser, kind == C_DTR_NORMAL, 3487 attrs); 3488 if (args == NULL) 3489 return NULL; 3490 else 3491 { 3492 inner 3493 = build_function_declarator (args, 3494 build_id_declarator (NULL_TREE)); 3495 return c_parser_direct_declarator_inner (parser, *seen_id, 3496 inner); 3497 } 3498 } 3499 /* A parenthesized declarator. */ 3500 inner = c_parser_declarator (parser, type_seen_p, kind, seen_id); 3501 if (inner != NULL && attrs != NULL) 3502 inner = build_attrs_declarator (attrs, inner); 3503 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN)) 3504 { 3505 c_parser_consume_token (parser); 3506 if (inner == NULL) 3507 return NULL; 3508 else 3509 return c_parser_direct_declarator_inner (parser, *seen_id, inner); 3510 } 3511 else 3512 { 3513 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 3514 "expected %<)%>"); 3515 return NULL; 3516 } 3517 } 3518 else 3519 { 3520 if (kind == C_DTR_NORMAL) 3521 { 3522 c_parser_error (parser, "expected identifier or %<(%>"); 3523 return NULL; 3524 } 3525 else 3526 return build_id_declarator (NULL_TREE); 3527 } 3528 } 3529 3530 /* Parse part of a direct declarator or direct abstract declarator, 3531 given that some (in INNER) has already been parsed; ID_PRESENT is 3532 true if an identifier is present, false for an abstract 3533 declarator. */ 3534 3535 static struct c_declarator * 3536 c_parser_direct_declarator_inner (c_parser *parser, bool id_present, 3537 struct c_declarator *inner) 3538 { 3539 /* Parse a sequence of array declarators and parameter lists. */ 3540 if (c_parser_next_token_is (parser, CPP_OPEN_SQUARE)) 3541 { 3542 location_t brace_loc = c_parser_peek_token (parser)->location; 3543 struct c_declarator *declarator; 3544 struct c_declspecs *quals_attrs = build_null_declspecs (); 3545 bool static_seen; 3546 bool star_seen; 3547 struct c_expr dimen; 3548 dimen.value = NULL_TREE; 3549 dimen.original_code = ERROR_MARK; 3550 dimen.original_type = NULL_TREE; 3551 c_parser_consume_token (parser); 3552 c_parser_declspecs (parser, quals_attrs, false, false, true, 3553 false, false, cla_prefer_id); 3554 static_seen = c_parser_next_token_is_keyword (parser, RID_STATIC); 3555 if (static_seen) 3556 c_parser_consume_token (parser); 3557 if (static_seen && !quals_attrs->declspecs_seen_p) 3558 c_parser_declspecs (parser, quals_attrs, false, false, true, 3559 false, false, cla_prefer_id); 3560 if (!quals_attrs->declspecs_seen_p) 3561 quals_attrs = NULL; 3562 /* If "static" is present, there must be an array dimension. 3563 Otherwise, there may be a dimension, "*", or no 3564 dimension. */ 3565 if (static_seen) 3566 { 3567 star_seen = false; 3568 dimen = c_parser_expr_no_commas (parser, NULL); 3569 } 3570 else 3571 { 3572 if (c_parser_next_token_is (parser, CPP_CLOSE_SQUARE)) 3573 { 3574 dimen.value = NULL_TREE; 3575 star_seen = false; 3576 } 3577 else if (flag_cilkplus 3578 && c_parser_next_token_is (parser, CPP_COLON)) 3579 { 3580 dimen.value = error_mark_node; 3581 star_seen = false; 3582 error_at (c_parser_peek_token (parser)->location, 3583 "array notations cannot be used in declaration"); 3584 c_parser_consume_token (parser); 3585 } 3586 else if (c_parser_next_token_is (parser, CPP_MULT)) 3587 { 3588 if (c_parser_peek_2nd_token (parser)->type == CPP_CLOSE_SQUARE) 3589 { 3590 dimen.value = NULL_TREE; 3591 star_seen = true; 3592 c_parser_consume_token (parser); 3593 } 3594 else 3595 { 3596 star_seen = false; 3597 dimen = c_parser_expr_no_commas (parser, NULL); 3598 } 3599 } 3600 else 3601 { 3602 star_seen = false; 3603 dimen = c_parser_expr_no_commas (parser, NULL); 3604 } 3605 } 3606 if (c_parser_next_token_is (parser, CPP_CLOSE_SQUARE)) 3607 c_parser_consume_token (parser); 3608 else if (flag_cilkplus 3609 && c_parser_next_token_is (parser, CPP_COLON)) 3610 { 3611 error_at (c_parser_peek_token (parser)->location, 3612 "array notations cannot be used in declaration"); 3613 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, NULL); 3614 return NULL; 3615 } 3616 else 3617 { 3618 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, 3619 "expected %<]%>"); 3620 return NULL; 3621 } 3622 if (dimen.value) 3623 dimen = convert_lvalue_to_rvalue (brace_loc, dimen, true, true); 3624 declarator = build_array_declarator (brace_loc, dimen.value, quals_attrs, 3625 static_seen, star_seen); 3626 if (declarator == NULL) 3627 return NULL; 3628 inner = set_array_declarator_inner (declarator, inner); 3629 return c_parser_direct_declarator_inner (parser, id_present, inner); 3630 } 3631 else if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)) 3632 { 3633 tree attrs; 3634 struct c_arg_info *args; 3635 c_parser_consume_token (parser); 3636 attrs = c_parser_attributes (parser); 3637 args = c_parser_parms_declarator (parser, id_present, attrs); 3638 if (args == NULL) 3639 return NULL; 3640 else 3641 { 3642 inner = build_function_declarator (args, inner); 3643 return c_parser_direct_declarator_inner (parser, id_present, inner); 3644 } 3645 } 3646 return inner; 3647 } 3648 3649 /* Parse a parameter list or identifier list, including the closing 3650 parenthesis but not the opening one. ATTRS are the attributes at 3651 the start of the list. ID_LIST_OK is true if an identifier list is 3652 acceptable; such a list must not have attributes at the start. */ 3653 3654 static struct c_arg_info * 3655 c_parser_parms_declarator (c_parser *parser, bool id_list_ok, tree attrs) 3656 { 3657 push_scope (); 3658 declare_parm_level (); 3659 /* If the list starts with an identifier, it is an identifier list. 3660 Otherwise, it is either a prototype list or an empty list. */ 3661 if (id_list_ok 3662 && !attrs 3663 && c_parser_next_token_is (parser, CPP_NAME) 3664 && c_parser_peek_token (parser)->id_kind == C_ID_ID 3665 3666 /* Look ahead to detect typos in type names. */ 3667 && c_parser_peek_2nd_token (parser)->type != CPP_NAME 3668 && c_parser_peek_2nd_token (parser)->type != CPP_MULT 3669 && c_parser_peek_2nd_token (parser)->type != CPP_OPEN_PAREN 3670 && c_parser_peek_2nd_token (parser)->type != CPP_OPEN_SQUARE 3671 && c_parser_peek_2nd_token (parser)->type != CPP_KEYWORD) 3672 { 3673 tree list = NULL_TREE, *nextp = &list; 3674 while (c_parser_next_token_is (parser, CPP_NAME) 3675 && c_parser_peek_token (parser)->id_kind == C_ID_ID) 3676 { 3677 *nextp = build_tree_list (NULL_TREE, 3678 c_parser_peek_token (parser)->value); 3679 nextp = & TREE_CHAIN (*nextp); 3680 c_parser_consume_token (parser); 3681 if (c_parser_next_token_is_not (parser, CPP_COMMA)) 3682 break; 3683 c_parser_consume_token (parser); 3684 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN)) 3685 { 3686 c_parser_error (parser, "expected identifier"); 3687 break; 3688 } 3689 } 3690 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN)) 3691 { 3692 struct c_arg_info *ret = build_arg_info (); 3693 ret->types = list; 3694 c_parser_consume_token (parser); 3695 pop_scope (); 3696 return ret; 3697 } 3698 else 3699 { 3700 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 3701 "expected %<)%>"); 3702 pop_scope (); 3703 return NULL; 3704 } 3705 } 3706 else 3707 { 3708 struct c_arg_info *ret = c_parser_parms_list_declarator (parser, attrs, 3709 NULL); 3710 pop_scope (); 3711 return ret; 3712 } 3713 } 3714 3715 /* Parse a parameter list (possibly empty), including the closing 3716 parenthesis but not the opening one. ATTRS are the attributes at 3717 the start of the list. EXPR is NULL or an expression that needs to 3718 be evaluated for the side effects of array size expressions in the 3719 parameters. */ 3720 3721 static struct c_arg_info * 3722 c_parser_parms_list_declarator (c_parser *parser, tree attrs, tree expr) 3723 { 3724 bool bad_parm = false; 3725 3726 /* ??? Following the old parser, forward parameter declarations may 3727 use abstract declarators, and if no real parameter declarations 3728 follow the forward declarations then this is not diagnosed. Also 3729 note as above that attributes are ignored as the only contents of 3730 the parentheses, or as the only contents after forward 3731 declarations. */ 3732 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN)) 3733 { 3734 struct c_arg_info *ret = build_arg_info (); 3735 c_parser_consume_token (parser); 3736 return ret; 3737 } 3738 if (c_parser_next_token_is (parser, CPP_ELLIPSIS)) 3739 { 3740 struct c_arg_info *ret = build_arg_info (); 3741 3742 if (flag_allow_parameterless_variadic_functions) 3743 { 3744 /* F (...) is allowed. */ 3745 ret->types = NULL_TREE; 3746 } 3747 else 3748 { 3749 /* Suppress -Wold-style-definition for this case. */ 3750 ret->types = error_mark_node; 3751 error_at (c_parser_peek_token (parser)->location, 3752 "ISO C requires a named argument before %<...%>"); 3753 } 3754 c_parser_consume_token (parser); 3755 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN)) 3756 { 3757 c_parser_consume_token (parser); 3758 return ret; 3759 } 3760 else 3761 { 3762 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 3763 "expected %<)%>"); 3764 return NULL; 3765 } 3766 } 3767 /* Nonempty list of parameters, either terminated with semicolon 3768 (forward declarations; recurse) or with close parenthesis (normal 3769 function) or with ", ... )" (variadic function). */ 3770 while (true) 3771 { 3772 /* Parse a parameter. */ 3773 struct c_parm *parm = c_parser_parameter_declaration (parser, attrs); 3774 attrs = NULL_TREE; 3775 if (parm == NULL) 3776 bad_parm = true; 3777 else 3778 push_parm_decl (parm, &expr); 3779 if (c_parser_next_token_is (parser, CPP_SEMICOLON)) 3780 { 3781 tree new_attrs; 3782 c_parser_consume_token (parser); 3783 mark_forward_parm_decls (); 3784 new_attrs = c_parser_attributes (parser); 3785 return c_parser_parms_list_declarator (parser, new_attrs, expr); 3786 } 3787 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN)) 3788 { 3789 c_parser_consume_token (parser); 3790 if (bad_parm) 3791 return NULL; 3792 else 3793 return get_parm_info (false, expr); 3794 } 3795 if (!c_parser_require (parser, CPP_COMMA, 3796 "expected %<;%>, %<,%> or %<)%>")) 3797 { 3798 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL); 3799 return NULL; 3800 } 3801 if (c_parser_next_token_is (parser, CPP_ELLIPSIS)) 3802 { 3803 c_parser_consume_token (parser); 3804 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN)) 3805 { 3806 c_parser_consume_token (parser); 3807 if (bad_parm) 3808 return NULL; 3809 else 3810 return get_parm_info (true, expr); 3811 } 3812 else 3813 { 3814 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 3815 "expected %<)%>"); 3816 return NULL; 3817 } 3818 } 3819 } 3820 } 3821 3822 /* Parse a parameter declaration. ATTRS are the attributes at the 3823 start of the declaration if it is the first parameter. */ 3824 3825 static struct c_parm * 3826 c_parser_parameter_declaration (c_parser *parser, tree attrs) 3827 { 3828 struct c_declspecs *specs; 3829 struct c_declarator *declarator; 3830 tree prefix_attrs; 3831 tree postfix_attrs = NULL_TREE; 3832 bool dummy = false; 3833 3834 /* Accept #pragmas between parameter declarations. */ 3835 while (c_parser_next_token_is (parser, CPP_PRAGMA)) 3836 c_parser_pragma (parser, pragma_param, NULL); 3837 3838 if (!c_parser_next_token_starts_declspecs (parser)) 3839 { 3840 c_token *token = c_parser_peek_token (parser); 3841 if (parser->error) 3842 return NULL; 3843 c_parser_set_source_position_from_token (token); 3844 if (c_parser_next_tokens_start_typename (parser, cla_prefer_type)) 3845 { 3846 const char *hint = lookup_name_fuzzy (token->value, 3847 FUZZY_LOOKUP_TYPENAME); 3848 if (hint) 3849 { 3850 gcc_rich_location richloc (token->location); 3851 richloc.add_fixit_replace (hint); 3852 error_at_rich_loc (&richloc, 3853 "unknown type name %qE; did you mean %qs?", 3854 token->value, hint); 3855 } 3856 else 3857 error_at (token->location, "unknown type name %qE", token->value); 3858 parser->error = true; 3859 } 3860 /* ??? In some Objective-C cases '...' isn't applicable so there 3861 should be a different message. */ 3862 else 3863 c_parser_error (parser, 3864 "expected declaration specifiers or %<...%>"); 3865 c_parser_skip_to_end_of_parameter (parser); 3866 return NULL; 3867 } 3868 specs = build_null_declspecs (); 3869 if (attrs) 3870 { 3871 declspecs_add_attrs (input_location, specs, attrs); 3872 attrs = NULL_TREE; 3873 } 3874 c_parser_declspecs (parser, specs, true, true, true, true, false, 3875 cla_nonabstract_decl); 3876 finish_declspecs (specs); 3877 pending_xref_error (); 3878 prefix_attrs = specs->attrs; 3879 specs->attrs = NULL_TREE; 3880 declarator = c_parser_declarator (parser, 3881 specs->typespec_kind != ctsk_none, 3882 C_DTR_PARM, &dummy); 3883 if (declarator == NULL) 3884 { 3885 c_parser_skip_until_found (parser, CPP_COMMA, NULL); 3886 return NULL; 3887 } 3888 if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE)) 3889 postfix_attrs = c_parser_attributes (parser); 3890 return build_c_parm (specs, chainon (postfix_attrs, prefix_attrs), 3891 declarator); 3892 } 3893 3894 /* Parse a string literal in an asm expression. It should not be 3895 translated, and wide string literals are an error although 3896 permitted by the syntax. This is a GNU extension. 3897 3898 asm-string-literal: 3899 string-literal 3900 3901 ??? At present, following the old parser, the caller needs to have 3902 set lex_untranslated_string to 1. It would be better to follow the 3903 C++ parser rather than using this kludge. */ 3904 3905 static tree 3906 c_parser_asm_string_literal (c_parser *parser) 3907 { 3908 tree str; 3909 int save_flag = warn_overlength_strings; 3910 warn_overlength_strings = 0; 3911 if (c_parser_next_token_is (parser, CPP_STRING)) 3912 { 3913 str = c_parser_peek_token (parser)->value; 3914 c_parser_consume_token (parser); 3915 } 3916 else if (c_parser_next_token_is (parser, CPP_WSTRING)) 3917 { 3918 error_at (c_parser_peek_token (parser)->location, 3919 "wide string literal in %<asm%>"); 3920 str = build_string (1, ""); 3921 c_parser_consume_token (parser); 3922 } 3923 else 3924 { 3925 c_parser_error (parser, "expected string literal"); 3926 str = NULL_TREE; 3927 } 3928 warn_overlength_strings = save_flag; 3929 return str; 3930 } 3931 3932 /* Parse a simple asm expression. This is used in restricted 3933 contexts, where a full expression with inputs and outputs does not 3934 make sense. This is a GNU extension. 3935 3936 simple-asm-expr: 3937 asm ( asm-string-literal ) 3938 */ 3939 3940 static tree 3941 c_parser_simple_asm_expr (c_parser *parser) 3942 { 3943 tree str; 3944 gcc_assert (c_parser_next_token_is_keyword (parser, RID_ASM)); 3945 /* ??? Follow the C++ parser rather than using the 3946 lex_untranslated_string kludge. */ 3947 parser->lex_untranslated_string = true; 3948 c_parser_consume_token (parser); 3949 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 3950 { 3951 parser->lex_untranslated_string = false; 3952 return NULL_TREE; 3953 } 3954 str = c_parser_asm_string_literal (parser); 3955 parser->lex_untranslated_string = false; 3956 if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>")) 3957 { 3958 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL); 3959 return NULL_TREE; 3960 } 3961 return str; 3962 } 3963 3964 static tree 3965 c_parser_attribute_any_word (c_parser *parser) 3966 { 3967 tree attr_name = NULL_TREE; 3968 3969 if (c_parser_next_token_is (parser, CPP_KEYWORD)) 3970 { 3971 /* ??? See comment above about what keywords are accepted here. */ 3972 bool ok; 3973 switch (c_parser_peek_token (parser)->keyword) 3974 { 3975 case RID_STATIC: 3976 case RID_UNSIGNED: 3977 case RID_LONG: 3978 case RID_CONST: 3979 case RID_EXTERN: 3980 case RID_REGISTER: 3981 case RID_TYPEDEF: 3982 case RID_SHORT: 3983 case RID_INLINE: 3984 case RID_NORETURN: 3985 case RID_VOLATILE: 3986 case RID_SIGNED: 3987 case RID_AUTO: 3988 case RID_RESTRICT: 3989 case RID_COMPLEX: 3990 case RID_THREAD: 3991 case RID_INT: 3992 case RID_CHAR: 3993 case RID_FLOAT: 3994 case RID_DOUBLE: 3995 case RID_VOID: 3996 case RID_DFLOAT32: 3997 case RID_DFLOAT64: 3998 case RID_DFLOAT128: 3999 CASE_RID_FLOATN_NX: 4000 case RID_BOOL: 4001 case RID_FRACT: 4002 case RID_ACCUM: 4003 case RID_SAT: 4004 case RID_TRANSACTION_ATOMIC: 4005 case RID_TRANSACTION_CANCEL: 4006 case RID_ATOMIC: 4007 case RID_AUTO_TYPE: 4008 case RID_INT_N_0: 4009 case RID_INT_N_1: 4010 case RID_INT_N_2: 4011 case RID_INT_N_3: 4012 ok = true; 4013 break; 4014 default: 4015 ok = false; 4016 break; 4017 } 4018 if (!ok) 4019 return NULL_TREE; 4020 4021 /* Accept __attribute__((__const)) as __attribute__((const)) etc. */ 4022 attr_name = ridpointers[(int) c_parser_peek_token (parser)->keyword]; 4023 } 4024 else if (c_parser_next_token_is (parser, CPP_NAME)) 4025 attr_name = c_parser_peek_token (parser)->value; 4026 4027 return attr_name; 4028 } 4029 4030 #define CILK_SIMD_FN_CLAUSE_MASK \ 4031 ((OMP_CLAUSE_MASK_1 << PRAGMA_CILK_CLAUSE_VECTORLENGTH) \ 4032 | (OMP_CLAUSE_MASK_1 << PRAGMA_CILK_CLAUSE_LINEAR) \ 4033 | (OMP_CLAUSE_MASK_1 << PRAGMA_CILK_CLAUSE_UNIFORM) \ 4034 | (OMP_CLAUSE_MASK_1 << PRAGMA_CILK_CLAUSE_MASK) \ 4035 | (OMP_CLAUSE_MASK_1 << PRAGMA_CILK_CLAUSE_NOMASK)) 4036 4037 /* Parses the vector attribute of SIMD enabled functions in Cilk Plus. 4038 VEC_TOKEN is the "vector" token that is replaced with "simd" and 4039 pushed into the token list. 4040 Syntax: 4041 vector 4042 vector (<vector attributes>). */ 4043 4044 static void 4045 c_parser_cilk_simd_fn_vector_attrs (c_parser *parser, c_token vec_token) 4046 { 4047 gcc_assert (is_cilkplus_vector_p (vec_token.value)); 4048 4049 int paren_scope = 0; 4050 vec_safe_push (parser->cilk_simd_fn_tokens, vec_token); 4051 /* Consume the "vector" token. */ 4052 c_parser_consume_token (parser); 4053 4054 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)) 4055 { 4056 c_parser_consume_token (parser); 4057 paren_scope++; 4058 } 4059 while (paren_scope > 0) 4060 { 4061 c_token *token = c_parser_peek_token (parser); 4062 if (token->type == CPP_OPEN_PAREN) 4063 paren_scope++; 4064 else if (token->type == CPP_CLOSE_PAREN) 4065 paren_scope--; 4066 /* Do not push the last ')' since we are not pushing the '('. */ 4067 if (!(token->type == CPP_CLOSE_PAREN && paren_scope == 0)) 4068 vec_safe_push (parser->cilk_simd_fn_tokens, *token); 4069 c_parser_consume_token (parser); 4070 } 4071 4072 /* Since we are converting an attribute to a pragma, we need to end the 4073 attribute with PRAGMA_EOL. */ 4074 c_token eol_token; 4075 memset (&eol_token, 0, sizeof (eol_token)); 4076 eol_token.type = CPP_PRAGMA_EOL; 4077 vec_safe_push (parser->cilk_simd_fn_tokens, eol_token); 4078 } 4079 4080 /* Add 2 CPP_EOF at the end of PARSER->ELEM_FN_TOKENS vector. */ 4081 4082 static void 4083 c_finish_cilk_simd_fn_tokens (c_parser *parser) 4084 { 4085 c_token last_token = parser->cilk_simd_fn_tokens->last (); 4086 4087 /* c_parser_attributes is called in several places, so if these EOF 4088 tokens are already inserted, then don't do them again. */ 4089 if (last_token.type == CPP_EOF) 4090 return; 4091 4092 /* Two CPP_EOF token are added as a safety net since the normal C 4093 front-end has two token look-ahead. */ 4094 c_token eof_token; 4095 eof_token.type = CPP_EOF; 4096 vec_safe_push (parser->cilk_simd_fn_tokens, eof_token); 4097 vec_safe_push (parser->cilk_simd_fn_tokens, eof_token); 4098 } 4099 4100 /* Parse (possibly empty) attributes. This is a GNU extension. 4101 4102 attributes: 4103 empty 4104 attributes attribute 4105 4106 attribute: 4107 __attribute__ ( ( attribute-list ) ) 4108 4109 attribute-list: 4110 attrib 4111 attribute_list , attrib 4112 4113 attrib: 4114 empty 4115 any-word 4116 any-word ( identifier ) 4117 any-word ( identifier , nonempty-expr-list ) 4118 any-word ( expr-list ) 4119 4120 where the "identifier" must not be declared as a type, and 4121 "any-word" may be any identifier (including one declared as a 4122 type), a reserved word storage class specifier, type specifier or 4123 type qualifier. ??? This still leaves out most reserved keywords 4124 (following the old parser), shouldn't we include them, and why not 4125 allow identifiers declared as types to start the arguments? */ 4126 4127 static tree 4128 c_parser_attributes (c_parser *parser) 4129 { 4130 tree attrs = NULL_TREE; 4131 while (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE)) 4132 { 4133 /* ??? Follow the C++ parser rather than using the 4134 lex_untranslated_string kludge. */ 4135 parser->lex_untranslated_string = true; 4136 /* Consume the `__attribute__' keyword. */ 4137 c_parser_consume_token (parser); 4138 /* Look for the two `(' tokens. */ 4139 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 4140 { 4141 parser->lex_untranslated_string = false; 4142 return attrs; 4143 } 4144 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 4145 { 4146 parser->lex_untranslated_string = false; 4147 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL); 4148 return attrs; 4149 } 4150 /* Parse the attribute list. */ 4151 while (c_parser_next_token_is (parser, CPP_COMMA) 4152 || c_parser_next_token_is (parser, CPP_NAME) 4153 || c_parser_next_token_is (parser, CPP_KEYWORD)) 4154 { 4155 tree attr, attr_name, attr_args; 4156 vec<tree, va_gc> *expr_list; 4157 if (c_parser_next_token_is (parser, CPP_COMMA)) 4158 { 4159 c_parser_consume_token (parser); 4160 continue; 4161 } 4162 4163 attr_name = c_parser_attribute_any_word (parser); 4164 if (attr_name == NULL) 4165 break; 4166 if (is_cilkplus_vector_p (attr_name)) 4167 { 4168 c_token *v_token = c_parser_peek_token (parser); 4169 c_parser_cilk_simd_fn_vector_attrs (parser, *v_token); 4170 /* If the next token isn't a comma, we're done. */ 4171 if (!c_parser_next_token_is (parser, CPP_COMMA)) 4172 break; 4173 continue; 4174 } 4175 c_parser_consume_token (parser); 4176 if (c_parser_next_token_is_not (parser, CPP_OPEN_PAREN)) 4177 { 4178 attr = build_tree_list (attr_name, NULL_TREE); 4179 /* Add this attribute to the list. */ 4180 attrs = chainon (attrs, attr); 4181 /* If the next token isn't a comma, we're done. */ 4182 if (!c_parser_next_token_is (parser, CPP_COMMA)) 4183 break; 4184 continue; 4185 } 4186 c_parser_consume_token (parser); 4187 /* Parse the attribute contents. If they start with an 4188 identifier which is followed by a comma or close 4189 parenthesis, then the arguments start with that 4190 identifier; otherwise they are an expression list. 4191 In objective-c the identifier may be a classname. */ 4192 if (c_parser_next_token_is (parser, CPP_NAME) 4193 && (c_parser_peek_token (parser)->id_kind == C_ID_ID 4194 || (c_dialect_objc () 4195 && c_parser_peek_token (parser)->id_kind 4196 == C_ID_CLASSNAME)) 4197 && ((c_parser_peek_2nd_token (parser)->type == CPP_COMMA) 4198 || (c_parser_peek_2nd_token (parser)->type 4199 == CPP_CLOSE_PAREN)) 4200 && (attribute_takes_identifier_p (attr_name) 4201 || (c_dialect_objc () 4202 && c_parser_peek_token (parser)->id_kind 4203 == C_ID_CLASSNAME))) 4204 { 4205 tree arg1 = c_parser_peek_token (parser)->value; 4206 c_parser_consume_token (parser); 4207 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN)) 4208 attr_args = build_tree_list (NULL_TREE, arg1); 4209 else 4210 { 4211 tree tree_list; 4212 c_parser_consume_token (parser); 4213 expr_list = c_parser_expr_list (parser, false, true, 4214 NULL, NULL, NULL, NULL); 4215 tree_list = build_tree_list_vec (expr_list); 4216 attr_args = tree_cons (NULL_TREE, arg1, tree_list); 4217 release_tree_vector (expr_list); 4218 } 4219 } 4220 else 4221 { 4222 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN)) 4223 attr_args = NULL_TREE; 4224 else 4225 { 4226 expr_list = c_parser_expr_list (parser, false, true, 4227 NULL, NULL, NULL, NULL); 4228 attr_args = build_tree_list_vec (expr_list); 4229 release_tree_vector (expr_list); 4230 } 4231 } 4232 attr = build_tree_list (attr_name, attr_args); 4233 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN)) 4234 c_parser_consume_token (parser); 4235 else 4236 { 4237 parser->lex_untranslated_string = false; 4238 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 4239 "expected %<)%>"); 4240 return attrs; 4241 } 4242 /* Add this attribute to the list. */ 4243 attrs = chainon (attrs, attr); 4244 /* If the next token isn't a comma, we're done. */ 4245 if (!c_parser_next_token_is (parser, CPP_COMMA)) 4246 break; 4247 } 4248 /* Look for the two `)' tokens. */ 4249 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN)) 4250 c_parser_consume_token (parser); 4251 else 4252 { 4253 parser->lex_untranslated_string = false; 4254 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 4255 "expected %<)%>"); 4256 return attrs; 4257 } 4258 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN)) 4259 c_parser_consume_token (parser); 4260 else 4261 { 4262 parser->lex_untranslated_string = false; 4263 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 4264 "expected %<)%>"); 4265 return attrs; 4266 } 4267 parser->lex_untranslated_string = false; 4268 } 4269 4270 if (flag_cilkplus && !vec_safe_is_empty (parser->cilk_simd_fn_tokens)) 4271 c_finish_cilk_simd_fn_tokens (parser); 4272 return attrs; 4273 } 4274 4275 /* Parse a type name (C90 6.5.5, C99 6.7.6, C11 6.7.7). 4276 4277 type-name: 4278 specifier-qualifier-list abstract-declarator[opt] 4279 */ 4280 4281 struct c_type_name * 4282 c_parser_type_name (c_parser *parser) 4283 { 4284 struct c_declspecs *specs = build_null_declspecs (); 4285 struct c_declarator *declarator; 4286 struct c_type_name *ret; 4287 bool dummy = false; 4288 c_parser_declspecs (parser, specs, false, true, true, false, false, 4289 cla_prefer_type); 4290 if (!specs->declspecs_seen_p) 4291 { 4292 c_parser_error (parser, "expected specifier-qualifier-list"); 4293 return NULL; 4294 } 4295 if (specs->type != error_mark_node) 4296 { 4297 pending_xref_error (); 4298 finish_declspecs (specs); 4299 } 4300 declarator = c_parser_declarator (parser, 4301 specs->typespec_kind != ctsk_none, 4302 C_DTR_ABSTRACT, &dummy); 4303 if (declarator == NULL) 4304 return NULL; 4305 ret = XOBNEW (&parser_obstack, struct c_type_name); 4306 ret->specs = specs; 4307 ret->declarator = declarator; 4308 return ret; 4309 } 4310 4311 /* Parse an initializer (C90 6.5.7, C99 6.7.8, C11 6.7.9). 4312 4313 initializer: 4314 assignment-expression 4315 { initializer-list } 4316 { initializer-list , } 4317 4318 initializer-list: 4319 designation[opt] initializer 4320 initializer-list , designation[opt] initializer 4321 4322 designation: 4323 designator-list = 4324 4325 designator-list: 4326 designator 4327 designator-list designator 4328 4329 designator: 4330 array-designator 4331 . identifier 4332 4333 array-designator: 4334 [ constant-expression ] 4335 4336 GNU extensions: 4337 4338 initializer: 4339 { } 4340 4341 designation: 4342 array-designator 4343 identifier : 4344 4345 array-designator: 4346 [ constant-expression ... constant-expression ] 4347 4348 Any expression without commas is accepted in the syntax for the 4349 constant-expressions, with non-constant expressions rejected later. 4350 4351 This function is only used for top-level initializers; for nested 4352 ones, see c_parser_initval. */ 4353 4354 static struct c_expr 4355 c_parser_initializer (c_parser *parser) 4356 { 4357 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE)) 4358 return c_parser_braced_init (parser, NULL_TREE, false, NULL); 4359 else 4360 { 4361 struct c_expr ret; 4362 location_t loc = c_parser_peek_token (parser)->location; 4363 ret = c_parser_expr_no_commas (parser, NULL); 4364 if (TREE_CODE (ret.value) != STRING_CST 4365 && TREE_CODE (ret.value) != COMPOUND_LITERAL_EXPR) 4366 ret = convert_lvalue_to_rvalue (loc, ret, true, true); 4367 return ret; 4368 } 4369 } 4370 4371 /* The location of the last comma within the current initializer list, 4372 or UNKNOWN_LOCATION if not within one. */ 4373 4374 location_t last_init_list_comma; 4375 4376 /* Parse a braced initializer list. TYPE is the type specified for a 4377 compound literal, and NULL_TREE for other initializers and for 4378 nested braced lists. NESTED_P is true for nested braced lists, 4379 false for the list of a compound literal or the list that is the 4380 top-level initializer in a declaration. */ 4381 4382 static struct c_expr 4383 c_parser_braced_init (c_parser *parser, tree type, bool nested_p, 4384 struct obstack *outer_obstack) 4385 { 4386 struct c_expr ret; 4387 struct obstack braced_init_obstack; 4388 location_t brace_loc = c_parser_peek_token (parser)->location; 4389 gcc_obstack_init (&braced_init_obstack); 4390 gcc_assert (c_parser_next_token_is (parser, CPP_OPEN_BRACE)); 4391 c_parser_consume_token (parser); 4392 if (nested_p) 4393 { 4394 finish_implicit_inits (brace_loc, outer_obstack); 4395 push_init_level (brace_loc, 0, &braced_init_obstack); 4396 } 4397 else 4398 really_start_incremental_init (type); 4399 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE)) 4400 { 4401 pedwarn (brace_loc, OPT_Wpedantic, "ISO C forbids empty initializer braces"); 4402 } 4403 else 4404 { 4405 /* Parse a non-empty initializer list, possibly with a trailing 4406 comma. */ 4407 while (true) 4408 { 4409 c_parser_initelt (parser, &braced_init_obstack); 4410 if (parser->error) 4411 break; 4412 if (c_parser_next_token_is (parser, CPP_COMMA)) 4413 { 4414 last_init_list_comma = c_parser_peek_token (parser)->location; 4415 c_parser_consume_token (parser); 4416 } 4417 else 4418 break; 4419 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE)) 4420 break; 4421 } 4422 } 4423 c_token *next_tok = c_parser_peek_token (parser); 4424 if (next_tok->type != CPP_CLOSE_BRACE) 4425 { 4426 ret.value = error_mark_node; 4427 ret.original_code = ERROR_MARK; 4428 ret.original_type = NULL; 4429 c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, "expected %<}%>"); 4430 pop_init_level (brace_loc, 0, &braced_init_obstack, last_init_list_comma); 4431 obstack_free (&braced_init_obstack, NULL); 4432 return ret; 4433 } 4434 location_t close_loc = next_tok->location; 4435 c_parser_consume_token (parser); 4436 ret = pop_init_level (brace_loc, 0, &braced_init_obstack, close_loc); 4437 obstack_free (&braced_init_obstack, NULL); 4438 set_c_expr_source_range (&ret, brace_loc, close_loc); 4439 return ret; 4440 } 4441 4442 /* Parse a nested initializer, including designators. */ 4443 4444 static void 4445 c_parser_initelt (c_parser *parser, struct obstack * braced_init_obstack) 4446 { 4447 /* Parse any designator or designator list. A single array 4448 designator may have the subsequent "=" omitted in GNU C, but a 4449 longer list or a structure member designator may not. */ 4450 if (c_parser_next_token_is (parser, CPP_NAME) 4451 && c_parser_peek_2nd_token (parser)->type == CPP_COLON) 4452 { 4453 /* Old-style structure member designator. */ 4454 set_init_label (c_parser_peek_token (parser)->location, 4455 c_parser_peek_token (parser)->value, 4456 c_parser_peek_token (parser)->location, 4457 braced_init_obstack); 4458 /* Use the colon as the error location. */ 4459 pedwarn (c_parser_peek_2nd_token (parser)->location, OPT_Wpedantic, 4460 "obsolete use of designated initializer with %<:%>"); 4461 c_parser_consume_token (parser); 4462 c_parser_consume_token (parser); 4463 } 4464 else 4465 { 4466 /* des_seen is 0 if there have been no designators, 1 if there 4467 has been a single array designator and 2 otherwise. */ 4468 int des_seen = 0; 4469 /* Location of a designator. */ 4470 location_t des_loc = UNKNOWN_LOCATION; /* Quiet warning. */ 4471 while (c_parser_next_token_is (parser, CPP_OPEN_SQUARE) 4472 || c_parser_next_token_is (parser, CPP_DOT)) 4473 { 4474 int des_prev = des_seen; 4475 if (!des_seen) 4476 des_loc = c_parser_peek_token (parser)->location; 4477 if (des_seen < 2) 4478 des_seen++; 4479 if (c_parser_next_token_is (parser, CPP_DOT)) 4480 { 4481 des_seen = 2; 4482 c_parser_consume_token (parser); 4483 if (c_parser_next_token_is (parser, CPP_NAME)) 4484 { 4485 set_init_label (des_loc, c_parser_peek_token (parser)->value, 4486 c_parser_peek_token (parser)->location, 4487 braced_init_obstack); 4488 c_parser_consume_token (parser); 4489 } 4490 else 4491 { 4492 struct c_expr init; 4493 init.value = error_mark_node; 4494 init.original_code = ERROR_MARK; 4495 init.original_type = NULL; 4496 c_parser_error (parser, "expected identifier"); 4497 c_parser_skip_until_found (parser, CPP_COMMA, NULL); 4498 process_init_element (input_location, init, false, 4499 braced_init_obstack); 4500 return; 4501 } 4502 } 4503 else 4504 { 4505 tree first, second; 4506 location_t ellipsis_loc = UNKNOWN_LOCATION; /* Quiet warning. */ 4507 location_t array_index_loc = UNKNOWN_LOCATION; 4508 /* ??? Following the old parser, [ objc-receiver 4509 objc-message-args ] is accepted as an initializer, 4510 being distinguished from a designator by what follows 4511 the first assignment expression inside the square 4512 brackets, but after a first array designator a 4513 subsequent square bracket is for Objective-C taken to 4514 start an expression, using the obsolete form of 4515 designated initializer without '=', rather than 4516 possibly being a second level of designation: in LALR 4517 terms, the '[' is shifted rather than reducing 4518 designator to designator-list. */ 4519 if (des_prev == 1 && c_dialect_objc ()) 4520 { 4521 des_seen = des_prev; 4522 break; 4523 } 4524 if (des_prev == 0 && c_dialect_objc ()) 4525 { 4526 /* This might be an array designator or an 4527 Objective-C message expression. If the former, 4528 continue parsing here; if the latter, parse the 4529 remainder of the initializer given the starting 4530 primary-expression. ??? It might make sense to 4531 distinguish when des_prev == 1 as well; see 4532 previous comment. */ 4533 tree rec, args; 4534 struct c_expr mexpr; 4535 c_parser_consume_token (parser); 4536 if (c_parser_peek_token (parser)->type == CPP_NAME 4537 && ((c_parser_peek_token (parser)->id_kind 4538 == C_ID_TYPENAME) 4539 || (c_parser_peek_token (parser)->id_kind 4540 == C_ID_CLASSNAME))) 4541 { 4542 /* Type name receiver. */ 4543 tree id = c_parser_peek_token (parser)->value; 4544 c_parser_consume_token (parser); 4545 rec = objc_get_class_reference (id); 4546 goto parse_message_args; 4547 } 4548 first = c_parser_expr_no_commas (parser, NULL).value; 4549 mark_exp_read (first); 4550 if (c_parser_next_token_is (parser, CPP_ELLIPSIS) 4551 || c_parser_next_token_is (parser, CPP_CLOSE_SQUARE)) 4552 goto array_desig_after_first; 4553 /* Expression receiver. So far only one part 4554 without commas has been parsed; there might be 4555 more of the expression. */ 4556 rec = first; 4557 while (c_parser_next_token_is (parser, CPP_COMMA)) 4558 { 4559 struct c_expr next; 4560 location_t comma_loc, exp_loc; 4561 comma_loc = c_parser_peek_token (parser)->location; 4562 c_parser_consume_token (parser); 4563 exp_loc = c_parser_peek_token (parser)->location; 4564 next = c_parser_expr_no_commas (parser, NULL); 4565 next = convert_lvalue_to_rvalue (exp_loc, next, 4566 true, true); 4567 rec = build_compound_expr (comma_loc, rec, next.value); 4568 } 4569 parse_message_args: 4570 /* Now parse the objc-message-args. */ 4571 args = c_parser_objc_message_args (parser); 4572 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, 4573 "expected %<]%>"); 4574 mexpr.value 4575 = objc_build_message_expr (rec, args); 4576 mexpr.original_code = ERROR_MARK; 4577 mexpr.original_type = NULL; 4578 /* Now parse and process the remainder of the 4579 initializer, starting with this message 4580 expression as a primary-expression. */ 4581 c_parser_initval (parser, &mexpr, braced_init_obstack); 4582 return; 4583 } 4584 c_parser_consume_token (parser); 4585 array_index_loc = c_parser_peek_token (parser)->location; 4586 first = c_parser_expr_no_commas (parser, NULL).value; 4587 mark_exp_read (first); 4588 array_desig_after_first: 4589 if (c_parser_next_token_is (parser, CPP_ELLIPSIS)) 4590 { 4591 ellipsis_loc = c_parser_peek_token (parser)->location; 4592 c_parser_consume_token (parser); 4593 second = c_parser_expr_no_commas (parser, NULL).value; 4594 mark_exp_read (second); 4595 } 4596 else 4597 second = NULL_TREE; 4598 if (c_parser_next_token_is (parser, CPP_CLOSE_SQUARE)) 4599 { 4600 c_parser_consume_token (parser); 4601 set_init_index (array_index_loc, first, second, 4602 braced_init_obstack); 4603 if (second) 4604 pedwarn (ellipsis_loc, OPT_Wpedantic, 4605 "ISO C forbids specifying range of elements to initialize"); 4606 } 4607 else 4608 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, 4609 "expected %<]%>"); 4610 } 4611 } 4612 if (des_seen >= 1) 4613 { 4614 if (c_parser_next_token_is (parser, CPP_EQ)) 4615 { 4616 pedwarn_c90 (des_loc, OPT_Wpedantic, 4617 "ISO C90 forbids specifying subobject " 4618 "to initialize"); 4619 c_parser_consume_token (parser); 4620 } 4621 else 4622 { 4623 if (des_seen == 1) 4624 pedwarn (c_parser_peek_token (parser)->location, OPT_Wpedantic, 4625 "obsolete use of designated initializer without %<=%>"); 4626 else 4627 { 4628 struct c_expr init; 4629 init.value = error_mark_node; 4630 init.original_code = ERROR_MARK; 4631 init.original_type = NULL; 4632 c_parser_error (parser, "expected %<=%>"); 4633 c_parser_skip_until_found (parser, CPP_COMMA, NULL); 4634 process_init_element (input_location, init, false, 4635 braced_init_obstack); 4636 return; 4637 } 4638 } 4639 } 4640 } 4641 c_parser_initval (parser, NULL, braced_init_obstack); 4642 } 4643 4644 /* Parse a nested initializer; as c_parser_initializer but parses 4645 initializers within braced lists, after any designators have been 4646 applied. If AFTER is not NULL then it is an Objective-C message 4647 expression which is the primary-expression starting the 4648 initializer. */ 4649 4650 static void 4651 c_parser_initval (c_parser *parser, struct c_expr *after, 4652 struct obstack * braced_init_obstack) 4653 { 4654 struct c_expr init; 4655 gcc_assert (!after || c_dialect_objc ()); 4656 location_t loc = c_parser_peek_token (parser)->location; 4657 4658 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE) && !after) 4659 init = c_parser_braced_init (parser, NULL_TREE, true, 4660 braced_init_obstack); 4661 else 4662 { 4663 init = c_parser_expr_no_commas (parser, after); 4664 if (init.value != NULL_TREE 4665 && TREE_CODE (init.value) != STRING_CST 4666 && TREE_CODE (init.value) != COMPOUND_LITERAL_EXPR) 4667 init = convert_lvalue_to_rvalue (loc, init, true, true); 4668 } 4669 process_init_element (loc, init, false, braced_init_obstack); 4670 } 4671 4672 /* Parse a compound statement (possibly a function body) (C90 6.6.2, 4673 C99 6.8.2, C11 6.8.2). 4674 4675 compound-statement: 4676 { block-item-list[opt] } 4677 { label-declarations block-item-list } 4678 4679 block-item-list: 4680 block-item 4681 block-item-list block-item 4682 4683 block-item: 4684 nested-declaration 4685 statement 4686 4687 nested-declaration: 4688 declaration 4689 4690 GNU extensions: 4691 4692 compound-statement: 4693 { label-declarations block-item-list } 4694 4695 nested-declaration: 4696 __extension__ nested-declaration 4697 nested-function-definition 4698 4699 label-declarations: 4700 label-declaration 4701 label-declarations label-declaration 4702 4703 label-declaration: 4704 __label__ identifier-list ; 4705 4706 Allowing the mixing of declarations and code is new in C99. The 4707 GNU syntax also permits (not shown above) labels at the end of 4708 compound statements, which yield an error. We don't allow labels 4709 on declarations; this might seem like a natural extension, but 4710 there would be a conflict between attributes on the label and 4711 prefix attributes on the declaration. ??? The syntax follows the 4712 old parser in requiring something after label declarations. 4713 Although they are erroneous if the labels declared aren't defined, 4714 is it useful for the syntax to be this way? 4715 4716 OpenACC: 4717 4718 block-item: 4719 openacc-directive 4720 4721 openacc-directive: 4722 update-directive 4723 4724 OpenMP: 4725 4726 block-item: 4727 openmp-directive 4728 4729 openmp-directive: 4730 barrier-directive 4731 flush-directive 4732 taskwait-directive 4733 taskyield-directive 4734 cancel-directive 4735 cancellation-point-directive */ 4736 4737 static tree 4738 c_parser_compound_statement (c_parser *parser) 4739 { 4740 tree stmt; 4741 location_t brace_loc; 4742 brace_loc = c_parser_peek_token (parser)->location; 4743 if (!c_parser_require (parser, CPP_OPEN_BRACE, "expected %<{%>")) 4744 { 4745 /* Ensure a scope is entered and left anyway to avoid confusion 4746 if we have just prepared to enter a function body. */ 4747 stmt = c_begin_compound_stmt (true); 4748 c_end_compound_stmt (brace_loc, stmt, true); 4749 return error_mark_node; 4750 } 4751 stmt = c_begin_compound_stmt (true); 4752 c_parser_compound_statement_nostart (parser); 4753 4754 /* If the compound stmt contains array notations, then we expand them. */ 4755 if (flag_cilkplus && contains_array_notation_expr (stmt)) 4756 stmt = expand_array_notation_exprs (stmt); 4757 return c_end_compound_stmt (brace_loc, stmt, true); 4758 } 4759 4760 /* Parse a compound statement except for the opening brace. This is 4761 used for parsing both compound statements and statement expressions 4762 (which follow different paths to handling the opening). */ 4763 4764 static void 4765 c_parser_compound_statement_nostart (c_parser *parser) 4766 { 4767 bool last_stmt = false; 4768 bool last_label = false; 4769 bool save_valid_for_pragma = valid_location_for_stdc_pragma_p (); 4770 location_t label_loc = UNKNOWN_LOCATION; /* Quiet warning. */ 4771 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE)) 4772 { 4773 c_parser_consume_token (parser); 4774 return; 4775 } 4776 mark_valid_location_for_stdc_pragma (true); 4777 if (c_parser_next_token_is_keyword (parser, RID_LABEL)) 4778 { 4779 /* Read zero or more forward-declarations for labels that nested 4780 functions can jump to. */ 4781 mark_valid_location_for_stdc_pragma (false); 4782 while (c_parser_next_token_is_keyword (parser, RID_LABEL)) 4783 { 4784 label_loc = c_parser_peek_token (parser)->location; 4785 c_parser_consume_token (parser); 4786 /* Any identifiers, including those declared as type names, 4787 are OK here. */ 4788 while (true) 4789 { 4790 tree label; 4791 if (c_parser_next_token_is_not (parser, CPP_NAME)) 4792 { 4793 c_parser_error (parser, "expected identifier"); 4794 break; 4795 } 4796 label 4797 = declare_label (c_parser_peek_token (parser)->value); 4798 C_DECLARED_LABEL_FLAG (label) = 1; 4799 add_stmt (build_stmt (label_loc, DECL_EXPR, label)); 4800 c_parser_consume_token (parser); 4801 if (c_parser_next_token_is (parser, CPP_COMMA)) 4802 c_parser_consume_token (parser); 4803 else 4804 break; 4805 } 4806 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>"); 4807 } 4808 pedwarn (label_loc, OPT_Wpedantic, "ISO C forbids label declarations"); 4809 } 4810 /* We must now have at least one statement, label or declaration. */ 4811 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE)) 4812 { 4813 mark_valid_location_for_stdc_pragma (save_valid_for_pragma); 4814 c_parser_error (parser, "expected declaration or statement"); 4815 c_parser_consume_token (parser); 4816 return; 4817 } 4818 while (c_parser_next_token_is_not (parser, CPP_CLOSE_BRACE)) 4819 { 4820 location_t loc = c_parser_peek_token (parser)->location; 4821 if (c_parser_next_token_is_keyword (parser, RID_CASE) 4822 || c_parser_next_token_is_keyword (parser, RID_DEFAULT) 4823 || (c_parser_next_token_is (parser, CPP_NAME) 4824 && c_parser_peek_2nd_token (parser)->type == CPP_COLON)) 4825 { 4826 if (c_parser_next_token_is_keyword (parser, RID_CASE)) 4827 label_loc = c_parser_peek_2nd_token (parser)->location; 4828 else 4829 label_loc = c_parser_peek_token (parser)->location; 4830 last_label = true; 4831 last_stmt = false; 4832 mark_valid_location_for_stdc_pragma (false); 4833 c_parser_label (parser); 4834 } 4835 else if (!last_label 4836 && c_parser_next_tokens_start_declaration (parser)) 4837 { 4838 last_label = false; 4839 mark_valid_location_for_stdc_pragma (false); 4840 bool fallthru_attr_p = false; 4841 c_parser_declaration_or_fndef (parser, true, true, true, true, 4842 true, NULL, vNULL, NULL, 4843 &fallthru_attr_p); 4844 if (last_stmt && !fallthru_attr_p) 4845 pedwarn_c90 (loc, OPT_Wdeclaration_after_statement, 4846 "ISO C90 forbids mixed declarations and code"); 4847 last_stmt = fallthru_attr_p; 4848 } 4849 else if (!last_label 4850 && c_parser_next_token_is_keyword (parser, RID_EXTENSION)) 4851 { 4852 /* __extension__ can start a declaration, but is also an 4853 unary operator that can start an expression. Consume all 4854 but the last of a possible series of __extension__ to 4855 determine which. */ 4856 while (c_parser_peek_2nd_token (parser)->type == CPP_KEYWORD 4857 && (c_parser_peek_2nd_token (parser)->keyword 4858 == RID_EXTENSION)) 4859 c_parser_consume_token (parser); 4860 if (c_token_starts_declaration (c_parser_peek_2nd_token (parser))) 4861 { 4862 int ext; 4863 ext = disable_extension_diagnostics (); 4864 c_parser_consume_token (parser); 4865 last_label = false; 4866 mark_valid_location_for_stdc_pragma (false); 4867 c_parser_declaration_or_fndef (parser, true, true, true, true, 4868 true, NULL, vNULL); 4869 /* Following the old parser, __extension__ does not 4870 disable this diagnostic. */ 4871 restore_extension_diagnostics (ext); 4872 if (last_stmt) 4873 pedwarn_c90 (loc, OPT_Wdeclaration_after_statement, 4874 "ISO C90 forbids mixed declarations and code"); 4875 last_stmt = false; 4876 } 4877 else 4878 goto statement; 4879 } 4880 else if (c_parser_next_token_is (parser, CPP_PRAGMA)) 4881 { 4882 /* External pragmas, and some omp pragmas, are not associated 4883 with regular c code, and so are not to be considered statements 4884 syntactically. This ensures that the user doesn't put them 4885 places that would turn into syntax errors if the directive 4886 were ignored. */ 4887 if (c_parser_pragma (parser, 4888 last_label ? pragma_stmt : pragma_compound, 4889 NULL)) 4890 last_label = false, last_stmt = true; 4891 } 4892 else if (c_parser_next_token_is (parser, CPP_EOF)) 4893 { 4894 mark_valid_location_for_stdc_pragma (save_valid_for_pragma); 4895 c_parser_error (parser, "expected declaration or statement"); 4896 return; 4897 } 4898 else if (c_parser_next_token_is_keyword (parser, RID_ELSE)) 4899 { 4900 if (parser->in_if_block) 4901 { 4902 mark_valid_location_for_stdc_pragma (save_valid_for_pragma); 4903 error_at (loc, """expected %<}%> before %<else%>"); 4904 return; 4905 } 4906 else 4907 { 4908 error_at (loc, "%<else%> without a previous %<if%>"); 4909 c_parser_consume_token (parser); 4910 continue; 4911 } 4912 } 4913 else 4914 { 4915 statement: 4916 last_label = false; 4917 last_stmt = true; 4918 mark_valid_location_for_stdc_pragma (false); 4919 c_parser_statement_after_labels (parser, NULL); 4920 } 4921 4922 parser->error = false; 4923 } 4924 if (last_label) 4925 error_at (label_loc, "label at end of compound statement"); 4926 c_parser_consume_token (parser); 4927 /* Restore the value we started with. */ 4928 mark_valid_location_for_stdc_pragma (save_valid_for_pragma); 4929 } 4930 4931 /* Parse all consecutive labels. */ 4932 4933 static void 4934 c_parser_all_labels (c_parser *parser) 4935 { 4936 while (c_parser_next_token_is_keyword (parser, RID_CASE) 4937 || c_parser_next_token_is_keyword (parser, RID_DEFAULT) 4938 || (c_parser_next_token_is (parser, CPP_NAME) 4939 && c_parser_peek_2nd_token (parser)->type == CPP_COLON)) 4940 c_parser_label (parser); 4941 } 4942 4943 /* Parse a label (C90 6.6.1, C99 6.8.1, C11 6.8.1). 4944 4945 label: 4946 identifier : attributes[opt] 4947 case constant-expression : 4948 default : 4949 4950 GNU extensions: 4951 4952 label: 4953 case constant-expression ... constant-expression : 4954 4955 The use of attributes on labels is a GNU extension. The syntax in 4956 GNU C accepts any expressions without commas, non-constant 4957 expressions being rejected later. */ 4958 4959 static void 4960 c_parser_label (c_parser *parser) 4961 { 4962 location_t loc1 = c_parser_peek_token (parser)->location; 4963 tree label = NULL_TREE; 4964 4965 /* Remember whether this case or a user-defined label is allowed to fall 4966 through to. */ 4967 bool fallthrough_p = c_parser_peek_token (parser)->flags & PREV_FALLTHROUGH; 4968 4969 if (c_parser_next_token_is_keyword (parser, RID_CASE)) 4970 { 4971 tree exp1, exp2; 4972 c_parser_consume_token (parser); 4973 exp1 = c_parser_expr_no_commas (parser, NULL).value; 4974 if (c_parser_next_token_is (parser, CPP_COLON)) 4975 { 4976 c_parser_consume_token (parser); 4977 label = do_case (loc1, exp1, NULL_TREE); 4978 } 4979 else if (c_parser_next_token_is (parser, CPP_ELLIPSIS)) 4980 { 4981 c_parser_consume_token (parser); 4982 exp2 = c_parser_expr_no_commas (parser, NULL).value; 4983 if (c_parser_require (parser, CPP_COLON, "expected %<:%>")) 4984 label = do_case (loc1, exp1, exp2); 4985 } 4986 else 4987 c_parser_error (parser, "expected %<:%> or %<...%>"); 4988 } 4989 else if (c_parser_next_token_is_keyword (parser, RID_DEFAULT)) 4990 { 4991 c_parser_consume_token (parser); 4992 if (c_parser_require (parser, CPP_COLON, "expected %<:%>")) 4993 label = do_case (loc1, NULL_TREE, NULL_TREE); 4994 } 4995 else 4996 { 4997 tree name = c_parser_peek_token (parser)->value; 4998 tree tlab; 4999 tree attrs; 5000 location_t loc2 = c_parser_peek_token (parser)->location; 5001 gcc_assert (c_parser_next_token_is (parser, CPP_NAME)); 5002 c_parser_consume_token (parser); 5003 gcc_assert (c_parser_next_token_is (parser, CPP_COLON)); 5004 c_parser_consume_token (parser); 5005 attrs = c_parser_attributes (parser); 5006 tlab = define_label (loc2, name); 5007 if (tlab) 5008 { 5009 decl_attributes (&tlab, attrs, 0); 5010 label = add_stmt (build_stmt (loc1, LABEL_EXPR, tlab)); 5011 } 5012 } 5013 if (label) 5014 { 5015 if (TREE_CODE (label) == LABEL_EXPR) 5016 FALLTHROUGH_LABEL_P (LABEL_EXPR_LABEL (label)) = fallthrough_p; 5017 else 5018 FALLTHROUGH_LABEL_P (CASE_LABEL (label)) = fallthrough_p; 5019 5020 /* Allow '__attribute__((fallthrough));'. */ 5021 if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE)) 5022 { 5023 location_t loc = c_parser_peek_token (parser)->location; 5024 tree attrs = c_parser_attributes (parser); 5025 if (attribute_fallthrough_p (attrs)) 5026 { 5027 if (c_parser_next_token_is (parser, CPP_SEMICOLON)) 5028 { 5029 tree fn = build_call_expr_internal_loc (loc, 5030 IFN_FALLTHROUGH, 5031 void_type_node, 0); 5032 add_stmt (fn); 5033 } 5034 else 5035 warning_at (loc, OPT_Wattributes, "%<fallthrough%> attribute " 5036 "not followed by %<;%>"); 5037 } 5038 else if (attrs != NULL_TREE) 5039 warning_at (loc, OPT_Wattributes, "only attribute %<fallthrough%>" 5040 " can be applied to a null statement"); 5041 } 5042 if (c_parser_next_tokens_start_declaration (parser)) 5043 { 5044 error_at (c_parser_peek_token (parser)->location, 5045 "a label can only be part of a statement and " 5046 "a declaration is not a statement"); 5047 c_parser_declaration_or_fndef (parser, /*fndef_ok*/ false, 5048 /*static_assert_ok*/ true, 5049 /*empty_ok*/ true, /*nested*/ true, 5050 /*start_attr_ok*/ true, NULL, 5051 vNULL); 5052 } 5053 } 5054 } 5055 5056 /* Parse a statement (C90 6.6, C99 6.8, C11 6.8). 5057 5058 statement: 5059 labeled-statement 5060 compound-statement 5061 expression-statement 5062 selection-statement 5063 iteration-statement 5064 jump-statement 5065 5066 labeled-statement: 5067 label statement 5068 5069 expression-statement: 5070 expression[opt] ; 5071 5072 selection-statement: 5073 if-statement 5074 switch-statement 5075 5076 iteration-statement: 5077 while-statement 5078 do-statement 5079 for-statement 5080 5081 jump-statement: 5082 goto identifier ; 5083 continue ; 5084 break ; 5085 return expression[opt] ; 5086 5087 GNU extensions: 5088 5089 statement: 5090 asm-statement 5091 5092 jump-statement: 5093 goto * expression ; 5094 5095 expression-statement: 5096 attributes ; 5097 5098 Objective-C: 5099 5100 statement: 5101 objc-throw-statement 5102 objc-try-catch-statement 5103 objc-synchronized-statement 5104 5105 objc-throw-statement: 5106 @throw expression ; 5107 @throw ; 5108 5109 OpenACC: 5110 5111 statement: 5112 openacc-construct 5113 5114 openacc-construct: 5115 parallel-construct 5116 kernels-construct 5117 data-construct 5118 loop-construct 5119 5120 parallel-construct: 5121 parallel-directive structured-block 5122 5123 kernels-construct: 5124 kernels-directive structured-block 5125 5126 data-construct: 5127 data-directive structured-block 5128 5129 loop-construct: 5130 loop-directive structured-block 5131 5132 OpenMP: 5133 5134 statement: 5135 openmp-construct 5136 5137 openmp-construct: 5138 parallel-construct 5139 for-construct 5140 simd-construct 5141 for-simd-construct 5142 sections-construct 5143 single-construct 5144 parallel-for-construct 5145 parallel-for-simd-construct 5146 parallel-sections-construct 5147 master-construct 5148 critical-construct 5149 atomic-construct 5150 ordered-construct 5151 5152 parallel-construct: 5153 parallel-directive structured-block 5154 5155 for-construct: 5156 for-directive iteration-statement 5157 5158 simd-construct: 5159 simd-directive iteration-statements 5160 5161 for-simd-construct: 5162 for-simd-directive iteration-statements 5163 5164 sections-construct: 5165 sections-directive section-scope 5166 5167 single-construct: 5168 single-directive structured-block 5169 5170 parallel-for-construct: 5171 parallel-for-directive iteration-statement 5172 5173 parallel-for-simd-construct: 5174 parallel-for-simd-directive iteration-statement 5175 5176 parallel-sections-construct: 5177 parallel-sections-directive section-scope 5178 5179 master-construct: 5180 master-directive structured-block 5181 5182 critical-construct: 5183 critical-directive structured-block 5184 5185 atomic-construct: 5186 atomic-directive expression-statement 5187 5188 ordered-construct: 5189 ordered-directive structured-block 5190 5191 Transactional Memory: 5192 5193 statement: 5194 transaction-statement 5195 transaction-cancel-statement 5196 5197 IF_P is used to track whether there's a (possibly labeled) if statement 5198 which is not enclosed in braces and has an else clause. This is used to 5199 implement -Wparentheses. */ 5200 5201 static void 5202 c_parser_statement (c_parser *parser, bool *if_p) 5203 { 5204 c_parser_all_labels (parser); 5205 c_parser_statement_after_labels (parser, if_p, NULL); 5206 } 5207 5208 /* Parse a statement, other than a labeled statement. CHAIN is a vector 5209 of if-else-if conditions. 5210 5211 IF_P is used to track whether there's a (possibly labeled) if statement 5212 which is not enclosed in braces and has an else clause. This is used to 5213 implement -Wparentheses. */ 5214 5215 static void 5216 c_parser_statement_after_labels (c_parser *parser, bool *if_p, 5217 vec<tree> *chain) 5218 { 5219 location_t loc = c_parser_peek_token (parser)->location; 5220 tree stmt = NULL_TREE; 5221 bool in_if_block = parser->in_if_block; 5222 parser->in_if_block = false; 5223 if (if_p != NULL) 5224 *if_p = false; 5225 switch (c_parser_peek_token (parser)->type) 5226 { 5227 case CPP_OPEN_BRACE: 5228 add_stmt (c_parser_compound_statement (parser)); 5229 break; 5230 case CPP_KEYWORD: 5231 switch (c_parser_peek_token (parser)->keyword) 5232 { 5233 case RID_IF: 5234 c_parser_if_statement (parser, if_p, chain); 5235 break; 5236 case RID_SWITCH: 5237 c_parser_switch_statement (parser, if_p); 5238 break; 5239 case RID_WHILE: 5240 c_parser_while_statement (parser, false, if_p); 5241 break; 5242 case RID_DO: 5243 c_parser_do_statement (parser, false); 5244 break; 5245 case RID_FOR: 5246 c_parser_for_statement (parser, false, if_p); 5247 break; 5248 case RID_CILK_FOR: 5249 if (!flag_cilkplus) 5250 { 5251 error_at (c_parser_peek_token (parser)->location, 5252 "-fcilkplus must be enabled to use %<_Cilk_for%>"); 5253 c_parser_skip_to_end_of_block_or_statement (parser); 5254 } 5255 else 5256 c_parser_cilk_for (parser, integer_zero_node, if_p); 5257 break; 5258 case RID_CILK_SYNC: 5259 c_parser_consume_token (parser); 5260 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>"); 5261 if (!flag_cilkplus) 5262 error_at (loc, "-fcilkplus must be enabled to use %<_Cilk_sync%>"); 5263 else 5264 add_stmt (build_cilk_sync ()); 5265 break; 5266 case RID_GOTO: 5267 c_parser_consume_token (parser); 5268 if (c_parser_next_token_is (parser, CPP_NAME)) 5269 { 5270 stmt = c_finish_goto_label (loc, 5271 c_parser_peek_token (parser)->value); 5272 c_parser_consume_token (parser); 5273 } 5274 else if (c_parser_next_token_is (parser, CPP_MULT)) 5275 { 5276 struct c_expr val; 5277 5278 c_parser_consume_token (parser); 5279 val = c_parser_expression (parser); 5280 if (check_no_cilk (val.value, 5281 "Cilk array notation cannot be used as a computed goto expression", 5282 "%<_Cilk_spawn%> statement cannot be used as a computed goto expression", 5283 loc)) 5284 val.value = error_mark_node; 5285 val = convert_lvalue_to_rvalue (loc, val, false, true); 5286 stmt = c_finish_goto_ptr (loc, val.value); 5287 } 5288 else 5289 c_parser_error (parser, "expected identifier or %<*%>"); 5290 goto expect_semicolon; 5291 case RID_CONTINUE: 5292 c_parser_consume_token (parser); 5293 stmt = c_finish_bc_stmt (loc, &c_cont_label, false); 5294 goto expect_semicolon; 5295 case RID_BREAK: 5296 c_parser_consume_token (parser); 5297 stmt = c_finish_bc_stmt (loc, &c_break_label, true); 5298 goto expect_semicolon; 5299 case RID_RETURN: 5300 c_parser_consume_token (parser); 5301 if (c_parser_next_token_is (parser, CPP_SEMICOLON)) 5302 { 5303 stmt = c_finish_return (loc, NULL_TREE, NULL_TREE); 5304 c_parser_consume_token (parser); 5305 } 5306 else 5307 { 5308 location_t xloc = c_parser_peek_token (parser)->location; 5309 struct c_expr expr = c_parser_expression_conv (parser); 5310 mark_exp_read (expr.value); 5311 stmt = c_finish_return (EXPR_LOC_OR_LOC (expr.value, xloc), 5312 expr.value, expr.original_type); 5313 goto expect_semicolon; 5314 } 5315 break; 5316 case RID_ASM: 5317 stmt = c_parser_asm_statement (parser); 5318 break; 5319 case RID_TRANSACTION_ATOMIC: 5320 case RID_TRANSACTION_RELAXED: 5321 stmt = c_parser_transaction (parser, 5322 c_parser_peek_token (parser)->keyword); 5323 break; 5324 case RID_TRANSACTION_CANCEL: 5325 stmt = c_parser_transaction_cancel (parser); 5326 goto expect_semicolon; 5327 case RID_AT_THROW: 5328 gcc_assert (c_dialect_objc ()); 5329 c_parser_consume_token (parser); 5330 if (c_parser_next_token_is (parser, CPP_SEMICOLON)) 5331 { 5332 stmt = objc_build_throw_stmt (loc, NULL_TREE); 5333 c_parser_consume_token (parser); 5334 } 5335 else 5336 { 5337 struct c_expr expr = c_parser_expression (parser); 5338 expr = convert_lvalue_to_rvalue (loc, expr, false, false); 5339 if (check_no_cilk (expr.value, 5340 "Cilk array notation cannot be used for a throw expression", 5341 "%<_Cilk_spawn%> statement cannot be used for a throw expression")) 5342 expr.value = error_mark_node; 5343 else 5344 { 5345 expr.value = c_fully_fold (expr.value, false, NULL); 5346 stmt = objc_build_throw_stmt (loc, expr.value); 5347 } 5348 goto expect_semicolon; 5349 } 5350 break; 5351 case RID_AT_TRY: 5352 gcc_assert (c_dialect_objc ()); 5353 c_parser_objc_try_catch_finally_statement (parser); 5354 break; 5355 case RID_AT_SYNCHRONIZED: 5356 gcc_assert (c_dialect_objc ()); 5357 c_parser_objc_synchronized_statement (parser); 5358 break; 5359 case RID_ATTRIBUTE: 5360 { 5361 /* Allow '__attribute__((fallthrough));'. */ 5362 tree attrs = c_parser_attributes (parser); 5363 if (attribute_fallthrough_p (attrs)) 5364 { 5365 if (c_parser_next_token_is (parser, CPP_SEMICOLON)) 5366 { 5367 tree fn = build_call_expr_internal_loc (loc, 5368 IFN_FALLTHROUGH, 5369 void_type_node, 0); 5370 add_stmt (fn); 5371 /* Eat the ';'. */ 5372 c_parser_consume_token (parser); 5373 } 5374 else 5375 warning_at (loc, OPT_Wattributes, 5376 "%<fallthrough%> attribute not followed " 5377 "by %<;%>"); 5378 } 5379 else if (attrs != NULL_TREE) 5380 warning_at (loc, OPT_Wattributes, "only attribute %<fallthrough%>" 5381 " can be applied to a null statement"); 5382 break; 5383 } 5384 default: 5385 goto expr_stmt; 5386 } 5387 break; 5388 case CPP_SEMICOLON: 5389 c_parser_consume_token (parser); 5390 break; 5391 case CPP_CLOSE_PAREN: 5392 case CPP_CLOSE_SQUARE: 5393 /* Avoid infinite loop in error recovery: 5394 c_parser_skip_until_found stops at a closing nesting 5395 delimiter without consuming it, but here we need to consume 5396 it to proceed further. */ 5397 c_parser_error (parser, "expected statement"); 5398 c_parser_consume_token (parser); 5399 break; 5400 case CPP_PRAGMA: 5401 c_parser_pragma (parser, pragma_stmt, if_p); 5402 break; 5403 default: 5404 expr_stmt: 5405 stmt = c_finish_expr_stmt (loc, c_parser_expression_conv (parser).value); 5406 expect_semicolon: 5407 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>"); 5408 break; 5409 } 5410 /* Two cases cannot and do not have line numbers associated: If stmt 5411 is degenerate, such as "2;", then stmt is an INTEGER_CST, which 5412 cannot hold line numbers. But that's OK because the statement 5413 will either be changed to a MODIFY_EXPR during gimplification of 5414 the statement expr, or discarded. If stmt was compound, but 5415 without new variables, we will have skipped the creation of a 5416 BIND and will have a bare STATEMENT_LIST. But that's OK because 5417 (recursively) all of the component statements should already have 5418 line numbers assigned. ??? Can we discard no-op statements 5419 earlier? */ 5420 if (EXPR_LOCATION (stmt) == UNKNOWN_LOCATION) 5421 protected_set_expr_location (stmt, loc); 5422 5423 parser->in_if_block = in_if_block; 5424 } 5425 5426 /* Parse the condition from an if, do, while or for statements. */ 5427 5428 static tree 5429 c_parser_condition (c_parser *parser) 5430 { 5431 location_t loc = c_parser_peek_token (parser)->location; 5432 tree cond; 5433 cond = c_parser_expression_conv (parser).value; 5434 cond = c_objc_common_truthvalue_conversion (loc, cond); 5435 cond = c_fully_fold (cond, false, NULL); 5436 if (warn_sequence_point) 5437 verify_sequence_points (cond); 5438 return cond; 5439 } 5440 5441 /* Parse a parenthesized condition from an if, do or while statement. 5442 5443 condition: 5444 ( expression ) 5445 */ 5446 static tree 5447 c_parser_paren_condition (c_parser *parser) 5448 { 5449 tree cond; 5450 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 5451 return error_mark_node; 5452 cond = c_parser_condition (parser); 5453 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 5454 return cond; 5455 } 5456 5457 /* Parse a statement which is a block in C99. 5458 5459 IF_P is used to track whether there's a (possibly labeled) if statement 5460 which is not enclosed in braces and has an else clause. This is used to 5461 implement -Wparentheses. */ 5462 5463 static tree 5464 c_parser_c99_block_statement (c_parser *parser, bool *if_p) 5465 { 5466 tree block = c_begin_compound_stmt (flag_isoc99); 5467 location_t loc = c_parser_peek_token (parser)->location; 5468 c_parser_statement (parser, if_p); 5469 return c_end_compound_stmt (loc, block, flag_isoc99); 5470 } 5471 5472 /* Parse the body of an if statement. This is just parsing a 5473 statement but (a) it is a block in C99, (b) we track whether the 5474 body is an if statement for the sake of -Wparentheses warnings, (c) 5475 we handle an empty body specially for the sake of -Wempty-body 5476 warnings, and (d) we call parser_compound_statement directly 5477 because c_parser_statement_after_labels resets 5478 parser->in_if_block. 5479 5480 IF_P is used to track whether there's a (possibly labeled) if statement 5481 which is not enclosed in braces and has an else clause. This is used to 5482 implement -Wparentheses. */ 5483 5484 static tree 5485 c_parser_if_body (c_parser *parser, bool *if_p, 5486 const token_indent_info &if_tinfo) 5487 { 5488 tree block = c_begin_compound_stmt (flag_isoc99); 5489 location_t body_loc = c_parser_peek_token (parser)->location; 5490 token_indent_info body_tinfo 5491 = get_token_indent_info (c_parser_peek_token (parser)); 5492 5493 c_parser_all_labels (parser); 5494 if (c_parser_next_token_is (parser, CPP_SEMICOLON)) 5495 { 5496 location_t loc = c_parser_peek_token (parser)->location; 5497 add_stmt (build_empty_stmt (loc)); 5498 c_parser_consume_token (parser); 5499 if (!c_parser_next_token_is_keyword (parser, RID_ELSE)) 5500 warning_at (loc, OPT_Wempty_body, 5501 "suggest braces around empty body in an %<if%> statement"); 5502 } 5503 else if (c_parser_next_token_is (parser, CPP_OPEN_BRACE)) 5504 add_stmt (c_parser_compound_statement (parser)); 5505 else 5506 c_parser_statement_after_labels (parser, if_p); 5507 5508 token_indent_info next_tinfo 5509 = get_token_indent_info (c_parser_peek_token (parser)); 5510 warn_for_misleading_indentation (if_tinfo, body_tinfo, next_tinfo); 5511 5512 return c_end_compound_stmt (body_loc, block, flag_isoc99); 5513 } 5514 5515 /* Parse the else body of an if statement. This is just parsing a 5516 statement but (a) it is a block in C99, (b) we handle an empty body 5517 specially for the sake of -Wempty-body warnings. CHAIN is a vector 5518 of if-else-if conditions. */ 5519 5520 static tree 5521 c_parser_else_body (c_parser *parser, const token_indent_info &else_tinfo, 5522 vec<tree> *chain) 5523 { 5524 location_t body_loc = c_parser_peek_token (parser)->location; 5525 tree block = c_begin_compound_stmt (flag_isoc99); 5526 token_indent_info body_tinfo 5527 = get_token_indent_info (c_parser_peek_token (parser)); 5528 5529 c_parser_all_labels (parser); 5530 if (c_parser_next_token_is (parser, CPP_SEMICOLON)) 5531 { 5532 location_t loc = c_parser_peek_token (parser)->location; 5533 warning_at (loc, 5534 OPT_Wempty_body, 5535 "suggest braces around empty body in an %<else%> statement"); 5536 add_stmt (build_empty_stmt (loc)); 5537 c_parser_consume_token (parser); 5538 } 5539 else 5540 c_parser_statement_after_labels (parser, NULL, chain); 5541 5542 token_indent_info next_tinfo 5543 = get_token_indent_info (c_parser_peek_token (parser)); 5544 warn_for_misleading_indentation (else_tinfo, body_tinfo, next_tinfo); 5545 5546 return c_end_compound_stmt (body_loc, block, flag_isoc99); 5547 } 5548 5549 /* We might need to reclassify any previously-lexed identifier, e.g. 5550 when we've left a for loop with an if-statement without else in the 5551 body - we might have used a wrong scope for the token. See PR67784. */ 5552 5553 static void 5554 c_parser_maybe_reclassify_token (c_parser *parser) 5555 { 5556 if (c_parser_next_token_is (parser, CPP_NAME)) 5557 { 5558 c_token *token = c_parser_peek_token (parser); 5559 5560 if (token->id_kind != C_ID_CLASSNAME) 5561 { 5562 tree decl = lookup_name (token->value); 5563 5564 token->id_kind = C_ID_ID; 5565 if (decl) 5566 { 5567 if (TREE_CODE (decl) == TYPE_DECL) 5568 token->id_kind = C_ID_TYPENAME; 5569 } 5570 else if (c_dialect_objc ()) 5571 { 5572 tree objc_interface_decl = objc_is_class_name (token->value); 5573 /* Objective-C class names are in the same namespace as 5574 variables and typedefs, and hence are shadowed by local 5575 declarations. */ 5576 if (objc_interface_decl) 5577 { 5578 token->value = objc_interface_decl; 5579 token->id_kind = C_ID_CLASSNAME; 5580 } 5581 } 5582 } 5583 } 5584 } 5585 5586 /* Parse an if statement (C90 6.6.4, C99 6.8.4, C11 6.8.4). 5587 5588 if-statement: 5589 if ( expression ) statement 5590 if ( expression ) statement else statement 5591 5592 CHAIN is a vector of if-else-if conditions. 5593 IF_P is used to track whether there's a (possibly labeled) if statement 5594 which is not enclosed in braces and has an else clause. This is used to 5595 implement -Wparentheses. */ 5596 5597 static void 5598 c_parser_if_statement (c_parser *parser, bool *if_p, vec<tree> *chain) 5599 { 5600 tree block; 5601 location_t loc; 5602 tree cond; 5603 bool nested_if = false; 5604 tree first_body, second_body; 5605 bool in_if_block; 5606 tree if_stmt; 5607 5608 gcc_assert (c_parser_next_token_is_keyword (parser, RID_IF)); 5609 token_indent_info if_tinfo 5610 = get_token_indent_info (c_parser_peek_token (parser)); 5611 c_parser_consume_token (parser); 5612 block = c_begin_compound_stmt (flag_isoc99); 5613 loc = c_parser_peek_token (parser)->location; 5614 cond = c_parser_paren_condition (parser); 5615 if (flag_cilkplus && contains_cilk_spawn_stmt (cond)) 5616 { 5617 error_at (loc, "if statement cannot contain %<Cilk_spawn%>"); 5618 cond = error_mark_node; 5619 } 5620 in_if_block = parser->in_if_block; 5621 parser->in_if_block = true; 5622 first_body = c_parser_if_body (parser, &nested_if, if_tinfo); 5623 parser->in_if_block = in_if_block; 5624 5625 if (warn_duplicated_cond) 5626 warn_duplicated_cond_add_or_warn (EXPR_LOCATION (cond), cond, &chain); 5627 5628 if (c_parser_next_token_is_keyword (parser, RID_ELSE)) 5629 { 5630 token_indent_info else_tinfo 5631 = get_token_indent_info (c_parser_peek_token (parser)); 5632 c_parser_consume_token (parser); 5633 if (warn_duplicated_cond) 5634 { 5635 if (c_parser_next_token_is_keyword (parser, RID_IF) 5636 && chain == NULL) 5637 { 5638 /* We've got "if (COND) else if (COND2)". Start the 5639 condition chain and add COND as the first element. */ 5640 chain = new vec<tree> (); 5641 if (!CONSTANT_CLASS_P (cond) && !TREE_SIDE_EFFECTS (cond)) 5642 chain->safe_push (cond); 5643 } 5644 else if (!c_parser_next_token_is_keyword (parser, RID_IF)) 5645 { 5646 /* This is if-else without subsequent if. Zap the condition 5647 chain; we would have already warned at this point. */ 5648 delete chain; 5649 chain = NULL; 5650 } 5651 } 5652 second_body = c_parser_else_body (parser, else_tinfo, chain); 5653 /* Set IF_P to true to indicate that this if statement has an 5654 else clause. This may trigger the Wparentheses warning 5655 below when we get back up to the parent if statement. */ 5656 if (if_p != NULL) 5657 *if_p = true; 5658 } 5659 else 5660 { 5661 second_body = NULL_TREE; 5662 5663 /* Diagnose an ambiguous else if if-then-else is nested inside 5664 if-then. */ 5665 if (nested_if) 5666 warning_at (loc, OPT_Wdangling_else, 5667 "suggest explicit braces to avoid ambiguous %<else%>"); 5668 5669 if (warn_duplicated_cond) 5670 { 5671 /* This if statement does not have an else clause. We don't 5672 need the condition chain anymore. */ 5673 delete chain; 5674 chain = NULL; 5675 } 5676 } 5677 c_finish_if_stmt (loc, cond, first_body, second_body); 5678 if_stmt = c_end_compound_stmt (loc, block, flag_isoc99); 5679 5680 /* If the if statement contains array notations, then we expand them. */ 5681 if (flag_cilkplus && contains_array_notation_expr (if_stmt)) 5682 if_stmt = fix_conditional_array_notations (if_stmt); 5683 add_stmt (if_stmt); 5684 c_parser_maybe_reclassify_token (parser); 5685 } 5686 5687 /* Parse a switch statement (C90 6.6.4, C99 6.8.4, C11 6.8.4). 5688 5689 switch-statement: 5690 switch (expression) statement 5691 */ 5692 5693 static void 5694 c_parser_switch_statement (c_parser *parser, bool *if_p) 5695 { 5696 struct c_expr ce; 5697 tree block, expr, body, save_break; 5698 location_t switch_loc = c_parser_peek_token (parser)->location; 5699 location_t switch_cond_loc; 5700 gcc_assert (c_parser_next_token_is_keyword (parser, RID_SWITCH)); 5701 c_parser_consume_token (parser); 5702 block = c_begin_compound_stmt (flag_isoc99); 5703 bool explicit_cast_p = false; 5704 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 5705 { 5706 switch_cond_loc = c_parser_peek_token (parser)->location; 5707 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN) 5708 && c_token_starts_typename (c_parser_peek_2nd_token (parser))) 5709 explicit_cast_p = true; 5710 ce = c_parser_expression (parser); 5711 ce = convert_lvalue_to_rvalue (switch_cond_loc, ce, true, false); 5712 expr = ce.value; 5713 /* ??? expr has no valid location? */ 5714 if (check_no_cilk (expr, 5715 "Cilk array notation cannot be used as a condition for switch statement", 5716 "%<_Cilk_spawn%> statement cannot be used as a condition for switch statement", 5717 switch_cond_loc)) 5718 expr = error_mark_node; 5719 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 5720 } 5721 else 5722 { 5723 switch_cond_loc = UNKNOWN_LOCATION; 5724 expr = error_mark_node; 5725 ce.original_type = error_mark_node; 5726 } 5727 c_start_case (switch_loc, switch_cond_loc, expr, explicit_cast_p); 5728 save_break = c_break_label; 5729 c_break_label = NULL_TREE; 5730 body = c_parser_c99_block_statement (parser, if_p); 5731 c_finish_case (body, ce.original_type); 5732 if (c_break_label) 5733 { 5734 location_t here = c_parser_peek_token (parser)->location; 5735 tree t = build1 (LABEL_EXPR, void_type_node, c_break_label); 5736 SET_EXPR_LOCATION (t, here); 5737 add_stmt (t); 5738 } 5739 c_break_label = save_break; 5740 add_stmt (c_end_compound_stmt (switch_loc, block, flag_isoc99)); 5741 c_parser_maybe_reclassify_token (parser); 5742 } 5743 5744 /* Parse a while statement (C90 6.6.5, C99 6.8.5, C11 6.8.5). 5745 5746 while-statement: 5747 while (expression) statement 5748 5749 IF_P is used to track whether there's a (possibly labeled) if statement 5750 which is not enclosed in braces and has an else clause. This is used to 5751 implement -Wparentheses. */ 5752 5753 static void 5754 c_parser_while_statement (c_parser *parser, bool ivdep, bool *if_p) 5755 { 5756 tree block, cond, body, save_break, save_cont; 5757 location_t loc; 5758 gcc_assert (c_parser_next_token_is_keyword (parser, RID_WHILE)); 5759 token_indent_info while_tinfo 5760 = get_token_indent_info (c_parser_peek_token (parser)); 5761 c_parser_consume_token (parser); 5762 block = c_begin_compound_stmt (flag_isoc99); 5763 loc = c_parser_peek_token (parser)->location; 5764 cond = c_parser_paren_condition (parser); 5765 if (check_no_cilk (cond, 5766 "Cilk array notation cannot be used as a condition for while statement", 5767 "%<_Cilk_spawn%> statement cannot be used as a condition for while statement")) 5768 cond = error_mark_node; 5769 if (ivdep && cond != error_mark_node) 5770 cond = build2 (ANNOTATE_EXPR, TREE_TYPE (cond), cond, 5771 build_int_cst (integer_type_node, 5772 annot_expr_ivdep_kind)); 5773 save_break = c_break_label; 5774 c_break_label = NULL_TREE; 5775 save_cont = c_cont_label; 5776 c_cont_label = NULL_TREE; 5777 5778 token_indent_info body_tinfo 5779 = get_token_indent_info (c_parser_peek_token (parser)); 5780 5781 body = c_parser_c99_block_statement (parser, if_p); 5782 c_finish_loop (loc, cond, NULL, body, c_break_label, c_cont_label, true); 5783 add_stmt (c_end_compound_stmt (loc, block, flag_isoc99)); 5784 c_parser_maybe_reclassify_token (parser); 5785 5786 token_indent_info next_tinfo 5787 = get_token_indent_info (c_parser_peek_token (parser)); 5788 warn_for_misleading_indentation (while_tinfo, body_tinfo, next_tinfo); 5789 5790 c_break_label = save_break; 5791 c_cont_label = save_cont; 5792 } 5793 5794 /* Parse a do statement (C90 6.6.5, C99 6.8.5, C11 6.8.5). 5795 5796 do-statement: 5797 do statement while ( expression ) ; 5798 */ 5799 5800 static void 5801 c_parser_do_statement (c_parser *parser, bool ivdep) 5802 { 5803 tree block, cond, body, save_break, save_cont, new_break, new_cont; 5804 location_t loc; 5805 gcc_assert (c_parser_next_token_is_keyword (parser, RID_DO)); 5806 c_parser_consume_token (parser); 5807 if (c_parser_next_token_is (parser, CPP_SEMICOLON)) 5808 warning_at (c_parser_peek_token (parser)->location, 5809 OPT_Wempty_body, 5810 "suggest braces around empty body in %<do%> statement"); 5811 block = c_begin_compound_stmt (flag_isoc99); 5812 loc = c_parser_peek_token (parser)->location; 5813 save_break = c_break_label; 5814 c_break_label = NULL_TREE; 5815 save_cont = c_cont_label; 5816 c_cont_label = NULL_TREE; 5817 body = c_parser_c99_block_statement (parser, NULL); 5818 c_parser_require_keyword (parser, RID_WHILE, "expected %<while%>"); 5819 new_break = c_break_label; 5820 c_break_label = save_break; 5821 new_cont = c_cont_label; 5822 c_cont_label = save_cont; 5823 cond = c_parser_paren_condition (parser); 5824 if (check_no_cilk (cond, 5825 "Cilk array notation cannot be used as a condition for a do-while statement", 5826 "%<_Cilk_spawn%> statement cannot be used as a condition for a do-while statement")) 5827 cond = error_mark_node; 5828 if (ivdep && cond != error_mark_node) 5829 cond = build2 (ANNOTATE_EXPR, TREE_TYPE (cond), cond, 5830 build_int_cst (integer_type_node, 5831 annot_expr_ivdep_kind)); 5832 if (!c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>")) 5833 c_parser_skip_to_end_of_block_or_statement (parser); 5834 c_finish_loop (loc, cond, NULL, body, new_break, new_cont, false); 5835 add_stmt (c_end_compound_stmt (loc, block, flag_isoc99)); 5836 } 5837 5838 /* Parse a for statement (C90 6.6.5, C99 6.8.5, C11 6.8.5). 5839 5840 for-statement: 5841 for ( expression[opt] ; expression[opt] ; expression[opt] ) statement 5842 for ( nested-declaration expression[opt] ; expression[opt] ) statement 5843 5844 The form with a declaration is new in C99. 5845 5846 ??? In accordance with the old parser, the declaration may be a 5847 nested function, which is then rejected in check_for_loop_decls, 5848 but does it make any sense for this to be included in the grammar? 5849 Note in particular that the nested function does not include a 5850 trailing ';', whereas the "declaration" production includes one. 5851 Also, can we reject bad declarations earlier and cheaper than 5852 check_for_loop_decls? 5853 5854 In Objective-C, there are two additional variants: 5855 5856 foreach-statement: 5857 for ( expression in expresssion ) statement 5858 for ( declaration in expression ) statement 5859 5860 This is inconsistent with C, because the second variant is allowed 5861 even if c99 is not enabled. 5862 5863 The rest of the comment documents these Objective-C foreach-statement. 5864 5865 Here is the canonical example of the first variant: 5866 for (object in array) { do something with object } 5867 we call the first expression ("object") the "object_expression" and 5868 the second expression ("array") the "collection_expression". 5869 object_expression must be an lvalue of type "id" (a generic Objective-C 5870 object) because the loop works by assigning to object_expression the 5871 various objects from the collection_expression. collection_expression 5872 must evaluate to something of type "id" which responds to the method 5873 countByEnumeratingWithState:objects:count:. 5874 5875 The canonical example of the second variant is: 5876 for (id object in array) { do something with object } 5877 which is completely equivalent to 5878 { 5879 id object; 5880 for (object in array) { do something with object } 5881 } 5882 Note that initizializing 'object' in some way (eg, "for ((object = 5883 xxx) in array) { do something with object }") is possibly 5884 technically valid, but completely pointless as 'object' will be 5885 assigned to something else as soon as the loop starts. We should 5886 most likely reject it (TODO). 5887 5888 The beginning of the Objective-C foreach-statement looks exactly 5889 like the beginning of the for-statement, and we can tell it is a 5890 foreach-statement only because the initial declaration or 5891 expression is terminated by 'in' instead of ';'. 5892 5893 IF_P is used to track whether there's a (possibly labeled) if statement 5894 which is not enclosed in braces and has an else clause. This is used to 5895 implement -Wparentheses. */ 5896 5897 static void 5898 c_parser_for_statement (c_parser *parser, bool ivdep, bool *if_p) 5899 { 5900 tree block, cond, incr, save_break, save_cont, body; 5901 /* The following are only used when parsing an ObjC foreach statement. */ 5902 tree object_expression; 5903 /* Silence the bogus uninitialized warning. */ 5904 tree collection_expression = NULL; 5905 location_t loc = c_parser_peek_token (parser)->location; 5906 location_t for_loc = c_parser_peek_token (parser)->location; 5907 bool is_foreach_statement = false; 5908 gcc_assert (c_parser_next_token_is_keyword (parser, RID_FOR)); 5909 token_indent_info for_tinfo 5910 = get_token_indent_info (c_parser_peek_token (parser)); 5911 c_parser_consume_token (parser); 5912 /* Open a compound statement in Objective-C as well, just in case this is 5913 as foreach expression. */ 5914 block = c_begin_compound_stmt (flag_isoc99 || c_dialect_objc ()); 5915 cond = error_mark_node; 5916 incr = error_mark_node; 5917 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 5918 { 5919 /* Parse the initialization declaration or expression. */ 5920 object_expression = error_mark_node; 5921 parser->objc_could_be_foreach_context = c_dialect_objc (); 5922 if (c_parser_next_token_is (parser, CPP_SEMICOLON)) 5923 { 5924 parser->objc_could_be_foreach_context = false; 5925 c_parser_consume_token (parser); 5926 c_finish_expr_stmt (loc, NULL_TREE); 5927 } 5928 else if (c_parser_next_tokens_start_declaration (parser)) 5929 { 5930 c_parser_declaration_or_fndef (parser, true, true, true, true, true, 5931 &object_expression, vNULL); 5932 parser->objc_could_be_foreach_context = false; 5933 5934 if (c_parser_next_token_is_keyword (parser, RID_IN)) 5935 { 5936 c_parser_consume_token (parser); 5937 is_foreach_statement = true; 5938 if (check_for_loop_decls (for_loc, true) == NULL_TREE) 5939 c_parser_error (parser, "multiple iterating variables in fast enumeration"); 5940 } 5941 else 5942 check_for_loop_decls (for_loc, flag_isoc99); 5943 } 5944 else if (c_parser_next_token_is_keyword (parser, RID_EXTENSION)) 5945 { 5946 /* __extension__ can start a declaration, but is also an 5947 unary operator that can start an expression. Consume all 5948 but the last of a possible series of __extension__ to 5949 determine which. */ 5950 while (c_parser_peek_2nd_token (parser)->type == CPP_KEYWORD 5951 && (c_parser_peek_2nd_token (parser)->keyword 5952 == RID_EXTENSION)) 5953 c_parser_consume_token (parser); 5954 if (c_token_starts_declaration (c_parser_peek_2nd_token (parser))) 5955 { 5956 int ext; 5957 ext = disable_extension_diagnostics (); 5958 c_parser_consume_token (parser); 5959 c_parser_declaration_or_fndef (parser, true, true, true, true, 5960 true, &object_expression, vNULL); 5961 parser->objc_could_be_foreach_context = false; 5962 5963 restore_extension_diagnostics (ext); 5964 if (c_parser_next_token_is_keyword (parser, RID_IN)) 5965 { 5966 c_parser_consume_token (parser); 5967 is_foreach_statement = true; 5968 if (check_for_loop_decls (for_loc, true) == NULL_TREE) 5969 c_parser_error (parser, "multiple iterating variables in fast enumeration"); 5970 } 5971 else 5972 check_for_loop_decls (for_loc, flag_isoc99); 5973 } 5974 else 5975 goto init_expr; 5976 } 5977 else 5978 { 5979 init_expr: 5980 { 5981 struct c_expr ce; 5982 tree init_expression; 5983 ce = c_parser_expression (parser); 5984 /* In theory we could forbid _Cilk_spawn here, as the spec says "only in top 5985 level statement", but it works just fine, so allow it. */ 5986 init_expression = ce.value; 5987 parser->objc_could_be_foreach_context = false; 5988 if (c_parser_next_token_is_keyword (parser, RID_IN)) 5989 { 5990 c_parser_consume_token (parser); 5991 is_foreach_statement = true; 5992 if (! lvalue_p (init_expression)) 5993 c_parser_error (parser, "invalid iterating variable in fast enumeration"); 5994 object_expression = c_fully_fold (init_expression, false, NULL); 5995 } 5996 else 5997 { 5998 ce = convert_lvalue_to_rvalue (loc, ce, true, false); 5999 init_expression = ce.value; 6000 c_finish_expr_stmt (loc, init_expression); 6001 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>"); 6002 } 6003 } 6004 } 6005 /* Parse the loop condition. In the case of a foreach 6006 statement, there is no loop condition. */ 6007 gcc_assert (!parser->objc_could_be_foreach_context); 6008 if (!is_foreach_statement) 6009 { 6010 if (c_parser_next_token_is (parser, CPP_SEMICOLON)) 6011 { 6012 if (ivdep) 6013 { 6014 c_parser_error (parser, "missing loop condition in loop with " 6015 "%<GCC ivdep%> pragma"); 6016 cond = error_mark_node; 6017 } 6018 else 6019 { 6020 c_parser_consume_token (parser); 6021 cond = NULL_TREE; 6022 } 6023 } 6024 else 6025 { 6026 cond = c_parser_condition (parser); 6027 if (check_no_cilk (cond, 6028 "Cilk array notation cannot be used in a condition for a for-loop", 6029 "%<_Cilk_spawn%> statement cannot be used in a condition for a for-loop")) 6030 cond = error_mark_node; 6031 c_parser_skip_until_found (parser, CPP_SEMICOLON, 6032 "expected %<;%>"); 6033 } 6034 if (ivdep && cond != error_mark_node) 6035 cond = build2 (ANNOTATE_EXPR, TREE_TYPE (cond), cond, 6036 build_int_cst (integer_type_node, 6037 annot_expr_ivdep_kind)); 6038 } 6039 /* Parse the increment expression (the third expression in a 6040 for-statement). In the case of a foreach-statement, this is 6041 the expression that follows the 'in'. */ 6042 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN)) 6043 { 6044 if (is_foreach_statement) 6045 { 6046 c_parser_error (parser, "missing collection in fast enumeration"); 6047 collection_expression = error_mark_node; 6048 } 6049 else 6050 incr = c_process_expr_stmt (loc, NULL_TREE); 6051 } 6052 else 6053 { 6054 if (is_foreach_statement) 6055 collection_expression = c_fully_fold (c_parser_expression (parser).value, 6056 false, NULL); 6057 else 6058 { 6059 struct c_expr ce = c_parser_expression (parser); 6060 ce = convert_lvalue_to_rvalue (loc, ce, true, false); 6061 incr = c_process_expr_stmt (loc, ce.value); 6062 } 6063 } 6064 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 6065 } 6066 save_break = c_break_label; 6067 c_break_label = NULL_TREE; 6068 save_cont = c_cont_label; 6069 c_cont_label = NULL_TREE; 6070 6071 token_indent_info body_tinfo 6072 = get_token_indent_info (c_parser_peek_token (parser)); 6073 6074 body = c_parser_c99_block_statement (parser, if_p); 6075 6076 if (is_foreach_statement) 6077 objc_finish_foreach_loop (loc, object_expression, collection_expression, body, c_break_label, c_cont_label); 6078 else 6079 c_finish_loop (loc, cond, incr, body, c_break_label, c_cont_label, true); 6080 add_stmt (c_end_compound_stmt (loc, block, flag_isoc99 || c_dialect_objc ())); 6081 c_parser_maybe_reclassify_token (parser); 6082 6083 token_indent_info next_tinfo 6084 = get_token_indent_info (c_parser_peek_token (parser)); 6085 warn_for_misleading_indentation (for_tinfo, body_tinfo, next_tinfo); 6086 6087 c_break_label = save_break; 6088 c_cont_label = save_cont; 6089 } 6090 6091 /* Parse an asm statement, a GNU extension. This is a full-blown asm 6092 statement with inputs, outputs, clobbers, and volatile tag 6093 allowed. 6094 6095 asm-statement: 6096 asm type-qualifier[opt] ( asm-argument ) ; 6097 asm type-qualifier[opt] goto ( asm-goto-argument ) ; 6098 6099 asm-argument: 6100 asm-string-literal 6101 asm-string-literal : asm-operands[opt] 6102 asm-string-literal : asm-operands[opt] : asm-operands[opt] 6103 asm-string-literal : asm-operands[opt] : asm-operands[opt] : asm-clobbers[opt] 6104 6105 asm-goto-argument: 6106 asm-string-literal : : asm-operands[opt] : asm-clobbers[opt] \ 6107 : asm-goto-operands 6108 6109 Qualifiers other than volatile are accepted in the syntax but 6110 warned for. */ 6111 6112 static tree 6113 c_parser_asm_statement (c_parser *parser) 6114 { 6115 tree quals, str, outputs, inputs, clobbers, labels, ret; 6116 bool simple, is_goto; 6117 location_t asm_loc = c_parser_peek_token (parser)->location; 6118 int section, nsections; 6119 6120 gcc_assert (c_parser_next_token_is_keyword (parser, RID_ASM)); 6121 c_parser_consume_token (parser); 6122 if (c_parser_next_token_is_keyword (parser, RID_VOLATILE)) 6123 { 6124 quals = c_parser_peek_token (parser)->value; 6125 c_parser_consume_token (parser); 6126 } 6127 else if (c_parser_next_token_is_keyword (parser, RID_CONST) 6128 || c_parser_next_token_is_keyword (parser, RID_RESTRICT)) 6129 { 6130 warning_at (c_parser_peek_token (parser)->location, 6131 0, 6132 "%E qualifier ignored on asm", 6133 c_parser_peek_token (parser)->value); 6134 quals = NULL_TREE; 6135 c_parser_consume_token (parser); 6136 } 6137 else 6138 quals = NULL_TREE; 6139 6140 is_goto = false; 6141 if (c_parser_next_token_is_keyword (parser, RID_GOTO)) 6142 { 6143 c_parser_consume_token (parser); 6144 is_goto = true; 6145 } 6146 6147 /* ??? Follow the C++ parser rather than using the 6148 lex_untranslated_string kludge. */ 6149 parser->lex_untranslated_string = true; 6150 ret = NULL; 6151 6152 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 6153 goto error; 6154 6155 str = c_parser_asm_string_literal (parser); 6156 if (str == NULL_TREE) 6157 goto error_close_paren; 6158 6159 simple = true; 6160 outputs = NULL_TREE; 6161 inputs = NULL_TREE; 6162 clobbers = NULL_TREE; 6163 labels = NULL_TREE; 6164 6165 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN) && !is_goto) 6166 goto done_asm; 6167 6168 /* Parse each colon-delimited section of operands. */ 6169 nsections = 3 + is_goto; 6170 for (section = 0; section < nsections; ++section) 6171 { 6172 if (!c_parser_require (parser, CPP_COLON, 6173 is_goto 6174 ? G_("expected %<:%>") 6175 : G_("expected %<:%> or %<)%>"))) 6176 goto error_close_paren; 6177 6178 /* Once past any colon, we're no longer a simple asm. */ 6179 simple = false; 6180 6181 if ((!c_parser_next_token_is (parser, CPP_COLON) 6182 && !c_parser_next_token_is (parser, CPP_CLOSE_PAREN)) 6183 || section == 3) 6184 switch (section) 6185 { 6186 case 0: 6187 /* For asm goto, we don't allow output operands, but reserve 6188 the slot for a future extension that does allow them. */ 6189 if (!is_goto) 6190 outputs = c_parser_asm_operands (parser); 6191 break; 6192 case 1: 6193 inputs = c_parser_asm_operands (parser); 6194 break; 6195 case 2: 6196 clobbers = c_parser_asm_clobbers (parser); 6197 break; 6198 case 3: 6199 labels = c_parser_asm_goto_operands (parser); 6200 break; 6201 default: 6202 gcc_unreachable (); 6203 } 6204 6205 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN) && !is_goto) 6206 goto done_asm; 6207 } 6208 6209 done_asm: 6210 if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>")) 6211 { 6212 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL); 6213 goto error; 6214 } 6215 6216 if (!c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>")) 6217 c_parser_skip_to_end_of_block_or_statement (parser); 6218 6219 ret = build_asm_stmt (quals, build_asm_expr (asm_loc, str, outputs, inputs, 6220 clobbers, labels, simple)); 6221 6222 error: 6223 parser->lex_untranslated_string = false; 6224 return ret; 6225 6226 error_close_paren: 6227 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL); 6228 goto error; 6229 } 6230 6231 /* Parse asm operands, a GNU extension. 6232 6233 asm-operands: 6234 asm-operand 6235 asm-operands , asm-operand 6236 6237 asm-operand: 6238 asm-string-literal ( expression ) 6239 [ identifier ] asm-string-literal ( expression ) 6240 */ 6241 6242 static tree 6243 c_parser_asm_operands (c_parser *parser) 6244 { 6245 tree list = NULL_TREE; 6246 while (true) 6247 { 6248 tree name, str; 6249 struct c_expr expr; 6250 if (c_parser_next_token_is (parser, CPP_OPEN_SQUARE)) 6251 { 6252 c_parser_consume_token (parser); 6253 if (c_parser_next_token_is (parser, CPP_NAME)) 6254 { 6255 tree id = c_parser_peek_token (parser)->value; 6256 c_parser_consume_token (parser); 6257 name = build_string (IDENTIFIER_LENGTH (id), 6258 IDENTIFIER_POINTER (id)); 6259 } 6260 else 6261 { 6262 c_parser_error (parser, "expected identifier"); 6263 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, NULL); 6264 return NULL_TREE; 6265 } 6266 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, 6267 "expected %<]%>"); 6268 } 6269 else 6270 name = NULL_TREE; 6271 str = c_parser_asm_string_literal (parser); 6272 if (str == NULL_TREE) 6273 return NULL_TREE; 6274 parser->lex_untranslated_string = false; 6275 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 6276 { 6277 parser->lex_untranslated_string = true; 6278 return NULL_TREE; 6279 } 6280 expr = c_parser_expression (parser); 6281 mark_exp_read (expr.value); 6282 parser->lex_untranslated_string = true; 6283 if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>")) 6284 { 6285 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL); 6286 return NULL_TREE; 6287 } 6288 list = chainon (list, build_tree_list (build_tree_list (name, str), 6289 expr.value)); 6290 if (c_parser_next_token_is (parser, CPP_COMMA)) 6291 c_parser_consume_token (parser); 6292 else 6293 break; 6294 } 6295 return list; 6296 } 6297 6298 /* Parse asm clobbers, a GNU extension. 6299 6300 asm-clobbers: 6301 asm-string-literal 6302 asm-clobbers , asm-string-literal 6303 */ 6304 6305 static tree 6306 c_parser_asm_clobbers (c_parser *parser) 6307 { 6308 tree list = NULL_TREE; 6309 while (true) 6310 { 6311 tree str = c_parser_asm_string_literal (parser); 6312 if (str) 6313 list = tree_cons (NULL_TREE, str, list); 6314 else 6315 return NULL_TREE; 6316 if (c_parser_next_token_is (parser, CPP_COMMA)) 6317 c_parser_consume_token (parser); 6318 else 6319 break; 6320 } 6321 return list; 6322 } 6323 6324 /* Parse asm goto labels, a GNU extension. 6325 6326 asm-goto-operands: 6327 identifier 6328 asm-goto-operands , identifier 6329 */ 6330 6331 static tree 6332 c_parser_asm_goto_operands (c_parser *parser) 6333 { 6334 tree list = NULL_TREE; 6335 while (true) 6336 { 6337 tree name, label; 6338 6339 if (c_parser_next_token_is (parser, CPP_NAME)) 6340 { 6341 c_token *tok = c_parser_peek_token (parser); 6342 name = tok->value; 6343 label = lookup_label_for_goto (tok->location, name); 6344 c_parser_consume_token (parser); 6345 TREE_USED (label) = 1; 6346 } 6347 else 6348 { 6349 c_parser_error (parser, "expected identifier"); 6350 return NULL_TREE; 6351 } 6352 6353 name = build_string (IDENTIFIER_LENGTH (name), 6354 IDENTIFIER_POINTER (name)); 6355 list = tree_cons (name, label, list); 6356 if (c_parser_next_token_is (parser, CPP_COMMA)) 6357 c_parser_consume_token (parser); 6358 else 6359 return nreverse (list); 6360 } 6361 } 6362 6363 /* Parse an expression other than a compound expression; that is, an 6364 assignment expression (C90 6.3.16, C99 6.5.16, C11 6.5.16). If 6365 AFTER is not NULL then it is an Objective-C message expression which 6366 is the primary-expression starting the expression as an initializer. 6367 6368 assignment-expression: 6369 conditional-expression 6370 unary-expression assignment-operator assignment-expression 6371 6372 assignment-operator: one of 6373 = *= /= %= += -= <<= >>= &= ^= |= 6374 6375 In GNU C we accept any conditional expression on the LHS and 6376 diagnose the invalid lvalue rather than producing a syntax 6377 error. */ 6378 6379 static struct c_expr 6380 c_parser_expr_no_commas (c_parser *parser, struct c_expr *after, 6381 tree omp_atomic_lhs) 6382 { 6383 struct c_expr lhs, rhs, ret; 6384 enum tree_code code; 6385 location_t op_location, exp_location; 6386 gcc_assert (!after || c_dialect_objc ()); 6387 lhs = c_parser_conditional_expression (parser, after, omp_atomic_lhs); 6388 op_location = c_parser_peek_token (parser)->location; 6389 switch (c_parser_peek_token (parser)->type) 6390 { 6391 case CPP_EQ: 6392 code = NOP_EXPR; 6393 break; 6394 case CPP_MULT_EQ: 6395 code = MULT_EXPR; 6396 break; 6397 case CPP_DIV_EQ: 6398 code = TRUNC_DIV_EXPR; 6399 break; 6400 case CPP_MOD_EQ: 6401 code = TRUNC_MOD_EXPR; 6402 break; 6403 case CPP_PLUS_EQ: 6404 code = PLUS_EXPR; 6405 break; 6406 case CPP_MINUS_EQ: 6407 code = MINUS_EXPR; 6408 break; 6409 case CPP_LSHIFT_EQ: 6410 code = LSHIFT_EXPR; 6411 break; 6412 case CPP_RSHIFT_EQ: 6413 code = RSHIFT_EXPR; 6414 break; 6415 case CPP_AND_EQ: 6416 code = BIT_AND_EXPR; 6417 break; 6418 case CPP_XOR_EQ: 6419 code = BIT_XOR_EXPR; 6420 break; 6421 case CPP_OR_EQ: 6422 code = BIT_IOR_EXPR; 6423 break; 6424 default: 6425 return lhs; 6426 } 6427 c_parser_consume_token (parser); 6428 exp_location = c_parser_peek_token (parser)->location; 6429 rhs = c_parser_expr_no_commas (parser, NULL); 6430 rhs = convert_lvalue_to_rvalue (exp_location, rhs, true, true); 6431 6432 ret.value = build_modify_expr (op_location, lhs.value, lhs.original_type, 6433 code, exp_location, rhs.value, 6434 rhs.original_type); 6435 set_c_expr_source_range (&ret, lhs.get_start (), rhs.get_finish ()); 6436 if (code == NOP_EXPR) 6437 ret.original_code = MODIFY_EXPR; 6438 else 6439 { 6440 TREE_NO_WARNING (ret.value) = 1; 6441 ret.original_code = ERROR_MARK; 6442 } 6443 ret.original_type = NULL; 6444 return ret; 6445 } 6446 6447 /* Parse a conditional expression (C90 6.3.15, C99 6.5.15, C11 6.5.15). If 6448 AFTER is not NULL then it is an Objective-C message expression which is 6449 the primary-expression starting the expression as an initializer. 6450 6451 conditional-expression: 6452 logical-OR-expression 6453 logical-OR-expression ? expression : conditional-expression 6454 6455 GNU extensions: 6456 6457 conditional-expression: 6458 logical-OR-expression ? : conditional-expression 6459 */ 6460 6461 static struct c_expr 6462 c_parser_conditional_expression (c_parser *parser, struct c_expr *after, 6463 tree omp_atomic_lhs) 6464 { 6465 struct c_expr cond, exp1, exp2, ret; 6466 location_t start, cond_loc, colon_loc, middle_loc; 6467 6468 gcc_assert (!after || c_dialect_objc ()); 6469 6470 cond = c_parser_binary_expression (parser, after, omp_atomic_lhs); 6471 6472 if (c_parser_next_token_is_not (parser, CPP_QUERY)) 6473 return cond; 6474 if (cond.value != error_mark_node) 6475 start = cond.get_start (); 6476 else 6477 start = UNKNOWN_LOCATION; 6478 cond_loc = c_parser_peek_token (parser)->location; 6479 cond = convert_lvalue_to_rvalue (cond_loc, cond, true, true); 6480 c_parser_consume_token (parser); 6481 if (c_parser_next_token_is (parser, CPP_COLON)) 6482 { 6483 tree eptype = NULL_TREE; 6484 6485 middle_loc = c_parser_peek_token (parser)->location; 6486 pedwarn (middle_loc, OPT_Wpedantic, 6487 "ISO C forbids omitting the middle term of a ?: expression"); 6488 if (TREE_CODE (cond.value) == EXCESS_PRECISION_EXPR) 6489 { 6490 eptype = TREE_TYPE (cond.value); 6491 cond.value = TREE_OPERAND (cond.value, 0); 6492 } 6493 tree e = cond.value; 6494 while (TREE_CODE (e) == COMPOUND_EXPR) 6495 e = TREE_OPERAND (e, 1); 6496 warn_for_omitted_condop (middle_loc, e); 6497 /* Make sure first operand is calculated only once. */ 6498 exp1.value = c_save_expr (default_conversion (cond.value)); 6499 if (eptype) 6500 exp1.value = build1 (EXCESS_PRECISION_EXPR, eptype, exp1.value); 6501 exp1.original_type = NULL; 6502 cond.value = c_objc_common_truthvalue_conversion (cond_loc, exp1.value); 6503 c_inhibit_evaluation_warnings += cond.value == truthvalue_true_node; 6504 } 6505 else 6506 { 6507 cond.value 6508 = c_objc_common_truthvalue_conversion 6509 (cond_loc, default_conversion (cond.value)); 6510 c_inhibit_evaluation_warnings += cond.value == truthvalue_false_node; 6511 exp1 = c_parser_expression_conv (parser); 6512 mark_exp_read (exp1.value); 6513 c_inhibit_evaluation_warnings += 6514 ((cond.value == truthvalue_true_node) 6515 - (cond.value == truthvalue_false_node)); 6516 } 6517 6518 colon_loc = c_parser_peek_token (parser)->location; 6519 if (!c_parser_require (parser, CPP_COLON, "expected %<:%>")) 6520 { 6521 c_inhibit_evaluation_warnings -= cond.value == truthvalue_true_node; 6522 ret.value = error_mark_node; 6523 ret.original_code = ERROR_MARK; 6524 ret.original_type = NULL; 6525 return ret; 6526 } 6527 { 6528 location_t exp2_loc = c_parser_peek_token (parser)->location; 6529 exp2 = c_parser_conditional_expression (parser, NULL, NULL_TREE); 6530 exp2 = convert_lvalue_to_rvalue (exp2_loc, exp2, true, true); 6531 } 6532 c_inhibit_evaluation_warnings -= cond.value == truthvalue_true_node; 6533 ret.value = build_conditional_expr (colon_loc, cond.value, 6534 cond.original_code == C_MAYBE_CONST_EXPR, 6535 exp1.value, exp1.original_type, 6536 exp2.value, exp2.original_type); 6537 ret.original_code = ERROR_MARK; 6538 if (exp1.value == error_mark_node || exp2.value == error_mark_node) 6539 ret.original_type = NULL; 6540 else 6541 { 6542 tree t1, t2; 6543 6544 /* If both sides are enum type, the default conversion will have 6545 made the type of the result be an integer type. We want to 6546 remember the enum types we started with. */ 6547 t1 = exp1.original_type ? exp1.original_type : TREE_TYPE (exp1.value); 6548 t2 = exp2.original_type ? exp2.original_type : TREE_TYPE (exp2.value); 6549 ret.original_type = ((t1 != error_mark_node 6550 && t2 != error_mark_node 6551 && (TYPE_MAIN_VARIANT (t1) 6552 == TYPE_MAIN_VARIANT (t2))) 6553 ? t1 6554 : NULL); 6555 } 6556 set_c_expr_source_range (&ret, start, exp2.get_finish ()); 6557 return ret; 6558 } 6559 6560 /* Parse a binary expression; that is, a logical-OR-expression (C90 6561 6.3.5-6.3.14, C99 6.5.5-6.5.14, C11 6.5.5-6.5.14). If AFTER is not 6562 NULL then it is an Objective-C message expression which is the 6563 primary-expression starting the expression as an initializer. 6564 6565 OMP_ATOMIC_LHS is NULL, unless parsing OpenMP #pragma omp atomic, 6566 when it should be the unfolded lhs. In a valid OpenMP source, 6567 one of the operands of the toplevel binary expression must be equal 6568 to it. In that case, just return a build2 created binary operation 6569 rather than result of parser_build_binary_op. 6570 6571 multiplicative-expression: 6572 cast-expression 6573 multiplicative-expression * cast-expression 6574 multiplicative-expression / cast-expression 6575 multiplicative-expression % cast-expression 6576 6577 additive-expression: 6578 multiplicative-expression 6579 additive-expression + multiplicative-expression 6580 additive-expression - multiplicative-expression 6581 6582 shift-expression: 6583 additive-expression 6584 shift-expression << additive-expression 6585 shift-expression >> additive-expression 6586 6587 relational-expression: 6588 shift-expression 6589 relational-expression < shift-expression 6590 relational-expression > shift-expression 6591 relational-expression <= shift-expression 6592 relational-expression >= shift-expression 6593 6594 equality-expression: 6595 relational-expression 6596 equality-expression == relational-expression 6597 equality-expression != relational-expression 6598 6599 AND-expression: 6600 equality-expression 6601 AND-expression & equality-expression 6602 6603 exclusive-OR-expression: 6604 AND-expression 6605 exclusive-OR-expression ^ AND-expression 6606 6607 inclusive-OR-expression: 6608 exclusive-OR-expression 6609 inclusive-OR-expression | exclusive-OR-expression 6610 6611 logical-AND-expression: 6612 inclusive-OR-expression 6613 logical-AND-expression && inclusive-OR-expression 6614 6615 logical-OR-expression: 6616 logical-AND-expression 6617 logical-OR-expression || logical-AND-expression 6618 */ 6619 6620 static struct c_expr 6621 c_parser_binary_expression (c_parser *parser, struct c_expr *after, 6622 tree omp_atomic_lhs) 6623 { 6624 /* A binary expression is parsed using operator-precedence parsing, 6625 with the operands being cast expressions. All the binary 6626 operators are left-associative. Thus a binary expression is of 6627 form: 6628 6629 E0 op1 E1 op2 E2 ... 6630 6631 which we represent on a stack. On the stack, the precedence 6632 levels are strictly increasing. When a new operator is 6633 encountered of higher precedence than that at the top of the 6634 stack, it is pushed; its LHS is the top expression, and its RHS 6635 is everything parsed until it is popped. When a new operator is 6636 encountered with precedence less than or equal to that at the top 6637 of the stack, triples E[i-1] op[i] E[i] are popped and replaced 6638 by the result of the operation until the operator at the top of 6639 the stack has lower precedence than the new operator or there is 6640 only one element on the stack; then the top expression is the LHS 6641 of the new operator. In the case of logical AND and OR 6642 expressions, we also need to adjust c_inhibit_evaluation_warnings 6643 as appropriate when the operators are pushed and popped. */ 6644 6645 struct { 6646 /* The expression at this stack level. */ 6647 struct c_expr expr; 6648 /* The precedence of the operator on its left, PREC_NONE at the 6649 bottom of the stack. */ 6650 enum c_parser_prec prec; 6651 /* The operation on its left. */ 6652 enum tree_code op; 6653 /* The source location of this operation. */ 6654 location_t loc; 6655 } stack[NUM_PRECS]; 6656 int sp; 6657 /* Location of the binary operator. */ 6658 location_t binary_loc = UNKNOWN_LOCATION; /* Quiet warning. */ 6659 #define POP \ 6660 do { \ 6661 switch (stack[sp].op) \ 6662 { \ 6663 case TRUTH_ANDIF_EXPR: \ 6664 c_inhibit_evaluation_warnings -= (stack[sp - 1].expr.value \ 6665 == truthvalue_false_node); \ 6666 break; \ 6667 case TRUTH_ORIF_EXPR: \ 6668 c_inhibit_evaluation_warnings -= (stack[sp - 1].expr.value \ 6669 == truthvalue_true_node); \ 6670 break; \ 6671 default: \ 6672 break; \ 6673 } \ 6674 stack[sp - 1].expr \ 6675 = convert_lvalue_to_rvalue (stack[sp - 1].loc, \ 6676 stack[sp - 1].expr, true, true); \ 6677 stack[sp].expr \ 6678 = convert_lvalue_to_rvalue (stack[sp].loc, \ 6679 stack[sp].expr, true, true); \ 6680 if (__builtin_expect (omp_atomic_lhs != NULL_TREE, 0) && sp == 1 \ 6681 && c_parser_peek_token (parser)->type == CPP_SEMICOLON \ 6682 && ((1 << stack[sp].prec) \ 6683 & ((1 << PREC_BITOR) | (1 << PREC_BITXOR) | (1 << PREC_BITAND) \ 6684 | (1 << PREC_SHIFT) | (1 << PREC_ADD) | (1 << PREC_MULT))) \ 6685 && stack[sp].op != TRUNC_MOD_EXPR \ 6686 && stack[0].expr.value != error_mark_node \ 6687 && stack[1].expr.value != error_mark_node \ 6688 && (c_tree_equal (stack[0].expr.value, omp_atomic_lhs) \ 6689 || c_tree_equal (stack[1].expr.value, omp_atomic_lhs))) \ 6690 stack[0].expr.value \ 6691 = build2 (stack[1].op, TREE_TYPE (stack[0].expr.value), \ 6692 stack[0].expr.value, stack[1].expr.value); \ 6693 else \ 6694 stack[sp - 1].expr = parser_build_binary_op (stack[sp].loc, \ 6695 stack[sp].op, \ 6696 stack[sp - 1].expr, \ 6697 stack[sp].expr); \ 6698 sp--; \ 6699 } while (0) 6700 gcc_assert (!after || c_dialect_objc ()); 6701 stack[0].loc = c_parser_peek_token (parser)->location; 6702 stack[0].expr = c_parser_cast_expression (parser, after); 6703 stack[0].prec = PREC_NONE; 6704 sp = 0; 6705 while (true) 6706 { 6707 enum c_parser_prec oprec; 6708 enum tree_code ocode; 6709 source_range src_range; 6710 if (parser->error) 6711 goto out; 6712 switch (c_parser_peek_token (parser)->type) 6713 { 6714 case CPP_MULT: 6715 oprec = PREC_MULT; 6716 ocode = MULT_EXPR; 6717 break; 6718 case CPP_DIV: 6719 oprec = PREC_MULT; 6720 ocode = TRUNC_DIV_EXPR; 6721 break; 6722 case CPP_MOD: 6723 oprec = PREC_MULT; 6724 ocode = TRUNC_MOD_EXPR; 6725 break; 6726 case CPP_PLUS: 6727 oprec = PREC_ADD; 6728 ocode = PLUS_EXPR; 6729 break; 6730 case CPP_MINUS: 6731 oprec = PREC_ADD; 6732 ocode = MINUS_EXPR; 6733 break; 6734 case CPP_LSHIFT: 6735 oprec = PREC_SHIFT; 6736 ocode = LSHIFT_EXPR; 6737 break; 6738 case CPP_RSHIFT: 6739 oprec = PREC_SHIFT; 6740 ocode = RSHIFT_EXPR; 6741 break; 6742 case CPP_LESS: 6743 oprec = PREC_REL; 6744 ocode = LT_EXPR; 6745 break; 6746 case CPP_GREATER: 6747 oprec = PREC_REL; 6748 ocode = GT_EXPR; 6749 break; 6750 case CPP_LESS_EQ: 6751 oprec = PREC_REL; 6752 ocode = LE_EXPR; 6753 break; 6754 case CPP_GREATER_EQ: 6755 oprec = PREC_REL; 6756 ocode = GE_EXPR; 6757 break; 6758 case CPP_EQ_EQ: 6759 oprec = PREC_EQ; 6760 ocode = EQ_EXPR; 6761 break; 6762 case CPP_NOT_EQ: 6763 oprec = PREC_EQ; 6764 ocode = NE_EXPR; 6765 break; 6766 case CPP_AND: 6767 oprec = PREC_BITAND; 6768 ocode = BIT_AND_EXPR; 6769 break; 6770 case CPP_XOR: 6771 oprec = PREC_BITXOR; 6772 ocode = BIT_XOR_EXPR; 6773 break; 6774 case CPP_OR: 6775 oprec = PREC_BITOR; 6776 ocode = BIT_IOR_EXPR; 6777 break; 6778 case CPP_AND_AND: 6779 oprec = PREC_LOGAND; 6780 ocode = TRUTH_ANDIF_EXPR; 6781 break; 6782 case CPP_OR_OR: 6783 oprec = PREC_LOGOR; 6784 ocode = TRUTH_ORIF_EXPR; 6785 break; 6786 default: 6787 /* Not a binary operator, so end of the binary 6788 expression. */ 6789 goto out; 6790 } 6791 binary_loc = c_parser_peek_token (parser)->location; 6792 while (oprec <= stack[sp].prec) 6793 POP; 6794 c_parser_consume_token (parser); 6795 switch (ocode) 6796 { 6797 case TRUTH_ANDIF_EXPR: 6798 src_range = stack[sp].expr.src_range; 6799 stack[sp].expr 6800 = convert_lvalue_to_rvalue (stack[sp].loc, 6801 stack[sp].expr, true, true); 6802 stack[sp].expr.value = c_objc_common_truthvalue_conversion 6803 (stack[sp].loc, default_conversion (stack[sp].expr.value)); 6804 c_inhibit_evaluation_warnings += (stack[sp].expr.value 6805 == truthvalue_false_node); 6806 set_c_expr_source_range (&stack[sp].expr, src_range); 6807 break; 6808 case TRUTH_ORIF_EXPR: 6809 src_range = stack[sp].expr.src_range; 6810 stack[sp].expr 6811 = convert_lvalue_to_rvalue (stack[sp].loc, 6812 stack[sp].expr, true, true); 6813 stack[sp].expr.value = c_objc_common_truthvalue_conversion 6814 (stack[sp].loc, default_conversion (stack[sp].expr.value)); 6815 c_inhibit_evaluation_warnings += (stack[sp].expr.value 6816 == truthvalue_true_node); 6817 set_c_expr_source_range (&stack[sp].expr, src_range); 6818 break; 6819 default: 6820 break; 6821 } 6822 sp++; 6823 stack[sp].loc = binary_loc; 6824 stack[sp].expr = c_parser_cast_expression (parser, NULL); 6825 stack[sp].prec = oprec; 6826 stack[sp].op = ocode; 6827 } 6828 out: 6829 while (sp > 0) 6830 POP; 6831 return stack[0].expr; 6832 #undef POP 6833 } 6834 6835 /* Parse a cast expression (C90 6.3.4, C99 6.5.4, C11 6.5.4). If AFTER 6836 is not NULL then it is an Objective-C message expression which is the 6837 primary-expression starting the expression as an initializer. 6838 6839 cast-expression: 6840 unary-expression 6841 ( type-name ) unary-expression 6842 */ 6843 6844 static struct c_expr 6845 c_parser_cast_expression (c_parser *parser, struct c_expr *after) 6846 { 6847 location_t cast_loc = c_parser_peek_token (parser)->location; 6848 gcc_assert (!after || c_dialect_objc ()); 6849 if (after) 6850 return c_parser_postfix_expression_after_primary (parser, 6851 cast_loc, *after); 6852 /* If the expression begins with a parenthesized type name, it may 6853 be either a cast or a compound literal; we need to see whether 6854 the next character is '{' to tell the difference. If not, it is 6855 an unary expression. Full detection of unknown typenames here 6856 would require a 3-token lookahead. */ 6857 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN) 6858 && c_token_starts_typename (c_parser_peek_2nd_token (parser))) 6859 { 6860 struct c_type_name *type_name; 6861 struct c_expr ret; 6862 struct c_expr expr; 6863 c_parser_consume_token (parser); 6864 type_name = c_parser_type_name (parser); 6865 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 6866 if (type_name == NULL) 6867 { 6868 ret.value = error_mark_node; 6869 ret.original_code = ERROR_MARK; 6870 ret.original_type = NULL; 6871 return ret; 6872 } 6873 6874 /* Save casted types in the function's used types hash table. */ 6875 used_types_insert (type_name->specs->type); 6876 6877 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE)) 6878 return c_parser_postfix_expression_after_paren_type (parser, type_name, 6879 cast_loc); 6880 { 6881 location_t expr_loc = c_parser_peek_token (parser)->location; 6882 expr = c_parser_cast_expression (parser, NULL); 6883 expr = convert_lvalue_to_rvalue (expr_loc, expr, true, true); 6884 } 6885 ret.value = c_cast_expr (cast_loc, type_name, expr.value); 6886 if (ret.value && expr.value) 6887 set_c_expr_source_range (&ret, cast_loc, expr.get_finish ()); 6888 ret.original_code = ERROR_MARK; 6889 ret.original_type = NULL; 6890 return ret; 6891 } 6892 else 6893 return c_parser_unary_expression (parser); 6894 } 6895 6896 /* Parse an unary expression (C90 6.3.3, C99 6.5.3, C11 6.5.3). 6897 6898 unary-expression: 6899 postfix-expression 6900 ++ unary-expression 6901 -- unary-expression 6902 unary-operator cast-expression 6903 sizeof unary-expression 6904 sizeof ( type-name ) 6905 6906 unary-operator: one of 6907 & * + - ~ ! 6908 6909 GNU extensions: 6910 6911 unary-expression: 6912 __alignof__ unary-expression 6913 __alignof__ ( type-name ) 6914 && identifier 6915 6916 (C11 permits _Alignof with type names only.) 6917 6918 unary-operator: one of 6919 __extension__ __real__ __imag__ 6920 6921 Transactional Memory: 6922 6923 unary-expression: 6924 transaction-expression 6925 6926 In addition, the GNU syntax treats ++ and -- as unary operators, so 6927 they may be applied to cast expressions with errors for non-lvalues 6928 given later. */ 6929 6930 static struct c_expr 6931 c_parser_unary_expression (c_parser *parser) 6932 { 6933 int ext; 6934 struct c_expr ret, op; 6935 location_t op_loc = c_parser_peek_token (parser)->location; 6936 location_t exp_loc; 6937 location_t finish; 6938 ret.original_code = ERROR_MARK; 6939 ret.original_type = NULL; 6940 switch (c_parser_peek_token (parser)->type) 6941 { 6942 case CPP_PLUS_PLUS: 6943 c_parser_consume_token (parser); 6944 exp_loc = c_parser_peek_token (parser)->location; 6945 op = c_parser_cast_expression (parser, NULL); 6946 6947 /* If there is array notations in op, we expand them. */ 6948 if (flag_cilkplus && TREE_CODE (op.value) == ARRAY_NOTATION_REF) 6949 return fix_array_notation_expr (exp_loc, PREINCREMENT_EXPR, op); 6950 else 6951 { 6952 op = default_function_array_read_conversion (exp_loc, op); 6953 return parser_build_unary_op (op_loc, PREINCREMENT_EXPR, op); 6954 } 6955 case CPP_MINUS_MINUS: 6956 c_parser_consume_token (parser); 6957 exp_loc = c_parser_peek_token (parser)->location; 6958 op = c_parser_cast_expression (parser, NULL); 6959 6960 /* If there is array notations in op, we expand them. */ 6961 if (flag_cilkplus && TREE_CODE (op.value) == ARRAY_NOTATION_REF) 6962 return fix_array_notation_expr (exp_loc, PREDECREMENT_EXPR, op); 6963 else 6964 { 6965 op = default_function_array_read_conversion (exp_loc, op); 6966 return parser_build_unary_op (op_loc, PREDECREMENT_EXPR, op); 6967 } 6968 case CPP_AND: 6969 c_parser_consume_token (parser); 6970 op = c_parser_cast_expression (parser, NULL); 6971 mark_exp_read (op.value); 6972 return parser_build_unary_op (op_loc, ADDR_EXPR, op); 6973 case CPP_MULT: 6974 { 6975 c_parser_consume_token (parser); 6976 exp_loc = c_parser_peek_token (parser)->location; 6977 op = c_parser_cast_expression (parser, NULL); 6978 finish = op.get_finish (); 6979 op = convert_lvalue_to_rvalue (exp_loc, op, true, true); 6980 location_t combined_loc = make_location (op_loc, op_loc, finish); 6981 ret.value = build_indirect_ref (combined_loc, op.value, RO_UNARY_STAR); 6982 ret.src_range.m_start = op_loc; 6983 ret.src_range.m_finish = finish; 6984 return ret; 6985 } 6986 case CPP_PLUS: 6987 if (!c_dialect_objc () && !in_system_header_at (input_location)) 6988 warning_at (op_loc, 6989 OPT_Wtraditional, 6990 "traditional C rejects the unary plus operator"); 6991 c_parser_consume_token (parser); 6992 exp_loc = c_parser_peek_token (parser)->location; 6993 op = c_parser_cast_expression (parser, NULL); 6994 op = convert_lvalue_to_rvalue (exp_loc, op, true, true); 6995 return parser_build_unary_op (op_loc, CONVERT_EXPR, op); 6996 case CPP_MINUS: 6997 c_parser_consume_token (parser); 6998 exp_loc = c_parser_peek_token (parser)->location; 6999 op = c_parser_cast_expression (parser, NULL); 7000 op = convert_lvalue_to_rvalue (exp_loc, op, true, true); 7001 return parser_build_unary_op (op_loc, NEGATE_EXPR, op); 7002 case CPP_COMPL: 7003 c_parser_consume_token (parser); 7004 exp_loc = c_parser_peek_token (parser)->location; 7005 op = c_parser_cast_expression (parser, NULL); 7006 op = convert_lvalue_to_rvalue (exp_loc, op, true, true); 7007 return parser_build_unary_op (op_loc, BIT_NOT_EXPR, op); 7008 case CPP_NOT: 7009 c_parser_consume_token (parser); 7010 exp_loc = c_parser_peek_token (parser)->location; 7011 op = c_parser_cast_expression (parser, NULL); 7012 op = convert_lvalue_to_rvalue (exp_loc, op, true, true); 7013 return parser_build_unary_op (op_loc, TRUTH_NOT_EXPR, op); 7014 case CPP_AND_AND: 7015 /* Refer to the address of a label as a pointer. */ 7016 c_parser_consume_token (parser); 7017 if (c_parser_next_token_is (parser, CPP_NAME)) 7018 { 7019 ret.value = finish_label_address_expr 7020 (c_parser_peek_token (parser)->value, op_loc); 7021 set_c_expr_source_range (&ret, op_loc, 7022 c_parser_peek_token (parser)->get_finish ()); 7023 c_parser_consume_token (parser); 7024 } 7025 else 7026 { 7027 c_parser_error (parser, "expected identifier"); 7028 ret.value = error_mark_node; 7029 } 7030 return ret; 7031 case CPP_KEYWORD: 7032 switch (c_parser_peek_token (parser)->keyword) 7033 { 7034 case RID_SIZEOF: 7035 return c_parser_sizeof_expression (parser); 7036 case RID_ALIGNOF: 7037 return c_parser_alignof_expression (parser); 7038 case RID_EXTENSION: 7039 c_parser_consume_token (parser); 7040 ext = disable_extension_diagnostics (); 7041 ret = c_parser_cast_expression (parser, NULL); 7042 restore_extension_diagnostics (ext); 7043 return ret; 7044 case RID_REALPART: 7045 c_parser_consume_token (parser); 7046 exp_loc = c_parser_peek_token (parser)->location; 7047 op = c_parser_cast_expression (parser, NULL); 7048 op = default_function_array_conversion (exp_loc, op); 7049 return parser_build_unary_op (op_loc, REALPART_EXPR, op); 7050 case RID_IMAGPART: 7051 c_parser_consume_token (parser); 7052 exp_loc = c_parser_peek_token (parser)->location; 7053 op = c_parser_cast_expression (parser, NULL); 7054 op = default_function_array_conversion (exp_loc, op); 7055 return parser_build_unary_op (op_loc, IMAGPART_EXPR, op); 7056 case RID_TRANSACTION_ATOMIC: 7057 case RID_TRANSACTION_RELAXED: 7058 return c_parser_transaction_expression (parser, 7059 c_parser_peek_token (parser)->keyword); 7060 default: 7061 return c_parser_postfix_expression (parser); 7062 } 7063 default: 7064 return c_parser_postfix_expression (parser); 7065 } 7066 } 7067 7068 /* Parse a sizeof expression. */ 7069 7070 static struct c_expr 7071 c_parser_sizeof_expression (c_parser *parser) 7072 { 7073 struct c_expr expr; 7074 struct c_expr result; 7075 location_t expr_loc; 7076 gcc_assert (c_parser_next_token_is_keyword (parser, RID_SIZEOF)); 7077 7078 location_t start; 7079 location_t finish = UNKNOWN_LOCATION; 7080 7081 start = c_parser_peek_token (parser)->location; 7082 7083 c_parser_consume_token (parser); 7084 c_inhibit_evaluation_warnings++; 7085 in_sizeof++; 7086 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN) 7087 && c_token_starts_typename (c_parser_peek_2nd_token (parser))) 7088 { 7089 /* Either sizeof ( type-name ) or sizeof unary-expression 7090 starting with a compound literal. */ 7091 struct c_type_name *type_name; 7092 c_parser_consume_token (parser); 7093 expr_loc = c_parser_peek_token (parser)->location; 7094 type_name = c_parser_type_name (parser); 7095 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 7096 finish = parser->tokens_buf[0].location; 7097 if (type_name == NULL) 7098 { 7099 struct c_expr ret; 7100 c_inhibit_evaluation_warnings--; 7101 in_sizeof--; 7102 ret.value = error_mark_node; 7103 ret.original_code = ERROR_MARK; 7104 ret.original_type = NULL; 7105 return ret; 7106 } 7107 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE)) 7108 { 7109 expr = c_parser_postfix_expression_after_paren_type (parser, 7110 type_name, 7111 expr_loc); 7112 finish = expr.get_finish (); 7113 goto sizeof_expr; 7114 } 7115 /* sizeof ( type-name ). */ 7116 c_inhibit_evaluation_warnings--; 7117 in_sizeof--; 7118 result = c_expr_sizeof_type (expr_loc, type_name); 7119 } 7120 else 7121 { 7122 expr_loc = c_parser_peek_token (parser)->location; 7123 expr = c_parser_unary_expression (parser); 7124 finish = expr.get_finish (); 7125 sizeof_expr: 7126 c_inhibit_evaluation_warnings--; 7127 in_sizeof--; 7128 mark_exp_read (expr.value); 7129 if (TREE_CODE (expr.value) == COMPONENT_REF 7130 && DECL_C_BIT_FIELD (TREE_OPERAND (expr.value, 1))) 7131 error_at (expr_loc, "%<sizeof%> applied to a bit-field"); 7132 result = c_expr_sizeof_expr (expr_loc, expr); 7133 } 7134 if (finish != UNKNOWN_LOCATION) 7135 set_c_expr_source_range (&result, start, finish); 7136 return result; 7137 } 7138 7139 /* Parse an alignof expression. */ 7140 7141 static struct c_expr 7142 c_parser_alignof_expression (c_parser *parser) 7143 { 7144 struct c_expr expr; 7145 location_t start_loc = c_parser_peek_token (parser)->location; 7146 location_t end_loc; 7147 tree alignof_spelling = c_parser_peek_token (parser)->value; 7148 gcc_assert (c_parser_next_token_is_keyword (parser, RID_ALIGNOF)); 7149 bool is_c11_alignof = strcmp (IDENTIFIER_POINTER (alignof_spelling), 7150 "_Alignof") == 0; 7151 /* A diagnostic is not required for the use of this identifier in 7152 the implementation namespace; only diagnose it for the C11 7153 spelling because of existing code using the other spellings. */ 7154 if (is_c11_alignof) 7155 { 7156 if (flag_isoc99) 7157 pedwarn_c99 (start_loc, OPT_Wpedantic, "ISO C99 does not support %qE", 7158 alignof_spelling); 7159 else 7160 pedwarn_c99 (start_loc, OPT_Wpedantic, "ISO C90 does not support %qE", 7161 alignof_spelling); 7162 } 7163 c_parser_consume_token (parser); 7164 c_inhibit_evaluation_warnings++; 7165 in_alignof++; 7166 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN) 7167 && c_token_starts_typename (c_parser_peek_2nd_token (parser))) 7168 { 7169 /* Either __alignof__ ( type-name ) or __alignof__ 7170 unary-expression starting with a compound literal. */ 7171 location_t loc; 7172 struct c_type_name *type_name; 7173 struct c_expr ret; 7174 c_parser_consume_token (parser); 7175 loc = c_parser_peek_token (parser)->location; 7176 type_name = c_parser_type_name (parser); 7177 end_loc = c_parser_peek_token (parser)->location; 7178 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 7179 if (type_name == NULL) 7180 { 7181 struct c_expr ret; 7182 c_inhibit_evaluation_warnings--; 7183 in_alignof--; 7184 ret.value = error_mark_node; 7185 ret.original_code = ERROR_MARK; 7186 ret.original_type = NULL; 7187 return ret; 7188 } 7189 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE)) 7190 { 7191 expr = c_parser_postfix_expression_after_paren_type (parser, 7192 type_name, 7193 loc); 7194 goto alignof_expr; 7195 } 7196 /* alignof ( type-name ). */ 7197 c_inhibit_evaluation_warnings--; 7198 in_alignof--; 7199 ret.value = c_sizeof_or_alignof_type (loc, groktypename (type_name, 7200 NULL, NULL), 7201 false, is_c11_alignof, 1); 7202 ret.original_code = ERROR_MARK; 7203 ret.original_type = NULL; 7204 set_c_expr_source_range (&ret, start_loc, end_loc); 7205 return ret; 7206 } 7207 else 7208 { 7209 struct c_expr ret; 7210 expr = c_parser_unary_expression (parser); 7211 end_loc = expr.src_range.m_finish; 7212 alignof_expr: 7213 mark_exp_read (expr.value); 7214 c_inhibit_evaluation_warnings--; 7215 in_alignof--; 7216 if (is_c11_alignof) 7217 pedwarn (start_loc, 7218 OPT_Wpedantic, "ISO C does not allow %<%E (expression)%>", 7219 alignof_spelling); 7220 ret.value = c_alignof_expr (start_loc, expr.value); 7221 ret.original_code = ERROR_MARK; 7222 ret.original_type = NULL; 7223 set_c_expr_source_range (&ret, start_loc, end_loc); 7224 return ret; 7225 } 7226 } 7227 7228 /* Helper function to read arguments of builtins which are interfaces 7229 for the middle-end nodes like COMPLEX_EXPR, VEC_PERM_EXPR and 7230 others. The name of the builtin is passed using BNAME parameter. 7231 Function returns true if there were no errors while parsing and 7232 stores the arguments in CEXPR_LIST. If it returns true, 7233 *OUT_CLOSE_PAREN_LOC is written to with the location of the closing 7234 parenthesis. */ 7235 static bool 7236 c_parser_get_builtin_args (c_parser *parser, const char *bname, 7237 vec<c_expr_t, va_gc> **ret_cexpr_list, 7238 bool choose_expr_p, 7239 location_t *out_close_paren_loc) 7240 { 7241 location_t loc = c_parser_peek_token (parser)->location; 7242 vec<c_expr_t, va_gc> *cexpr_list; 7243 c_expr_t expr; 7244 bool saved_force_folding_builtin_constant_p; 7245 7246 *ret_cexpr_list = NULL; 7247 if (c_parser_next_token_is_not (parser, CPP_OPEN_PAREN)) 7248 { 7249 error_at (loc, "cannot take address of %qs", bname); 7250 return false; 7251 } 7252 7253 c_parser_consume_token (parser); 7254 7255 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN)) 7256 { 7257 *out_close_paren_loc = c_parser_peek_token (parser)->location; 7258 c_parser_consume_token (parser); 7259 return true; 7260 } 7261 7262 saved_force_folding_builtin_constant_p 7263 = force_folding_builtin_constant_p; 7264 force_folding_builtin_constant_p |= choose_expr_p; 7265 expr = c_parser_expr_no_commas (parser, NULL); 7266 force_folding_builtin_constant_p 7267 = saved_force_folding_builtin_constant_p; 7268 vec_alloc (cexpr_list, 1); 7269 vec_safe_push (cexpr_list, expr); 7270 while (c_parser_next_token_is (parser, CPP_COMMA)) 7271 { 7272 c_parser_consume_token (parser); 7273 expr = c_parser_expr_no_commas (parser, NULL); 7274 vec_safe_push (cexpr_list, expr); 7275 } 7276 7277 *out_close_paren_loc = c_parser_peek_token (parser)->location; 7278 if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>")) 7279 return false; 7280 7281 *ret_cexpr_list = cexpr_list; 7282 return true; 7283 } 7284 7285 /* This represents a single generic-association. */ 7286 7287 struct c_generic_association 7288 { 7289 /* The location of the starting token of the type. */ 7290 location_t type_location; 7291 /* The association's type, or NULL_TREE for 'default'. */ 7292 tree type; 7293 /* The association's expression. */ 7294 struct c_expr expression; 7295 }; 7296 7297 /* Parse a generic-selection. (C11 6.5.1.1). 7298 7299 generic-selection: 7300 _Generic ( assignment-expression , generic-assoc-list ) 7301 7302 generic-assoc-list: 7303 generic-association 7304 generic-assoc-list , generic-association 7305 7306 generic-association: 7307 type-name : assignment-expression 7308 default : assignment-expression 7309 */ 7310 7311 static struct c_expr 7312 c_parser_generic_selection (c_parser *parser) 7313 { 7314 struct c_expr selector, error_expr; 7315 tree selector_type; 7316 struct c_generic_association matched_assoc; 7317 bool match_found = false; 7318 location_t generic_loc, selector_loc; 7319 7320 error_expr.original_code = ERROR_MARK; 7321 error_expr.original_type = NULL; 7322 error_expr.set_error (); 7323 matched_assoc.type_location = UNKNOWN_LOCATION; 7324 matched_assoc.type = NULL_TREE; 7325 matched_assoc.expression = error_expr; 7326 7327 gcc_assert (c_parser_next_token_is_keyword (parser, RID_GENERIC)); 7328 generic_loc = c_parser_peek_token (parser)->location; 7329 c_parser_consume_token (parser); 7330 if (flag_isoc99) 7331 pedwarn_c99 (generic_loc, OPT_Wpedantic, 7332 "ISO C99 does not support %<_Generic%>"); 7333 else 7334 pedwarn_c99 (generic_loc, OPT_Wpedantic, 7335 "ISO C90 does not support %<_Generic%>"); 7336 7337 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 7338 return error_expr; 7339 7340 c_inhibit_evaluation_warnings++; 7341 selector_loc = c_parser_peek_token (parser)->location; 7342 selector = c_parser_expr_no_commas (parser, NULL); 7343 selector = default_function_array_conversion (selector_loc, selector); 7344 c_inhibit_evaluation_warnings--; 7345 7346 if (selector.value == error_mark_node) 7347 { 7348 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL); 7349 return selector; 7350 } 7351 selector_type = TREE_TYPE (selector.value); 7352 /* In ISO C terms, rvalues (including the controlling expression of 7353 _Generic) do not have qualified types. */ 7354 if (TREE_CODE (selector_type) != ARRAY_TYPE) 7355 selector_type = TYPE_MAIN_VARIANT (selector_type); 7356 /* In ISO C terms, _Noreturn is not part of the type of expressions 7357 such as &abort, but in GCC it is represented internally as a type 7358 qualifier. */ 7359 if (FUNCTION_POINTER_TYPE_P (selector_type) 7360 && TYPE_QUALS (TREE_TYPE (selector_type)) != TYPE_UNQUALIFIED) 7361 selector_type 7362 = build_pointer_type (TYPE_MAIN_VARIANT (TREE_TYPE (selector_type))); 7363 7364 if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>")) 7365 { 7366 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL); 7367 return error_expr; 7368 } 7369 7370 auto_vec<c_generic_association> associations; 7371 while (1) 7372 { 7373 struct c_generic_association assoc, *iter; 7374 unsigned int ix; 7375 c_token *token = c_parser_peek_token (parser); 7376 7377 assoc.type_location = token->location; 7378 if (token->type == CPP_KEYWORD && token->keyword == RID_DEFAULT) 7379 { 7380 c_parser_consume_token (parser); 7381 assoc.type = NULL_TREE; 7382 } 7383 else 7384 { 7385 struct c_type_name *type_name; 7386 7387 type_name = c_parser_type_name (parser); 7388 if (type_name == NULL) 7389 { 7390 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL); 7391 return error_expr; 7392 } 7393 assoc.type = groktypename (type_name, NULL, NULL); 7394 if (assoc.type == error_mark_node) 7395 { 7396 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL); 7397 return error_expr; 7398 } 7399 7400 if (TREE_CODE (assoc.type) == FUNCTION_TYPE) 7401 error_at (assoc.type_location, 7402 "%<_Generic%> association has function type"); 7403 else if (!COMPLETE_TYPE_P (assoc.type)) 7404 error_at (assoc.type_location, 7405 "%<_Generic%> association has incomplete type"); 7406 7407 if (variably_modified_type_p (assoc.type, NULL_TREE)) 7408 error_at (assoc.type_location, 7409 "%<_Generic%> association has " 7410 "variable length type"); 7411 } 7412 7413 if (!c_parser_require (parser, CPP_COLON, "expected %<:%>")) 7414 { 7415 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL); 7416 return error_expr; 7417 } 7418 7419 assoc.expression = c_parser_expr_no_commas (parser, NULL); 7420 if (assoc.expression.value == error_mark_node) 7421 { 7422 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL); 7423 return error_expr; 7424 } 7425 7426 for (ix = 0; associations.iterate (ix, &iter); ++ix) 7427 { 7428 if (assoc.type == NULL_TREE) 7429 { 7430 if (iter->type == NULL_TREE) 7431 { 7432 error_at (assoc.type_location, 7433 "duplicate %<default%> case in %<_Generic%>"); 7434 inform (iter->type_location, "original %<default%> is here"); 7435 } 7436 } 7437 else if (iter->type != NULL_TREE) 7438 { 7439 if (comptypes (assoc.type, iter->type)) 7440 { 7441 error_at (assoc.type_location, 7442 "%<_Generic%> specifies two compatible types"); 7443 inform (iter->type_location, "compatible type is here"); 7444 } 7445 } 7446 } 7447 7448 if (assoc.type == NULL_TREE) 7449 { 7450 if (!match_found) 7451 { 7452 matched_assoc = assoc; 7453 match_found = true; 7454 } 7455 } 7456 else if (comptypes (assoc.type, selector_type)) 7457 { 7458 if (!match_found || matched_assoc.type == NULL_TREE) 7459 { 7460 matched_assoc = assoc; 7461 match_found = true; 7462 } 7463 else 7464 { 7465 error_at (assoc.type_location, 7466 "%<_Generic%> selector matches multiple associations"); 7467 inform (matched_assoc.type_location, 7468 "other match is here"); 7469 } 7470 } 7471 7472 associations.safe_push (assoc); 7473 7474 if (c_parser_peek_token (parser)->type != CPP_COMMA) 7475 break; 7476 c_parser_consume_token (parser); 7477 } 7478 7479 if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>")) 7480 { 7481 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL); 7482 return error_expr; 7483 } 7484 7485 if (!match_found) 7486 { 7487 error_at (selector_loc, "%<_Generic%> selector of type %qT is not " 7488 "compatible with any association", 7489 selector_type); 7490 return error_expr; 7491 } 7492 7493 return matched_assoc.expression; 7494 } 7495 7496 /* Parse a postfix expression (C90 6.3.1-6.3.2, C99 6.5.1-6.5.2, 7497 C11 6.5.1-6.5.2). 7498 7499 postfix-expression: 7500 primary-expression 7501 postfix-expression [ expression ] 7502 postfix-expression ( argument-expression-list[opt] ) 7503 postfix-expression . identifier 7504 postfix-expression -> identifier 7505 postfix-expression ++ 7506 postfix-expression -- 7507 ( type-name ) { initializer-list } 7508 ( type-name ) { initializer-list , } 7509 7510 argument-expression-list: 7511 argument-expression 7512 argument-expression-list , argument-expression 7513 7514 primary-expression: 7515 identifier 7516 constant 7517 string-literal 7518 ( expression ) 7519 generic-selection 7520 7521 GNU extensions: 7522 7523 primary-expression: 7524 __func__ 7525 (treated as a keyword in GNU C) 7526 __FUNCTION__ 7527 __PRETTY_FUNCTION__ 7528 ( compound-statement ) 7529 __builtin_va_arg ( assignment-expression , type-name ) 7530 __builtin_offsetof ( type-name , offsetof-member-designator ) 7531 __builtin_choose_expr ( assignment-expression , 7532 assignment-expression , 7533 assignment-expression ) 7534 __builtin_types_compatible_p ( type-name , type-name ) 7535 __builtin_complex ( assignment-expression , assignment-expression ) 7536 __builtin_shuffle ( assignment-expression , assignment-expression ) 7537 __builtin_shuffle ( assignment-expression , 7538 assignment-expression , 7539 assignment-expression, ) 7540 7541 offsetof-member-designator: 7542 identifier 7543 offsetof-member-designator . identifier 7544 offsetof-member-designator [ expression ] 7545 7546 Objective-C: 7547 7548 primary-expression: 7549 [ objc-receiver objc-message-args ] 7550 @selector ( objc-selector-arg ) 7551 @protocol ( identifier ) 7552 @encode ( type-name ) 7553 objc-string-literal 7554 Classname . identifier 7555 */ 7556 7557 static struct c_expr 7558 c_parser_postfix_expression (c_parser *parser) 7559 { 7560 struct c_expr expr, e1; 7561 struct c_type_name *t1, *t2; 7562 location_t loc = c_parser_peek_token (parser)->location;; 7563 source_range tok_range = c_parser_peek_token (parser)->get_range (); 7564 expr.original_code = ERROR_MARK; 7565 expr.original_type = NULL; 7566 switch (c_parser_peek_token (parser)->type) 7567 { 7568 case CPP_NUMBER: 7569 expr.value = c_parser_peek_token (parser)->value; 7570 set_c_expr_source_range (&expr, tok_range); 7571 loc = c_parser_peek_token (parser)->location; 7572 c_parser_consume_token (parser); 7573 if (TREE_CODE (expr.value) == FIXED_CST 7574 && !targetm.fixed_point_supported_p ()) 7575 { 7576 error_at (loc, "fixed-point types not supported for this target"); 7577 expr.value = error_mark_node; 7578 } 7579 break; 7580 case CPP_CHAR: 7581 case CPP_CHAR16: 7582 case CPP_CHAR32: 7583 case CPP_WCHAR: 7584 expr.value = c_parser_peek_token (parser)->value; 7585 /* For the purpose of warning when a pointer is compared with 7586 a zero character constant. */ 7587 expr.original_type = char_type_node; 7588 set_c_expr_source_range (&expr, tok_range); 7589 c_parser_consume_token (parser); 7590 break; 7591 case CPP_STRING: 7592 case CPP_STRING16: 7593 case CPP_STRING32: 7594 case CPP_WSTRING: 7595 case CPP_UTF8STRING: 7596 expr.value = c_parser_peek_token (parser)->value; 7597 set_c_expr_source_range (&expr, tok_range); 7598 expr.original_code = STRING_CST; 7599 c_parser_consume_token (parser); 7600 break; 7601 case CPP_OBJC_STRING: 7602 gcc_assert (c_dialect_objc ()); 7603 expr.value 7604 = objc_build_string_object (c_parser_peek_token (parser)->value); 7605 set_c_expr_source_range (&expr, tok_range); 7606 c_parser_consume_token (parser); 7607 break; 7608 case CPP_NAME: 7609 switch (c_parser_peek_token (parser)->id_kind) 7610 { 7611 case C_ID_ID: 7612 { 7613 tree id = c_parser_peek_token (parser)->value; 7614 c_parser_consume_token (parser); 7615 expr.value = build_external_ref (loc, id, 7616 (c_parser_peek_token (parser)->type 7617 == CPP_OPEN_PAREN), 7618 &expr.original_type); 7619 set_c_expr_source_range (&expr, tok_range); 7620 break; 7621 } 7622 case C_ID_CLASSNAME: 7623 { 7624 /* Here we parse the Objective-C 2.0 Class.name dot 7625 syntax. */ 7626 tree class_name = c_parser_peek_token (parser)->value; 7627 tree component; 7628 c_parser_consume_token (parser); 7629 gcc_assert (c_dialect_objc ()); 7630 if (!c_parser_require (parser, CPP_DOT, "expected %<.%>")) 7631 { 7632 expr.set_error (); 7633 break; 7634 } 7635 if (c_parser_next_token_is_not (parser, CPP_NAME)) 7636 { 7637 c_parser_error (parser, "expected identifier"); 7638 expr.set_error (); 7639 break; 7640 } 7641 c_token *component_tok = c_parser_peek_token (parser); 7642 component = component_tok->value; 7643 location_t end_loc = component_tok->get_finish (); 7644 c_parser_consume_token (parser); 7645 expr.value = objc_build_class_component_ref (class_name, 7646 component); 7647 set_c_expr_source_range (&expr, loc, end_loc); 7648 break; 7649 } 7650 default: 7651 c_parser_error (parser, "expected expression"); 7652 expr.set_error (); 7653 break; 7654 } 7655 break; 7656 case CPP_OPEN_PAREN: 7657 /* A parenthesized expression, statement expression or compound 7658 literal. */ 7659 if (c_parser_peek_2nd_token (parser)->type == CPP_OPEN_BRACE) 7660 { 7661 /* A statement expression. */ 7662 tree stmt; 7663 location_t brace_loc; 7664 c_parser_consume_token (parser); 7665 brace_loc = c_parser_peek_token (parser)->location; 7666 c_parser_consume_token (parser); 7667 if (!building_stmt_list_p ()) 7668 { 7669 error_at (loc, "braced-group within expression allowed " 7670 "only inside a function"); 7671 parser->error = true; 7672 c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL); 7673 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL); 7674 expr.set_error (); 7675 break; 7676 } 7677 stmt = c_begin_stmt_expr (); 7678 c_parser_compound_statement_nostart (parser); 7679 location_t close_loc = c_parser_peek_token (parser)->location; 7680 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 7681 "expected %<)%>"); 7682 pedwarn (loc, OPT_Wpedantic, 7683 "ISO C forbids braced-groups within expressions"); 7684 expr.value = c_finish_stmt_expr (brace_loc, stmt); 7685 set_c_expr_source_range (&expr, loc, close_loc); 7686 mark_exp_read (expr.value); 7687 } 7688 else if (c_token_starts_typename (c_parser_peek_2nd_token (parser))) 7689 { 7690 /* A compound literal. ??? Can we actually get here rather 7691 than going directly to 7692 c_parser_postfix_expression_after_paren_type from 7693 elsewhere? */ 7694 location_t loc; 7695 struct c_type_name *type_name; 7696 c_parser_consume_token (parser); 7697 loc = c_parser_peek_token (parser)->location; 7698 type_name = c_parser_type_name (parser); 7699 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 7700 "expected %<)%>"); 7701 if (type_name == NULL) 7702 { 7703 expr.set_error (); 7704 } 7705 else 7706 expr = c_parser_postfix_expression_after_paren_type (parser, 7707 type_name, 7708 loc); 7709 } 7710 else 7711 { 7712 /* A parenthesized expression. */ 7713 location_t loc_open_paren = c_parser_peek_token (parser)->location; 7714 c_parser_consume_token (parser); 7715 expr = c_parser_expression (parser); 7716 if (TREE_CODE (expr.value) == MODIFY_EXPR) 7717 TREE_NO_WARNING (expr.value) = 1; 7718 if (expr.original_code != C_MAYBE_CONST_EXPR) 7719 expr.original_code = ERROR_MARK; 7720 /* Don't change EXPR.ORIGINAL_TYPE. */ 7721 location_t loc_close_paren = c_parser_peek_token (parser)->location; 7722 set_c_expr_source_range (&expr, loc_open_paren, loc_close_paren); 7723 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 7724 "expected %<)%>"); 7725 } 7726 break; 7727 case CPP_KEYWORD: 7728 switch (c_parser_peek_token (parser)->keyword) 7729 { 7730 case RID_FUNCTION_NAME: 7731 pedwarn (loc, OPT_Wpedantic, "ISO C does not support " 7732 "%<__FUNCTION__%> predefined identifier"); 7733 expr.value = fname_decl (loc, 7734 c_parser_peek_token (parser)->keyword, 7735 c_parser_peek_token (parser)->value); 7736 set_c_expr_source_range (&expr, loc, loc); 7737 c_parser_consume_token (parser); 7738 break; 7739 case RID_PRETTY_FUNCTION_NAME: 7740 pedwarn (loc, OPT_Wpedantic, "ISO C does not support " 7741 "%<__PRETTY_FUNCTION__%> predefined identifier"); 7742 expr.value = fname_decl (loc, 7743 c_parser_peek_token (parser)->keyword, 7744 c_parser_peek_token (parser)->value); 7745 set_c_expr_source_range (&expr, loc, loc); 7746 c_parser_consume_token (parser); 7747 break; 7748 case RID_C99_FUNCTION_NAME: 7749 pedwarn_c90 (loc, OPT_Wpedantic, "ISO C90 does not support " 7750 "%<__func__%> predefined identifier"); 7751 expr.value = fname_decl (loc, 7752 c_parser_peek_token (parser)->keyword, 7753 c_parser_peek_token (parser)->value); 7754 set_c_expr_source_range (&expr, loc, loc); 7755 c_parser_consume_token (parser); 7756 break; 7757 case RID_VA_ARG: 7758 { 7759 location_t start_loc = loc; 7760 c_parser_consume_token (parser); 7761 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 7762 { 7763 expr.set_error (); 7764 break; 7765 } 7766 e1 = c_parser_expr_no_commas (parser, NULL); 7767 mark_exp_read (e1.value); 7768 e1.value = c_fully_fold (e1.value, false, NULL); 7769 if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>")) 7770 { 7771 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL); 7772 expr.set_error (); 7773 break; 7774 } 7775 loc = c_parser_peek_token (parser)->location; 7776 t1 = c_parser_type_name (parser); 7777 location_t end_loc = c_parser_peek_token (parser)->get_finish (); 7778 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 7779 "expected %<)%>"); 7780 if (t1 == NULL) 7781 { 7782 expr.set_error (); 7783 } 7784 else 7785 { 7786 tree type_expr = NULL_TREE; 7787 expr.value = c_build_va_arg (start_loc, e1.value, loc, 7788 groktypename (t1, &type_expr, NULL)); 7789 if (type_expr) 7790 { 7791 expr.value = build2 (C_MAYBE_CONST_EXPR, 7792 TREE_TYPE (expr.value), type_expr, 7793 expr.value); 7794 C_MAYBE_CONST_EXPR_NON_CONST (expr.value) = true; 7795 } 7796 set_c_expr_source_range (&expr, start_loc, end_loc); 7797 } 7798 } 7799 break; 7800 case RID_OFFSETOF: 7801 c_parser_consume_token (parser); 7802 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 7803 { 7804 expr.set_error (); 7805 break; 7806 } 7807 t1 = c_parser_type_name (parser); 7808 if (t1 == NULL) 7809 parser->error = true; 7810 if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>")) 7811 gcc_assert (parser->error); 7812 if (parser->error) 7813 { 7814 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL); 7815 expr.set_error (); 7816 break; 7817 } 7818 7819 { 7820 tree type = groktypename (t1, NULL, NULL); 7821 tree offsetof_ref; 7822 if (type == error_mark_node) 7823 offsetof_ref = error_mark_node; 7824 else 7825 { 7826 offsetof_ref = build1 (INDIRECT_REF, type, null_pointer_node); 7827 SET_EXPR_LOCATION (offsetof_ref, loc); 7828 } 7829 /* Parse the second argument to __builtin_offsetof. We 7830 must have one identifier, and beyond that we want to 7831 accept sub structure and sub array references. */ 7832 if (c_parser_next_token_is (parser, CPP_NAME)) 7833 { 7834 c_token *comp_tok = c_parser_peek_token (parser); 7835 offsetof_ref = build_component_ref 7836 (loc, offsetof_ref, comp_tok->value, comp_tok->location); 7837 c_parser_consume_token (parser); 7838 while (c_parser_next_token_is (parser, CPP_DOT) 7839 || c_parser_next_token_is (parser, 7840 CPP_OPEN_SQUARE) 7841 || c_parser_next_token_is (parser, 7842 CPP_DEREF)) 7843 { 7844 if (c_parser_next_token_is (parser, CPP_DEREF)) 7845 { 7846 loc = c_parser_peek_token (parser)->location; 7847 offsetof_ref = build_array_ref (loc, 7848 offsetof_ref, 7849 integer_zero_node); 7850 goto do_dot; 7851 } 7852 else if (c_parser_next_token_is (parser, CPP_DOT)) 7853 { 7854 do_dot: 7855 c_parser_consume_token (parser); 7856 if (c_parser_next_token_is_not (parser, 7857 CPP_NAME)) 7858 { 7859 c_parser_error (parser, "expected identifier"); 7860 break; 7861 } 7862 c_token *comp_tok = c_parser_peek_token (parser); 7863 offsetof_ref = build_component_ref 7864 (loc, offsetof_ref, comp_tok->value, 7865 comp_tok->location); 7866 c_parser_consume_token (parser); 7867 } 7868 else 7869 { 7870 struct c_expr ce; 7871 tree idx; 7872 loc = c_parser_peek_token (parser)->location; 7873 c_parser_consume_token (parser); 7874 ce = c_parser_expression (parser); 7875 ce = convert_lvalue_to_rvalue (loc, ce, false, false); 7876 idx = ce.value; 7877 idx = c_fully_fold (idx, false, NULL); 7878 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, 7879 "expected %<]%>"); 7880 offsetof_ref = build_array_ref (loc, offsetof_ref, idx); 7881 } 7882 } 7883 } 7884 else 7885 c_parser_error (parser, "expected identifier"); 7886 location_t end_loc = c_parser_peek_token (parser)->get_finish (); 7887 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 7888 "expected %<)%>"); 7889 expr.value = fold_offsetof (offsetof_ref); 7890 set_c_expr_source_range (&expr, loc, end_loc); 7891 } 7892 break; 7893 case RID_CHOOSE_EXPR: 7894 { 7895 vec<c_expr_t, va_gc> *cexpr_list; 7896 c_expr_t *e1_p, *e2_p, *e3_p; 7897 tree c; 7898 location_t close_paren_loc; 7899 7900 c_parser_consume_token (parser); 7901 if (!c_parser_get_builtin_args (parser, 7902 "__builtin_choose_expr", 7903 &cexpr_list, true, 7904 &close_paren_loc)) 7905 { 7906 expr.set_error (); 7907 break; 7908 } 7909 7910 if (vec_safe_length (cexpr_list) != 3) 7911 { 7912 error_at (loc, "wrong number of arguments to " 7913 "%<__builtin_choose_expr%>"); 7914 expr.set_error (); 7915 break; 7916 } 7917 7918 e1_p = &(*cexpr_list)[0]; 7919 e2_p = &(*cexpr_list)[1]; 7920 e3_p = &(*cexpr_list)[2]; 7921 7922 c = e1_p->value; 7923 mark_exp_read (e2_p->value); 7924 mark_exp_read (e3_p->value); 7925 if (TREE_CODE (c) != INTEGER_CST 7926 || !INTEGRAL_TYPE_P (TREE_TYPE (c))) 7927 error_at (loc, 7928 "first argument to %<__builtin_choose_expr%> not" 7929 " a constant"); 7930 constant_expression_warning (c); 7931 expr = integer_zerop (c) ? *e3_p : *e2_p; 7932 set_c_expr_source_range (&expr, loc, close_paren_loc); 7933 break; 7934 } 7935 case RID_TYPES_COMPATIBLE_P: 7936 c_parser_consume_token (parser); 7937 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 7938 { 7939 expr.set_error (); 7940 break; 7941 } 7942 t1 = c_parser_type_name (parser); 7943 if (t1 == NULL) 7944 { 7945 expr.set_error (); 7946 break; 7947 } 7948 if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>")) 7949 { 7950 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL); 7951 expr.set_error (); 7952 break; 7953 } 7954 t2 = c_parser_type_name (parser); 7955 if (t2 == NULL) 7956 { 7957 expr.set_error (); 7958 break; 7959 } 7960 { 7961 location_t close_paren_loc = c_parser_peek_token (parser)->location; 7962 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 7963 "expected %<)%>"); 7964 tree e1, e2; 7965 e1 = groktypename (t1, NULL, NULL); 7966 e2 = groktypename (t2, NULL, NULL); 7967 if (e1 == error_mark_node || e2 == error_mark_node) 7968 { 7969 expr.set_error (); 7970 break; 7971 } 7972 7973 e1 = TYPE_MAIN_VARIANT (e1); 7974 e2 = TYPE_MAIN_VARIANT (e2); 7975 7976 expr.value 7977 = comptypes (e1, e2) ? integer_one_node : integer_zero_node; 7978 set_c_expr_source_range (&expr, loc, close_paren_loc); 7979 } 7980 break; 7981 case RID_BUILTIN_CALL_WITH_STATIC_CHAIN: 7982 { 7983 vec<c_expr_t, va_gc> *cexpr_list; 7984 c_expr_t *e2_p; 7985 tree chain_value; 7986 location_t close_paren_loc; 7987 7988 c_parser_consume_token (parser); 7989 if (!c_parser_get_builtin_args (parser, 7990 "__builtin_call_with_static_chain", 7991 &cexpr_list, false, 7992 &close_paren_loc)) 7993 { 7994 expr.set_error (); 7995 break; 7996 } 7997 if (vec_safe_length (cexpr_list) != 2) 7998 { 7999 error_at (loc, "wrong number of arguments to " 8000 "%<__builtin_call_with_static_chain%>"); 8001 expr.set_error (); 8002 break; 8003 } 8004 8005 expr = (*cexpr_list)[0]; 8006 e2_p = &(*cexpr_list)[1]; 8007 *e2_p = convert_lvalue_to_rvalue (loc, *e2_p, true, true); 8008 chain_value = e2_p->value; 8009 mark_exp_read (chain_value); 8010 8011 if (TREE_CODE (expr.value) != CALL_EXPR) 8012 error_at (loc, "first argument to " 8013 "%<__builtin_call_with_static_chain%> " 8014 "must be a call expression"); 8015 else if (TREE_CODE (TREE_TYPE (chain_value)) != POINTER_TYPE) 8016 error_at (loc, "second argument to " 8017 "%<__builtin_call_with_static_chain%> " 8018 "must be a pointer type"); 8019 else 8020 CALL_EXPR_STATIC_CHAIN (expr.value) = chain_value; 8021 set_c_expr_source_range (&expr, loc, close_paren_loc); 8022 break; 8023 } 8024 case RID_BUILTIN_COMPLEX: 8025 { 8026 vec<c_expr_t, va_gc> *cexpr_list; 8027 c_expr_t *e1_p, *e2_p; 8028 location_t close_paren_loc; 8029 8030 c_parser_consume_token (parser); 8031 if (!c_parser_get_builtin_args (parser, 8032 "__builtin_complex", 8033 &cexpr_list, false, 8034 &close_paren_loc)) 8035 { 8036 expr.set_error (); 8037 break; 8038 } 8039 8040 if (vec_safe_length (cexpr_list) != 2) 8041 { 8042 error_at (loc, "wrong number of arguments to " 8043 "%<__builtin_complex%>"); 8044 expr.set_error (); 8045 break; 8046 } 8047 8048 e1_p = &(*cexpr_list)[0]; 8049 e2_p = &(*cexpr_list)[1]; 8050 8051 *e1_p = convert_lvalue_to_rvalue (loc, *e1_p, true, true); 8052 if (TREE_CODE (e1_p->value) == EXCESS_PRECISION_EXPR) 8053 e1_p->value = convert (TREE_TYPE (e1_p->value), 8054 TREE_OPERAND (e1_p->value, 0)); 8055 *e2_p = convert_lvalue_to_rvalue (loc, *e2_p, true, true); 8056 if (TREE_CODE (e2_p->value) == EXCESS_PRECISION_EXPR) 8057 e2_p->value = convert (TREE_TYPE (e2_p->value), 8058 TREE_OPERAND (e2_p->value, 0)); 8059 if (!SCALAR_FLOAT_TYPE_P (TREE_TYPE (e1_p->value)) 8060 || DECIMAL_FLOAT_TYPE_P (TREE_TYPE (e1_p->value)) 8061 || !SCALAR_FLOAT_TYPE_P (TREE_TYPE (e2_p->value)) 8062 || DECIMAL_FLOAT_TYPE_P (TREE_TYPE (e2_p->value))) 8063 { 8064 error_at (loc, "%<__builtin_complex%> operand " 8065 "not of real binary floating-point type"); 8066 expr.set_error (); 8067 break; 8068 } 8069 if (TYPE_MAIN_VARIANT (TREE_TYPE (e1_p->value)) 8070 != TYPE_MAIN_VARIANT (TREE_TYPE (e2_p->value))) 8071 { 8072 error_at (loc, 8073 "%<__builtin_complex%> operands of different types"); 8074 expr.set_error (); 8075 break; 8076 } 8077 pedwarn_c90 (loc, OPT_Wpedantic, 8078 "ISO C90 does not support complex types"); 8079 expr.value = build2_loc (loc, COMPLEX_EXPR, 8080 build_complex_type 8081 (TYPE_MAIN_VARIANT 8082 (TREE_TYPE (e1_p->value))), 8083 e1_p->value, e2_p->value); 8084 set_c_expr_source_range (&expr, loc, close_paren_loc); 8085 break; 8086 } 8087 case RID_BUILTIN_SHUFFLE: 8088 { 8089 vec<c_expr_t, va_gc> *cexpr_list; 8090 unsigned int i; 8091 c_expr_t *p; 8092 location_t close_paren_loc; 8093 8094 c_parser_consume_token (parser); 8095 if (!c_parser_get_builtin_args (parser, 8096 "__builtin_shuffle", 8097 &cexpr_list, false, 8098 &close_paren_loc)) 8099 { 8100 expr.set_error (); 8101 break; 8102 } 8103 8104 FOR_EACH_VEC_SAFE_ELT (cexpr_list, i, p) 8105 *p = convert_lvalue_to_rvalue (loc, *p, true, true); 8106 8107 if (vec_safe_length (cexpr_list) == 2) 8108 expr.value = 8109 c_build_vec_perm_expr 8110 (loc, (*cexpr_list)[0].value, 8111 NULL_TREE, (*cexpr_list)[1].value); 8112 8113 else if (vec_safe_length (cexpr_list) == 3) 8114 expr.value = 8115 c_build_vec_perm_expr 8116 (loc, (*cexpr_list)[0].value, 8117 (*cexpr_list)[1].value, 8118 (*cexpr_list)[2].value); 8119 else 8120 { 8121 error_at (loc, "wrong number of arguments to " 8122 "%<__builtin_shuffle%>"); 8123 expr.set_error (); 8124 } 8125 set_c_expr_source_range (&expr, loc, close_paren_loc); 8126 break; 8127 } 8128 case RID_AT_SELECTOR: 8129 gcc_assert (c_dialect_objc ()); 8130 c_parser_consume_token (parser); 8131 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 8132 { 8133 expr.set_error (); 8134 break; 8135 } 8136 { 8137 tree sel = c_parser_objc_selector_arg (parser); 8138 location_t close_loc = c_parser_peek_token (parser)->location; 8139 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 8140 "expected %<)%>"); 8141 expr.value = objc_build_selector_expr (loc, sel); 8142 set_c_expr_source_range (&expr, loc, close_loc); 8143 } 8144 break; 8145 case RID_AT_PROTOCOL: 8146 gcc_assert (c_dialect_objc ()); 8147 c_parser_consume_token (parser); 8148 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 8149 { 8150 expr.set_error (); 8151 break; 8152 } 8153 if (c_parser_next_token_is_not (parser, CPP_NAME)) 8154 { 8155 c_parser_error (parser, "expected identifier"); 8156 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL); 8157 expr.set_error (); 8158 break; 8159 } 8160 { 8161 tree id = c_parser_peek_token (parser)->value; 8162 c_parser_consume_token (parser); 8163 location_t close_loc = c_parser_peek_token (parser)->location; 8164 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 8165 "expected %<)%>"); 8166 expr.value = objc_build_protocol_expr (id); 8167 set_c_expr_source_range (&expr, loc, close_loc); 8168 } 8169 break; 8170 case RID_AT_ENCODE: 8171 /* Extension to support C-structures in the archiver. */ 8172 gcc_assert (c_dialect_objc ()); 8173 c_parser_consume_token (parser); 8174 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 8175 { 8176 expr.set_error (); 8177 break; 8178 } 8179 t1 = c_parser_type_name (parser); 8180 if (t1 == NULL) 8181 { 8182 expr.set_error (); 8183 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL); 8184 break; 8185 } 8186 { 8187 location_t close_loc = c_parser_peek_token (parser)->location; 8188 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 8189 "expected %<)%>"); 8190 tree type = groktypename (t1, NULL, NULL); 8191 expr.value = objc_build_encode_expr (type); 8192 set_c_expr_source_range (&expr, loc, close_loc); 8193 } 8194 break; 8195 case RID_GENERIC: 8196 expr = c_parser_generic_selection (parser); 8197 break; 8198 case RID_CILK_SPAWN: 8199 c_parser_consume_token (parser); 8200 if (!flag_cilkplus) 8201 { 8202 error_at (loc, "-fcilkplus must be enabled to use " 8203 "%<_Cilk_spawn%>"); 8204 expr = c_parser_cast_expression (parser, NULL); 8205 expr.set_error (); 8206 } 8207 else if (c_parser_peek_token (parser)->keyword == RID_CILK_SPAWN) 8208 { 8209 error_at (loc, "consecutive %<_Cilk_spawn%> keywords " 8210 "are not permitted"); 8211 /* Now flush out all the _Cilk_spawns. */ 8212 while (c_parser_peek_token (parser)->keyword == RID_CILK_SPAWN) 8213 c_parser_consume_token (parser); 8214 expr = c_parser_cast_expression (parser, NULL); 8215 } 8216 else 8217 { 8218 expr = c_parser_cast_expression (parser, NULL); 8219 expr.value = build_cilk_spawn (loc, expr.value); 8220 } 8221 break; 8222 default: 8223 c_parser_error (parser, "expected expression"); 8224 expr.set_error (); 8225 break; 8226 } 8227 break; 8228 case CPP_OPEN_SQUARE: 8229 if (c_dialect_objc ()) 8230 { 8231 tree receiver, args; 8232 c_parser_consume_token (parser); 8233 receiver = c_parser_objc_receiver (parser); 8234 args = c_parser_objc_message_args (parser); 8235 location_t close_loc = c_parser_peek_token (parser)->location; 8236 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, 8237 "expected %<]%>"); 8238 expr.value = objc_build_message_expr (receiver, args); 8239 set_c_expr_source_range (&expr, loc, close_loc); 8240 break; 8241 } 8242 /* Else fall through to report error. */ 8243 /* FALLTHRU */ 8244 default: 8245 c_parser_error (parser, "expected expression"); 8246 expr.set_error (); 8247 break; 8248 } 8249 return c_parser_postfix_expression_after_primary 8250 (parser, EXPR_LOC_OR_LOC (expr.value, loc), expr); 8251 } 8252 8253 /* Parse a postfix expression after a parenthesized type name: the 8254 brace-enclosed initializer of a compound literal, possibly followed 8255 by some postfix operators. This is separate because it is not 8256 possible to tell until after the type name whether a cast 8257 expression has a cast or a compound literal, or whether the operand 8258 of sizeof is a parenthesized type name or starts with a compound 8259 literal. TYPE_LOC is the location where TYPE_NAME starts--the 8260 location of the first token after the parentheses around the type 8261 name. */ 8262 8263 static struct c_expr 8264 c_parser_postfix_expression_after_paren_type (c_parser *parser, 8265 struct c_type_name *type_name, 8266 location_t type_loc) 8267 { 8268 tree type; 8269 struct c_expr init; 8270 bool non_const; 8271 struct c_expr expr; 8272 location_t start_loc; 8273 tree type_expr = NULL_TREE; 8274 bool type_expr_const = true; 8275 check_compound_literal_type (type_loc, type_name); 8276 rich_location richloc (line_table, type_loc); 8277 start_init (NULL_TREE, NULL, 0, &richloc); 8278 type = groktypename (type_name, &type_expr, &type_expr_const); 8279 start_loc = c_parser_peek_token (parser)->location; 8280 if (type != error_mark_node && C_TYPE_VARIABLE_SIZE (type)) 8281 { 8282 error_at (type_loc, "compound literal has variable size"); 8283 type = error_mark_node; 8284 } 8285 init = c_parser_braced_init (parser, type, false, NULL); 8286 finish_init (); 8287 maybe_warn_string_init (type_loc, type, init); 8288 8289 if (type != error_mark_node 8290 && !ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (type)) 8291 && current_function_decl) 8292 { 8293 error ("compound literal qualified by address-space qualifier"); 8294 type = error_mark_node; 8295 } 8296 8297 pedwarn_c90 (start_loc, OPT_Wpedantic, "ISO C90 forbids compound literals"); 8298 non_const = ((init.value && TREE_CODE (init.value) == CONSTRUCTOR) 8299 ? CONSTRUCTOR_NON_CONST (init.value) 8300 : init.original_code == C_MAYBE_CONST_EXPR); 8301 non_const |= !type_expr_const; 8302 expr.value = build_compound_literal (start_loc, type, init.value, non_const); 8303 set_c_expr_source_range (&expr, init.src_range); 8304 expr.original_code = ERROR_MARK; 8305 expr.original_type = NULL; 8306 if (type != error_mark_node 8307 && expr.value != error_mark_node 8308 && type_expr) 8309 { 8310 if (TREE_CODE (expr.value) == C_MAYBE_CONST_EXPR) 8311 { 8312 gcc_assert (C_MAYBE_CONST_EXPR_PRE (expr.value) == NULL_TREE); 8313 C_MAYBE_CONST_EXPR_PRE (expr.value) = type_expr; 8314 } 8315 else 8316 { 8317 gcc_assert (!non_const); 8318 expr.value = build2 (C_MAYBE_CONST_EXPR, type, 8319 type_expr, expr.value); 8320 } 8321 } 8322 return c_parser_postfix_expression_after_primary (parser, start_loc, expr); 8323 } 8324 8325 /* Callback function for sizeof_pointer_memaccess_warning to compare 8326 types. */ 8327 8328 static bool 8329 sizeof_ptr_memacc_comptypes (tree type1, tree type2) 8330 { 8331 return comptypes (type1, type2) == 1; 8332 } 8333 8334 /* Parse a postfix expression after the initial primary or compound 8335 literal; that is, parse a series of postfix operators. 8336 8337 EXPR_LOC is the location of the primary expression. */ 8338 8339 static struct c_expr 8340 c_parser_postfix_expression_after_primary (c_parser *parser, 8341 location_t expr_loc, 8342 struct c_expr expr) 8343 { 8344 struct c_expr orig_expr; 8345 tree ident, idx; 8346 location_t sizeof_arg_loc[3], comp_loc; 8347 tree sizeof_arg[3]; 8348 unsigned int literal_zero_mask; 8349 unsigned int i; 8350 vec<tree, va_gc> *exprlist; 8351 vec<tree, va_gc> *origtypes = NULL; 8352 vec<location_t> arg_loc = vNULL; 8353 location_t start; 8354 location_t finish; 8355 8356 while (true) 8357 { 8358 location_t op_loc = c_parser_peek_token (parser)->location; 8359 switch (c_parser_peek_token (parser)->type) 8360 { 8361 case CPP_OPEN_SQUARE: 8362 /* Array reference. */ 8363 c_parser_consume_token (parser); 8364 if (flag_cilkplus 8365 && c_parser_peek_token (parser)->type == CPP_COLON) 8366 /* If we are here, then we have something like this: 8367 Array [ : ] 8368 */ 8369 expr.value = c_parser_array_notation (expr_loc, parser, NULL_TREE, 8370 expr.value); 8371 else 8372 { 8373 idx = c_parser_expression (parser).value; 8374 /* Here we have 3 options: 8375 1. Array [EXPR] -- Normal Array call. 8376 2. Array [EXPR : EXPR] -- Array notation without stride. 8377 3. Array [EXPR : EXPR : EXPR] -- Array notation with stride. 8378 8379 For 1, we just handle it just like a normal array expression. 8380 For 2 and 3 we handle it like we handle array notations. The 8381 idx value we have above becomes the initial/start index. 8382 */ 8383 if (flag_cilkplus 8384 && c_parser_peek_token (parser)->type == CPP_COLON) 8385 expr.value = c_parser_array_notation (expr_loc, parser, idx, 8386 expr.value); 8387 else 8388 { 8389 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, 8390 "expected %<]%>"); 8391 start = expr.get_start (); 8392 finish = parser->tokens_buf[0].location; 8393 expr.value = build_array_ref (op_loc, expr.value, idx); 8394 set_c_expr_source_range (&expr, start, finish); 8395 } 8396 } 8397 expr.original_code = ERROR_MARK; 8398 expr.original_type = NULL; 8399 break; 8400 case CPP_OPEN_PAREN: 8401 /* Function call. */ 8402 c_parser_consume_token (parser); 8403 for (i = 0; i < 3; i++) 8404 { 8405 sizeof_arg[i] = NULL_TREE; 8406 sizeof_arg_loc[i] = UNKNOWN_LOCATION; 8407 } 8408 literal_zero_mask = 0; 8409 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN)) 8410 exprlist = NULL; 8411 else 8412 exprlist = c_parser_expr_list (parser, true, false, &origtypes, 8413 sizeof_arg_loc, sizeof_arg, 8414 &arg_loc, &literal_zero_mask); 8415 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 8416 "expected %<)%>"); 8417 orig_expr = expr; 8418 mark_exp_read (expr.value); 8419 if (warn_sizeof_pointer_memaccess) 8420 sizeof_pointer_memaccess_warning (sizeof_arg_loc, 8421 expr.value, exprlist, 8422 sizeof_arg, 8423 sizeof_ptr_memacc_comptypes); 8424 if (TREE_CODE (expr.value) == FUNCTION_DECL 8425 && DECL_BUILT_IN_CLASS (expr.value) == BUILT_IN_NORMAL 8426 && DECL_FUNCTION_CODE (expr.value) == BUILT_IN_MEMSET 8427 && vec_safe_length (exprlist) == 3) 8428 { 8429 tree arg0 = (*exprlist)[0]; 8430 tree arg2 = (*exprlist)[2]; 8431 warn_for_memset (expr_loc, arg0, arg2, literal_zero_mask); 8432 } 8433 8434 start = expr.get_start (); 8435 finish = parser->tokens_buf[0].get_finish (); 8436 expr.value 8437 = c_build_function_call_vec (expr_loc, arg_loc, expr.value, 8438 exprlist, origtypes); 8439 set_c_expr_source_range (&expr, start, finish); 8440 8441 expr.original_code = ERROR_MARK; 8442 if (TREE_CODE (expr.value) == INTEGER_CST 8443 && TREE_CODE (orig_expr.value) == FUNCTION_DECL 8444 && DECL_BUILT_IN_CLASS (orig_expr.value) == BUILT_IN_NORMAL 8445 && DECL_FUNCTION_CODE (orig_expr.value) == BUILT_IN_CONSTANT_P) 8446 expr.original_code = C_MAYBE_CONST_EXPR; 8447 expr.original_type = NULL; 8448 if (exprlist) 8449 { 8450 release_tree_vector (exprlist); 8451 release_tree_vector (origtypes); 8452 } 8453 arg_loc.release (); 8454 break; 8455 case CPP_DOT: 8456 /* Structure element reference. */ 8457 c_parser_consume_token (parser); 8458 expr = default_function_array_conversion (expr_loc, expr); 8459 if (c_parser_next_token_is (parser, CPP_NAME)) 8460 { 8461 c_token *comp_tok = c_parser_peek_token (parser); 8462 ident = comp_tok->value; 8463 comp_loc = comp_tok->location; 8464 } 8465 else 8466 { 8467 c_parser_error (parser, "expected identifier"); 8468 expr.set_error (); 8469 expr.original_code = ERROR_MARK; 8470 expr.original_type = NULL; 8471 return expr; 8472 } 8473 start = expr.get_start (); 8474 finish = c_parser_peek_token (parser)->get_finish (); 8475 c_parser_consume_token (parser); 8476 expr.value = build_component_ref (op_loc, expr.value, ident, 8477 comp_loc); 8478 set_c_expr_source_range (&expr, start, finish); 8479 expr.original_code = ERROR_MARK; 8480 if (TREE_CODE (expr.value) != COMPONENT_REF) 8481 expr.original_type = NULL; 8482 else 8483 { 8484 /* Remember the original type of a bitfield. */ 8485 tree field = TREE_OPERAND (expr.value, 1); 8486 if (TREE_CODE (field) != FIELD_DECL) 8487 expr.original_type = NULL; 8488 else 8489 expr.original_type = DECL_BIT_FIELD_TYPE (field); 8490 } 8491 break; 8492 case CPP_DEREF: 8493 /* Structure element reference. */ 8494 c_parser_consume_token (parser); 8495 expr = convert_lvalue_to_rvalue (expr_loc, expr, true, false); 8496 if (c_parser_next_token_is (parser, CPP_NAME)) 8497 { 8498 c_token *comp_tok = c_parser_peek_token (parser); 8499 ident = comp_tok->value; 8500 comp_loc = comp_tok->location; 8501 } 8502 else 8503 { 8504 c_parser_error (parser, "expected identifier"); 8505 expr.set_error (); 8506 expr.original_code = ERROR_MARK; 8507 expr.original_type = NULL; 8508 return expr; 8509 } 8510 start = expr.get_start (); 8511 finish = c_parser_peek_token (parser)->get_finish (); 8512 c_parser_consume_token (parser); 8513 expr.value = build_component_ref (op_loc, 8514 build_indirect_ref (op_loc, 8515 expr.value, 8516 RO_ARROW), 8517 ident, comp_loc); 8518 set_c_expr_source_range (&expr, start, finish); 8519 expr.original_code = ERROR_MARK; 8520 if (TREE_CODE (expr.value) != COMPONENT_REF) 8521 expr.original_type = NULL; 8522 else 8523 { 8524 /* Remember the original type of a bitfield. */ 8525 tree field = TREE_OPERAND (expr.value, 1); 8526 if (TREE_CODE (field) != FIELD_DECL) 8527 expr.original_type = NULL; 8528 else 8529 expr.original_type = DECL_BIT_FIELD_TYPE (field); 8530 } 8531 break; 8532 case CPP_PLUS_PLUS: 8533 /* Postincrement. */ 8534 start = expr.get_start (); 8535 finish = c_parser_peek_token (parser)->get_finish (); 8536 c_parser_consume_token (parser); 8537 /* If the expressions have array notations, we expand them. */ 8538 if (flag_cilkplus 8539 && TREE_CODE (expr.value) == ARRAY_NOTATION_REF) 8540 expr = fix_array_notation_expr (expr_loc, POSTINCREMENT_EXPR, expr); 8541 else 8542 { 8543 expr = default_function_array_read_conversion (expr_loc, expr); 8544 expr.value = build_unary_op (op_loc, POSTINCREMENT_EXPR, 8545 expr.value, false); 8546 } 8547 set_c_expr_source_range (&expr, start, finish); 8548 expr.original_code = ERROR_MARK; 8549 expr.original_type = NULL; 8550 break; 8551 case CPP_MINUS_MINUS: 8552 /* Postdecrement. */ 8553 start = expr.get_start (); 8554 finish = c_parser_peek_token (parser)->get_finish (); 8555 c_parser_consume_token (parser); 8556 /* If the expressions have array notations, we expand them. */ 8557 if (flag_cilkplus 8558 && TREE_CODE (expr.value) == ARRAY_NOTATION_REF) 8559 expr = fix_array_notation_expr (expr_loc, POSTDECREMENT_EXPR, expr); 8560 else 8561 { 8562 expr = default_function_array_read_conversion (expr_loc, expr); 8563 expr.value = build_unary_op (op_loc, POSTDECREMENT_EXPR, 8564 expr.value, false); 8565 } 8566 set_c_expr_source_range (&expr, start, finish); 8567 expr.original_code = ERROR_MARK; 8568 expr.original_type = NULL; 8569 break; 8570 default: 8571 return expr; 8572 } 8573 } 8574 } 8575 8576 /* Parse an expression (C90 6.3.17, C99 6.5.17, C11 6.5.17). 8577 8578 expression: 8579 assignment-expression 8580 expression , assignment-expression 8581 */ 8582 8583 static struct c_expr 8584 c_parser_expression (c_parser *parser) 8585 { 8586 location_t tloc = c_parser_peek_token (parser)->location; 8587 struct c_expr expr; 8588 expr = c_parser_expr_no_commas (parser, NULL); 8589 if (c_parser_next_token_is (parser, CPP_COMMA)) 8590 expr = convert_lvalue_to_rvalue (tloc, expr, true, false); 8591 while (c_parser_next_token_is (parser, CPP_COMMA)) 8592 { 8593 struct c_expr next; 8594 tree lhsval; 8595 location_t loc = c_parser_peek_token (parser)->location; 8596 location_t expr_loc; 8597 c_parser_consume_token (parser); 8598 expr_loc = c_parser_peek_token (parser)->location; 8599 lhsval = expr.value; 8600 while (TREE_CODE (lhsval) == COMPOUND_EXPR) 8601 lhsval = TREE_OPERAND (lhsval, 1); 8602 if (DECL_P (lhsval) || handled_component_p (lhsval)) 8603 mark_exp_read (lhsval); 8604 next = c_parser_expr_no_commas (parser, NULL); 8605 next = convert_lvalue_to_rvalue (expr_loc, next, true, false); 8606 expr.value = build_compound_expr (loc, expr.value, next.value); 8607 expr.original_code = COMPOUND_EXPR; 8608 expr.original_type = next.original_type; 8609 } 8610 return expr; 8611 } 8612 8613 /* Parse an expression and convert functions or arrays to pointers and 8614 lvalues to rvalues. */ 8615 8616 static struct c_expr 8617 c_parser_expression_conv (c_parser *parser) 8618 { 8619 struct c_expr expr; 8620 location_t loc = c_parser_peek_token (parser)->location; 8621 expr = c_parser_expression (parser); 8622 expr = convert_lvalue_to_rvalue (loc, expr, true, false); 8623 return expr; 8624 } 8625 8626 /* Helper function of c_parser_expr_list. Check if IDXth (0 based) 8627 argument is a literal zero alone and if so, set it in literal_zero_mask. */ 8628 8629 static inline void 8630 c_parser_check_literal_zero (c_parser *parser, unsigned *literal_zero_mask, 8631 unsigned int idx) 8632 { 8633 if (idx >= HOST_BITS_PER_INT) 8634 return; 8635 8636 c_token *tok = c_parser_peek_token (parser); 8637 switch (tok->type) 8638 { 8639 case CPP_NUMBER: 8640 case CPP_CHAR: 8641 case CPP_WCHAR: 8642 case CPP_CHAR16: 8643 case CPP_CHAR32: 8644 /* If a parameter is literal zero alone, remember it 8645 for -Wmemset-transposed-args warning. */ 8646 if (integer_zerop (tok->value) 8647 && !TREE_OVERFLOW (tok->value) 8648 && (c_parser_peek_2nd_token (parser)->type == CPP_COMMA 8649 || c_parser_peek_2nd_token (parser)->type == CPP_CLOSE_PAREN)) 8650 *literal_zero_mask |= 1U << idx; 8651 default: 8652 break; 8653 } 8654 } 8655 8656 /* Parse a non-empty list of expressions. If CONVERT_P, convert 8657 functions and arrays to pointers and lvalues to rvalues. If 8658 FOLD_P, fold the expressions. If LOCATIONS is non-NULL, save the 8659 locations of function arguments into this vector. 8660 8661 nonempty-expr-list: 8662 assignment-expression 8663 nonempty-expr-list , assignment-expression 8664 */ 8665 8666 static vec<tree, va_gc> * 8667 c_parser_expr_list (c_parser *parser, bool convert_p, bool fold_p, 8668 vec<tree, va_gc> **p_orig_types, 8669 location_t *sizeof_arg_loc, tree *sizeof_arg, 8670 vec<location_t> *locations, 8671 unsigned int *literal_zero_mask) 8672 { 8673 vec<tree, va_gc> *ret; 8674 vec<tree, va_gc> *orig_types; 8675 struct c_expr expr; 8676 location_t loc = c_parser_peek_token (parser)->location; 8677 location_t cur_sizeof_arg_loc = UNKNOWN_LOCATION; 8678 unsigned int idx = 0; 8679 8680 ret = make_tree_vector (); 8681 if (p_orig_types == NULL) 8682 orig_types = NULL; 8683 else 8684 orig_types = make_tree_vector (); 8685 8686 if (sizeof_arg != NULL 8687 && c_parser_next_token_is_keyword (parser, RID_SIZEOF)) 8688 cur_sizeof_arg_loc = c_parser_peek_2nd_token (parser)->location; 8689 if (literal_zero_mask) 8690 c_parser_check_literal_zero (parser, literal_zero_mask, 0); 8691 expr = c_parser_expr_no_commas (parser, NULL); 8692 if (convert_p) 8693 expr = convert_lvalue_to_rvalue (loc, expr, true, true); 8694 if (fold_p) 8695 expr.value = c_fully_fold (expr.value, false, NULL); 8696 ret->quick_push (expr.value); 8697 if (orig_types) 8698 orig_types->quick_push (expr.original_type); 8699 if (locations) 8700 locations->safe_push (loc); 8701 if (sizeof_arg != NULL 8702 && cur_sizeof_arg_loc != UNKNOWN_LOCATION 8703 && expr.original_code == SIZEOF_EXPR) 8704 { 8705 sizeof_arg[0] = c_last_sizeof_arg; 8706 sizeof_arg_loc[0] = cur_sizeof_arg_loc; 8707 } 8708 while (c_parser_next_token_is (parser, CPP_COMMA)) 8709 { 8710 c_parser_consume_token (parser); 8711 loc = c_parser_peek_token (parser)->location; 8712 if (sizeof_arg != NULL 8713 && c_parser_next_token_is_keyword (parser, RID_SIZEOF)) 8714 cur_sizeof_arg_loc = c_parser_peek_2nd_token (parser)->location; 8715 else 8716 cur_sizeof_arg_loc = UNKNOWN_LOCATION; 8717 if (literal_zero_mask) 8718 c_parser_check_literal_zero (parser, literal_zero_mask, idx + 1); 8719 expr = c_parser_expr_no_commas (parser, NULL); 8720 if (convert_p) 8721 expr = convert_lvalue_to_rvalue (loc, expr, true, true); 8722 if (fold_p) 8723 expr.value = c_fully_fold (expr.value, false, NULL); 8724 vec_safe_push (ret, expr.value); 8725 if (orig_types) 8726 vec_safe_push (orig_types, expr.original_type); 8727 if (locations) 8728 locations->safe_push (loc); 8729 if (++idx < 3 8730 && sizeof_arg != NULL 8731 && cur_sizeof_arg_loc != UNKNOWN_LOCATION 8732 && expr.original_code == SIZEOF_EXPR) 8733 { 8734 sizeof_arg[idx] = c_last_sizeof_arg; 8735 sizeof_arg_loc[idx] = cur_sizeof_arg_loc; 8736 } 8737 } 8738 if (orig_types) 8739 *p_orig_types = orig_types; 8740 return ret; 8741 } 8742 8743 /* Parse Objective-C-specific constructs. */ 8744 8745 /* Parse an objc-class-definition. 8746 8747 objc-class-definition: 8748 @interface identifier objc-superclass[opt] objc-protocol-refs[opt] 8749 objc-class-instance-variables[opt] objc-methodprotolist @end 8750 @implementation identifier objc-superclass[opt] 8751 objc-class-instance-variables[opt] 8752 @interface identifier ( identifier ) objc-protocol-refs[opt] 8753 objc-methodprotolist @end 8754 @interface identifier ( ) objc-protocol-refs[opt] 8755 objc-methodprotolist @end 8756 @implementation identifier ( identifier ) 8757 8758 objc-superclass: 8759 : identifier 8760 8761 "@interface identifier (" must start "@interface identifier ( 8762 identifier ) ...": objc-methodprotolist in the first production may 8763 not start with a parenthesized identifier as a declarator of a data 8764 definition with no declaration specifiers if the objc-superclass, 8765 objc-protocol-refs and objc-class-instance-variables are omitted. */ 8766 8767 static void 8768 c_parser_objc_class_definition (c_parser *parser, tree attributes) 8769 { 8770 bool iface_p; 8771 tree id1; 8772 tree superclass; 8773 if (c_parser_next_token_is_keyword (parser, RID_AT_INTERFACE)) 8774 iface_p = true; 8775 else if (c_parser_next_token_is_keyword (parser, RID_AT_IMPLEMENTATION)) 8776 iface_p = false; 8777 else 8778 gcc_unreachable (); 8779 8780 c_parser_consume_token (parser); 8781 if (c_parser_next_token_is_not (parser, CPP_NAME)) 8782 { 8783 c_parser_error (parser, "expected identifier"); 8784 return; 8785 } 8786 id1 = c_parser_peek_token (parser)->value; 8787 c_parser_consume_token (parser); 8788 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)) 8789 { 8790 /* We have a category or class extension. */ 8791 tree id2; 8792 tree proto = NULL_TREE; 8793 c_parser_consume_token (parser); 8794 if (c_parser_next_token_is_not (parser, CPP_NAME)) 8795 { 8796 if (iface_p && c_parser_next_token_is (parser, CPP_CLOSE_PAREN)) 8797 { 8798 /* We have a class extension. */ 8799 id2 = NULL_TREE; 8800 } 8801 else 8802 { 8803 c_parser_error (parser, "expected identifier or %<)%>"); 8804 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL); 8805 return; 8806 } 8807 } 8808 else 8809 { 8810 id2 = c_parser_peek_token (parser)->value; 8811 c_parser_consume_token (parser); 8812 } 8813 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 8814 if (!iface_p) 8815 { 8816 objc_start_category_implementation (id1, id2); 8817 return; 8818 } 8819 if (c_parser_next_token_is (parser, CPP_LESS)) 8820 proto = c_parser_objc_protocol_refs (parser); 8821 objc_start_category_interface (id1, id2, proto, attributes); 8822 c_parser_objc_methodprotolist (parser); 8823 c_parser_require_keyword (parser, RID_AT_END, "expected %<@end%>"); 8824 objc_finish_interface (); 8825 return; 8826 } 8827 if (c_parser_next_token_is (parser, CPP_COLON)) 8828 { 8829 c_parser_consume_token (parser); 8830 if (c_parser_next_token_is_not (parser, CPP_NAME)) 8831 { 8832 c_parser_error (parser, "expected identifier"); 8833 return; 8834 } 8835 superclass = c_parser_peek_token (parser)->value; 8836 c_parser_consume_token (parser); 8837 } 8838 else 8839 superclass = NULL_TREE; 8840 if (iface_p) 8841 { 8842 tree proto = NULL_TREE; 8843 if (c_parser_next_token_is (parser, CPP_LESS)) 8844 proto = c_parser_objc_protocol_refs (parser); 8845 objc_start_class_interface (id1, superclass, proto, attributes); 8846 } 8847 else 8848 objc_start_class_implementation (id1, superclass); 8849 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE)) 8850 c_parser_objc_class_instance_variables (parser); 8851 if (iface_p) 8852 { 8853 objc_continue_interface (); 8854 c_parser_objc_methodprotolist (parser); 8855 c_parser_require_keyword (parser, RID_AT_END, "expected %<@end%>"); 8856 objc_finish_interface (); 8857 } 8858 else 8859 { 8860 objc_continue_implementation (); 8861 return; 8862 } 8863 } 8864 8865 /* Parse objc-class-instance-variables. 8866 8867 objc-class-instance-variables: 8868 { objc-instance-variable-decl-list[opt] } 8869 8870 objc-instance-variable-decl-list: 8871 objc-visibility-spec 8872 objc-instance-variable-decl ; 8873 ; 8874 objc-instance-variable-decl-list objc-visibility-spec 8875 objc-instance-variable-decl-list objc-instance-variable-decl ; 8876 objc-instance-variable-decl-list ; 8877 8878 objc-visibility-spec: 8879 @private 8880 @protected 8881 @public 8882 8883 objc-instance-variable-decl: 8884 struct-declaration 8885 */ 8886 8887 static void 8888 c_parser_objc_class_instance_variables (c_parser *parser) 8889 { 8890 gcc_assert (c_parser_next_token_is (parser, CPP_OPEN_BRACE)); 8891 c_parser_consume_token (parser); 8892 while (c_parser_next_token_is_not (parser, CPP_EOF)) 8893 { 8894 tree decls; 8895 /* Parse any stray semicolon. */ 8896 if (c_parser_next_token_is (parser, CPP_SEMICOLON)) 8897 { 8898 pedwarn (c_parser_peek_token (parser)->location, OPT_Wpedantic, 8899 "extra semicolon"); 8900 c_parser_consume_token (parser); 8901 continue; 8902 } 8903 /* Stop if at the end of the instance variables. */ 8904 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE)) 8905 { 8906 c_parser_consume_token (parser); 8907 break; 8908 } 8909 /* Parse any objc-visibility-spec. */ 8910 if (c_parser_next_token_is_keyword (parser, RID_AT_PRIVATE)) 8911 { 8912 c_parser_consume_token (parser); 8913 objc_set_visibility (OBJC_IVAR_VIS_PRIVATE); 8914 continue; 8915 } 8916 else if (c_parser_next_token_is_keyword (parser, RID_AT_PROTECTED)) 8917 { 8918 c_parser_consume_token (parser); 8919 objc_set_visibility (OBJC_IVAR_VIS_PROTECTED); 8920 continue; 8921 } 8922 else if (c_parser_next_token_is_keyword (parser, RID_AT_PUBLIC)) 8923 { 8924 c_parser_consume_token (parser); 8925 objc_set_visibility (OBJC_IVAR_VIS_PUBLIC); 8926 continue; 8927 } 8928 else if (c_parser_next_token_is_keyword (parser, RID_AT_PACKAGE)) 8929 { 8930 c_parser_consume_token (parser); 8931 objc_set_visibility (OBJC_IVAR_VIS_PACKAGE); 8932 continue; 8933 } 8934 else if (c_parser_next_token_is (parser, CPP_PRAGMA)) 8935 { 8936 c_parser_pragma (parser, pragma_external, NULL); 8937 continue; 8938 } 8939 8940 /* Parse some comma-separated declarations. */ 8941 decls = c_parser_struct_declaration (parser); 8942 if (decls == NULL) 8943 { 8944 /* There is a syntax error. We want to skip the offending 8945 tokens up to the next ';' (included) or '}' 8946 (excluded). */ 8947 8948 /* First, skip manually a ')' or ']'. This is because they 8949 reduce the nesting level, so c_parser_skip_until_found() 8950 wouldn't be able to skip past them. */ 8951 c_token *token = c_parser_peek_token (parser); 8952 if (token->type == CPP_CLOSE_PAREN || token->type == CPP_CLOSE_SQUARE) 8953 c_parser_consume_token (parser); 8954 8955 /* Then, do the standard skipping. */ 8956 c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL); 8957 8958 /* We hopefully recovered. Start normal parsing again. */ 8959 parser->error = false; 8960 continue; 8961 } 8962 else 8963 { 8964 /* Comma-separated instance variables are chained together 8965 in reverse order; add them one by one. */ 8966 tree ivar = nreverse (decls); 8967 for (; ivar; ivar = DECL_CHAIN (ivar)) 8968 objc_add_instance_variable (copy_node (ivar)); 8969 } 8970 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>"); 8971 } 8972 } 8973 8974 /* Parse an objc-class-declaration. 8975 8976 objc-class-declaration: 8977 @class identifier-list ; 8978 */ 8979 8980 static void 8981 c_parser_objc_class_declaration (c_parser *parser) 8982 { 8983 gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_CLASS)); 8984 c_parser_consume_token (parser); 8985 /* Any identifiers, including those declared as type names, are OK 8986 here. */ 8987 while (true) 8988 { 8989 tree id; 8990 if (c_parser_next_token_is_not (parser, CPP_NAME)) 8991 { 8992 c_parser_error (parser, "expected identifier"); 8993 c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL); 8994 parser->error = false; 8995 return; 8996 } 8997 id = c_parser_peek_token (parser)->value; 8998 objc_declare_class (id); 8999 c_parser_consume_token (parser); 9000 if (c_parser_next_token_is (parser, CPP_COMMA)) 9001 c_parser_consume_token (parser); 9002 else 9003 break; 9004 } 9005 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>"); 9006 } 9007 9008 /* Parse an objc-alias-declaration. 9009 9010 objc-alias-declaration: 9011 @compatibility_alias identifier identifier ; 9012 */ 9013 9014 static void 9015 c_parser_objc_alias_declaration (c_parser *parser) 9016 { 9017 tree id1, id2; 9018 gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_ALIAS)); 9019 c_parser_consume_token (parser); 9020 if (c_parser_next_token_is_not (parser, CPP_NAME)) 9021 { 9022 c_parser_error (parser, "expected identifier"); 9023 c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL); 9024 return; 9025 } 9026 id1 = c_parser_peek_token (parser)->value; 9027 c_parser_consume_token (parser); 9028 if (c_parser_next_token_is_not (parser, CPP_NAME)) 9029 { 9030 c_parser_error (parser, "expected identifier"); 9031 c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL); 9032 return; 9033 } 9034 id2 = c_parser_peek_token (parser)->value; 9035 c_parser_consume_token (parser); 9036 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>"); 9037 objc_declare_alias (id1, id2); 9038 } 9039 9040 /* Parse an objc-protocol-definition. 9041 9042 objc-protocol-definition: 9043 @protocol identifier objc-protocol-refs[opt] objc-methodprotolist @end 9044 @protocol identifier-list ; 9045 9046 "@protocol identifier ;" should be resolved as "@protocol 9047 identifier-list ;": objc-methodprotolist may not start with a 9048 semicolon in the first alternative if objc-protocol-refs are 9049 omitted. */ 9050 9051 static void 9052 c_parser_objc_protocol_definition (c_parser *parser, tree attributes) 9053 { 9054 gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_PROTOCOL)); 9055 9056 c_parser_consume_token (parser); 9057 if (c_parser_next_token_is_not (parser, CPP_NAME)) 9058 { 9059 c_parser_error (parser, "expected identifier"); 9060 return; 9061 } 9062 if (c_parser_peek_2nd_token (parser)->type == CPP_COMMA 9063 || c_parser_peek_2nd_token (parser)->type == CPP_SEMICOLON) 9064 { 9065 /* Any identifiers, including those declared as type names, are 9066 OK here. */ 9067 while (true) 9068 { 9069 tree id; 9070 if (c_parser_next_token_is_not (parser, CPP_NAME)) 9071 { 9072 c_parser_error (parser, "expected identifier"); 9073 break; 9074 } 9075 id = c_parser_peek_token (parser)->value; 9076 objc_declare_protocol (id, attributes); 9077 c_parser_consume_token (parser); 9078 if (c_parser_next_token_is (parser, CPP_COMMA)) 9079 c_parser_consume_token (parser); 9080 else 9081 break; 9082 } 9083 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>"); 9084 } 9085 else 9086 { 9087 tree id = c_parser_peek_token (parser)->value; 9088 tree proto = NULL_TREE; 9089 c_parser_consume_token (parser); 9090 if (c_parser_next_token_is (parser, CPP_LESS)) 9091 proto = c_parser_objc_protocol_refs (parser); 9092 parser->objc_pq_context = true; 9093 objc_start_protocol (id, proto, attributes); 9094 c_parser_objc_methodprotolist (parser); 9095 c_parser_require_keyword (parser, RID_AT_END, "expected %<@end%>"); 9096 parser->objc_pq_context = false; 9097 objc_finish_interface (); 9098 } 9099 } 9100 9101 /* Parse an objc-method-type. 9102 9103 objc-method-type: 9104 + 9105 - 9106 9107 Return true if it is a class method (+) and false if it is 9108 an instance method (-). 9109 */ 9110 static inline bool 9111 c_parser_objc_method_type (c_parser *parser) 9112 { 9113 switch (c_parser_peek_token (parser)->type) 9114 { 9115 case CPP_PLUS: 9116 c_parser_consume_token (parser); 9117 return true; 9118 case CPP_MINUS: 9119 c_parser_consume_token (parser); 9120 return false; 9121 default: 9122 gcc_unreachable (); 9123 } 9124 } 9125 9126 /* Parse an objc-method-definition. 9127 9128 objc-method-definition: 9129 objc-method-type objc-method-decl ;[opt] compound-statement 9130 */ 9131 9132 static void 9133 c_parser_objc_method_definition (c_parser *parser) 9134 { 9135 bool is_class_method = c_parser_objc_method_type (parser); 9136 tree decl, attributes = NULL_TREE, expr = NULL_TREE; 9137 parser->objc_pq_context = true; 9138 decl = c_parser_objc_method_decl (parser, is_class_method, &attributes, 9139 &expr); 9140 if (decl == error_mark_node) 9141 return; /* Bail here. */ 9142 9143 if (c_parser_next_token_is (parser, CPP_SEMICOLON)) 9144 { 9145 c_parser_consume_token (parser); 9146 pedwarn (c_parser_peek_token (parser)->location, OPT_Wpedantic, 9147 "extra semicolon in method definition specified"); 9148 } 9149 9150 if (!c_parser_next_token_is (parser, CPP_OPEN_BRACE)) 9151 { 9152 c_parser_error (parser, "expected %<{%>"); 9153 return; 9154 } 9155 9156 parser->objc_pq_context = false; 9157 if (objc_start_method_definition (is_class_method, decl, attributes, expr)) 9158 { 9159 add_stmt (c_parser_compound_statement (parser)); 9160 objc_finish_method_definition (current_function_decl); 9161 } 9162 else 9163 { 9164 /* This code is executed when we find a method definition 9165 outside of an @implementation context (or invalid for other 9166 reasons). Parse the method (to keep going) but do not emit 9167 any code. 9168 */ 9169 c_parser_compound_statement (parser); 9170 } 9171 } 9172 9173 /* Parse an objc-methodprotolist. 9174 9175 objc-methodprotolist: 9176 empty 9177 objc-methodprotolist objc-methodproto 9178 objc-methodprotolist declaration 9179 objc-methodprotolist ; 9180 @optional 9181 @required 9182 9183 The declaration is a data definition, which may be missing 9184 declaration specifiers under the same rules and diagnostics as 9185 other data definitions outside functions, and the stray semicolon 9186 is diagnosed the same way as a stray semicolon outside a 9187 function. */ 9188 9189 static void 9190 c_parser_objc_methodprotolist (c_parser *parser) 9191 { 9192 while (true) 9193 { 9194 /* The list is terminated by @end. */ 9195 switch (c_parser_peek_token (parser)->type) 9196 { 9197 case CPP_SEMICOLON: 9198 pedwarn (c_parser_peek_token (parser)->location, OPT_Wpedantic, 9199 "ISO C does not allow extra %<;%> outside of a function"); 9200 c_parser_consume_token (parser); 9201 break; 9202 case CPP_PLUS: 9203 case CPP_MINUS: 9204 c_parser_objc_methodproto (parser); 9205 break; 9206 case CPP_PRAGMA: 9207 c_parser_pragma (parser, pragma_external, NULL); 9208 break; 9209 case CPP_EOF: 9210 return; 9211 default: 9212 if (c_parser_next_token_is_keyword (parser, RID_AT_END)) 9213 return; 9214 else if (c_parser_next_token_is_keyword (parser, RID_AT_PROPERTY)) 9215 c_parser_objc_at_property_declaration (parser); 9216 else if (c_parser_next_token_is_keyword (parser, RID_AT_OPTIONAL)) 9217 { 9218 objc_set_method_opt (true); 9219 c_parser_consume_token (parser); 9220 } 9221 else if (c_parser_next_token_is_keyword (parser, RID_AT_REQUIRED)) 9222 { 9223 objc_set_method_opt (false); 9224 c_parser_consume_token (parser); 9225 } 9226 else 9227 c_parser_declaration_or_fndef (parser, false, false, true, 9228 false, true, NULL, vNULL); 9229 break; 9230 } 9231 } 9232 } 9233 9234 /* Parse an objc-methodproto. 9235 9236 objc-methodproto: 9237 objc-method-type objc-method-decl ; 9238 */ 9239 9240 static void 9241 c_parser_objc_methodproto (c_parser *parser) 9242 { 9243 bool is_class_method = c_parser_objc_method_type (parser); 9244 tree decl, attributes = NULL_TREE; 9245 9246 /* Remember protocol qualifiers in prototypes. */ 9247 parser->objc_pq_context = true; 9248 decl = c_parser_objc_method_decl (parser, is_class_method, &attributes, 9249 NULL); 9250 /* Forget protocol qualifiers now. */ 9251 parser->objc_pq_context = false; 9252 9253 /* Do not allow the presence of attributes to hide an erroneous 9254 method implementation in the interface section. */ 9255 if (!c_parser_next_token_is (parser, CPP_SEMICOLON)) 9256 { 9257 c_parser_error (parser, "expected %<;%>"); 9258 return; 9259 } 9260 9261 if (decl != error_mark_node) 9262 objc_add_method_declaration (is_class_method, decl, attributes); 9263 9264 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>"); 9265 } 9266 9267 /* If we are at a position that method attributes may be present, check that 9268 there are not any parsed already (a syntax error) and then collect any 9269 specified at the current location. Finally, if new attributes were present, 9270 check that the next token is legal ( ';' for decls and '{' for defs). */ 9271 9272 static bool 9273 c_parser_objc_maybe_method_attributes (c_parser* parser, tree* attributes) 9274 { 9275 bool bad = false; 9276 if (*attributes) 9277 { 9278 c_parser_error (parser, 9279 "method attributes must be specified at the end only"); 9280 *attributes = NULL_TREE; 9281 bad = true; 9282 } 9283 9284 if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE)) 9285 *attributes = c_parser_attributes (parser); 9286 9287 /* If there were no attributes here, just report any earlier error. */ 9288 if (*attributes == NULL_TREE || bad) 9289 return bad; 9290 9291 /* If the attributes are followed by a ; or {, then just report any earlier 9292 error. */ 9293 if (c_parser_next_token_is (parser, CPP_SEMICOLON) 9294 || c_parser_next_token_is (parser, CPP_OPEN_BRACE)) 9295 return bad; 9296 9297 /* We've got attributes, but not at the end. */ 9298 c_parser_error (parser, 9299 "expected %<;%> or %<{%> after method attribute definition"); 9300 return true; 9301 } 9302 9303 /* Parse an objc-method-decl. 9304 9305 objc-method-decl: 9306 ( objc-type-name ) objc-selector 9307 objc-selector 9308 ( objc-type-name ) objc-keyword-selector objc-optparmlist 9309 objc-keyword-selector objc-optparmlist 9310 attributes 9311 9312 objc-keyword-selector: 9313 objc-keyword-decl 9314 objc-keyword-selector objc-keyword-decl 9315 9316 objc-keyword-decl: 9317 objc-selector : ( objc-type-name ) identifier 9318 objc-selector : identifier 9319 : ( objc-type-name ) identifier 9320 : identifier 9321 9322 objc-optparmlist: 9323 objc-optparms objc-optellipsis 9324 9325 objc-optparms: 9326 empty 9327 objc-opt-parms , parameter-declaration 9328 9329 objc-optellipsis: 9330 empty 9331 , ... 9332 */ 9333 9334 static tree 9335 c_parser_objc_method_decl (c_parser *parser, bool is_class_method, 9336 tree *attributes, tree *expr) 9337 { 9338 tree type = NULL_TREE; 9339 tree sel; 9340 tree parms = NULL_TREE; 9341 bool ellipsis = false; 9342 bool attr_err = false; 9343 9344 *attributes = NULL_TREE; 9345 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)) 9346 { 9347 c_parser_consume_token (parser); 9348 type = c_parser_objc_type_name (parser); 9349 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 9350 } 9351 sel = c_parser_objc_selector (parser); 9352 /* If there is no selector, or a colon follows, we have an 9353 objc-keyword-selector. If there is a selector, and a colon does 9354 not follow, that selector ends the objc-method-decl. */ 9355 if (!sel || c_parser_next_token_is (parser, CPP_COLON)) 9356 { 9357 tree tsel = sel; 9358 tree list = NULL_TREE; 9359 while (true) 9360 { 9361 tree atype = NULL_TREE, id, keyworddecl; 9362 tree param_attr = NULL_TREE; 9363 if (!c_parser_require (parser, CPP_COLON, "expected %<:%>")) 9364 break; 9365 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)) 9366 { 9367 c_parser_consume_token (parser); 9368 atype = c_parser_objc_type_name (parser); 9369 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 9370 "expected %<)%>"); 9371 } 9372 /* New ObjC allows attributes on method parameters. */ 9373 if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE)) 9374 param_attr = c_parser_attributes (parser); 9375 if (c_parser_next_token_is_not (parser, CPP_NAME)) 9376 { 9377 c_parser_error (parser, "expected identifier"); 9378 return error_mark_node; 9379 } 9380 id = c_parser_peek_token (parser)->value; 9381 c_parser_consume_token (parser); 9382 keyworddecl = objc_build_keyword_decl (tsel, atype, id, param_attr); 9383 list = chainon (list, keyworddecl); 9384 tsel = c_parser_objc_selector (parser); 9385 if (!tsel && c_parser_next_token_is_not (parser, CPP_COLON)) 9386 break; 9387 } 9388 9389 attr_err |= c_parser_objc_maybe_method_attributes (parser, attributes) ; 9390 9391 /* Parse the optional parameter list. Optional Objective-C 9392 method parameters follow the C syntax, and may include '...' 9393 to denote a variable number of arguments. */ 9394 parms = make_node (TREE_LIST); 9395 while (c_parser_next_token_is (parser, CPP_COMMA)) 9396 { 9397 struct c_parm *parm; 9398 c_parser_consume_token (parser); 9399 if (c_parser_next_token_is (parser, CPP_ELLIPSIS)) 9400 { 9401 ellipsis = true; 9402 c_parser_consume_token (parser); 9403 attr_err |= c_parser_objc_maybe_method_attributes 9404 (parser, attributes) ; 9405 break; 9406 } 9407 parm = c_parser_parameter_declaration (parser, NULL_TREE); 9408 if (parm == NULL) 9409 break; 9410 parms = chainon (parms, 9411 build_tree_list (NULL_TREE, grokparm (parm, expr))); 9412 } 9413 sel = list; 9414 } 9415 else 9416 attr_err |= c_parser_objc_maybe_method_attributes (parser, attributes) ; 9417 9418 if (sel == NULL) 9419 { 9420 c_parser_error (parser, "objective-c method declaration is expected"); 9421 return error_mark_node; 9422 } 9423 9424 if (attr_err) 9425 return error_mark_node; 9426 9427 return objc_build_method_signature (is_class_method, type, sel, parms, ellipsis); 9428 } 9429 9430 /* Parse an objc-type-name. 9431 9432 objc-type-name: 9433 objc-type-qualifiers[opt] type-name 9434 objc-type-qualifiers[opt] 9435 9436 objc-type-qualifiers: 9437 objc-type-qualifier 9438 objc-type-qualifiers objc-type-qualifier 9439 9440 objc-type-qualifier: one of 9441 in out inout bycopy byref oneway 9442 */ 9443 9444 static tree 9445 c_parser_objc_type_name (c_parser *parser) 9446 { 9447 tree quals = NULL_TREE; 9448 struct c_type_name *type_name = NULL; 9449 tree type = NULL_TREE; 9450 while (true) 9451 { 9452 c_token *token = c_parser_peek_token (parser); 9453 if (token->type == CPP_KEYWORD 9454 && (token->keyword == RID_IN 9455 || token->keyword == RID_OUT 9456 || token->keyword == RID_INOUT 9457 || token->keyword == RID_BYCOPY 9458 || token->keyword == RID_BYREF 9459 || token->keyword == RID_ONEWAY)) 9460 { 9461 quals = chainon (build_tree_list (NULL_TREE, token->value), quals); 9462 c_parser_consume_token (parser); 9463 } 9464 else 9465 break; 9466 } 9467 if (c_parser_next_tokens_start_typename (parser, cla_prefer_type)) 9468 type_name = c_parser_type_name (parser); 9469 if (type_name) 9470 type = groktypename (type_name, NULL, NULL); 9471 9472 /* If the type is unknown, and error has already been produced and 9473 we need to recover from the error. In that case, use NULL_TREE 9474 for the type, as if no type had been specified; this will use the 9475 default type ('id') which is good for error recovery. */ 9476 if (type == error_mark_node) 9477 type = NULL_TREE; 9478 9479 return build_tree_list (quals, type); 9480 } 9481 9482 /* Parse objc-protocol-refs. 9483 9484 objc-protocol-refs: 9485 < identifier-list > 9486 */ 9487 9488 static tree 9489 c_parser_objc_protocol_refs (c_parser *parser) 9490 { 9491 tree list = NULL_TREE; 9492 gcc_assert (c_parser_next_token_is (parser, CPP_LESS)); 9493 c_parser_consume_token (parser); 9494 /* Any identifiers, including those declared as type names, are OK 9495 here. */ 9496 while (true) 9497 { 9498 tree id; 9499 if (c_parser_next_token_is_not (parser, CPP_NAME)) 9500 { 9501 c_parser_error (parser, "expected identifier"); 9502 break; 9503 } 9504 id = c_parser_peek_token (parser)->value; 9505 list = chainon (list, build_tree_list (NULL_TREE, id)); 9506 c_parser_consume_token (parser); 9507 if (c_parser_next_token_is (parser, CPP_COMMA)) 9508 c_parser_consume_token (parser); 9509 else 9510 break; 9511 } 9512 c_parser_require (parser, CPP_GREATER, "expected %<>%>"); 9513 return list; 9514 } 9515 9516 /* Parse an objc-try-catch-finally-statement. 9517 9518 objc-try-catch-finally-statement: 9519 @try compound-statement objc-catch-list[opt] 9520 @try compound-statement objc-catch-list[opt] @finally compound-statement 9521 9522 objc-catch-list: 9523 @catch ( objc-catch-parameter-declaration ) compound-statement 9524 objc-catch-list @catch ( objc-catch-parameter-declaration ) compound-statement 9525 9526 objc-catch-parameter-declaration: 9527 parameter-declaration 9528 '...' 9529 9530 where '...' is to be interpreted literally, that is, it means CPP_ELLIPSIS. 9531 9532 PS: This function is identical to cp_parser_objc_try_catch_finally_statement 9533 for C++. Keep them in sync. */ 9534 9535 static void 9536 c_parser_objc_try_catch_finally_statement (c_parser *parser) 9537 { 9538 location_t location; 9539 tree stmt; 9540 9541 gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_TRY)); 9542 c_parser_consume_token (parser); 9543 location = c_parser_peek_token (parser)->location; 9544 objc_maybe_warn_exceptions (location); 9545 stmt = c_parser_compound_statement (parser); 9546 objc_begin_try_stmt (location, stmt); 9547 9548 while (c_parser_next_token_is_keyword (parser, RID_AT_CATCH)) 9549 { 9550 struct c_parm *parm; 9551 tree parameter_declaration = error_mark_node; 9552 bool seen_open_paren = false; 9553 9554 c_parser_consume_token (parser); 9555 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 9556 seen_open_paren = true; 9557 if (c_parser_next_token_is (parser, CPP_ELLIPSIS)) 9558 { 9559 /* We have "@catch (...)" (where the '...' are literally 9560 what is in the code). Skip the '...'. 9561 parameter_declaration is set to NULL_TREE, and 9562 objc_being_catch_clauses() knows that that means 9563 '...'. */ 9564 c_parser_consume_token (parser); 9565 parameter_declaration = NULL_TREE; 9566 } 9567 else 9568 { 9569 /* We have "@catch (NSException *exception)" or something 9570 like that. Parse the parameter declaration. */ 9571 parm = c_parser_parameter_declaration (parser, NULL_TREE); 9572 if (parm == NULL) 9573 parameter_declaration = error_mark_node; 9574 else 9575 parameter_declaration = grokparm (parm, NULL); 9576 } 9577 if (seen_open_paren) 9578 c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 9579 else 9580 { 9581 /* If there was no open parenthesis, we are recovering from 9582 an error, and we are trying to figure out what mistake 9583 the user has made. */ 9584 9585 /* If there is an immediate closing parenthesis, the user 9586 probably forgot the opening one (ie, they typed "@catch 9587 NSException *e)". Parse the closing parenthesis and keep 9588 going. */ 9589 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN)) 9590 c_parser_consume_token (parser); 9591 9592 /* If these is no immediate closing parenthesis, the user 9593 probably doesn't know that parenthesis are required at 9594 all (ie, they typed "@catch NSException *e"). So, just 9595 forget about the closing parenthesis and keep going. */ 9596 } 9597 objc_begin_catch_clause (parameter_declaration); 9598 if (c_parser_require (parser, CPP_OPEN_BRACE, "expected %<{%>")) 9599 c_parser_compound_statement_nostart (parser); 9600 objc_finish_catch_clause (); 9601 } 9602 if (c_parser_next_token_is_keyword (parser, RID_AT_FINALLY)) 9603 { 9604 c_parser_consume_token (parser); 9605 location = c_parser_peek_token (parser)->location; 9606 stmt = c_parser_compound_statement (parser); 9607 objc_build_finally_clause (location, stmt); 9608 } 9609 objc_finish_try_stmt (); 9610 } 9611 9612 /* Parse an objc-synchronized-statement. 9613 9614 objc-synchronized-statement: 9615 @synchronized ( expression ) compound-statement 9616 */ 9617 9618 static void 9619 c_parser_objc_synchronized_statement (c_parser *parser) 9620 { 9621 location_t loc; 9622 tree expr, stmt; 9623 gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_SYNCHRONIZED)); 9624 c_parser_consume_token (parser); 9625 loc = c_parser_peek_token (parser)->location; 9626 objc_maybe_warn_exceptions (loc); 9627 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 9628 { 9629 struct c_expr ce = c_parser_expression (parser); 9630 ce = convert_lvalue_to_rvalue (loc, ce, false, false); 9631 expr = ce.value; 9632 expr = c_fully_fold (expr, false, NULL); 9633 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 9634 } 9635 else 9636 expr = error_mark_node; 9637 stmt = c_parser_compound_statement (parser); 9638 objc_build_synchronized (loc, expr, stmt); 9639 } 9640 9641 /* Parse an objc-selector; return NULL_TREE without an error if the 9642 next token is not an objc-selector. 9643 9644 objc-selector: 9645 identifier 9646 one of 9647 enum struct union if else while do for switch case default 9648 break continue return goto asm sizeof typeof __alignof 9649 unsigned long const short volatile signed restrict _Complex 9650 in out inout bycopy byref oneway int char float double void _Bool 9651 _Atomic 9652 9653 ??? Why this selection of keywords but not, for example, storage 9654 class specifiers? */ 9655 9656 static tree 9657 c_parser_objc_selector (c_parser *parser) 9658 { 9659 c_token *token = c_parser_peek_token (parser); 9660 tree value = token->value; 9661 if (token->type == CPP_NAME) 9662 { 9663 c_parser_consume_token (parser); 9664 return value; 9665 } 9666 if (token->type != CPP_KEYWORD) 9667 return NULL_TREE; 9668 switch (token->keyword) 9669 { 9670 case RID_ENUM: 9671 case RID_STRUCT: 9672 case RID_UNION: 9673 case RID_IF: 9674 case RID_ELSE: 9675 case RID_WHILE: 9676 case RID_DO: 9677 case RID_FOR: 9678 case RID_SWITCH: 9679 case RID_CASE: 9680 case RID_DEFAULT: 9681 case RID_BREAK: 9682 case RID_CONTINUE: 9683 case RID_RETURN: 9684 case RID_GOTO: 9685 case RID_ASM: 9686 case RID_SIZEOF: 9687 case RID_TYPEOF: 9688 case RID_ALIGNOF: 9689 case RID_UNSIGNED: 9690 case RID_LONG: 9691 case RID_CONST: 9692 case RID_SHORT: 9693 case RID_VOLATILE: 9694 case RID_SIGNED: 9695 case RID_RESTRICT: 9696 case RID_COMPLEX: 9697 case RID_IN: 9698 case RID_OUT: 9699 case RID_INOUT: 9700 case RID_BYCOPY: 9701 case RID_BYREF: 9702 case RID_ONEWAY: 9703 case RID_INT: 9704 case RID_CHAR: 9705 case RID_FLOAT: 9706 case RID_DOUBLE: 9707 CASE_RID_FLOATN_NX: 9708 case RID_VOID: 9709 case RID_BOOL: 9710 case RID_ATOMIC: 9711 case RID_AUTO_TYPE: 9712 case RID_INT_N_0: 9713 case RID_INT_N_1: 9714 case RID_INT_N_2: 9715 case RID_INT_N_3: 9716 c_parser_consume_token (parser); 9717 return value; 9718 default: 9719 return NULL_TREE; 9720 } 9721 } 9722 9723 /* Parse an objc-selector-arg. 9724 9725 objc-selector-arg: 9726 objc-selector 9727 objc-keywordname-list 9728 9729 objc-keywordname-list: 9730 objc-keywordname 9731 objc-keywordname-list objc-keywordname 9732 9733 objc-keywordname: 9734 objc-selector : 9735 : 9736 */ 9737 9738 static tree 9739 c_parser_objc_selector_arg (c_parser *parser) 9740 { 9741 tree sel = c_parser_objc_selector (parser); 9742 tree list = NULL_TREE; 9743 if (sel && c_parser_next_token_is_not (parser, CPP_COLON)) 9744 return sel; 9745 while (true) 9746 { 9747 if (!c_parser_require (parser, CPP_COLON, "expected %<:%>")) 9748 return list; 9749 list = chainon (list, build_tree_list (sel, NULL_TREE)); 9750 sel = c_parser_objc_selector (parser); 9751 if (!sel && c_parser_next_token_is_not (parser, CPP_COLON)) 9752 break; 9753 } 9754 return list; 9755 } 9756 9757 /* Parse an objc-receiver. 9758 9759 objc-receiver: 9760 expression 9761 class-name 9762 type-name 9763 */ 9764 9765 static tree 9766 c_parser_objc_receiver (c_parser *parser) 9767 { 9768 location_t loc = c_parser_peek_token (parser)->location; 9769 9770 if (c_parser_peek_token (parser)->type == CPP_NAME 9771 && (c_parser_peek_token (parser)->id_kind == C_ID_TYPENAME 9772 || c_parser_peek_token (parser)->id_kind == C_ID_CLASSNAME)) 9773 { 9774 tree id = c_parser_peek_token (parser)->value; 9775 c_parser_consume_token (parser); 9776 return objc_get_class_reference (id); 9777 } 9778 struct c_expr ce = c_parser_expression (parser); 9779 ce = convert_lvalue_to_rvalue (loc, ce, false, false); 9780 return c_fully_fold (ce.value, false, NULL); 9781 } 9782 9783 /* Parse objc-message-args. 9784 9785 objc-message-args: 9786 objc-selector 9787 objc-keywordarg-list 9788 9789 objc-keywordarg-list: 9790 objc-keywordarg 9791 objc-keywordarg-list objc-keywordarg 9792 9793 objc-keywordarg: 9794 objc-selector : objc-keywordexpr 9795 : objc-keywordexpr 9796 */ 9797 9798 static tree 9799 c_parser_objc_message_args (c_parser *parser) 9800 { 9801 tree sel = c_parser_objc_selector (parser); 9802 tree list = NULL_TREE; 9803 if (sel && c_parser_next_token_is_not (parser, CPP_COLON)) 9804 return sel; 9805 while (true) 9806 { 9807 tree keywordexpr; 9808 if (!c_parser_require (parser, CPP_COLON, "expected %<:%>")) 9809 return error_mark_node; 9810 keywordexpr = c_parser_objc_keywordexpr (parser); 9811 list = chainon (list, build_tree_list (sel, keywordexpr)); 9812 sel = c_parser_objc_selector (parser); 9813 if (!sel && c_parser_next_token_is_not (parser, CPP_COLON)) 9814 break; 9815 } 9816 return list; 9817 } 9818 9819 /* Parse an objc-keywordexpr. 9820 9821 objc-keywordexpr: 9822 nonempty-expr-list 9823 */ 9824 9825 static tree 9826 c_parser_objc_keywordexpr (c_parser *parser) 9827 { 9828 tree ret; 9829 vec<tree, va_gc> *expr_list = c_parser_expr_list (parser, true, true, 9830 NULL, NULL, NULL, NULL); 9831 if (vec_safe_length (expr_list) == 1) 9832 { 9833 /* Just return the expression, remove a level of 9834 indirection. */ 9835 ret = (*expr_list)[0]; 9836 } 9837 else 9838 { 9839 /* We have a comma expression, we will collapse later. */ 9840 ret = build_tree_list_vec (expr_list); 9841 } 9842 release_tree_vector (expr_list); 9843 return ret; 9844 } 9845 9846 /* A check, needed in several places, that ObjC interface, implementation or 9847 method definitions are not prefixed by incorrect items. */ 9848 static bool 9849 c_parser_objc_diagnose_bad_element_prefix (c_parser *parser, 9850 struct c_declspecs *specs) 9851 { 9852 if (!specs->declspecs_seen_p || specs->non_sc_seen_p 9853 || specs->typespec_kind != ctsk_none) 9854 { 9855 c_parser_error (parser, 9856 "no type or storage class may be specified here,"); 9857 c_parser_skip_to_end_of_block_or_statement (parser); 9858 return true; 9859 } 9860 return false; 9861 } 9862 9863 /* Parse an Objective-C @property declaration. The syntax is: 9864 9865 objc-property-declaration: 9866 '@property' objc-property-attributes[opt] struct-declaration ; 9867 9868 objc-property-attributes: 9869 '(' objc-property-attribute-list ')' 9870 9871 objc-property-attribute-list: 9872 objc-property-attribute 9873 objc-property-attribute-list, objc-property-attribute 9874 9875 objc-property-attribute 9876 'getter' = identifier 9877 'setter' = identifier 9878 'readonly' 9879 'readwrite' 9880 'assign' 9881 'retain' 9882 'copy' 9883 'nonatomic' 9884 9885 For example: 9886 @property NSString *name; 9887 @property (readonly) id object; 9888 @property (retain, nonatomic, getter=getTheName) id name; 9889 @property int a, b, c; 9890 9891 PS: This function is identical to cp_parser_objc_at_propery_declaration 9892 for C++. Keep them in sync. */ 9893 static void 9894 c_parser_objc_at_property_declaration (c_parser *parser) 9895 { 9896 /* The following variables hold the attributes of the properties as 9897 parsed. They are 'false' or 'NULL_TREE' if the attribute was not 9898 seen. When we see an attribute, we set them to 'true' (if they 9899 are boolean properties) or to the identifier (if they have an 9900 argument, ie, for getter and setter). Note that here we only 9901 parse the list of attributes, check the syntax and accumulate the 9902 attributes that we find. objc_add_property_declaration() will 9903 then process the information. */ 9904 bool property_assign = false; 9905 bool property_copy = false; 9906 tree property_getter_ident = NULL_TREE; 9907 bool property_nonatomic = false; 9908 bool property_readonly = false; 9909 bool property_readwrite = false; 9910 bool property_retain = false; 9911 tree property_setter_ident = NULL_TREE; 9912 9913 /* 'properties' is the list of properties that we read. Usually a 9914 single one, but maybe more (eg, in "@property int a, b, c;" there 9915 are three). */ 9916 tree properties; 9917 location_t loc; 9918 9919 loc = c_parser_peek_token (parser)->location; 9920 gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_PROPERTY)); 9921 9922 c_parser_consume_token (parser); /* Eat '@property'. */ 9923 9924 /* Parse the optional attribute list... */ 9925 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)) 9926 { 9927 /* Eat the '(' */ 9928 c_parser_consume_token (parser); 9929 9930 /* Property attribute keywords are valid now. */ 9931 parser->objc_property_attr_context = true; 9932 9933 while (true) 9934 { 9935 bool syntax_error = false; 9936 c_token *token = c_parser_peek_token (parser); 9937 enum rid keyword; 9938 9939 if (token->type != CPP_KEYWORD) 9940 { 9941 if (token->type == CPP_CLOSE_PAREN) 9942 c_parser_error (parser, "expected identifier"); 9943 else 9944 { 9945 c_parser_consume_token (parser); 9946 c_parser_error (parser, "unknown property attribute"); 9947 } 9948 break; 9949 } 9950 keyword = token->keyword; 9951 c_parser_consume_token (parser); 9952 switch (keyword) 9953 { 9954 case RID_ASSIGN: property_assign = true; break; 9955 case RID_COPY: property_copy = true; break; 9956 case RID_NONATOMIC: property_nonatomic = true; break; 9957 case RID_READONLY: property_readonly = true; break; 9958 case RID_READWRITE: property_readwrite = true; break; 9959 case RID_RETAIN: property_retain = true; break; 9960 9961 case RID_GETTER: 9962 case RID_SETTER: 9963 if (c_parser_next_token_is_not (parser, CPP_EQ)) 9964 { 9965 if (keyword == RID_GETTER) 9966 c_parser_error (parser, 9967 "missing %<=%> (after %<getter%> attribute)"); 9968 else 9969 c_parser_error (parser, 9970 "missing %<=%> (after %<setter%> attribute)"); 9971 syntax_error = true; 9972 break; 9973 } 9974 c_parser_consume_token (parser); /* eat the = */ 9975 if (c_parser_next_token_is_not (parser, CPP_NAME)) 9976 { 9977 c_parser_error (parser, "expected identifier"); 9978 syntax_error = true; 9979 break; 9980 } 9981 if (keyword == RID_SETTER) 9982 { 9983 if (property_setter_ident != NULL_TREE) 9984 c_parser_error (parser, "the %<setter%> attribute may only be specified once"); 9985 else 9986 property_setter_ident = c_parser_peek_token (parser)->value; 9987 c_parser_consume_token (parser); 9988 if (c_parser_next_token_is_not (parser, CPP_COLON)) 9989 c_parser_error (parser, "setter name must terminate with %<:%>"); 9990 else 9991 c_parser_consume_token (parser); 9992 } 9993 else 9994 { 9995 if (property_getter_ident != NULL_TREE) 9996 c_parser_error (parser, "the %<getter%> attribute may only be specified once"); 9997 else 9998 property_getter_ident = c_parser_peek_token (parser)->value; 9999 c_parser_consume_token (parser); 10000 } 10001 break; 10002 default: 10003 c_parser_error (parser, "unknown property attribute"); 10004 syntax_error = true; 10005 break; 10006 } 10007 10008 if (syntax_error) 10009 break; 10010 10011 if (c_parser_next_token_is (parser, CPP_COMMA)) 10012 c_parser_consume_token (parser); 10013 else 10014 break; 10015 } 10016 parser->objc_property_attr_context = false; 10017 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 10018 } 10019 /* ... and the property declaration(s). */ 10020 properties = c_parser_struct_declaration (parser); 10021 10022 if (properties == error_mark_node) 10023 { 10024 c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL); 10025 parser->error = false; 10026 return; 10027 } 10028 10029 if (properties == NULL_TREE) 10030 c_parser_error (parser, "expected identifier"); 10031 else 10032 { 10033 /* Comma-separated properties are chained together in 10034 reverse order; add them one by one. */ 10035 properties = nreverse (properties); 10036 10037 for (; properties; properties = TREE_CHAIN (properties)) 10038 objc_add_property_declaration (loc, copy_node (properties), 10039 property_readonly, property_readwrite, 10040 property_assign, property_retain, 10041 property_copy, property_nonatomic, 10042 property_getter_ident, property_setter_ident); 10043 } 10044 10045 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>"); 10046 parser->error = false; 10047 } 10048 10049 /* Parse an Objective-C @synthesize declaration. The syntax is: 10050 10051 objc-synthesize-declaration: 10052 @synthesize objc-synthesize-identifier-list ; 10053 10054 objc-synthesize-identifier-list: 10055 objc-synthesize-identifier 10056 objc-synthesize-identifier-list, objc-synthesize-identifier 10057 10058 objc-synthesize-identifier 10059 identifier 10060 identifier = identifier 10061 10062 For example: 10063 @synthesize MyProperty; 10064 @synthesize OneProperty, AnotherProperty=MyIvar, YetAnotherProperty; 10065 10066 PS: This function is identical to cp_parser_objc_at_synthesize_declaration 10067 for C++. Keep them in sync. 10068 */ 10069 static void 10070 c_parser_objc_at_synthesize_declaration (c_parser *parser) 10071 { 10072 tree list = NULL_TREE; 10073 location_t loc; 10074 gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_SYNTHESIZE)); 10075 loc = c_parser_peek_token (parser)->location; 10076 10077 c_parser_consume_token (parser); 10078 while (true) 10079 { 10080 tree property, ivar; 10081 if (c_parser_next_token_is_not (parser, CPP_NAME)) 10082 { 10083 c_parser_error (parser, "expected identifier"); 10084 c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL); 10085 /* Once we find the semicolon, we can resume normal parsing. 10086 We have to reset parser->error manually because 10087 c_parser_skip_until_found() won't reset it for us if the 10088 next token is precisely a semicolon. */ 10089 parser->error = false; 10090 return; 10091 } 10092 property = c_parser_peek_token (parser)->value; 10093 c_parser_consume_token (parser); 10094 if (c_parser_next_token_is (parser, CPP_EQ)) 10095 { 10096 c_parser_consume_token (parser); 10097 if (c_parser_next_token_is_not (parser, CPP_NAME)) 10098 { 10099 c_parser_error (parser, "expected identifier"); 10100 c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL); 10101 parser->error = false; 10102 return; 10103 } 10104 ivar = c_parser_peek_token (parser)->value; 10105 c_parser_consume_token (parser); 10106 } 10107 else 10108 ivar = NULL_TREE; 10109 list = chainon (list, build_tree_list (ivar, property)); 10110 if (c_parser_next_token_is (parser, CPP_COMMA)) 10111 c_parser_consume_token (parser); 10112 else 10113 break; 10114 } 10115 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>"); 10116 objc_add_synthesize_declaration (loc, list); 10117 } 10118 10119 /* Parse an Objective-C @dynamic declaration. The syntax is: 10120 10121 objc-dynamic-declaration: 10122 @dynamic identifier-list ; 10123 10124 For example: 10125 @dynamic MyProperty; 10126 @dynamic MyProperty, AnotherProperty; 10127 10128 PS: This function is identical to cp_parser_objc_at_dynamic_declaration 10129 for C++. Keep them in sync. 10130 */ 10131 static void 10132 c_parser_objc_at_dynamic_declaration (c_parser *parser) 10133 { 10134 tree list = NULL_TREE; 10135 location_t loc; 10136 gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_DYNAMIC)); 10137 loc = c_parser_peek_token (parser)->location; 10138 10139 c_parser_consume_token (parser); 10140 while (true) 10141 { 10142 tree property; 10143 if (c_parser_next_token_is_not (parser, CPP_NAME)) 10144 { 10145 c_parser_error (parser, "expected identifier"); 10146 c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL); 10147 parser->error = false; 10148 return; 10149 } 10150 property = c_parser_peek_token (parser)->value; 10151 list = chainon (list, build_tree_list (NULL_TREE, property)); 10152 c_parser_consume_token (parser); 10153 if (c_parser_next_token_is (parser, CPP_COMMA)) 10154 c_parser_consume_token (parser); 10155 else 10156 break; 10157 } 10158 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>"); 10159 objc_add_dynamic_declaration (loc, list); 10160 } 10161 10162 10163 /* Handle pragmas. Some OpenMP pragmas are associated with, and therefore 10164 should be considered, statements. ALLOW_STMT is true if we're within 10165 the context of a function and such pragmas are to be allowed. Returns 10166 true if we actually parsed such a pragma. */ 10167 10168 static bool 10169 c_parser_pragma (c_parser *parser, enum pragma_context context, bool *if_p) 10170 { 10171 unsigned int id; 10172 const char *construct = NULL; 10173 10174 id = c_parser_peek_token (parser)->pragma_kind; 10175 gcc_assert (id != PRAGMA_NONE); 10176 10177 switch (id) 10178 { 10179 case PRAGMA_OACC_DECLARE: 10180 c_parser_oacc_declare (parser); 10181 return false; 10182 10183 case PRAGMA_OACC_ENTER_DATA: 10184 if (context != pragma_compound) 10185 { 10186 construct = "acc enter data"; 10187 in_compound: 10188 if (context == pragma_stmt) 10189 { 10190 error_at (c_parser_peek_token (parser)->location, 10191 "%<#pragma %s%> may only be used in compound " 10192 "statements", construct); 10193 c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL); 10194 return false; 10195 } 10196 goto bad_stmt; 10197 } 10198 c_parser_oacc_enter_exit_data (parser, true); 10199 return false; 10200 10201 case PRAGMA_OACC_EXIT_DATA: 10202 if (context != pragma_compound) 10203 { 10204 construct = "acc exit data"; 10205 goto in_compound; 10206 } 10207 c_parser_oacc_enter_exit_data (parser, false); 10208 return false; 10209 10210 case PRAGMA_OACC_ROUTINE: 10211 if (context != pragma_external) 10212 { 10213 error_at (c_parser_peek_token (parser)->location, 10214 "%<#pragma acc routine%> must be at file scope"); 10215 c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL); 10216 return false; 10217 } 10218 c_parser_oacc_routine (parser, context); 10219 return false; 10220 10221 case PRAGMA_OACC_UPDATE: 10222 if (context != pragma_compound) 10223 { 10224 construct = "acc update"; 10225 goto in_compound; 10226 } 10227 c_parser_oacc_update (parser); 10228 return false; 10229 10230 case PRAGMA_OMP_BARRIER: 10231 if (context != pragma_compound) 10232 { 10233 construct = "omp barrier"; 10234 goto in_compound; 10235 } 10236 c_parser_omp_barrier (parser); 10237 return false; 10238 10239 case PRAGMA_OMP_FLUSH: 10240 if (context != pragma_compound) 10241 { 10242 construct = "omp flush"; 10243 goto in_compound; 10244 } 10245 c_parser_omp_flush (parser); 10246 return false; 10247 10248 case PRAGMA_OMP_TASKWAIT: 10249 if (context != pragma_compound) 10250 { 10251 construct = "omp taskwait"; 10252 goto in_compound; 10253 } 10254 c_parser_omp_taskwait (parser); 10255 return false; 10256 10257 case PRAGMA_OMP_TASKYIELD: 10258 if (context != pragma_compound) 10259 { 10260 construct = "omp taskyield"; 10261 goto in_compound; 10262 } 10263 c_parser_omp_taskyield (parser); 10264 return false; 10265 10266 case PRAGMA_OMP_CANCEL: 10267 if (context != pragma_compound) 10268 { 10269 construct = "omp cancel"; 10270 goto in_compound; 10271 } 10272 c_parser_omp_cancel (parser); 10273 return false; 10274 10275 case PRAGMA_OMP_CANCELLATION_POINT: 10276 c_parser_omp_cancellation_point (parser, context); 10277 return false; 10278 10279 case PRAGMA_OMP_THREADPRIVATE: 10280 c_parser_omp_threadprivate (parser); 10281 return false; 10282 10283 case PRAGMA_OMP_TARGET: 10284 return c_parser_omp_target (parser, context, if_p); 10285 10286 case PRAGMA_OMP_END_DECLARE_TARGET: 10287 c_parser_omp_end_declare_target (parser); 10288 return false; 10289 10290 case PRAGMA_OMP_SECTION: 10291 error_at (c_parser_peek_token (parser)->location, 10292 "%<#pragma omp section%> may only be used in " 10293 "%<#pragma omp sections%> construct"); 10294 c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL); 10295 return false; 10296 10297 case PRAGMA_OMP_DECLARE: 10298 c_parser_omp_declare (parser, context); 10299 return false; 10300 10301 case PRAGMA_OMP_ORDERED: 10302 return c_parser_omp_ordered (parser, context, if_p); 10303 10304 case PRAGMA_IVDEP: 10305 c_parser_consume_pragma (parser); 10306 c_parser_skip_to_pragma_eol (parser); 10307 if (!c_parser_next_token_is_keyword (parser, RID_FOR) 10308 && !c_parser_next_token_is_keyword (parser, RID_WHILE) 10309 && !c_parser_next_token_is_keyword (parser, RID_DO)) 10310 { 10311 c_parser_error (parser, "for, while or do statement expected"); 10312 return false; 10313 } 10314 if (c_parser_next_token_is_keyword (parser, RID_FOR)) 10315 c_parser_for_statement (parser, true, if_p); 10316 else if (c_parser_next_token_is_keyword (parser, RID_WHILE)) 10317 c_parser_while_statement (parser, true, if_p); 10318 else 10319 c_parser_do_statement (parser, true); 10320 return false; 10321 10322 case PRAGMA_GCC_PCH_PREPROCESS: 10323 c_parser_error (parser, "%<#pragma GCC pch_preprocess%> must be first"); 10324 c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL); 10325 return false; 10326 10327 case PRAGMA_CILK_SIMD: 10328 if (!c_parser_cilk_verify_simd (parser, context)) 10329 return false; 10330 c_parser_consume_pragma (parser); 10331 c_parser_cilk_simd (parser, if_p); 10332 return false; 10333 case PRAGMA_CILK_GRAINSIZE: 10334 if (!flag_cilkplus) 10335 { 10336 warning (0, "%<#pragma grainsize%> ignored because -fcilkplus is not" 10337 " enabled"); 10338 c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL); 10339 return false; 10340 } 10341 if (context == pragma_external) 10342 { 10343 error_at (c_parser_peek_token (parser)->location, 10344 "%<#pragma grainsize%> must be inside a function"); 10345 c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL); 10346 return false; 10347 } 10348 c_parser_cilk_grainsize (parser, if_p); 10349 return false; 10350 10351 case PRAGMA_OACC_WAIT: 10352 if (context != pragma_compound) 10353 { 10354 construct = "acc wait"; 10355 goto in_compound; 10356 } 10357 /* FALL THROUGH. */ 10358 10359 default: 10360 if (id < PRAGMA_FIRST_EXTERNAL) 10361 { 10362 if (context != pragma_stmt && context != pragma_compound) 10363 { 10364 bad_stmt: 10365 c_parser_error (parser, "expected declaration specifiers"); 10366 c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL); 10367 return false; 10368 } 10369 c_parser_omp_construct (parser, if_p); 10370 return true; 10371 } 10372 break; 10373 } 10374 10375 c_parser_consume_pragma (parser); 10376 c_invoke_pragma_handler (id); 10377 10378 /* Skip to EOL, but suppress any error message. Those will have been 10379 generated by the handler routine through calling error, as opposed 10380 to calling c_parser_error. */ 10381 parser->error = true; 10382 c_parser_skip_to_pragma_eol (parser); 10383 10384 return false; 10385 } 10386 10387 /* The interface the pragma parsers have to the lexer. */ 10388 10389 enum cpp_ttype 10390 pragma_lex (tree *value, location_t *loc) 10391 { 10392 c_token *tok = c_parser_peek_token (the_parser); 10393 enum cpp_ttype ret = tok->type; 10394 10395 *value = tok->value; 10396 if (loc) 10397 *loc = tok->location; 10398 10399 if (ret == CPP_PRAGMA_EOL || ret == CPP_EOF) 10400 ret = CPP_EOF; 10401 else 10402 { 10403 if (ret == CPP_KEYWORD) 10404 ret = CPP_NAME; 10405 c_parser_consume_token (the_parser); 10406 } 10407 10408 return ret; 10409 } 10410 10411 static void 10412 c_parser_pragma_pch_preprocess (c_parser *parser) 10413 { 10414 tree name = NULL; 10415 10416 c_parser_consume_pragma (parser); 10417 if (c_parser_next_token_is (parser, CPP_STRING)) 10418 { 10419 name = c_parser_peek_token (parser)->value; 10420 c_parser_consume_token (parser); 10421 } 10422 else 10423 c_parser_error (parser, "expected string literal"); 10424 c_parser_skip_to_pragma_eol (parser); 10425 10426 if (name) 10427 c_common_pch_pragma (parse_in, TREE_STRING_POINTER (name)); 10428 } 10429 10430 /* OpenACC and OpenMP parsing routines. */ 10431 10432 /* Returns name of the next clause. 10433 If the clause is not recognized PRAGMA_OMP_CLAUSE_NONE is returned and 10434 the token is not consumed. Otherwise appropriate pragma_omp_clause is 10435 returned and the token is consumed. */ 10436 10437 static pragma_omp_clause 10438 c_parser_omp_clause_name (c_parser *parser) 10439 { 10440 pragma_omp_clause result = PRAGMA_OMP_CLAUSE_NONE; 10441 10442 if (c_parser_next_token_is_keyword (parser, RID_AUTO)) 10443 result = PRAGMA_OACC_CLAUSE_AUTO; 10444 else if (c_parser_next_token_is_keyword (parser, RID_IF)) 10445 result = PRAGMA_OMP_CLAUSE_IF; 10446 else if (c_parser_next_token_is_keyword (parser, RID_DEFAULT)) 10447 result = PRAGMA_OMP_CLAUSE_DEFAULT; 10448 else if (c_parser_next_token_is_keyword (parser, RID_FOR)) 10449 result = PRAGMA_OMP_CLAUSE_FOR; 10450 else if (c_parser_next_token_is (parser, CPP_NAME)) 10451 { 10452 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value); 10453 10454 switch (p[0]) 10455 { 10456 case 'a': 10457 if (!strcmp ("aligned", p)) 10458 result = PRAGMA_OMP_CLAUSE_ALIGNED; 10459 else if (!strcmp ("async", p)) 10460 result = PRAGMA_OACC_CLAUSE_ASYNC; 10461 break; 10462 case 'c': 10463 if (!strcmp ("collapse", p)) 10464 result = PRAGMA_OMP_CLAUSE_COLLAPSE; 10465 else if (!strcmp ("copy", p)) 10466 result = PRAGMA_OACC_CLAUSE_COPY; 10467 else if (!strcmp ("copyin", p)) 10468 result = PRAGMA_OMP_CLAUSE_COPYIN; 10469 else if (!strcmp ("copyout", p)) 10470 result = PRAGMA_OACC_CLAUSE_COPYOUT; 10471 else if (!strcmp ("copyprivate", p)) 10472 result = PRAGMA_OMP_CLAUSE_COPYPRIVATE; 10473 else if (!strcmp ("create", p)) 10474 result = PRAGMA_OACC_CLAUSE_CREATE; 10475 break; 10476 case 'd': 10477 if (!strcmp ("defaultmap", p)) 10478 result = PRAGMA_OMP_CLAUSE_DEFAULTMAP; 10479 else if (!strcmp ("delete", p)) 10480 result = PRAGMA_OACC_CLAUSE_DELETE; 10481 else if (!strcmp ("depend", p)) 10482 result = PRAGMA_OMP_CLAUSE_DEPEND; 10483 else if (!strcmp ("device", p)) 10484 result = PRAGMA_OMP_CLAUSE_DEVICE; 10485 else if (!strcmp ("deviceptr", p)) 10486 result = PRAGMA_OACC_CLAUSE_DEVICEPTR; 10487 else if (!strcmp ("device_resident", p)) 10488 result = PRAGMA_OACC_CLAUSE_DEVICE_RESIDENT; 10489 else if (!strcmp ("dist_schedule", p)) 10490 result = PRAGMA_OMP_CLAUSE_DIST_SCHEDULE; 10491 break; 10492 case 'f': 10493 if (!strcmp ("final", p)) 10494 result = PRAGMA_OMP_CLAUSE_FINAL; 10495 else if (!strcmp ("firstprivate", p)) 10496 result = PRAGMA_OMP_CLAUSE_FIRSTPRIVATE; 10497 else if (!strcmp ("from", p)) 10498 result = PRAGMA_OMP_CLAUSE_FROM; 10499 break; 10500 case 'g': 10501 if (!strcmp ("gang", p)) 10502 result = PRAGMA_OACC_CLAUSE_GANG; 10503 else if (!strcmp ("grainsize", p)) 10504 result = PRAGMA_OMP_CLAUSE_GRAINSIZE; 10505 break; 10506 case 'h': 10507 if (!strcmp ("hint", p)) 10508 result = PRAGMA_OMP_CLAUSE_HINT; 10509 else if (!strcmp ("host", p)) 10510 result = PRAGMA_OACC_CLAUSE_HOST; 10511 break; 10512 case 'i': 10513 if (!strcmp ("inbranch", p)) 10514 result = PRAGMA_OMP_CLAUSE_INBRANCH; 10515 else if (!strcmp ("independent", p)) 10516 result = PRAGMA_OACC_CLAUSE_INDEPENDENT; 10517 else if (!strcmp ("is_device_ptr", p)) 10518 result = PRAGMA_OMP_CLAUSE_IS_DEVICE_PTR; 10519 break; 10520 case 'l': 10521 if (!strcmp ("lastprivate", p)) 10522 result = PRAGMA_OMP_CLAUSE_LASTPRIVATE; 10523 else if (!strcmp ("linear", p)) 10524 result = PRAGMA_OMP_CLAUSE_LINEAR; 10525 else if (!strcmp ("link", p)) 10526 result = PRAGMA_OMP_CLAUSE_LINK; 10527 break; 10528 case 'm': 10529 if (!strcmp ("map", p)) 10530 result = PRAGMA_OMP_CLAUSE_MAP; 10531 else if (!strcmp ("mergeable", p)) 10532 result = PRAGMA_OMP_CLAUSE_MERGEABLE; 10533 else if (flag_cilkplus && !strcmp ("mask", p)) 10534 result = PRAGMA_CILK_CLAUSE_MASK; 10535 break; 10536 case 'n': 10537 if (!strcmp ("nogroup", p)) 10538 result = PRAGMA_OMP_CLAUSE_NOGROUP; 10539 else if (!strcmp ("notinbranch", p)) 10540 result = PRAGMA_OMP_CLAUSE_NOTINBRANCH; 10541 else if (!strcmp ("nowait", p)) 10542 result = PRAGMA_OMP_CLAUSE_NOWAIT; 10543 else if (!strcmp ("num_gangs", p)) 10544 result = PRAGMA_OACC_CLAUSE_NUM_GANGS; 10545 else if (!strcmp ("num_tasks", p)) 10546 result = PRAGMA_OMP_CLAUSE_NUM_TASKS; 10547 else if (!strcmp ("num_teams", p)) 10548 result = PRAGMA_OMP_CLAUSE_NUM_TEAMS; 10549 else if (!strcmp ("num_threads", p)) 10550 result = PRAGMA_OMP_CLAUSE_NUM_THREADS; 10551 else if (!strcmp ("num_workers", p)) 10552 result = PRAGMA_OACC_CLAUSE_NUM_WORKERS; 10553 else if (flag_cilkplus && !strcmp ("nomask", p)) 10554 result = PRAGMA_CILK_CLAUSE_NOMASK; 10555 break; 10556 case 'o': 10557 if (!strcmp ("ordered", p)) 10558 result = PRAGMA_OMP_CLAUSE_ORDERED; 10559 break; 10560 case 'p': 10561 if (!strcmp ("parallel", p)) 10562 result = PRAGMA_OMP_CLAUSE_PARALLEL; 10563 else if (!strcmp ("present", p)) 10564 result = PRAGMA_OACC_CLAUSE_PRESENT; 10565 else if (!strcmp ("present_or_copy", p) 10566 || !strcmp ("pcopy", p)) 10567 result = PRAGMA_OACC_CLAUSE_PRESENT_OR_COPY; 10568 else if (!strcmp ("present_or_copyin", p) 10569 || !strcmp ("pcopyin", p)) 10570 result = PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYIN; 10571 else if (!strcmp ("present_or_copyout", p) 10572 || !strcmp ("pcopyout", p)) 10573 result = PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYOUT; 10574 else if (!strcmp ("present_or_create", p) 10575 || !strcmp ("pcreate", p)) 10576 result = PRAGMA_OACC_CLAUSE_PRESENT_OR_CREATE; 10577 else if (!strcmp ("priority", p)) 10578 result = PRAGMA_OMP_CLAUSE_PRIORITY; 10579 else if (!strcmp ("private", p)) 10580 result = PRAGMA_OMP_CLAUSE_PRIVATE; 10581 else if (!strcmp ("proc_bind", p)) 10582 result = PRAGMA_OMP_CLAUSE_PROC_BIND; 10583 break; 10584 case 'r': 10585 if (!strcmp ("reduction", p)) 10586 result = PRAGMA_OMP_CLAUSE_REDUCTION; 10587 break; 10588 case 's': 10589 if (!strcmp ("safelen", p)) 10590 result = PRAGMA_OMP_CLAUSE_SAFELEN; 10591 else if (!strcmp ("schedule", p)) 10592 result = PRAGMA_OMP_CLAUSE_SCHEDULE; 10593 else if (!strcmp ("sections", p)) 10594 result = PRAGMA_OMP_CLAUSE_SECTIONS; 10595 else if (!strcmp ("seq", p)) 10596 result = PRAGMA_OACC_CLAUSE_SEQ; 10597 else if (!strcmp ("shared", p)) 10598 result = PRAGMA_OMP_CLAUSE_SHARED; 10599 else if (!strcmp ("simd", p)) 10600 result = PRAGMA_OMP_CLAUSE_SIMD; 10601 else if (!strcmp ("simdlen", p)) 10602 result = PRAGMA_OMP_CLAUSE_SIMDLEN; 10603 else if (!strcmp ("self", p)) 10604 result = PRAGMA_OACC_CLAUSE_SELF; 10605 break; 10606 case 't': 10607 if (!strcmp ("taskgroup", p)) 10608 result = PRAGMA_OMP_CLAUSE_TASKGROUP; 10609 else if (!strcmp ("thread_limit", p)) 10610 result = PRAGMA_OMP_CLAUSE_THREAD_LIMIT; 10611 else if (!strcmp ("threads", p)) 10612 result = PRAGMA_OMP_CLAUSE_THREADS; 10613 else if (!strcmp ("tile", p)) 10614 result = PRAGMA_OACC_CLAUSE_TILE; 10615 else if (!strcmp ("to", p)) 10616 result = PRAGMA_OMP_CLAUSE_TO; 10617 break; 10618 case 'u': 10619 if (!strcmp ("uniform", p)) 10620 result = PRAGMA_OMP_CLAUSE_UNIFORM; 10621 else if (!strcmp ("untied", p)) 10622 result = PRAGMA_OMP_CLAUSE_UNTIED; 10623 else if (!strcmp ("use_device", p)) 10624 result = PRAGMA_OACC_CLAUSE_USE_DEVICE; 10625 else if (!strcmp ("use_device_ptr", p)) 10626 result = PRAGMA_OMP_CLAUSE_USE_DEVICE_PTR; 10627 break; 10628 case 'v': 10629 if (!strcmp ("vector", p)) 10630 result = PRAGMA_OACC_CLAUSE_VECTOR; 10631 else if (!strcmp ("vector_length", p)) 10632 result = PRAGMA_OACC_CLAUSE_VECTOR_LENGTH; 10633 else if (flag_cilkplus && !strcmp ("vectorlength", p)) 10634 result = PRAGMA_CILK_CLAUSE_VECTORLENGTH; 10635 break; 10636 case 'w': 10637 if (!strcmp ("wait", p)) 10638 result = PRAGMA_OACC_CLAUSE_WAIT; 10639 else if (!strcmp ("worker", p)) 10640 result = PRAGMA_OACC_CLAUSE_WORKER; 10641 break; 10642 } 10643 } 10644 10645 if (result != PRAGMA_OMP_CLAUSE_NONE) 10646 c_parser_consume_token (parser); 10647 10648 return result; 10649 } 10650 10651 /* Validate that a clause of the given type does not already exist. */ 10652 10653 static void 10654 check_no_duplicate_clause (tree clauses, enum omp_clause_code code, 10655 const char *name) 10656 { 10657 tree c; 10658 10659 for (c = clauses; c ; c = OMP_CLAUSE_CHAIN (c)) 10660 if (OMP_CLAUSE_CODE (c) == code) 10661 { 10662 location_t loc = OMP_CLAUSE_LOCATION (c); 10663 error_at (loc, "too many %qs clauses", name); 10664 break; 10665 } 10666 } 10667 10668 /* OpenACC 2.0 10669 Parse wait clause or wait directive parameters. */ 10670 10671 static tree 10672 c_parser_oacc_wait_list (c_parser *parser, location_t clause_loc, tree list) 10673 { 10674 vec<tree, va_gc> *args; 10675 tree t, args_tree; 10676 10677 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 10678 return list; 10679 10680 args = c_parser_expr_list (parser, false, true, NULL, NULL, NULL, NULL); 10681 10682 if (args->length () == 0) 10683 { 10684 c_parser_error (parser, "expected integer expression before ')'"); 10685 release_tree_vector (args); 10686 return list; 10687 } 10688 10689 args_tree = build_tree_list_vec (args); 10690 10691 for (t = args_tree; t; t = TREE_CHAIN (t)) 10692 { 10693 tree targ = TREE_VALUE (t); 10694 10695 if (targ != error_mark_node) 10696 { 10697 if (!INTEGRAL_TYPE_P (TREE_TYPE (targ))) 10698 { 10699 c_parser_error (parser, "expression must be integral"); 10700 targ = error_mark_node; 10701 } 10702 else 10703 { 10704 tree c = build_omp_clause (clause_loc, OMP_CLAUSE_WAIT); 10705 10706 OMP_CLAUSE_DECL (c) = targ; 10707 OMP_CLAUSE_CHAIN (c) = list; 10708 list = c; 10709 } 10710 } 10711 } 10712 10713 release_tree_vector (args); 10714 c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 10715 return list; 10716 } 10717 10718 /* OpenACC 2.0, OpenMP 2.5: 10719 variable-list: 10720 identifier 10721 variable-list , identifier 10722 10723 If KIND is nonzero, create the appropriate node and install the 10724 decl in OMP_CLAUSE_DECL and add the node to the head of the list. 10725 If KIND is nonzero, CLAUSE_LOC is the location of the clause. 10726 10727 If KIND is zero, create a TREE_LIST with the decl in TREE_PURPOSE; 10728 return the list created. */ 10729 10730 static tree 10731 c_parser_omp_variable_list (c_parser *parser, 10732 location_t clause_loc, 10733 enum omp_clause_code kind, tree list) 10734 { 10735 if (c_parser_next_token_is_not (parser, CPP_NAME) 10736 || c_parser_peek_token (parser)->id_kind != C_ID_ID) 10737 c_parser_error (parser, "expected identifier"); 10738 10739 while (c_parser_next_token_is (parser, CPP_NAME) 10740 && c_parser_peek_token (parser)->id_kind == C_ID_ID) 10741 { 10742 tree t = lookup_name (c_parser_peek_token (parser)->value); 10743 10744 if (t == NULL_TREE) 10745 { 10746 undeclared_variable (c_parser_peek_token (parser)->location, 10747 c_parser_peek_token (parser)->value); 10748 t = error_mark_node; 10749 } 10750 10751 c_parser_consume_token (parser); 10752 10753 if (t == error_mark_node) 10754 ; 10755 else if (kind != 0) 10756 { 10757 switch (kind) 10758 { 10759 case OMP_CLAUSE__CACHE_: 10760 /* The OpenACC cache directive explicitly only allows "array 10761 elements or subarrays". */ 10762 if (c_parser_peek_token (parser)->type != CPP_OPEN_SQUARE) 10763 { 10764 c_parser_error (parser, "expected %<[%>"); 10765 t = error_mark_node; 10766 break; 10767 } 10768 /* FALLTHROUGH */ 10769 case OMP_CLAUSE_MAP: 10770 case OMP_CLAUSE_FROM: 10771 case OMP_CLAUSE_TO: 10772 while (c_parser_next_token_is (parser, CPP_DOT)) 10773 { 10774 location_t op_loc = c_parser_peek_token (parser)->location; 10775 c_parser_consume_token (parser); 10776 if (!c_parser_next_token_is (parser, CPP_NAME)) 10777 { 10778 c_parser_error (parser, "expected identifier"); 10779 t = error_mark_node; 10780 break; 10781 } 10782 10783 c_token *comp_tok = c_parser_peek_token (parser); 10784 tree ident = comp_tok->value; 10785 location_t comp_loc = comp_tok->location; 10786 c_parser_consume_token (parser); 10787 t = build_component_ref (op_loc, t, ident, comp_loc); 10788 } 10789 /* FALLTHROUGH */ 10790 case OMP_CLAUSE_DEPEND: 10791 case OMP_CLAUSE_REDUCTION: 10792 while (c_parser_next_token_is (parser, CPP_OPEN_SQUARE)) 10793 { 10794 tree low_bound = NULL_TREE, length = NULL_TREE; 10795 10796 c_parser_consume_token (parser); 10797 if (!c_parser_next_token_is (parser, CPP_COLON)) 10798 { 10799 location_t expr_loc 10800 = c_parser_peek_token (parser)->location; 10801 c_expr expr = c_parser_expression (parser); 10802 expr = convert_lvalue_to_rvalue (expr_loc, expr, 10803 false, true); 10804 low_bound = expr.value; 10805 } 10806 if (c_parser_next_token_is (parser, CPP_CLOSE_SQUARE)) 10807 length = integer_one_node; 10808 else 10809 { 10810 /* Look for `:'. */ 10811 if (!c_parser_require (parser, CPP_COLON, 10812 "expected %<:%>")) 10813 { 10814 t = error_mark_node; 10815 break; 10816 } 10817 if (!c_parser_next_token_is (parser, CPP_CLOSE_SQUARE)) 10818 { 10819 location_t expr_loc 10820 = c_parser_peek_token (parser)->location; 10821 c_expr expr = c_parser_expression (parser); 10822 expr = convert_lvalue_to_rvalue (expr_loc, expr, 10823 false, true); 10824 length = expr.value; 10825 } 10826 } 10827 /* Look for the closing `]'. */ 10828 if (!c_parser_require (parser, CPP_CLOSE_SQUARE, 10829 "expected %<]%>")) 10830 { 10831 t = error_mark_node; 10832 break; 10833 } 10834 10835 t = tree_cons (low_bound, length, t); 10836 } 10837 break; 10838 default: 10839 break; 10840 } 10841 10842 if (t != error_mark_node) 10843 { 10844 tree u = build_omp_clause (clause_loc, kind); 10845 OMP_CLAUSE_DECL (u) = t; 10846 OMP_CLAUSE_CHAIN (u) = list; 10847 list = u; 10848 } 10849 } 10850 else 10851 list = tree_cons (t, NULL_TREE, list); 10852 10853 if (c_parser_next_token_is_not (parser, CPP_COMMA)) 10854 break; 10855 10856 c_parser_consume_token (parser); 10857 } 10858 10859 return list; 10860 } 10861 10862 /* Similarly, but expect leading and trailing parenthesis. This is a very 10863 common case for OpenACC and OpenMP clauses. */ 10864 10865 static tree 10866 c_parser_omp_var_list_parens (c_parser *parser, enum omp_clause_code kind, 10867 tree list) 10868 { 10869 /* The clauses location. */ 10870 location_t loc = c_parser_peek_token (parser)->location; 10871 10872 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 10873 { 10874 list = c_parser_omp_variable_list (parser, loc, kind, list); 10875 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 10876 } 10877 return list; 10878 } 10879 10880 /* OpenACC 2.0: 10881 copy ( variable-list ) 10882 copyin ( variable-list ) 10883 copyout ( variable-list ) 10884 create ( variable-list ) 10885 delete ( variable-list ) 10886 present ( variable-list ) 10887 present_or_copy ( variable-list ) 10888 pcopy ( variable-list ) 10889 present_or_copyin ( variable-list ) 10890 pcopyin ( variable-list ) 10891 present_or_copyout ( variable-list ) 10892 pcopyout ( variable-list ) 10893 present_or_create ( variable-list ) 10894 pcreate ( variable-list ) */ 10895 10896 static tree 10897 c_parser_oacc_data_clause (c_parser *parser, pragma_omp_clause c_kind, 10898 tree list) 10899 { 10900 enum gomp_map_kind kind; 10901 switch (c_kind) 10902 { 10903 case PRAGMA_OACC_CLAUSE_COPY: 10904 kind = GOMP_MAP_FORCE_TOFROM; 10905 break; 10906 case PRAGMA_OACC_CLAUSE_COPYIN: 10907 kind = GOMP_MAP_FORCE_TO; 10908 break; 10909 case PRAGMA_OACC_CLAUSE_COPYOUT: 10910 kind = GOMP_MAP_FORCE_FROM; 10911 break; 10912 case PRAGMA_OACC_CLAUSE_CREATE: 10913 kind = GOMP_MAP_FORCE_ALLOC; 10914 break; 10915 case PRAGMA_OACC_CLAUSE_DELETE: 10916 kind = GOMP_MAP_DELETE; 10917 break; 10918 case PRAGMA_OACC_CLAUSE_DEVICE: 10919 kind = GOMP_MAP_FORCE_TO; 10920 break; 10921 case PRAGMA_OACC_CLAUSE_DEVICE_RESIDENT: 10922 kind = GOMP_MAP_DEVICE_RESIDENT; 10923 break; 10924 case PRAGMA_OACC_CLAUSE_HOST: 10925 case PRAGMA_OACC_CLAUSE_SELF: 10926 kind = GOMP_MAP_FORCE_FROM; 10927 break; 10928 case PRAGMA_OACC_CLAUSE_LINK: 10929 kind = GOMP_MAP_LINK; 10930 break; 10931 case PRAGMA_OACC_CLAUSE_PRESENT: 10932 kind = GOMP_MAP_FORCE_PRESENT; 10933 break; 10934 case PRAGMA_OACC_CLAUSE_PRESENT_OR_COPY: 10935 kind = GOMP_MAP_TOFROM; 10936 break; 10937 case PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYIN: 10938 kind = GOMP_MAP_TO; 10939 break; 10940 case PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYOUT: 10941 kind = GOMP_MAP_FROM; 10942 break; 10943 case PRAGMA_OACC_CLAUSE_PRESENT_OR_CREATE: 10944 kind = GOMP_MAP_ALLOC; 10945 break; 10946 default: 10947 gcc_unreachable (); 10948 } 10949 tree nl, c; 10950 nl = c_parser_omp_var_list_parens (parser, OMP_CLAUSE_MAP, list); 10951 10952 for (c = nl; c != list; c = OMP_CLAUSE_CHAIN (c)) 10953 OMP_CLAUSE_SET_MAP_KIND (c, kind); 10954 10955 return nl; 10956 } 10957 10958 /* OpenACC 2.0: 10959 deviceptr ( variable-list ) */ 10960 10961 static tree 10962 c_parser_oacc_data_clause_deviceptr (c_parser *parser, tree list) 10963 { 10964 location_t loc = c_parser_peek_token (parser)->location; 10965 tree vars, t; 10966 10967 /* Can't use OMP_CLAUSE_MAP here (that is, can't use the generic 10968 c_parser_oacc_data_clause), as for PRAGMA_OACC_CLAUSE_DEVICEPTR, 10969 variable-list must only allow for pointer variables. */ 10970 vars = c_parser_omp_var_list_parens (parser, OMP_CLAUSE_ERROR, NULL); 10971 for (t = vars; t && t; t = TREE_CHAIN (t)) 10972 { 10973 tree v = TREE_PURPOSE (t); 10974 10975 /* FIXME diagnostics: Ideally we should keep individual 10976 locations for all the variables in the var list to make the 10977 following errors more precise. Perhaps 10978 c_parser_omp_var_list_parens() should construct a list of 10979 locations to go along with the var list. */ 10980 10981 if (!VAR_P (v) && TREE_CODE (v) != PARM_DECL) 10982 error_at (loc, "%qD is not a variable", v); 10983 else if (TREE_TYPE (v) == error_mark_node) 10984 ; 10985 else if (!POINTER_TYPE_P (TREE_TYPE (v))) 10986 error_at (loc, "%qD is not a pointer variable", v); 10987 10988 tree u = build_omp_clause (loc, OMP_CLAUSE_MAP); 10989 OMP_CLAUSE_SET_MAP_KIND (u, GOMP_MAP_FORCE_DEVICEPTR); 10990 OMP_CLAUSE_DECL (u) = v; 10991 OMP_CLAUSE_CHAIN (u) = list; 10992 list = u; 10993 } 10994 10995 return list; 10996 } 10997 10998 /* OpenACC 2.0, OpenMP 3.0: 10999 collapse ( constant-expression ) */ 11000 11001 static tree 11002 c_parser_omp_clause_collapse (c_parser *parser, tree list) 11003 { 11004 tree c, num = error_mark_node; 11005 HOST_WIDE_INT n; 11006 location_t loc; 11007 11008 check_no_duplicate_clause (list, OMP_CLAUSE_COLLAPSE, "collapse"); 11009 check_no_duplicate_clause (list, OMP_CLAUSE_TILE, "tile"); 11010 11011 loc = c_parser_peek_token (parser)->location; 11012 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 11013 { 11014 num = c_parser_expr_no_commas (parser, NULL).value; 11015 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 11016 } 11017 if (num == error_mark_node) 11018 return list; 11019 mark_exp_read (num); 11020 num = c_fully_fold (num, false, NULL); 11021 if (!INTEGRAL_TYPE_P (TREE_TYPE (num)) 11022 || !tree_fits_shwi_p (num) 11023 || (n = tree_to_shwi (num)) <= 0 11024 || (int) n != n) 11025 { 11026 error_at (loc, 11027 "collapse argument needs positive constant integer expression"); 11028 return list; 11029 } 11030 c = build_omp_clause (loc, OMP_CLAUSE_COLLAPSE); 11031 OMP_CLAUSE_COLLAPSE_EXPR (c) = num; 11032 OMP_CLAUSE_CHAIN (c) = list; 11033 return c; 11034 } 11035 11036 /* OpenMP 2.5: 11037 copyin ( variable-list ) */ 11038 11039 static tree 11040 c_parser_omp_clause_copyin (c_parser *parser, tree list) 11041 { 11042 return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_COPYIN, list); 11043 } 11044 11045 /* OpenMP 2.5: 11046 copyprivate ( variable-list ) */ 11047 11048 static tree 11049 c_parser_omp_clause_copyprivate (c_parser *parser, tree list) 11050 { 11051 return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_COPYPRIVATE, list); 11052 } 11053 11054 /* OpenMP 2.5: 11055 default ( shared | none ) 11056 11057 OpenACC 2.0: 11058 default (none) */ 11059 11060 static tree 11061 c_parser_omp_clause_default (c_parser *parser, tree list, bool is_oacc) 11062 { 11063 enum omp_clause_default_kind kind = OMP_CLAUSE_DEFAULT_UNSPECIFIED; 11064 location_t loc = c_parser_peek_token (parser)->location; 11065 tree c; 11066 11067 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 11068 return list; 11069 if (c_parser_next_token_is (parser, CPP_NAME)) 11070 { 11071 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value); 11072 11073 switch (p[0]) 11074 { 11075 case 'n': 11076 if (strcmp ("none", p) != 0) 11077 goto invalid_kind; 11078 kind = OMP_CLAUSE_DEFAULT_NONE; 11079 break; 11080 11081 case 's': 11082 if (strcmp ("shared", p) != 0 || is_oacc) 11083 goto invalid_kind; 11084 kind = OMP_CLAUSE_DEFAULT_SHARED; 11085 break; 11086 11087 default: 11088 goto invalid_kind; 11089 } 11090 11091 c_parser_consume_token (parser); 11092 } 11093 else 11094 { 11095 invalid_kind: 11096 if (is_oacc) 11097 c_parser_error (parser, "expected %<none%>"); 11098 else 11099 c_parser_error (parser, "expected %<none%> or %<shared%>"); 11100 } 11101 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 11102 11103 if (kind == OMP_CLAUSE_DEFAULT_UNSPECIFIED) 11104 return list; 11105 11106 check_no_duplicate_clause (list, OMP_CLAUSE_DEFAULT, "default"); 11107 c = build_omp_clause (loc, OMP_CLAUSE_DEFAULT); 11108 OMP_CLAUSE_CHAIN (c) = list; 11109 OMP_CLAUSE_DEFAULT_KIND (c) = kind; 11110 11111 return c; 11112 } 11113 11114 /* OpenMP 2.5: 11115 firstprivate ( variable-list ) */ 11116 11117 static tree 11118 c_parser_omp_clause_firstprivate (c_parser *parser, tree list) 11119 { 11120 return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_FIRSTPRIVATE, list); 11121 } 11122 11123 /* OpenMP 3.1: 11124 final ( expression ) */ 11125 11126 static tree 11127 c_parser_omp_clause_final (c_parser *parser, tree list) 11128 { 11129 location_t loc = c_parser_peek_token (parser)->location; 11130 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)) 11131 { 11132 tree t = c_parser_paren_condition (parser); 11133 tree c; 11134 11135 check_no_duplicate_clause (list, OMP_CLAUSE_FINAL, "final"); 11136 11137 c = build_omp_clause (loc, OMP_CLAUSE_FINAL); 11138 OMP_CLAUSE_FINAL_EXPR (c) = t; 11139 OMP_CLAUSE_CHAIN (c) = list; 11140 list = c; 11141 } 11142 else 11143 c_parser_error (parser, "expected %<(%>"); 11144 11145 return list; 11146 } 11147 11148 /* OpenACC, OpenMP 2.5: 11149 if ( expression ) 11150 11151 OpenMP 4.5: 11152 if ( directive-name-modifier : expression ) 11153 11154 directive-name-modifier: 11155 parallel | task | taskloop | target data | target | target update 11156 | target enter data | target exit data */ 11157 11158 static tree 11159 c_parser_omp_clause_if (c_parser *parser, tree list, bool is_omp) 11160 { 11161 location_t location = c_parser_peek_token (parser)->location; 11162 enum tree_code if_modifier = ERROR_MARK; 11163 11164 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 11165 return list; 11166 11167 if (is_omp && c_parser_next_token_is (parser, CPP_NAME)) 11168 { 11169 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value); 11170 int n = 2; 11171 if (strcmp (p, "parallel") == 0) 11172 if_modifier = OMP_PARALLEL; 11173 else if (strcmp (p, "task") == 0) 11174 if_modifier = OMP_TASK; 11175 else if (strcmp (p, "taskloop") == 0) 11176 if_modifier = OMP_TASKLOOP; 11177 else if (strcmp (p, "target") == 0) 11178 { 11179 if_modifier = OMP_TARGET; 11180 if (c_parser_peek_2nd_token (parser)->type == CPP_NAME) 11181 { 11182 p = IDENTIFIER_POINTER (c_parser_peek_2nd_token (parser)->value); 11183 if (strcmp ("data", p) == 0) 11184 if_modifier = OMP_TARGET_DATA; 11185 else if (strcmp ("update", p) == 0) 11186 if_modifier = OMP_TARGET_UPDATE; 11187 else if (strcmp ("enter", p) == 0) 11188 if_modifier = OMP_TARGET_ENTER_DATA; 11189 else if (strcmp ("exit", p) == 0) 11190 if_modifier = OMP_TARGET_EXIT_DATA; 11191 if (if_modifier != OMP_TARGET) 11192 { 11193 n = 3; 11194 c_parser_consume_token (parser); 11195 } 11196 else 11197 { 11198 location_t loc = c_parser_peek_2nd_token (parser)->location; 11199 error_at (loc, "expected %<data%>, %<update%>, %<enter%> " 11200 "or %<exit%>"); 11201 if_modifier = ERROR_MARK; 11202 } 11203 if (if_modifier == OMP_TARGET_ENTER_DATA 11204 || if_modifier == OMP_TARGET_EXIT_DATA) 11205 { 11206 if (c_parser_peek_2nd_token (parser)->type == CPP_NAME) 11207 { 11208 p = IDENTIFIER_POINTER 11209 (c_parser_peek_2nd_token (parser)->value); 11210 if (strcmp ("data", p) == 0) 11211 n = 4; 11212 } 11213 if (n == 4) 11214 c_parser_consume_token (parser); 11215 else 11216 { 11217 location_t loc 11218 = c_parser_peek_2nd_token (parser)->location; 11219 error_at (loc, "expected %<data%>"); 11220 if_modifier = ERROR_MARK; 11221 } 11222 } 11223 } 11224 } 11225 if (if_modifier != ERROR_MARK) 11226 { 11227 if (c_parser_peek_2nd_token (parser)->type == CPP_COLON) 11228 { 11229 c_parser_consume_token (parser); 11230 c_parser_consume_token (parser); 11231 } 11232 else 11233 { 11234 if (n > 2) 11235 { 11236 location_t loc = c_parser_peek_2nd_token (parser)->location; 11237 error_at (loc, "expected %<:%>"); 11238 } 11239 if_modifier = ERROR_MARK; 11240 } 11241 } 11242 } 11243 11244 tree t = c_parser_condition (parser), c; 11245 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 11246 11247 for (c = list; c ; c = OMP_CLAUSE_CHAIN (c)) 11248 if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_IF) 11249 { 11250 if (if_modifier != ERROR_MARK 11251 && OMP_CLAUSE_IF_MODIFIER (c) == if_modifier) 11252 { 11253 const char *p = NULL; 11254 switch (if_modifier) 11255 { 11256 case OMP_PARALLEL: p = "parallel"; break; 11257 case OMP_TASK: p = "task"; break; 11258 case OMP_TASKLOOP: p = "taskloop"; break; 11259 case OMP_TARGET_DATA: p = "target data"; break; 11260 case OMP_TARGET: p = "target"; break; 11261 case OMP_TARGET_UPDATE: p = "target update"; break; 11262 case OMP_TARGET_ENTER_DATA: p = "enter data"; break; 11263 case OMP_TARGET_EXIT_DATA: p = "exit data"; break; 11264 default: gcc_unreachable (); 11265 } 11266 error_at (location, "too many %<if%> clauses with %qs modifier", 11267 p); 11268 return list; 11269 } 11270 else if (OMP_CLAUSE_IF_MODIFIER (c) == if_modifier) 11271 { 11272 if (!is_omp) 11273 error_at (location, "too many %<if%> clauses"); 11274 else 11275 error_at (location, "too many %<if%> clauses without modifier"); 11276 return list; 11277 } 11278 else if (if_modifier == ERROR_MARK 11279 || OMP_CLAUSE_IF_MODIFIER (c) == ERROR_MARK) 11280 { 11281 error_at (location, "if any %<if%> clause has modifier, then all " 11282 "%<if%> clauses have to use modifier"); 11283 return list; 11284 } 11285 } 11286 11287 c = build_omp_clause (location, OMP_CLAUSE_IF); 11288 OMP_CLAUSE_IF_MODIFIER (c) = if_modifier; 11289 OMP_CLAUSE_IF_EXPR (c) = t; 11290 OMP_CLAUSE_CHAIN (c) = list; 11291 return c; 11292 } 11293 11294 /* OpenMP 2.5: 11295 lastprivate ( variable-list ) */ 11296 11297 static tree 11298 c_parser_omp_clause_lastprivate (c_parser *parser, tree list) 11299 { 11300 return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_LASTPRIVATE, list); 11301 } 11302 11303 /* OpenMP 3.1: 11304 mergeable */ 11305 11306 static tree 11307 c_parser_omp_clause_mergeable (c_parser *parser ATTRIBUTE_UNUSED, tree list) 11308 { 11309 tree c; 11310 11311 /* FIXME: Should we allow duplicates? */ 11312 check_no_duplicate_clause (list, OMP_CLAUSE_MERGEABLE, "mergeable"); 11313 11314 c = build_omp_clause (c_parser_peek_token (parser)->location, 11315 OMP_CLAUSE_MERGEABLE); 11316 OMP_CLAUSE_CHAIN (c) = list; 11317 11318 return c; 11319 } 11320 11321 /* OpenMP 2.5: 11322 nowait */ 11323 11324 static tree 11325 c_parser_omp_clause_nowait (c_parser *parser ATTRIBUTE_UNUSED, tree list) 11326 { 11327 tree c; 11328 location_t loc = c_parser_peek_token (parser)->location; 11329 11330 check_no_duplicate_clause (list, OMP_CLAUSE_NOWAIT, "nowait"); 11331 11332 c = build_omp_clause (loc, OMP_CLAUSE_NOWAIT); 11333 OMP_CLAUSE_CHAIN (c) = list; 11334 return c; 11335 } 11336 11337 /* OpenACC: 11338 num_gangs ( expression ) */ 11339 11340 static tree 11341 c_parser_omp_clause_num_gangs (c_parser *parser, tree list) 11342 { 11343 location_t num_gangs_loc = c_parser_peek_token (parser)->location; 11344 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 11345 { 11346 location_t expr_loc = c_parser_peek_token (parser)->location; 11347 c_expr expr = c_parser_expression (parser); 11348 expr = convert_lvalue_to_rvalue (expr_loc, expr, false, true); 11349 tree c, t = expr.value; 11350 t = c_fully_fold (t, false, NULL); 11351 11352 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 11353 11354 if (!INTEGRAL_TYPE_P (TREE_TYPE (t))) 11355 { 11356 c_parser_error (parser, "expected integer expression"); 11357 return list; 11358 } 11359 11360 /* Attempt to statically determine when the number isn't positive. */ 11361 c = fold_build2_loc (expr_loc, LE_EXPR, boolean_type_node, t, 11362 build_int_cst (TREE_TYPE (t), 0)); 11363 protected_set_expr_location (c, expr_loc); 11364 if (c == boolean_true_node) 11365 { 11366 warning_at (expr_loc, 0, 11367 "%<num_gangs%> value must be positive"); 11368 t = integer_one_node; 11369 } 11370 11371 check_no_duplicate_clause (list, OMP_CLAUSE_NUM_GANGS, "num_gangs"); 11372 11373 c = build_omp_clause (num_gangs_loc, OMP_CLAUSE_NUM_GANGS); 11374 OMP_CLAUSE_NUM_GANGS_EXPR (c) = t; 11375 OMP_CLAUSE_CHAIN (c) = list; 11376 list = c; 11377 } 11378 11379 return list; 11380 } 11381 11382 /* OpenMP 2.5: 11383 num_threads ( expression ) */ 11384 11385 static tree 11386 c_parser_omp_clause_num_threads (c_parser *parser, tree list) 11387 { 11388 location_t num_threads_loc = c_parser_peek_token (parser)->location; 11389 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 11390 { 11391 location_t expr_loc = c_parser_peek_token (parser)->location; 11392 c_expr expr = c_parser_expression (parser); 11393 expr = convert_lvalue_to_rvalue (expr_loc, expr, false, true); 11394 tree c, t = expr.value; 11395 t = c_fully_fold (t, false, NULL); 11396 11397 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 11398 11399 if (!INTEGRAL_TYPE_P (TREE_TYPE (t))) 11400 { 11401 c_parser_error (parser, "expected integer expression"); 11402 return list; 11403 } 11404 11405 /* Attempt to statically determine when the number isn't positive. */ 11406 c = fold_build2_loc (expr_loc, LE_EXPR, boolean_type_node, t, 11407 build_int_cst (TREE_TYPE (t), 0)); 11408 protected_set_expr_location (c, expr_loc); 11409 if (c == boolean_true_node) 11410 { 11411 warning_at (expr_loc, 0, 11412 "%<num_threads%> value must be positive"); 11413 t = integer_one_node; 11414 } 11415 11416 check_no_duplicate_clause (list, OMP_CLAUSE_NUM_THREADS, "num_threads"); 11417 11418 c = build_omp_clause (num_threads_loc, OMP_CLAUSE_NUM_THREADS); 11419 OMP_CLAUSE_NUM_THREADS_EXPR (c) = t; 11420 OMP_CLAUSE_CHAIN (c) = list; 11421 list = c; 11422 } 11423 11424 return list; 11425 } 11426 11427 /* OpenMP 4.5: 11428 num_tasks ( expression ) */ 11429 11430 static tree 11431 c_parser_omp_clause_num_tasks (c_parser *parser, tree list) 11432 { 11433 location_t num_tasks_loc = c_parser_peek_token (parser)->location; 11434 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 11435 { 11436 location_t expr_loc = c_parser_peek_token (parser)->location; 11437 c_expr expr = c_parser_expression (parser); 11438 expr = convert_lvalue_to_rvalue (expr_loc, expr, false, true); 11439 tree c, t = expr.value; 11440 t = c_fully_fold (t, false, NULL); 11441 11442 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 11443 11444 if (!INTEGRAL_TYPE_P (TREE_TYPE (t))) 11445 { 11446 c_parser_error (parser, "expected integer expression"); 11447 return list; 11448 } 11449 11450 /* Attempt to statically determine when the number isn't positive. */ 11451 c = fold_build2_loc (expr_loc, LE_EXPR, boolean_type_node, t, 11452 build_int_cst (TREE_TYPE (t), 0)); 11453 if (CAN_HAVE_LOCATION_P (c)) 11454 SET_EXPR_LOCATION (c, expr_loc); 11455 if (c == boolean_true_node) 11456 { 11457 warning_at (expr_loc, 0, "%<num_tasks%> value must be positive"); 11458 t = integer_one_node; 11459 } 11460 11461 check_no_duplicate_clause (list, OMP_CLAUSE_NUM_TASKS, "num_tasks"); 11462 11463 c = build_omp_clause (num_tasks_loc, OMP_CLAUSE_NUM_TASKS); 11464 OMP_CLAUSE_NUM_TASKS_EXPR (c) = t; 11465 OMP_CLAUSE_CHAIN (c) = list; 11466 list = c; 11467 } 11468 11469 return list; 11470 } 11471 11472 /* OpenMP 4.5: 11473 grainsize ( expression ) */ 11474 11475 static tree 11476 c_parser_omp_clause_grainsize (c_parser *parser, tree list) 11477 { 11478 location_t grainsize_loc = c_parser_peek_token (parser)->location; 11479 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 11480 { 11481 location_t expr_loc = c_parser_peek_token (parser)->location; 11482 c_expr expr = c_parser_expression (parser); 11483 expr = convert_lvalue_to_rvalue (expr_loc, expr, false, true); 11484 tree c, t = expr.value; 11485 t = c_fully_fold (t, false, NULL); 11486 11487 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 11488 11489 if (!INTEGRAL_TYPE_P (TREE_TYPE (t))) 11490 { 11491 c_parser_error (parser, "expected integer expression"); 11492 return list; 11493 } 11494 11495 /* Attempt to statically determine when the number isn't positive. */ 11496 c = fold_build2_loc (expr_loc, LE_EXPR, boolean_type_node, t, 11497 build_int_cst (TREE_TYPE (t), 0)); 11498 if (CAN_HAVE_LOCATION_P (c)) 11499 SET_EXPR_LOCATION (c, expr_loc); 11500 if (c == boolean_true_node) 11501 { 11502 warning_at (expr_loc, 0, "%<grainsize%> value must be positive"); 11503 t = integer_one_node; 11504 } 11505 11506 check_no_duplicate_clause (list, OMP_CLAUSE_GRAINSIZE, "grainsize"); 11507 11508 c = build_omp_clause (grainsize_loc, OMP_CLAUSE_GRAINSIZE); 11509 OMP_CLAUSE_GRAINSIZE_EXPR (c) = t; 11510 OMP_CLAUSE_CHAIN (c) = list; 11511 list = c; 11512 } 11513 11514 return list; 11515 } 11516 11517 /* OpenMP 4.5: 11518 priority ( expression ) */ 11519 11520 static tree 11521 c_parser_omp_clause_priority (c_parser *parser, tree list) 11522 { 11523 location_t priority_loc = c_parser_peek_token (parser)->location; 11524 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 11525 { 11526 location_t expr_loc = c_parser_peek_token (parser)->location; 11527 c_expr expr = c_parser_expression (parser); 11528 expr = convert_lvalue_to_rvalue (expr_loc, expr, false, true); 11529 tree c, t = expr.value; 11530 t = c_fully_fold (t, false, NULL); 11531 11532 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 11533 11534 if (!INTEGRAL_TYPE_P (TREE_TYPE (t))) 11535 { 11536 c_parser_error (parser, "expected integer expression"); 11537 return list; 11538 } 11539 11540 /* Attempt to statically determine when the number isn't 11541 non-negative. */ 11542 c = fold_build2_loc (expr_loc, LT_EXPR, boolean_type_node, t, 11543 build_int_cst (TREE_TYPE (t), 0)); 11544 if (CAN_HAVE_LOCATION_P (c)) 11545 SET_EXPR_LOCATION (c, expr_loc); 11546 if (c == boolean_true_node) 11547 { 11548 warning_at (expr_loc, 0, "%<priority%> value must be non-negative"); 11549 t = integer_one_node; 11550 } 11551 11552 check_no_duplicate_clause (list, OMP_CLAUSE_PRIORITY, "priority"); 11553 11554 c = build_omp_clause (priority_loc, OMP_CLAUSE_PRIORITY); 11555 OMP_CLAUSE_PRIORITY_EXPR (c) = t; 11556 OMP_CLAUSE_CHAIN (c) = list; 11557 list = c; 11558 } 11559 11560 return list; 11561 } 11562 11563 /* OpenMP 4.5: 11564 hint ( expression ) */ 11565 11566 static tree 11567 c_parser_omp_clause_hint (c_parser *parser, tree list) 11568 { 11569 location_t hint_loc = c_parser_peek_token (parser)->location; 11570 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 11571 { 11572 location_t expr_loc = c_parser_peek_token (parser)->location; 11573 c_expr expr = c_parser_expression (parser); 11574 expr = convert_lvalue_to_rvalue (expr_loc, expr, false, true); 11575 tree c, t = expr.value; 11576 t = c_fully_fold (t, false, NULL); 11577 11578 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 11579 11580 if (!INTEGRAL_TYPE_P (TREE_TYPE (t))) 11581 { 11582 c_parser_error (parser, "expected integer expression"); 11583 return list; 11584 } 11585 11586 check_no_duplicate_clause (list, OMP_CLAUSE_HINT, "hint"); 11587 11588 c = build_omp_clause (hint_loc, OMP_CLAUSE_HINT); 11589 OMP_CLAUSE_HINT_EXPR (c) = t; 11590 OMP_CLAUSE_CHAIN (c) = list; 11591 list = c; 11592 } 11593 11594 return list; 11595 } 11596 11597 /* OpenMP 4.5: 11598 defaultmap ( tofrom : scalar ) */ 11599 11600 static tree 11601 c_parser_omp_clause_defaultmap (c_parser *parser, tree list) 11602 { 11603 location_t loc = c_parser_peek_token (parser)->location; 11604 tree c; 11605 const char *p; 11606 11607 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 11608 return list; 11609 if (!c_parser_next_token_is (parser, CPP_NAME)) 11610 { 11611 c_parser_error (parser, "expected %<tofrom%>"); 11612 goto out_err; 11613 } 11614 p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value); 11615 if (strcmp (p, "tofrom") != 0) 11616 { 11617 c_parser_error (parser, "expected %<tofrom%>"); 11618 goto out_err; 11619 } 11620 c_parser_consume_token (parser); 11621 if (!c_parser_require (parser, CPP_COLON, "expected %<:%>")) 11622 goto out_err; 11623 if (!c_parser_next_token_is (parser, CPP_NAME)) 11624 { 11625 c_parser_error (parser, "expected %<scalar%>"); 11626 goto out_err; 11627 } 11628 p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value); 11629 if (strcmp (p, "scalar") != 0) 11630 { 11631 c_parser_error (parser, "expected %<scalar%>"); 11632 goto out_err; 11633 } 11634 c_parser_consume_token (parser); 11635 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 11636 check_no_duplicate_clause (list, OMP_CLAUSE_DEFAULTMAP, "defaultmap"); 11637 c = build_omp_clause (loc, OMP_CLAUSE_DEFAULTMAP); 11638 OMP_CLAUSE_CHAIN (c) = list; 11639 return c; 11640 11641 out_err: 11642 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 11643 return list; 11644 } 11645 11646 /* OpenACC 2.0: 11647 use_device ( variable-list ) 11648 11649 OpenMP 4.5: 11650 use_device_ptr ( variable-list ) */ 11651 11652 static tree 11653 c_parser_omp_clause_use_device_ptr (c_parser *parser, tree list) 11654 { 11655 return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_USE_DEVICE_PTR, 11656 list); 11657 } 11658 11659 /* OpenMP 4.5: 11660 is_device_ptr ( variable-list ) */ 11661 11662 static tree 11663 c_parser_omp_clause_is_device_ptr (c_parser *parser, tree list) 11664 { 11665 return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_IS_DEVICE_PTR, list); 11666 } 11667 11668 /* OpenACC: 11669 num_workers ( expression ) */ 11670 11671 static tree 11672 c_parser_omp_clause_num_workers (c_parser *parser, tree list) 11673 { 11674 location_t num_workers_loc = c_parser_peek_token (parser)->location; 11675 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 11676 { 11677 location_t expr_loc = c_parser_peek_token (parser)->location; 11678 c_expr expr = c_parser_expression (parser); 11679 expr = convert_lvalue_to_rvalue (expr_loc, expr, false, true); 11680 tree c, t = expr.value; 11681 t = c_fully_fold (t, false, NULL); 11682 11683 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 11684 11685 if (!INTEGRAL_TYPE_P (TREE_TYPE (t))) 11686 { 11687 c_parser_error (parser, "expected integer expression"); 11688 return list; 11689 } 11690 11691 /* Attempt to statically determine when the number isn't positive. */ 11692 c = fold_build2_loc (expr_loc, LE_EXPR, boolean_type_node, t, 11693 build_int_cst (TREE_TYPE (t), 0)); 11694 protected_set_expr_location (c, expr_loc); 11695 if (c == boolean_true_node) 11696 { 11697 warning_at (expr_loc, 0, 11698 "%<num_workers%> value must be positive"); 11699 t = integer_one_node; 11700 } 11701 11702 check_no_duplicate_clause (list, OMP_CLAUSE_NUM_WORKERS, "num_workers"); 11703 11704 c = build_omp_clause (num_workers_loc, OMP_CLAUSE_NUM_WORKERS); 11705 OMP_CLAUSE_NUM_WORKERS_EXPR (c) = t; 11706 OMP_CLAUSE_CHAIN (c) = list; 11707 list = c; 11708 } 11709 11710 return list; 11711 } 11712 11713 /* OpenACC: 11714 11715 gang [( gang-arg-list )] 11716 worker [( [num:] int-expr )] 11717 vector [( [length:] int-expr )] 11718 11719 where gang-arg is one of: 11720 11721 [num:] int-expr 11722 static: size-expr 11723 11724 and size-expr may be: 11725 11726 * 11727 int-expr 11728 */ 11729 11730 static tree 11731 c_parser_oacc_shape_clause (c_parser *parser, omp_clause_code kind, 11732 const char *str, tree list) 11733 { 11734 const char *id = "num"; 11735 tree ops[2] = { NULL_TREE, NULL_TREE }, c; 11736 location_t loc = c_parser_peek_token (parser)->location; 11737 11738 if (kind == OMP_CLAUSE_VECTOR) 11739 id = "length"; 11740 11741 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)) 11742 { 11743 c_parser_consume_token (parser); 11744 11745 do 11746 { 11747 c_token *next = c_parser_peek_token (parser); 11748 int idx = 0; 11749 11750 /* Gang static argument. */ 11751 if (kind == OMP_CLAUSE_GANG 11752 && c_parser_next_token_is_keyword (parser, RID_STATIC)) 11753 { 11754 c_parser_consume_token (parser); 11755 11756 if (!c_parser_require (parser, CPP_COLON, "expected %<:%>")) 11757 goto cleanup_error; 11758 11759 idx = 1; 11760 if (ops[idx] != NULL_TREE) 11761 { 11762 c_parser_error (parser, "too many %<static%> arguments"); 11763 goto cleanup_error; 11764 } 11765 11766 /* Check for the '*' argument. */ 11767 if (c_parser_next_token_is (parser, CPP_MULT) 11768 && (c_parser_peek_2nd_token (parser)->type == CPP_COMMA 11769 || c_parser_peek_2nd_token (parser)->type 11770 == CPP_CLOSE_PAREN)) 11771 { 11772 c_parser_consume_token (parser); 11773 ops[idx] = integer_minus_one_node; 11774 11775 if (c_parser_next_token_is (parser, CPP_COMMA)) 11776 { 11777 c_parser_consume_token (parser); 11778 continue; 11779 } 11780 else 11781 break; 11782 } 11783 } 11784 /* Worker num: argument and vector length: arguments. */ 11785 else if (c_parser_next_token_is (parser, CPP_NAME) 11786 && strcmp (id, IDENTIFIER_POINTER (next->value)) == 0 11787 && c_parser_peek_2nd_token (parser)->type == CPP_COLON) 11788 { 11789 c_parser_consume_token (parser); /* id */ 11790 c_parser_consume_token (parser); /* ':' */ 11791 } 11792 11793 /* Now collect the actual argument. */ 11794 if (ops[idx] != NULL_TREE) 11795 { 11796 c_parser_error (parser, "unexpected argument"); 11797 goto cleanup_error; 11798 } 11799 11800 location_t expr_loc = c_parser_peek_token (parser)->location; 11801 c_expr cexpr = c_parser_expr_no_commas (parser, NULL); 11802 cexpr = convert_lvalue_to_rvalue (expr_loc, cexpr, false, true); 11803 tree expr = cexpr.value; 11804 if (expr == error_mark_node) 11805 goto cleanup_error; 11806 11807 expr = c_fully_fold (expr, false, NULL); 11808 11809 /* Attempt to statically determine when the number isn't a 11810 positive integer. */ 11811 11812 if (!INTEGRAL_TYPE_P (TREE_TYPE (expr))) 11813 { 11814 c_parser_error (parser, "expected integer expression"); 11815 return list; 11816 } 11817 11818 tree c = fold_build2_loc (expr_loc, LE_EXPR, boolean_type_node, expr, 11819 build_int_cst (TREE_TYPE (expr), 0)); 11820 if (c == boolean_true_node) 11821 { 11822 warning_at (loc, 0, 11823 "%qs value must be positive", str); 11824 expr = integer_one_node; 11825 } 11826 11827 ops[idx] = expr; 11828 11829 if (kind == OMP_CLAUSE_GANG 11830 && c_parser_next_token_is (parser, CPP_COMMA)) 11831 { 11832 c_parser_consume_token (parser); 11833 continue; 11834 } 11835 break; 11836 } 11837 while (1); 11838 11839 if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>")) 11840 goto cleanup_error; 11841 } 11842 11843 check_no_duplicate_clause (list, kind, str); 11844 11845 c = build_omp_clause (loc, kind); 11846 11847 if (ops[1]) 11848 OMP_CLAUSE_OPERAND (c, 1) = ops[1]; 11849 11850 OMP_CLAUSE_OPERAND (c, 0) = ops[0]; 11851 OMP_CLAUSE_CHAIN (c) = list; 11852 11853 return c; 11854 11855 cleanup_error: 11856 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 0); 11857 return list; 11858 } 11859 11860 /* OpenACC: 11861 auto 11862 independent 11863 nohost 11864 seq */ 11865 11866 static tree 11867 c_parser_oacc_simple_clause (c_parser *parser, enum omp_clause_code code, 11868 tree list) 11869 { 11870 check_no_duplicate_clause (list, code, omp_clause_code_name[code]); 11871 11872 tree c = build_omp_clause (c_parser_peek_token (parser)->location, code); 11873 OMP_CLAUSE_CHAIN (c) = list; 11874 11875 return c; 11876 } 11877 11878 /* OpenACC: 11879 async [( int-expr )] */ 11880 11881 static tree 11882 c_parser_oacc_clause_async (c_parser *parser, tree list) 11883 { 11884 tree c, t; 11885 location_t loc = c_parser_peek_token (parser)->location; 11886 11887 t = build_int_cst (integer_type_node, GOMP_ASYNC_NOVAL); 11888 11889 if (c_parser_peek_token (parser)->type == CPP_OPEN_PAREN) 11890 { 11891 c_parser_consume_token (parser); 11892 11893 t = c_parser_expression (parser).value; 11894 if (!INTEGRAL_TYPE_P (TREE_TYPE (t))) 11895 c_parser_error (parser, "expected integer expression"); 11896 else if (t == error_mark_node 11897 || !c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>")) 11898 return list; 11899 } 11900 else 11901 t = c_fully_fold (t, false, NULL); 11902 11903 check_no_duplicate_clause (list, OMP_CLAUSE_ASYNC, "async"); 11904 11905 c = build_omp_clause (loc, OMP_CLAUSE_ASYNC); 11906 OMP_CLAUSE_ASYNC_EXPR (c) = t; 11907 OMP_CLAUSE_CHAIN (c) = list; 11908 list = c; 11909 11910 return list; 11911 } 11912 11913 /* OpenACC 2.0: 11914 tile ( size-expr-list ) */ 11915 11916 static tree 11917 c_parser_oacc_clause_tile (c_parser *parser, tree list) 11918 { 11919 tree c, expr = error_mark_node; 11920 location_t loc; 11921 tree tile = NULL_TREE; 11922 11923 check_no_duplicate_clause (list, OMP_CLAUSE_TILE, "tile"); 11924 check_no_duplicate_clause (list, OMP_CLAUSE_COLLAPSE, "collapse"); 11925 11926 loc = c_parser_peek_token (parser)->location; 11927 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 11928 return list; 11929 11930 do 11931 { 11932 if (tile && !c_parser_require (parser, CPP_COMMA, "expected %<,%>")) 11933 return list; 11934 11935 if (c_parser_next_token_is (parser, CPP_MULT) 11936 && (c_parser_peek_2nd_token (parser)->type == CPP_COMMA 11937 || c_parser_peek_2nd_token (parser)->type == CPP_CLOSE_PAREN)) 11938 { 11939 c_parser_consume_token (parser); 11940 expr = integer_zero_node; 11941 } 11942 else 11943 { 11944 location_t expr_loc = c_parser_peek_token (parser)->location; 11945 c_expr cexpr = c_parser_expr_no_commas (parser, NULL); 11946 cexpr = convert_lvalue_to_rvalue (expr_loc, cexpr, false, true); 11947 expr = cexpr.value; 11948 11949 if (expr == error_mark_node) 11950 { 11951 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 11952 "expected %<)%>"); 11953 return list; 11954 } 11955 11956 expr = c_fully_fold (expr, false, NULL); 11957 11958 if (!INTEGRAL_TYPE_P (TREE_TYPE (expr)) 11959 || !tree_fits_shwi_p (expr) 11960 || tree_to_shwi (expr) <= 0) 11961 { 11962 error_at (expr_loc, "%<tile%> argument needs positive" 11963 " integral constant"); 11964 expr = integer_zero_node; 11965 } 11966 } 11967 11968 tile = tree_cons (NULL_TREE, expr, tile); 11969 } 11970 while (c_parser_next_token_is_not (parser, CPP_CLOSE_PAREN)); 11971 11972 /* Consume the trailing ')'. */ 11973 c_parser_consume_token (parser); 11974 11975 c = build_omp_clause (loc, OMP_CLAUSE_TILE); 11976 tile = nreverse (tile); 11977 OMP_CLAUSE_TILE_LIST (c) = tile; 11978 OMP_CLAUSE_CHAIN (c) = list; 11979 return c; 11980 } 11981 11982 /* OpenACC: 11983 wait ( int-expr-list ) */ 11984 11985 static tree 11986 c_parser_oacc_clause_wait (c_parser *parser, tree list) 11987 { 11988 location_t clause_loc = c_parser_peek_token (parser)->location; 11989 11990 if (c_parser_peek_token (parser)->type == CPP_OPEN_PAREN) 11991 list = c_parser_oacc_wait_list (parser, clause_loc, list); 11992 11993 return list; 11994 } 11995 11996 /* OpenMP 2.5: 11997 ordered 11998 11999 OpenMP 4.5: 12000 ordered ( constant-expression ) */ 12001 12002 static tree 12003 c_parser_omp_clause_ordered (c_parser *parser, tree list) 12004 { 12005 check_no_duplicate_clause (list, OMP_CLAUSE_ORDERED, "ordered"); 12006 12007 tree c, num = NULL_TREE; 12008 HOST_WIDE_INT n; 12009 location_t loc = c_parser_peek_token (parser)->location; 12010 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)) 12011 { 12012 c_parser_consume_token (parser); 12013 num = c_parser_expr_no_commas (parser, NULL).value; 12014 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 12015 } 12016 if (num == error_mark_node) 12017 return list; 12018 if (num) 12019 { 12020 mark_exp_read (num); 12021 num = c_fully_fold (num, false, NULL); 12022 if (!INTEGRAL_TYPE_P (TREE_TYPE (num)) 12023 || !tree_fits_shwi_p (num) 12024 || (n = tree_to_shwi (num)) <= 0 12025 || (int) n != n) 12026 { 12027 error_at (loc, "ordered argument needs positive " 12028 "constant integer expression"); 12029 return list; 12030 } 12031 } 12032 c = build_omp_clause (loc, OMP_CLAUSE_ORDERED); 12033 OMP_CLAUSE_ORDERED_EXPR (c) = num; 12034 OMP_CLAUSE_CHAIN (c) = list; 12035 return c; 12036 } 12037 12038 /* OpenMP 2.5: 12039 private ( variable-list ) */ 12040 12041 static tree 12042 c_parser_omp_clause_private (c_parser *parser, tree list) 12043 { 12044 return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_PRIVATE, list); 12045 } 12046 12047 /* OpenMP 2.5: 12048 reduction ( reduction-operator : variable-list ) 12049 12050 reduction-operator: 12051 One of: + * - & ^ | && || 12052 12053 OpenMP 3.1: 12054 12055 reduction-operator: 12056 One of: + * - & ^ | && || max min 12057 12058 OpenMP 4.0: 12059 12060 reduction-operator: 12061 One of: + * - & ^ | && || 12062 identifier */ 12063 12064 static tree 12065 c_parser_omp_clause_reduction (c_parser *parser, tree list) 12066 { 12067 location_t clause_loc = c_parser_peek_token (parser)->location; 12068 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 12069 { 12070 enum tree_code code = ERROR_MARK; 12071 tree reduc_id = NULL_TREE; 12072 12073 switch (c_parser_peek_token (parser)->type) 12074 { 12075 case CPP_PLUS: 12076 code = PLUS_EXPR; 12077 break; 12078 case CPP_MULT: 12079 code = MULT_EXPR; 12080 break; 12081 case CPP_MINUS: 12082 code = MINUS_EXPR; 12083 break; 12084 case CPP_AND: 12085 code = BIT_AND_EXPR; 12086 break; 12087 case CPP_XOR: 12088 code = BIT_XOR_EXPR; 12089 break; 12090 case CPP_OR: 12091 code = BIT_IOR_EXPR; 12092 break; 12093 case CPP_AND_AND: 12094 code = TRUTH_ANDIF_EXPR; 12095 break; 12096 case CPP_OR_OR: 12097 code = TRUTH_ORIF_EXPR; 12098 break; 12099 case CPP_NAME: 12100 { 12101 const char *p 12102 = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value); 12103 if (strcmp (p, "min") == 0) 12104 { 12105 code = MIN_EXPR; 12106 break; 12107 } 12108 if (strcmp (p, "max") == 0) 12109 { 12110 code = MAX_EXPR; 12111 break; 12112 } 12113 reduc_id = c_parser_peek_token (parser)->value; 12114 break; 12115 } 12116 default: 12117 c_parser_error (parser, 12118 "expected %<+%>, %<*%>, %<-%>, %<&%>, " 12119 "%<^%>, %<|%>, %<&&%>, %<||%> or identifier"); 12120 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 0); 12121 return list; 12122 } 12123 c_parser_consume_token (parser); 12124 reduc_id = c_omp_reduction_id (code, reduc_id); 12125 if (c_parser_require (parser, CPP_COLON, "expected %<:%>")) 12126 { 12127 tree nl, c; 12128 12129 nl = c_parser_omp_variable_list (parser, clause_loc, 12130 OMP_CLAUSE_REDUCTION, list); 12131 for (c = nl; c != list; c = OMP_CLAUSE_CHAIN (c)) 12132 { 12133 tree d = OMP_CLAUSE_DECL (c), type; 12134 if (TREE_CODE (d) != TREE_LIST) 12135 type = TREE_TYPE (d); 12136 else 12137 { 12138 int cnt = 0; 12139 tree t; 12140 for (t = d; TREE_CODE (t) == TREE_LIST; t = TREE_CHAIN (t)) 12141 cnt++; 12142 type = TREE_TYPE (t); 12143 while (cnt > 0) 12144 { 12145 if (TREE_CODE (type) != POINTER_TYPE 12146 && TREE_CODE (type) != ARRAY_TYPE) 12147 break; 12148 type = TREE_TYPE (type); 12149 cnt--; 12150 } 12151 } 12152 while (TREE_CODE (type) == ARRAY_TYPE) 12153 type = TREE_TYPE (type); 12154 OMP_CLAUSE_REDUCTION_CODE (c) = code; 12155 if (code == ERROR_MARK 12156 || !(INTEGRAL_TYPE_P (type) 12157 || TREE_CODE (type) == REAL_TYPE 12158 || TREE_CODE (type) == COMPLEX_TYPE)) 12159 OMP_CLAUSE_REDUCTION_PLACEHOLDER (c) 12160 = c_omp_reduction_lookup (reduc_id, 12161 TYPE_MAIN_VARIANT (type)); 12162 } 12163 12164 list = nl; 12165 } 12166 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 12167 } 12168 return list; 12169 } 12170 12171 /* OpenMP 2.5: 12172 schedule ( schedule-kind ) 12173 schedule ( schedule-kind , expression ) 12174 12175 schedule-kind: 12176 static | dynamic | guided | runtime | auto 12177 12178 OpenMP 4.5: 12179 schedule ( schedule-modifier : schedule-kind ) 12180 schedule ( schedule-modifier [ , schedule-modifier ] : schedule-kind , expression ) 12181 12182 schedule-modifier: 12183 simd 12184 monotonic 12185 nonmonotonic */ 12186 12187 static tree 12188 c_parser_omp_clause_schedule (c_parser *parser, tree list) 12189 { 12190 tree c, t; 12191 location_t loc = c_parser_peek_token (parser)->location; 12192 int modifiers = 0, nmodifiers = 0; 12193 12194 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 12195 return list; 12196 12197 c = build_omp_clause (loc, OMP_CLAUSE_SCHEDULE); 12198 12199 while (c_parser_next_token_is (parser, CPP_NAME)) 12200 { 12201 tree kind = c_parser_peek_token (parser)->value; 12202 const char *p = IDENTIFIER_POINTER (kind); 12203 if (strcmp ("simd", p) == 0) 12204 OMP_CLAUSE_SCHEDULE_SIMD (c) = 1; 12205 else if (strcmp ("monotonic", p) == 0) 12206 modifiers |= OMP_CLAUSE_SCHEDULE_MONOTONIC; 12207 else if (strcmp ("nonmonotonic", p) == 0) 12208 modifiers |= OMP_CLAUSE_SCHEDULE_NONMONOTONIC; 12209 else 12210 break; 12211 c_parser_consume_token (parser); 12212 if (nmodifiers++ == 0 12213 && c_parser_next_token_is (parser, CPP_COMMA)) 12214 c_parser_consume_token (parser); 12215 else 12216 { 12217 c_parser_require (parser, CPP_COLON, "expected %<:%>"); 12218 break; 12219 } 12220 } 12221 12222 if ((modifiers & (OMP_CLAUSE_SCHEDULE_MONOTONIC 12223 | OMP_CLAUSE_SCHEDULE_NONMONOTONIC)) 12224 == (OMP_CLAUSE_SCHEDULE_MONOTONIC 12225 | OMP_CLAUSE_SCHEDULE_NONMONOTONIC)) 12226 { 12227 error_at (loc, "both %<monotonic%> and %<nonmonotonic%> modifiers " 12228 "specified"); 12229 modifiers = 0; 12230 } 12231 12232 if (c_parser_next_token_is (parser, CPP_NAME)) 12233 { 12234 tree kind = c_parser_peek_token (parser)->value; 12235 const char *p = IDENTIFIER_POINTER (kind); 12236 12237 switch (p[0]) 12238 { 12239 case 'd': 12240 if (strcmp ("dynamic", p) != 0) 12241 goto invalid_kind; 12242 OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_DYNAMIC; 12243 break; 12244 12245 case 'g': 12246 if (strcmp ("guided", p) != 0) 12247 goto invalid_kind; 12248 OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_GUIDED; 12249 break; 12250 12251 case 'r': 12252 if (strcmp ("runtime", p) != 0) 12253 goto invalid_kind; 12254 OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_RUNTIME; 12255 break; 12256 12257 default: 12258 goto invalid_kind; 12259 } 12260 } 12261 else if (c_parser_next_token_is_keyword (parser, RID_STATIC)) 12262 OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_STATIC; 12263 else if (c_parser_next_token_is_keyword (parser, RID_AUTO)) 12264 OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_AUTO; 12265 else 12266 goto invalid_kind; 12267 12268 c_parser_consume_token (parser); 12269 if (c_parser_next_token_is (parser, CPP_COMMA)) 12270 { 12271 location_t here; 12272 c_parser_consume_token (parser); 12273 12274 here = c_parser_peek_token (parser)->location; 12275 c_expr expr = c_parser_expr_no_commas (parser, NULL); 12276 expr = convert_lvalue_to_rvalue (here, expr, false, true); 12277 t = expr.value; 12278 t = c_fully_fold (t, false, NULL); 12279 12280 if (OMP_CLAUSE_SCHEDULE_KIND (c) == OMP_CLAUSE_SCHEDULE_RUNTIME) 12281 error_at (here, "schedule %<runtime%> does not take " 12282 "a %<chunk_size%> parameter"); 12283 else if (OMP_CLAUSE_SCHEDULE_KIND (c) == OMP_CLAUSE_SCHEDULE_AUTO) 12284 error_at (here, 12285 "schedule %<auto%> does not take " 12286 "a %<chunk_size%> parameter"); 12287 else if (TREE_CODE (TREE_TYPE (t)) == INTEGER_TYPE) 12288 { 12289 /* Attempt to statically determine when the number isn't 12290 positive. */ 12291 tree s = fold_build2_loc (loc, LE_EXPR, boolean_type_node, t, 12292 build_int_cst (TREE_TYPE (t), 0)); 12293 protected_set_expr_location (s, loc); 12294 if (s == boolean_true_node) 12295 { 12296 warning_at (loc, 0, 12297 "chunk size value must be positive"); 12298 t = integer_one_node; 12299 } 12300 OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (c) = t; 12301 } 12302 else 12303 c_parser_error (parser, "expected integer expression"); 12304 12305 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 12306 } 12307 else 12308 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 12309 "expected %<,%> or %<)%>"); 12310 12311 OMP_CLAUSE_SCHEDULE_KIND (c) 12312 = (enum omp_clause_schedule_kind) 12313 (OMP_CLAUSE_SCHEDULE_KIND (c) | modifiers); 12314 12315 check_no_duplicate_clause (list, OMP_CLAUSE_SCHEDULE, "schedule"); 12316 OMP_CLAUSE_CHAIN (c) = list; 12317 return c; 12318 12319 invalid_kind: 12320 c_parser_error (parser, "invalid schedule kind"); 12321 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 0); 12322 return list; 12323 } 12324 12325 /* OpenMP 2.5: 12326 shared ( variable-list ) */ 12327 12328 static tree 12329 c_parser_omp_clause_shared (c_parser *parser, tree list) 12330 { 12331 return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_SHARED, list); 12332 } 12333 12334 /* OpenMP 3.0: 12335 untied */ 12336 12337 static tree 12338 c_parser_omp_clause_untied (c_parser *parser ATTRIBUTE_UNUSED, tree list) 12339 { 12340 tree c; 12341 12342 /* FIXME: Should we allow duplicates? */ 12343 check_no_duplicate_clause (list, OMP_CLAUSE_UNTIED, "untied"); 12344 12345 c = build_omp_clause (c_parser_peek_token (parser)->location, 12346 OMP_CLAUSE_UNTIED); 12347 OMP_CLAUSE_CHAIN (c) = list; 12348 12349 return c; 12350 } 12351 12352 /* OpenACC: 12353 vector_length ( expression ) */ 12354 12355 static tree 12356 c_parser_omp_clause_vector_length (c_parser *parser, tree list) 12357 { 12358 location_t vector_length_loc = c_parser_peek_token (parser)->location; 12359 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 12360 { 12361 location_t expr_loc = c_parser_peek_token (parser)->location; 12362 c_expr expr = c_parser_expression (parser); 12363 expr = convert_lvalue_to_rvalue (expr_loc, expr, false, true); 12364 tree c, t = expr.value; 12365 t = c_fully_fold (t, false, NULL); 12366 12367 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 12368 12369 if (!INTEGRAL_TYPE_P (TREE_TYPE (t))) 12370 { 12371 c_parser_error (parser, "expected integer expression"); 12372 return list; 12373 } 12374 12375 /* Attempt to statically determine when the number isn't positive. */ 12376 c = fold_build2_loc (expr_loc, LE_EXPR, boolean_type_node, t, 12377 build_int_cst (TREE_TYPE (t), 0)); 12378 protected_set_expr_location (c, expr_loc); 12379 if (c == boolean_true_node) 12380 { 12381 warning_at (expr_loc, 0, 12382 "%<vector_length%> value must be positive"); 12383 t = integer_one_node; 12384 } 12385 12386 check_no_duplicate_clause (list, OMP_CLAUSE_VECTOR_LENGTH, "vector_length"); 12387 12388 c = build_omp_clause (vector_length_loc, OMP_CLAUSE_VECTOR_LENGTH); 12389 OMP_CLAUSE_VECTOR_LENGTH_EXPR (c) = t; 12390 OMP_CLAUSE_CHAIN (c) = list; 12391 list = c; 12392 } 12393 12394 return list; 12395 } 12396 12397 /* OpenMP 4.0: 12398 inbranch 12399 notinbranch */ 12400 12401 static tree 12402 c_parser_omp_clause_branch (c_parser *parser ATTRIBUTE_UNUSED, 12403 enum omp_clause_code code, tree list) 12404 { 12405 check_no_duplicate_clause (list, code, omp_clause_code_name[code]); 12406 12407 tree c = build_omp_clause (c_parser_peek_token (parser)->location, code); 12408 OMP_CLAUSE_CHAIN (c) = list; 12409 12410 return c; 12411 } 12412 12413 /* OpenMP 4.0: 12414 parallel 12415 for 12416 sections 12417 taskgroup */ 12418 12419 static tree 12420 c_parser_omp_clause_cancelkind (c_parser *parser ATTRIBUTE_UNUSED, 12421 enum omp_clause_code code, tree list) 12422 { 12423 tree c = build_omp_clause (c_parser_peek_token (parser)->location, code); 12424 OMP_CLAUSE_CHAIN (c) = list; 12425 12426 return c; 12427 } 12428 12429 /* OpenMP 4.5: 12430 nogroup */ 12431 12432 static tree 12433 c_parser_omp_clause_nogroup (c_parser *parser ATTRIBUTE_UNUSED, tree list) 12434 { 12435 check_no_duplicate_clause (list, OMP_CLAUSE_NOGROUP, "nogroup"); 12436 tree c = build_omp_clause (c_parser_peek_token (parser)->location, 12437 OMP_CLAUSE_NOGROUP); 12438 OMP_CLAUSE_CHAIN (c) = list; 12439 return c; 12440 } 12441 12442 /* OpenMP 4.5: 12443 simd 12444 threads */ 12445 12446 static tree 12447 c_parser_omp_clause_orderedkind (c_parser *parser ATTRIBUTE_UNUSED, 12448 enum omp_clause_code code, tree list) 12449 { 12450 check_no_duplicate_clause (list, code, omp_clause_code_name[code]); 12451 tree c = build_omp_clause (c_parser_peek_token (parser)->location, code); 12452 OMP_CLAUSE_CHAIN (c) = list; 12453 return c; 12454 } 12455 12456 /* OpenMP 4.0: 12457 num_teams ( expression ) */ 12458 12459 static tree 12460 c_parser_omp_clause_num_teams (c_parser *parser, tree list) 12461 { 12462 location_t num_teams_loc = c_parser_peek_token (parser)->location; 12463 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 12464 { 12465 location_t expr_loc = c_parser_peek_token (parser)->location; 12466 c_expr expr = c_parser_expression (parser); 12467 expr = convert_lvalue_to_rvalue (expr_loc, expr, false, true); 12468 tree c, t = expr.value; 12469 t = c_fully_fold (t, false, NULL); 12470 12471 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 12472 12473 if (!INTEGRAL_TYPE_P (TREE_TYPE (t))) 12474 { 12475 c_parser_error (parser, "expected integer expression"); 12476 return list; 12477 } 12478 12479 /* Attempt to statically determine when the number isn't positive. */ 12480 c = fold_build2_loc (expr_loc, LE_EXPR, boolean_type_node, t, 12481 build_int_cst (TREE_TYPE (t), 0)); 12482 protected_set_expr_location (c, expr_loc); 12483 if (c == boolean_true_node) 12484 { 12485 warning_at (expr_loc, 0, "%<num_teams%> value must be positive"); 12486 t = integer_one_node; 12487 } 12488 12489 check_no_duplicate_clause (list, OMP_CLAUSE_NUM_TEAMS, "num_teams"); 12490 12491 c = build_omp_clause (num_teams_loc, OMP_CLAUSE_NUM_TEAMS); 12492 OMP_CLAUSE_NUM_TEAMS_EXPR (c) = t; 12493 OMP_CLAUSE_CHAIN (c) = list; 12494 list = c; 12495 } 12496 12497 return list; 12498 } 12499 12500 /* OpenMP 4.0: 12501 thread_limit ( expression ) */ 12502 12503 static tree 12504 c_parser_omp_clause_thread_limit (c_parser *parser, tree list) 12505 { 12506 location_t num_thread_limit_loc = c_parser_peek_token (parser)->location; 12507 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 12508 { 12509 location_t expr_loc = c_parser_peek_token (parser)->location; 12510 c_expr expr = c_parser_expression (parser); 12511 expr = convert_lvalue_to_rvalue (expr_loc, expr, false, true); 12512 tree c, t = expr.value; 12513 t = c_fully_fold (t, false, NULL); 12514 12515 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 12516 12517 if (!INTEGRAL_TYPE_P (TREE_TYPE (t))) 12518 { 12519 c_parser_error (parser, "expected integer expression"); 12520 return list; 12521 } 12522 12523 /* Attempt to statically determine when the number isn't positive. */ 12524 c = fold_build2_loc (expr_loc, LE_EXPR, boolean_type_node, t, 12525 build_int_cst (TREE_TYPE (t), 0)); 12526 protected_set_expr_location (c, expr_loc); 12527 if (c == boolean_true_node) 12528 { 12529 warning_at (expr_loc, 0, "%<thread_limit%> value must be positive"); 12530 t = integer_one_node; 12531 } 12532 12533 check_no_duplicate_clause (list, OMP_CLAUSE_THREAD_LIMIT, 12534 "thread_limit"); 12535 12536 c = build_omp_clause (num_thread_limit_loc, OMP_CLAUSE_THREAD_LIMIT); 12537 OMP_CLAUSE_THREAD_LIMIT_EXPR (c) = t; 12538 OMP_CLAUSE_CHAIN (c) = list; 12539 list = c; 12540 } 12541 12542 return list; 12543 } 12544 12545 /* OpenMP 4.0: 12546 aligned ( variable-list ) 12547 aligned ( variable-list : constant-expression ) */ 12548 12549 static tree 12550 c_parser_omp_clause_aligned (c_parser *parser, tree list) 12551 { 12552 location_t clause_loc = c_parser_peek_token (parser)->location; 12553 tree nl, c; 12554 12555 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 12556 return list; 12557 12558 nl = c_parser_omp_variable_list (parser, clause_loc, 12559 OMP_CLAUSE_ALIGNED, list); 12560 12561 if (c_parser_next_token_is (parser, CPP_COLON)) 12562 { 12563 c_parser_consume_token (parser); 12564 location_t expr_loc = c_parser_peek_token (parser)->location; 12565 c_expr expr = c_parser_expr_no_commas (parser, NULL); 12566 expr = convert_lvalue_to_rvalue (expr_loc, expr, false, true); 12567 tree alignment = expr.value; 12568 alignment = c_fully_fold (alignment, false, NULL); 12569 if (TREE_CODE (alignment) != INTEGER_CST 12570 || !INTEGRAL_TYPE_P (TREE_TYPE (alignment)) 12571 || tree_int_cst_sgn (alignment) != 1) 12572 { 12573 error_at (clause_loc, "%<aligned%> clause alignment expression must " 12574 "be positive constant integer expression"); 12575 alignment = NULL_TREE; 12576 } 12577 12578 for (c = nl; c != list; c = OMP_CLAUSE_CHAIN (c)) 12579 OMP_CLAUSE_ALIGNED_ALIGNMENT (c) = alignment; 12580 } 12581 12582 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 12583 return nl; 12584 } 12585 12586 /* OpenMP 4.0: 12587 linear ( variable-list ) 12588 linear ( variable-list : expression ) 12589 12590 OpenMP 4.5: 12591 linear ( modifier ( variable-list ) ) 12592 linear ( modifier ( variable-list ) : expression ) */ 12593 12594 static tree 12595 c_parser_omp_clause_linear (c_parser *parser, tree list, bool is_cilk_simd_fn) 12596 { 12597 location_t clause_loc = c_parser_peek_token (parser)->location; 12598 tree nl, c, step; 12599 enum omp_clause_linear_kind kind = OMP_CLAUSE_LINEAR_DEFAULT; 12600 12601 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 12602 return list; 12603 12604 if (!is_cilk_simd_fn 12605 && c_parser_next_token_is (parser, CPP_NAME)) 12606 { 12607 c_token *tok = c_parser_peek_token (parser); 12608 const char *p = IDENTIFIER_POINTER (tok->value); 12609 if (strcmp ("val", p) == 0) 12610 kind = OMP_CLAUSE_LINEAR_VAL; 12611 if (c_parser_peek_2nd_token (parser)->type != CPP_OPEN_PAREN) 12612 kind = OMP_CLAUSE_LINEAR_DEFAULT; 12613 if (kind != OMP_CLAUSE_LINEAR_DEFAULT) 12614 { 12615 c_parser_consume_token (parser); 12616 c_parser_consume_token (parser); 12617 } 12618 } 12619 12620 nl = c_parser_omp_variable_list (parser, clause_loc, 12621 OMP_CLAUSE_LINEAR, list); 12622 12623 if (kind != OMP_CLAUSE_LINEAR_DEFAULT) 12624 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 12625 12626 if (c_parser_next_token_is (parser, CPP_COLON)) 12627 { 12628 c_parser_consume_token (parser); 12629 location_t expr_loc = c_parser_peek_token (parser)->location; 12630 c_expr expr = c_parser_expression (parser); 12631 expr = convert_lvalue_to_rvalue (expr_loc, expr, false, true); 12632 step = expr.value; 12633 step = c_fully_fold (step, false, NULL); 12634 if (is_cilk_simd_fn && TREE_CODE (step) == PARM_DECL) 12635 { 12636 sorry ("using parameters for %<linear%> step is not supported yet"); 12637 step = integer_one_node; 12638 } 12639 if (!INTEGRAL_TYPE_P (TREE_TYPE (step))) 12640 { 12641 error_at (clause_loc, "%<linear%> clause step expression must " 12642 "be integral"); 12643 step = integer_one_node; 12644 } 12645 12646 } 12647 else 12648 step = integer_one_node; 12649 12650 for (c = nl; c != list; c = OMP_CLAUSE_CHAIN (c)) 12651 { 12652 OMP_CLAUSE_LINEAR_STEP (c) = step; 12653 OMP_CLAUSE_LINEAR_KIND (c) = kind; 12654 } 12655 12656 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 12657 return nl; 12658 } 12659 12660 /* OpenMP 4.0: 12661 safelen ( constant-expression ) */ 12662 12663 static tree 12664 c_parser_omp_clause_safelen (c_parser *parser, tree list) 12665 { 12666 location_t clause_loc = c_parser_peek_token (parser)->location; 12667 tree c, t; 12668 12669 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 12670 return list; 12671 12672 location_t expr_loc = c_parser_peek_token (parser)->location; 12673 c_expr expr = c_parser_expr_no_commas (parser, NULL); 12674 expr = convert_lvalue_to_rvalue (expr_loc, expr, false, true); 12675 t = expr.value; 12676 t = c_fully_fold (t, false, NULL); 12677 if (TREE_CODE (t) != INTEGER_CST 12678 || !INTEGRAL_TYPE_P (TREE_TYPE (t)) 12679 || tree_int_cst_sgn (t) != 1) 12680 { 12681 error_at (clause_loc, "%<safelen%> clause expression must " 12682 "be positive constant integer expression"); 12683 t = NULL_TREE; 12684 } 12685 12686 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 12687 if (t == NULL_TREE || t == error_mark_node) 12688 return list; 12689 12690 check_no_duplicate_clause (list, OMP_CLAUSE_SAFELEN, "safelen"); 12691 12692 c = build_omp_clause (clause_loc, OMP_CLAUSE_SAFELEN); 12693 OMP_CLAUSE_SAFELEN_EXPR (c) = t; 12694 OMP_CLAUSE_CHAIN (c) = list; 12695 return c; 12696 } 12697 12698 /* OpenMP 4.0: 12699 simdlen ( constant-expression ) */ 12700 12701 static tree 12702 c_parser_omp_clause_simdlen (c_parser *parser, tree list) 12703 { 12704 location_t clause_loc = c_parser_peek_token (parser)->location; 12705 tree c, t; 12706 12707 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 12708 return list; 12709 12710 location_t expr_loc = c_parser_peek_token (parser)->location; 12711 c_expr expr = c_parser_expr_no_commas (parser, NULL); 12712 expr = convert_lvalue_to_rvalue (expr_loc, expr, false, true); 12713 t = expr.value; 12714 t = c_fully_fold (t, false, NULL); 12715 if (TREE_CODE (t) != INTEGER_CST 12716 || !INTEGRAL_TYPE_P (TREE_TYPE (t)) 12717 || tree_int_cst_sgn (t) != 1) 12718 { 12719 error_at (clause_loc, "%<simdlen%> clause expression must " 12720 "be positive constant integer expression"); 12721 t = NULL_TREE; 12722 } 12723 12724 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 12725 if (t == NULL_TREE || t == error_mark_node) 12726 return list; 12727 12728 check_no_duplicate_clause (list, OMP_CLAUSE_SIMDLEN, "simdlen"); 12729 12730 c = build_omp_clause (clause_loc, OMP_CLAUSE_SIMDLEN); 12731 OMP_CLAUSE_SIMDLEN_EXPR (c) = t; 12732 OMP_CLAUSE_CHAIN (c) = list; 12733 return c; 12734 } 12735 12736 /* OpenMP 4.5: 12737 vec: 12738 identifier [+/- integer] 12739 vec , identifier [+/- integer] 12740 */ 12741 12742 static tree 12743 c_parser_omp_clause_depend_sink (c_parser *parser, location_t clause_loc, 12744 tree list) 12745 { 12746 tree vec = NULL; 12747 if (c_parser_next_token_is_not (parser, CPP_NAME) 12748 || c_parser_peek_token (parser)->id_kind != C_ID_ID) 12749 { 12750 c_parser_error (parser, "expected identifier"); 12751 return list; 12752 } 12753 12754 while (c_parser_next_token_is (parser, CPP_NAME) 12755 && c_parser_peek_token (parser)->id_kind == C_ID_ID) 12756 { 12757 tree t = lookup_name (c_parser_peek_token (parser)->value); 12758 tree addend = NULL; 12759 12760 if (t == NULL_TREE) 12761 { 12762 undeclared_variable (c_parser_peek_token (parser)->location, 12763 c_parser_peek_token (parser)->value); 12764 t = error_mark_node; 12765 } 12766 12767 c_parser_consume_token (parser); 12768 12769 bool neg = false; 12770 if (c_parser_next_token_is (parser, CPP_MINUS)) 12771 neg = true; 12772 else if (!c_parser_next_token_is (parser, CPP_PLUS)) 12773 { 12774 addend = integer_zero_node; 12775 neg = false; 12776 goto add_to_vector; 12777 } 12778 c_parser_consume_token (parser); 12779 12780 if (c_parser_next_token_is_not (parser, CPP_NUMBER)) 12781 { 12782 c_parser_error (parser, "expected integer"); 12783 return list; 12784 } 12785 12786 addend = c_parser_peek_token (parser)->value; 12787 if (TREE_CODE (addend) != INTEGER_CST) 12788 { 12789 c_parser_error (parser, "expected integer"); 12790 return list; 12791 } 12792 c_parser_consume_token (parser); 12793 12794 add_to_vector: 12795 if (t != error_mark_node) 12796 { 12797 vec = tree_cons (addend, t, vec); 12798 if (neg) 12799 OMP_CLAUSE_DEPEND_SINK_NEGATIVE (vec) = 1; 12800 } 12801 12802 if (c_parser_next_token_is_not (parser, CPP_COMMA)) 12803 break; 12804 12805 c_parser_consume_token (parser); 12806 } 12807 12808 if (vec == NULL_TREE) 12809 return list; 12810 12811 tree u = build_omp_clause (clause_loc, OMP_CLAUSE_DEPEND); 12812 OMP_CLAUSE_DEPEND_KIND (u) = OMP_CLAUSE_DEPEND_SINK; 12813 OMP_CLAUSE_DECL (u) = nreverse (vec); 12814 OMP_CLAUSE_CHAIN (u) = list; 12815 return u; 12816 } 12817 12818 /* OpenMP 4.0: 12819 depend ( depend-kind: variable-list ) 12820 12821 depend-kind: 12822 in | out | inout 12823 12824 OpenMP 4.5: 12825 depend ( source ) 12826 12827 depend ( sink : vec ) */ 12828 12829 static tree 12830 c_parser_omp_clause_depend (c_parser *parser, tree list) 12831 { 12832 location_t clause_loc = c_parser_peek_token (parser)->location; 12833 enum omp_clause_depend_kind kind = OMP_CLAUSE_DEPEND_INOUT; 12834 tree nl, c; 12835 12836 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 12837 return list; 12838 12839 if (c_parser_next_token_is (parser, CPP_NAME)) 12840 { 12841 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value); 12842 if (strcmp ("in", p) == 0) 12843 kind = OMP_CLAUSE_DEPEND_IN; 12844 else if (strcmp ("inout", p) == 0) 12845 kind = OMP_CLAUSE_DEPEND_INOUT; 12846 else if (strcmp ("out", p) == 0) 12847 kind = OMP_CLAUSE_DEPEND_OUT; 12848 else if (strcmp ("source", p) == 0) 12849 kind = OMP_CLAUSE_DEPEND_SOURCE; 12850 else if (strcmp ("sink", p) == 0) 12851 kind = OMP_CLAUSE_DEPEND_SINK; 12852 else 12853 goto invalid_kind; 12854 } 12855 else 12856 goto invalid_kind; 12857 12858 c_parser_consume_token (parser); 12859 12860 if (kind == OMP_CLAUSE_DEPEND_SOURCE) 12861 { 12862 c = build_omp_clause (clause_loc, OMP_CLAUSE_DEPEND); 12863 OMP_CLAUSE_DEPEND_KIND (c) = kind; 12864 OMP_CLAUSE_DECL (c) = NULL_TREE; 12865 OMP_CLAUSE_CHAIN (c) = list; 12866 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 12867 return c; 12868 } 12869 12870 if (!c_parser_require (parser, CPP_COLON, "expected %<:%>")) 12871 goto resync_fail; 12872 12873 if (kind == OMP_CLAUSE_DEPEND_SINK) 12874 nl = c_parser_omp_clause_depend_sink (parser, clause_loc, list); 12875 else 12876 { 12877 nl = c_parser_omp_variable_list (parser, clause_loc, 12878 OMP_CLAUSE_DEPEND, list); 12879 12880 for (c = nl; c != list; c = OMP_CLAUSE_CHAIN (c)) 12881 OMP_CLAUSE_DEPEND_KIND (c) = kind; 12882 } 12883 12884 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 12885 return nl; 12886 12887 invalid_kind: 12888 c_parser_error (parser, "invalid depend kind"); 12889 resync_fail: 12890 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 12891 return list; 12892 } 12893 12894 /* OpenMP 4.0: 12895 map ( map-kind: variable-list ) 12896 map ( variable-list ) 12897 12898 map-kind: 12899 alloc | to | from | tofrom 12900 12901 OpenMP 4.5: 12902 map-kind: 12903 alloc | to | from | tofrom | release | delete 12904 12905 map ( always [,] map-kind: variable-list ) */ 12906 12907 static tree 12908 c_parser_omp_clause_map (c_parser *parser, tree list) 12909 { 12910 location_t clause_loc = c_parser_peek_token (parser)->location; 12911 enum gomp_map_kind kind = GOMP_MAP_TOFROM; 12912 int always = 0; 12913 enum c_id_kind always_id_kind = C_ID_NONE; 12914 location_t always_loc = UNKNOWN_LOCATION; 12915 tree always_id = NULL_TREE; 12916 tree nl, c; 12917 12918 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 12919 return list; 12920 12921 if (c_parser_next_token_is (parser, CPP_NAME)) 12922 { 12923 c_token *tok = c_parser_peek_token (parser); 12924 const char *p = IDENTIFIER_POINTER (tok->value); 12925 always_id_kind = tok->id_kind; 12926 always_loc = tok->location; 12927 always_id = tok->value; 12928 if (strcmp ("always", p) == 0) 12929 { 12930 c_token *sectok = c_parser_peek_2nd_token (parser); 12931 if (sectok->type == CPP_COMMA) 12932 { 12933 c_parser_consume_token (parser); 12934 c_parser_consume_token (parser); 12935 always = 2; 12936 } 12937 else if (sectok->type == CPP_NAME) 12938 { 12939 p = IDENTIFIER_POINTER (sectok->value); 12940 if (strcmp ("alloc", p) == 0 12941 || strcmp ("to", p) == 0 12942 || strcmp ("from", p) == 0 12943 || strcmp ("tofrom", p) == 0 12944 || strcmp ("release", p) == 0 12945 || strcmp ("delete", p) == 0) 12946 { 12947 c_parser_consume_token (parser); 12948 always = 1; 12949 } 12950 } 12951 } 12952 } 12953 12954 if (c_parser_next_token_is (parser, CPP_NAME) 12955 && c_parser_peek_2nd_token (parser)->type == CPP_COLON) 12956 { 12957 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value); 12958 if (strcmp ("alloc", p) == 0) 12959 kind = GOMP_MAP_ALLOC; 12960 else if (strcmp ("to", p) == 0) 12961 kind = always ? GOMP_MAP_ALWAYS_TO : GOMP_MAP_TO; 12962 else if (strcmp ("from", p) == 0) 12963 kind = always ? GOMP_MAP_ALWAYS_FROM : GOMP_MAP_FROM; 12964 else if (strcmp ("tofrom", p) == 0) 12965 kind = always ? GOMP_MAP_ALWAYS_TOFROM : GOMP_MAP_TOFROM; 12966 else if (strcmp ("release", p) == 0) 12967 kind = GOMP_MAP_RELEASE; 12968 else if (strcmp ("delete", p) == 0) 12969 kind = GOMP_MAP_DELETE; 12970 else 12971 { 12972 c_parser_error (parser, "invalid map kind"); 12973 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 12974 "expected %<)%>"); 12975 return list; 12976 } 12977 c_parser_consume_token (parser); 12978 c_parser_consume_token (parser); 12979 } 12980 else if (always) 12981 { 12982 if (always_id_kind != C_ID_ID) 12983 { 12984 c_parser_error (parser, "expected identifier"); 12985 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 12986 return list; 12987 } 12988 12989 tree t = lookup_name (always_id); 12990 if (t == NULL_TREE) 12991 { 12992 undeclared_variable (always_loc, always_id); 12993 t = error_mark_node; 12994 } 12995 if (t != error_mark_node) 12996 { 12997 tree u = build_omp_clause (clause_loc, OMP_CLAUSE_MAP); 12998 OMP_CLAUSE_DECL (u) = t; 12999 OMP_CLAUSE_CHAIN (u) = list; 13000 OMP_CLAUSE_SET_MAP_KIND (u, kind); 13001 list = u; 13002 } 13003 if (always == 1) 13004 { 13005 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 13006 return list; 13007 } 13008 } 13009 13010 nl = c_parser_omp_variable_list (parser, clause_loc, OMP_CLAUSE_MAP, list); 13011 13012 for (c = nl; c != list; c = OMP_CLAUSE_CHAIN (c)) 13013 OMP_CLAUSE_SET_MAP_KIND (c, kind); 13014 13015 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 13016 return nl; 13017 } 13018 13019 /* OpenMP 4.0: 13020 device ( expression ) */ 13021 13022 static tree 13023 c_parser_omp_clause_device (c_parser *parser, tree list) 13024 { 13025 location_t clause_loc = c_parser_peek_token (parser)->location; 13026 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 13027 { 13028 location_t expr_loc = c_parser_peek_token (parser)->location; 13029 c_expr expr = c_parser_expr_no_commas (parser, NULL); 13030 expr = convert_lvalue_to_rvalue (expr_loc, expr, false, true); 13031 tree c, t = expr.value; 13032 t = c_fully_fold (t, false, NULL); 13033 13034 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 13035 13036 if (!INTEGRAL_TYPE_P (TREE_TYPE (t))) 13037 { 13038 c_parser_error (parser, "expected integer expression"); 13039 return list; 13040 } 13041 13042 check_no_duplicate_clause (list, OMP_CLAUSE_DEVICE, "device"); 13043 13044 c = build_omp_clause (clause_loc, OMP_CLAUSE_DEVICE); 13045 OMP_CLAUSE_DEVICE_ID (c) = t; 13046 OMP_CLAUSE_CHAIN (c) = list; 13047 list = c; 13048 } 13049 13050 return list; 13051 } 13052 13053 /* OpenMP 4.0: 13054 dist_schedule ( static ) 13055 dist_schedule ( static , expression ) */ 13056 13057 static tree 13058 c_parser_omp_clause_dist_schedule (c_parser *parser, tree list) 13059 { 13060 tree c, t = NULL_TREE; 13061 location_t loc = c_parser_peek_token (parser)->location; 13062 13063 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 13064 return list; 13065 13066 if (!c_parser_next_token_is_keyword (parser, RID_STATIC)) 13067 { 13068 c_parser_error (parser, "invalid dist_schedule kind"); 13069 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 13070 "expected %<)%>"); 13071 return list; 13072 } 13073 13074 c_parser_consume_token (parser); 13075 if (c_parser_next_token_is (parser, CPP_COMMA)) 13076 { 13077 c_parser_consume_token (parser); 13078 13079 location_t expr_loc = c_parser_peek_token (parser)->location; 13080 c_expr expr = c_parser_expr_no_commas (parser, NULL); 13081 expr = convert_lvalue_to_rvalue (expr_loc, expr, false, true); 13082 t = expr.value; 13083 t = c_fully_fold (t, false, NULL); 13084 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 13085 } 13086 else 13087 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 13088 "expected %<,%> or %<)%>"); 13089 13090 check_no_duplicate_clause (list, OMP_CLAUSE_SCHEDULE, "schedule"); 13091 if (t == error_mark_node) 13092 return list; 13093 13094 c = build_omp_clause (loc, OMP_CLAUSE_DIST_SCHEDULE); 13095 OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (c) = t; 13096 OMP_CLAUSE_CHAIN (c) = list; 13097 return c; 13098 } 13099 13100 /* OpenMP 4.0: 13101 proc_bind ( proc-bind-kind ) 13102 13103 proc-bind-kind: 13104 master | close | spread */ 13105 13106 static tree 13107 c_parser_omp_clause_proc_bind (c_parser *parser, tree list) 13108 { 13109 location_t clause_loc = c_parser_peek_token (parser)->location; 13110 enum omp_clause_proc_bind_kind kind; 13111 tree c; 13112 13113 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 13114 return list; 13115 13116 if (c_parser_next_token_is (parser, CPP_NAME)) 13117 { 13118 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value); 13119 if (strcmp ("master", p) == 0) 13120 kind = OMP_CLAUSE_PROC_BIND_MASTER; 13121 else if (strcmp ("close", p) == 0) 13122 kind = OMP_CLAUSE_PROC_BIND_CLOSE; 13123 else if (strcmp ("spread", p) == 0) 13124 kind = OMP_CLAUSE_PROC_BIND_SPREAD; 13125 else 13126 goto invalid_kind; 13127 } 13128 else 13129 goto invalid_kind; 13130 13131 c_parser_consume_token (parser); 13132 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 13133 c = build_omp_clause (clause_loc, OMP_CLAUSE_PROC_BIND); 13134 OMP_CLAUSE_PROC_BIND_KIND (c) = kind; 13135 OMP_CLAUSE_CHAIN (c) = list; 13136 return c; 13137 13138 invalid_kind: 13139 c_parser_error (parser, "invalid proc_bind kind"); 13140 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 13141 return list; 13142 } 13143 13144 /* OpenMP 4.0: 13145 to ( variable-list ) */ 13146 13147 static tree 13148 c_parser_omp_clause_to (c_parser *parser, tree list) 13149 { 13150 return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_TO, list); 13151 } 13152 13153 /* OpenMP 4.0: 13154 from ( variable-list ) */ 13155 13156 static tree 13157 c_parser_omp_clause_from (c_parser *parser, tree list) 13158 { 13159 return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_FROM, list); 13160 } 13161 13162 /* OpenMP 4.0: 13163 uniform ( variable-list ) */ 13164 13165 static tree 13166 c_parser_omp_clause_uniform (c_parser *parser, tree list) 13167 { 13168 /* The clauses location. */ 13169 location_t loc = c_parser_peek_token (parser)->location; 13170 13171 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 13172 { 13173 list = c_parser_omp_variable_list (parser, loc, OMP_CLAUSE_UNIFORM, 13174 list); 13175 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 13176 } 13177 return list; 13178 } 13179 13180 /* Parse all OpenACC clauses. The set clauses allowed by the directive 13181 is a bitmask in MASK. Return the list of clauses found. */ 13182 13183 static tree 13184 c_parser_oacc_all_clauses (c_parser *parser, omp_clause_mask mask, 13185 const char *where, bool finish_p = true) 13186 { 13187 tree clauses = NULL; 13188 bool first = true; 13189 13190 while (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL)) 13191 { 13192 location_t here; 13193 pragma_omp_clause c_kind; 13194 const char *c_name; 13195 tree prev = clauses; 13196 13197 if (!first && c_parser_next_token_is (parser, CPP_COMMA)) 13198 c_parser_consume_token (parser); 13199 13200 here = c_parser_peek_token (parser)->location; 13201 c_kind = c_parser_omp_clause_name (parser); 13202 13203 switch (c_kind) 13204 { 13205 case PRAGMA_OACC_CLAUSE_ASYNC: 13206 clauses = c_parser_oacc_clause_async (parser, clauses); 13207 c_name = "async"; 13208 break; 13209 case PRAGMA_OACC_CLAUSE_AUTO: 13210 clauses = c_parser_oacc_simple_clause (parser, OMP_CLAUSE_AUTO, 13211 clauses); 13212 c_name = "auto"; 13213 break; 13214 case PRAGMA_OACC_CLAUSE_COLLAPSE: 13215 clauses = c_parser_omp_clause_collapse (parser, clauses); 13216 c_name = "collapse"; 13217 break; 13218 case PRAGMA_OACC_CLAUSE_COPY: 13219 clauses = c_parser_oacc_data_clause (parser, c_kind, clauses); 13220 c_name = "copy"; 13221 break; 13222 case PRAGMA_OACC_CLAUSE_COPYIN: 13223 clauses = c_parser_oacc_data_clause (parser, c_kind, clauses); 13224 c_name = "copyin"; 13225 break; 13226 case PRAGMA_OACC_CLAUSE_COPYOUT: 13227 clauses = c_parser_oacc_data_clause (parser, c_kind, clauses); 13228 c_name = "copyout"; 13229 break; 13230 case PRAGMA_OACC_CLAUSE_CREATE: 13231 clauses = c_parser_oacc_data_clause (parser, c_kind, clauses); 13232 c_name = "create"; 13233 break; 13234 case PRAGMA_OACC_CLAUSE_DELETE: 13235 clauses = c_parser_oacc_data_clause (parser, c_kind, clauses); 13236 c_name = "delete"; 13237 break; 13238 case PRAGMA_OMP_CLAUSE_DEFAULT: 13239 clauses = c_parser_omp_clause_default (parser, clauses, true); 13240 c_name = "default"; 13241 break; 13242 case PRAGMA_OACC_CLAUSE_DEVICE: 13243 clauses = c_parser_oacc_data_clause (parser, c_kind, clauses); 13244 c_name = "device"; 13245 break; 13246 case PRAGMA_OACC_CLAUSE_DEVICEPTR: 13247 clauses = c_parser_oacc_data_clause_deviceptr (parser, clauses); 13248 c_name = "deviceptr"; 13249 break; 13250 case PRAGMA_OACC_CLAUSE_DEVICE_RESIDENT: 13251 clauses = c_parser_oacc_data_clause (parser, c_kind, clauses); 13252 c_name = "device_resident"; 13253 break; 13254 case PRAGMA_OACC_CLAUSE_FIRSTPRIVATE: 13255 clauses = c_parser_omp_clause_firstprivate (parser, clauses); 13256 c_name = "firstprivate"; 13257 break; 13258 case PRAGMA_OACC_CLAUSE_GANG: 13259 c_name = "gang"; 13260 clauses = c_parser_oacc_shape_clause (parser, OMP_CLAUSE_GANG, 13261 c_name, clauses); 13262 break; 13263 case PRAGMA_OACC_CLAUSE_HOST: 13264 clauses = c_parser_oacc_data_clause (parser, c_kind, clauses); 13265 c_name = "host"; 13266 break; 13267 case PRAGMA_OACC_CLAUSE_IF: 13268 clauses = c_parser_omp_clause_if (parser, clauses, false); 13269 c_name = "if"; 13270 break; 13271 case PRAGMA_OACC_CLAUSE_INDEPENDENT: 13272 clauses = c_parser_oacc_simple_clause (parser, OMP_CLAUSE_INDEPENDENT, 13273 clauses); 13274 c_name = "independent"; 13275 break; 13276 case PRAGMA_OACC_CLAUSE_LINK: 13277 clauses = c_parser_oacc_data_clause (parser, c_kind, clauses); 13278 c_name = "link"; 13279 break; 13280 case PRAGMA_OACC_CLAUSE_NUM_GANGS: 13281 clauses = c_parser_omp_clause_num_gangs (parser, clauses); 13282 c_name = "num_gangs"; 13283 break; 13284 case PRAGMA_OACC_CLAUSE_NUM_WORKERS: 13285 clauses = c_parser_omp_clause_num_workers (parser, clauses); 13286 c_name = "num_workers"; 13287 break; 13288 case PRAGMA_OACC_CLAUSE_PRESENT: 13289 clauses = c_parser_oacc_data_clause (parser, c_kind, clauses); 13290 c_name = "present"; 13291 break; 13292 case PRAGMA_OACC_CLAUSE_PRESENT_OR_COPY: 13293 clauses = c_parser_oacc_data_clause (parser, c_kind, clauses); 13294 c_name = "present_or_copy"; 13295 break; 13296 case PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYIN: 13297 clauses = c_parser_oacc_data_clause (parser, c_kind, clauses); 13298 c_name = "present_or_copyin"; 13299 break; 13300 case PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYOUT: 13301 clauses = c_parser_oacc_data_clause (parser, c_kind, clauses); 13302 c_name = "present_or_copyout"; 13303 break; 13304 case PRAGMA_OACC_CLAUSE_PRESENT_OR_CREATE: 13305 clauses = c_parser_oacc_data_clause (parser, c_kind, clauses); 13306 c_name = "present_or_create"; 13307 break; 13308 case PRAGMA_OACC_CLAUSE_PRIVATE: 13309 clauses = c_parser_omp_clause_private (parser, clauses); 13310 c_name = "private"; 13311 break; 13312 case PRAGMA_OACC_CLAUSE_REDUCTION: 13313 clauses = c_parser_omp_clause_reduction (parser, clauses); 13314 c_name = "reduction"; 13315 break; 13316 case PRAGMA_OACC_CLAUSE_SELF: 13317 clauses = c_parser_oacc_data_clause (parser, c_kind, clauses); 13318 c_name = "self"; 13319 break; 13320 case PRAGMA_OACC_CLAUSE_SEQ: 13321 clauses = c_parser_oacc_simple_clause (parser, OMP_CLAUSE_SEQ, 13322 clauses); 13323 c_name = "seq"; 13324 break; 13325 case PRAGMA_OACC_CLAUSE_TILE: 13326 clauses = c_parser_oacc_clause_tile (parser, clauses); 13327 c_name = "tile"; 13328 break; 13329 case PRAGMA_OACC_CLAUSE_USE_DEVICE: 13330 clauses = c_parser_omp_clause_use_device_ptr (parser, clauses); 13331 c_name = "use_device"; 13332 break; 13333 case PRAGMA_OACC_CLAUSE_VECTOR: 13334 c_name = "vector"; 13335 clauses = c_parser_oacc_shape_clause (parser, OMP_CLAUSE_VECTOR, 13336 c_name, clauses); 13337 break; 13338 case PRAGMA_OACC_CLAUSE_VECTOR_LENGTH: 13339 clauses = c_parser_omp_clause_vector_length (parser, clauses); 13340 c_name = "vector_length"; 13341 break; 13342 case PRAGMA_OACC_CLAUSE_WAIT: 13343 clauses = c_parser_oacc_clause_wait (parser, clauses); 13344 c_name = "wait"; 13345 break; 13346 case PRAGMA_OACC_CLAUSE_WORKER: 13347 c_name = "worker"; 13348 clauses = c_parser_oacc_shape_clause (parser, OMP_CLAUSE_WORKER, 13349 c_name, clauses); 13350 break; 13351 default: 13352 c_parser_error (parser, "expected %<#pragma acc%> clause"); 13353 goto saw_error; 13354 } 13355 13356 first = false; 13357 13358 if (((mask >> c_kind) & 1) == 0) 13359 { 13360 /* Remove the invalid clause(s) from the list to avoid 13361 confusing the rest of the compiler. */ 13362 clauses = prev; 13363 error_at (here, "%qs is not valid for %qs", c_name, where); 13364 } 13365 } 13366 13367 saw_error: 13368 c_parser_skip_to_pragma_eol (parser); 13369 13370 if (finish_p) 13371 return c_finish_omp_clauses (clauses, C_ORT_ACC); 13372 13373 return clauses; 13374 } 13375 13376 /* Parse all OpenMP clauses. The set clauses allowed by the directive 13377 is a bitmask in MASK. Return the list of clauses found. */ 13378 13379 static tree 13380 c_parser_omp_all_clauses (c_parser *parser, omp_clause_mask mask, 13381 const char *where, bool finish_p = true) 13382 { 13383 tree clauses = NULL; 13384 bool first = true, cilk_simd_fn = false; 13385 13386 while (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL)) 13387 { 13388 location_t here; 13389 pragma_omp_clause c_kind; 13390 const char *c_name; 13391 tree prev = clauses; 13392 13393 if (!first && c_parser_next_token_is (parser, CPP_COMMA)) 13394 c_parser_consume_token (parser); 13395 13396 here = c_parser_peek_token (parser)->location; 13397 c_kind = c_parser_omp_clause_name (parser); 13398 13399 switch (c_kind) 13400 { 13401 case PRAGMA_OMP_CLAUSE_COLLAPSE: 13402 clauses = c_parser_omp_clause_collapse (parser, clauses); 13403 c_name = "collapse"; 13404 break; 13405 case PRAGMA_OMP_CLAUSE_COPYIN: 13406 clauses = c_parser_omp_clause_copyin (parser, clauses); 13407 c_name = "copyin"; 13408 break; 13409 case PRAGMA_OMP_CLAUSE_COPYPRIVATE: 13410 clauses = c_parser_omp_clause_copyprivate (parser, clauses); 13411 c_name = "copyprivate"; 13412 break; 13413 case PRAGMA_OMP_CLAUSE_DEFAULT: 13414 clauses = c_parser_omp_clause_default (parser, clauses, false); 13415 c_name = "default"; 13416 break; 13417 case PRAGMA_OMP_CLAUSE_FIRSTPRIVATE: 13418 clauses = c_parser_omp_clause_firstprivate (parser, clauses); 13419 c_name = "firstprivate"; 13420 break; 13421 case PRAGMA_OMP_CLAUSE_FINAL: 13422 clauses = c_parser_omp_clause_final (parser, clauses); 13423 c_name = "final"; 13424 break; 13425 case PRAGMA_OMP_CLAUSE_GRAINSIZE: 13426 clauses = c_parser_omp_clause_grainsize (parser, clauses); 13427 c_name = "grainsize"; 13428 break; 13429 case PRAGMA_OMP_CLAUSE_HINT: 13430 clauses = c_parser_omp_clause_hint (parser, clauses); 13431 c_name = "hint"; 13432 break; 13433 case PRAGMA_OMP_CLAUSE_DEFAULTMAP: 13434 clauses = c_parser_omp_clause_defaultmap (parser, clauses); 13435 c_name = "defaultmap"; 13436 break; 13437 case PRAGMA_OMP_CLAUSE_IF: 13438 clauses = c_parser_omp_clause_if (parser, clauses, true); 13439 c_name = "if"; 13440 break; 13441 case PRAGMA_OMP_CLAUSE_LASTPRIVATE: 13442 clauses = c_parser_omp_clause_lastprivate (parser, clauses); 13443 c_name = "lastprivate"; 13444 break; 13445 case PRAGMA_OMP_CLAUSE_MERGEABLE: 13446 clauses = c_parser_omp_clause_mergeable (parser, clauses); 13447 c_name = "mergeable"; 13448 break; 13449 case PRAGMA_OMP_CLAUSE_NOWAIT: 13450 clauses = c_parser_omp_clause_nowait (parser, clauses); 13451 c_name = "nowait"; 13452 break; 13453 case PRAGMA_OMP_CLAUSE_NUM_TASKS: 13454 clauses = c_parser_omp_clause_num_tasks (parser, clauses); 13455 c_name = "num_tasks"; 13456 break; 13457 case PRAGMA_OMP_CLAUSE_NUM_THREADS: 13458 clauses = c_parser_omp_clause_num_threads (parser, clauses); 13459 c_name = "num_threads"; 13460 break; 13461 case PRAGMA_OMP_CLAUSE_ORDERED: 13462 clauses = c_parser_omp_clause_ordered (parser, clauses); 13463 c_name = "ordered"; 13464 break; 13465 case PRAGMA_OMP_CLAUSE_PRIORITY: 13466 clauses = c_parser_omp_clause_priority (parser, clauses); 13467 c_name = "priority"; 13468 break; 13469 case PRAGMA_OMP_CLAUSE_PRIVATE: 13470 clauses = c_parser_omp_clause_private (parser, clauses); 13471 c_name = "private"; 13472 break; 13473 case PRAGMA_OMP_CLAUSE_REDUCTION: 13474 clauses = c_parser_omp_clause_reduction (parser, clauses); 13475 c_name = "reduction"; 13476 break; 13477 case PRAGMA_OMP_CLAUSE_SCHEDULE: 13478 clauses = c_parser_omp_clause_schedule (parser, clauses); 13479 c_name = "schedule"; 13480 break; 13481 case PRAGMA_OMP_CLAUSE_SHARED: 13482 clauses = c_parser_omp_clause_shared (parser, clauses); 13483 c_name = "shared"; 13484 break; 13485 case PRAGMA_OMP_CLAUSE_UNTIED: 13486 clauses = c_parser_omp_clause_untied (parser, clauses); 13487 c_name = "untied"; 13488 break; 13489 case PRAGMA_OMP_CLAUSE_INBRANCH: 13490 case PRAGMA_CILK_CLAUSE_MASK: 13491 clauses = c_parser_omp_clause_branch (parser, OMP_CLAUSE_INBRANCH, 13492 clauses); 13493 c_name = "inbranch"; 13494 break; 13495 case PRAGMA_OMP_CLAUSE_NOTINBRANCH: 13496 case PRAGMA_CILK_CLAUSE_NOMASK: 13497 clauses = c_parser_omp_clause_branch (parser, OMP_CLAUSE_NOTINBRANCH, 13498 clauses); 13499 c_name = "notinbranch"; 13500 break; 13501 case PRAGMA_OMP_CLAUSE_PARALLEL: 13502 clauses 13503 = c_parser_omp_clause_cancelkind (parser, OMP_CLAUSE_PARALLEL, 13504 clauses); 13505 c_name = "parallel"; 13506 if (!first) 13507 { 13508 clause_not_first: 13509 error_at (here, "%qs must be the first clause of %qs", 13510 c_name, where); 13511 clauses = prev; 13512 } 13513 break; 13514 case PRAGMA_OMP_CLAUSE_FOR: 13515 clauses 13516 = c_parser_omp_clause_cancelkind (parser, OMP_CLAUSE_FOR, 13517 clauses); 13518 c_name = "for"; 13519 if (!first) 13520 goto clause_not_first; 13521 break; 13522 case PRAGMA_OMP_CLAUSE_SECTIONS: 13523 clauses 13524 = c_parser_omp_clause_cancelkind (parser, OMP_CLAUSE_SECTIONS, 13525 clauses); 13526 c_name = "sections"; 13527 if (!first) 13528 goto clause_not_first; 13529 break; 13530 case PRAGMA_OMP_CLAUSE_TASKGROUP: 13531 clauses 13532 = c_parser_omp_clause_cancelkind (parser, OMP_CLAUSE_TASKGROUP, 13533 clauses); 13534 c_name = "taskgroup"; 13535 if (!first) 13536 goto clause_not_first; 13537 break; 13538 case PRAGMA_OMP_CLAUSE_LINK: 13539 clauses 13540 = c_parser_omp_var_list_parens (parser, OMP_CLAUSE_LINK, clauses); 13541 c_name = "link"; 13542 break; 13543 case PRAGMA_OMP_CLAUSE_TO: 13544 if ((mask & (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_LINK)) != 0) 13545 clauses 13546 = c_parser_omp_var_list_parens (parser, OMP_CLAUSE_TO_DECLARE, 13547 clauses); 13548 else 13549 clauses = c_parser_omp_clause_to (parser, clauses); 13550 c_name = "to"; 13551 break; 13552 case PRAGMA_OMP_CLAUSE_FROM: 13553 clauses = c_parser_omp_clause_from (parser, clauses); 13554 c_name = "from"; 13555 break; 13556 case PRAGMA_OMP_CLAUSE_UNIFORM: 13557 clauses = c_parser_omp_clause_uniform (parser, clauses); 13558 c_name = "uniform"; 13559 break; 13560 case PRAGMA_OMP_CLAUSE_NUM_TEAMS: 13561 clauses = c_parser_omp_clause_num_teams (parser, clauses); 13562 c_name = "num_teams"; 13563 break; 13564 case PRAGMA_OMP_CLAUSE_THREAD_LIMIT: 13565 clauses = c_parser_omp_clause_thread_limit (parser, clauses); 13566 c_name = "thread_limit"; 13567 break; 13568 case PRAGMA_OMP_CLAUSE_ALIGNED: 13569 clauses = c_parser_omp_clause_aligned (parser, clauses); 13570 c_name = "aligned"; 13571 break; 13572 case PRAGMA_OMP_CLAUSE_LINEAR: 13573 if (((mask >> PRAGMA_CILK_CLAUSE_VECTORLENGTH) & 1) != 0) 13574 cilk_simd_fn = true; 13575 clauses = c_parser_omp_clause_linear (parser, clauses, cilk_simd_fn); 13576 c_name = "linear"; 13577 break; 13578 case PRAGMA_OMP_CLAUSE_DEPEND: 13579 clauses = c_parser_omp_clause_depend (parser, clauses); 13580 c_name = "depend"; 13581 break; 13582 case PRAGMA_OMP_CLAUSE_MAP: 13583 clauses = c_parser_omp_clause_map (parser, clauses); 13584 c_name = "map"; 13585 break; 13586 case PRAGMA_OMP_CLAUSE_USE_DEVICE_PTR: 13587 clauses = c_parser_omp_clause_use_device_ptr (parser, clauses); 13588 c_name = "use_device_ptr"; 13589 break; 13590 case PRAGMA_OMP_CLAUSE_IS_DEVICE_PTR: 13591 clauses = c_parser_omp_clause_is_device_ptr (parser, clauses); 13592 c_name = "is_device_ptr"; 13593 break; 13594 case PRAGMA_OMP_CLAUSE_DEVICE: 13595 clauses = c_parser_omp_clause_device (parser, clauses); 13596 c_name = "device"; 13597 break; 13598 case PRAGMA_OMP_CLAUSE_DIST_SCHEDULE: 13599 clauses = c_parser_omp_clause_dist_schedule (parser, clauses); 13600 c_name = "dist_schedule"; 13601 break; 13602 case PRAGMA_OMP_CLAUSE_PROC_BIND: 13603 clauses = c_parser_omp_clause_proc_bind (parser, clauses); 13604 c_name = "proc_bind"; 13605 break; 13606 case PRAGMA_OMP_CLAUSE_SAFELEN: 13607 clauses = c_parser_omp_clause_safelen (parser, clauses); 13608 c_name = "safelen"; 13609 break; 13610 case PRAGMA_CILK_CLAUSE_VECTORLENGTH: 13611 clauses = c_parser_cilk_clause_vectorlength (parser, clauses, true); 13612 c_name = "simdlen"; 13613 break; 13614 case PRAGMA_OMP_CLAUSE_SIMDLEN: 13615 clauses = c_parser_omp_clause_simdlen (parser, clauses); 13616 c_name = "simdlen"; 13617 break; 13618 case PRAGMA_OMP_CLAUSE_NOGROUP: 13619 clauses = c_parser_omp_clause_nogroup (parser, clauses); 13620 c_name = "nogroup"; 13621 break; 13622 case PRAGMA_OMP_CLAUSE_THREADS: 13623 clauses 13624 = c_parser_omp_clause_orderedkind (parser, OMP_CLAUSE_THREADS, 13625 clauses); 13626 c_name = "threads"; 13627 break; 13628 case PRAGMA_OMP_CLAUSE_SIMD: 13629 clauses 13630 = c_parser_omp_clause_orderedkind (parser, OMP_CLAUSE_SIMD, 13631 clauses); 13632 c_name = "simd"; 13633 break; 13634 default: 13635 c_parser_error (parser, "expected %<#pragma omp%> clause"); 13636 goto saw_error; 13637 } 13638 13639 first = false; 13640 13641 if (((mask >> c_kind) & 1) == 0) 13642 { 13643 /* Remove the invalid clause(s) from the list to avoid 13644 confusing the rest of the compiler. */ 13645 clauses = prev; 13646 error_at (here, "%qs is not valid for %qs", c_name, where); 13647 } 13648 } 13649 13650 saw_error: 13651 c_parser_skip_to_pragma_eol (parser); 13652 13653 if (finish_p) 13654 { 13655 if ((mask & (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_UNIFORM)) != 0) 13656 return c_finish_omp_clauses (clauses, C_ORT_OMP_DECLARE_SIMD); 13657 return c_finish_omp_clauses (clauses, C_ORT_OMP); 13658 } 13659 13660 return clauses; 13661 } 13662 13663 /* OpenACC 2.0, OpenMP 2.5: 13664 structured-block: 13665 statement 13666 13667 In practice, we're also interested in adding the statement to an 13668 outer node. So it is convenient if we work around the fact that 13669 c_parser_statement calls add_stmt. */ 13670 13671 static tree 13672 c_parser_omp_structured_block (c_parser *parser, bool *if_p) 13673 { 13674 tree stmt = push_stmt_list (); 13675 c_parser_statement (parser, if_p); 13676 return pop_stmt_list (stmt); 13677 } 13678 13679 /* OpenACC 2.0: 13680 # pragma acc cache (variable-list) new-line 13681 13682 LOC is the location of the #pragma token. 13683 */ 13684 13685 static tree 13686 c_parser_oacc_cache (location_t loc, c_parser *parser) 13687 { 13688 tree stmt, clauses; 13689 13690 clauses = c_parser_omp_var_list_parens (parser, OMP_CLAUSE__CACHE_, NULL); 13691 clauses = c_finish_omp_clauses (clauses, C_ORT_ACC); 13692 13693 c_parser_skip_to_pragma_eol (parser); 13694 13695 stmt = make_node (OACC_CACHE); 13696 TREE_TYPE (stmt) = void_type_node; 13697 OACC_CACHE_CLAUSES (stmt) = clauses; 13698 SET_EXPR_LOCATION (stmt, loc); 13699 add_stmt (stmt); 13700 13701 return stmt; 13702 } 13703 13704 /* OpenACC 2.0: 13705 # pragma acc data oacc-data-clause[optseq] new-line 13706 structured-block 13707 13708 LOC is the location of the #pragma token. 13709 */ 13710 13711 #define OACC_DATA_CLAUSE_MASK \ 13712 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_COPY) \ 13713 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_COPYIN) \ 13714 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_COPYOUT) \ 13715 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_CREATE) \ 13716 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_DEVICEPTR) \ 13717 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_IF) \ 13718 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT) \ 13719 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_COPY) \ 13720 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYIN) \ 13721 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYOUT) \ 13722 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_CREATE) ) 13723 13724 static tree 13725 c_parser_oacc_data (location_t loc, c_parser *parser, bool *if_p) 13726 { 13727 tree stmt, clauses, block; 13728 13729 clauses = c_parser_oacc_all_clauses (parser, OACC_DATA_CLAUSE_MASK, 13730 "#pragma acc data"); 13731 13732 block = c_begin_omp_parallel (); 13733 add_stmt (c_parser_omp_structured_block (parser, if_p)); 13734 13735 stmt = c_finish_oacc_data (loc, clauses, block); 13736 13737 return stmt; 13738 } 13739 13740 /* OpenACC 2.0: 13741 # pragma acc declare oacc-data-clause[optseq] new-line 13742 */ 13743 13744 #define OACC_DECLARE_CLAUSE_MASK \ 13745 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_COPY) \ 13746 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_COPYIN) \ 13747 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_COPYOUT) \ 13748 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_CREATE) \ 13749 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_DEVICEPTR) \ 13750 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_DEVICE_RESIDENT) \ 13751 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_LINK) \ 13752 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT) \ 13753 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_COPY) \ 13754 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYIN) \ 13755 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYOUT) \ 13756 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_CREATE) ) 13757 13758 static void 13759 c_parser_oacc_declare (c_parser *parser) 13760 { 13761 location_t pragma_loc = c_parser_peek_token (parser)->location; 13762 tree clauses, stmt, t, decl; 13763 13764 bool error = false; 13765 13766 c_parser_consume_pragma (parser); 13767 13768 clauses = c_parser_oacc_all_clauses (parser, OACC_DECLARE_CLAUSE_MASK, 13769 "#pragma acc declare"); 13770 if (!clauses) 13771 { 13772 error_at (pragma_loc, 13773 "no valid clauses specified in %<#pragma acc declare%>"); 13774 return; 13775 } 13776 13777 for (t = clauses; t; t = OMP_CLAUSE_CHAIN (t)) 13778 { 13779 location_t loc = OMP_CLAUSE_LOCATION (t); 13780 decl = OMP_CLAUSE_DECL (t); 13781 if (!DECL_P (decl)) 13782 { 13783 error_at (loc, "array section in %<#pragma acc declare%>"); 13784 error = true; 13785 continue; 13786 } 13787 13788 switch (OMP_CLAUSE_MAP_KIND (t)) 13789 { 13790 case GOMP_MAP_FIRSTPRIVATE_POINTER: 13791 case GOMP_MAP_FORCE_ALLOC: 13792 case GOMP_MAP_FORCE_TO: 13793 case GOMP_MAP_FORCE_DEVICEPTR: 13794 case GOMP_MAP_DEVICE_RESIDENT: 13795 break; 13796 13797 case GOMP_MAP_LINK: 13798 if (!global_bindings_p () 13799 && (TREE_STATIC (decl) 13800 || !DECL_EXTERNAL (decl))) 13801 { 13802 error_at (loc, 13803 "%qD must be a global variable in " 13804 "%<#pragma acc declare link%>", 13805 decl); 13806 error = true; 13807 continue; 13808 } 13809 break; 13810 13811 default: 13812 if (global_bindings_p ()) 13813 { 13814 error_at (loc, "invalid OpenACC clause at file scope"); 13815 error = true; 13816 continue; 13817 } 13818 if (DECL_EXTERNAL (decl)) 13819 { 13820 error_at (loc, 13821 "invalid use of %<extern%> variable %qD " 13822 "in %<#pragma acc declare%>", decl); 13823 error = true; 13824 continue; 13825 } 13826 else if (TREE_PUBLIC (decl)) 13827 { 13828 error_at (loc, 13829 "invalid use of %<global%> variable %qD " 13830 "in %<#pragma acc declare%>", decl); 13831 error = true; 13832 continue; 13833 } 13834 break; 13835 } 13836 13837 if (lookup_attribute ("omp declare target", DECL_ATTRIBUTES (decl)) 13838 || lookup_attribute ("omp declare target link", 13839 DECL_ATTRIBUTES (decl))) 13840 { 13841 error_at (loc, "variable %qD used more than once with " 13842 "%<#pragma acc declare%>", decl); 13843 error = true; 13844 continue; 13845 } 13846 13847 if (!error) 13848 { 13849 tree id; 13850 13851 if (OMP_CLAUSE_MAP_KIND (t) == GOMP_MAP_LINK) 13852 id = get_identifier ("omp declare target link"); 13853 else 13854 id = get_identifier ("omp declare target"); 13855 13856 DECL_ATTRIBUTES (decl) 13857 = tree_cons (id, NULL_TREE, DECL_ATTRIBUTES (decl)); 13858 13859 if (global_bindings_p ()) 13860 { 13861 symtab_node *node = symtab_node::get (decl); 13862 if (node != NULL) 13863 { 13864 node->offloadable = 1; 13865 if (ENABLE_OFFLOADING) 13866 { 13867 g->have_offload = true; 13868 if (is_a <varpool_node *> (node)) 13869 vec_safe_push (offload_vars, decl); 13870 } 13871 } 13872 } 13873 } 13874 } 13875 13876 if (error || global_bindings_p ()) 13877 return; 13878 13879 stmt = make_node (OACC_DECLARE); 13880 TREE_TYPE (stmt) = void_type_node; 13881 OACC_DECLARE_CLAUSES (stmt) = clauses; 13882 SET_EXPR_LOCATION (stmt, pragma_loc); 13883 13884 add_stmt (stmt); 13885 13886 return; 13887 } 13888 13889 /* OpenACC 2.0: 13890 # pragma acc enter data oacc-enter-data-clause[optseq] new-line 13891 13892 or 13893 13894 # pragma acc exit data oacc-exit-data-clause[optseq] new-line 13895 13896 13897 LOC is the location of the #pragma token. 13898 */ 13899 13900 #define OACC_ENTER_DATA_CLAUSE_MASK \ 13901 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_IF) \ 13902 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_ASYNC) \ 13903 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_COPYIN) \ 13904 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_CREATE) \ 13905 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYIN) \ 13906 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_CREATE) \ 13907 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_WAIT) ) 13908 13909 #define OACC_EXIT_DATA_CLAUSE_MASK \ 13910 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_IF) \ 13911 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_ASYNC) \ 13912 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_COPYOUT) \ 13913 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_DELETE) \ 13914 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_WAIT) ) 13915 13916 static void 13917 c_parser_oacc_enter_exit_data (c_parser *parser, bool enter) 13918 { 13919 location_t loc = c_parser_peek_token (parser)->location; 13920 tree clauses, stmt; 13921 const char *p = ""; 13922 13923 c_parser_consume_pragma (parser); 13924 13925 if (c_parser_next_token_is (parser, CPP_NAME)) 13926 { 13927 p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value); 13928 c_parser_consume_token (parser); 13929 } 13930 13931 if (strcmp (p, "data") != 0) 13932 { 13933 error_at (loc, "expected %<data%> after %<#pragma acc %s%>", 13934 enter ? "enter" : "exit"); 13935 parser->error = true; 13936 c_parser_skip_to_pragma_eol (parser); 13937 return; 13938 } 13939 13940 if (enter) 13941 clauses = c_parser_oacc_all_clauses (parser, OACC_ENTER_DATA_CLAUSE_MASK, 13942 "#pragma acc enter data"); 13943 else 13944 clauses = c_parser_oacc_all_clauses (parser, OACC_EXIT_DATA_CLAUSE_MASK, 13945 "#pragma acc exit data"); 13946 13947 if (omp_find_clause (clauses, OMP_CLAUSE_MAP) == NULL_TREE) 13948 { 13949 error_at (loc, "%<#pragma acc %s data%> has no data movement clause", 13950 enter ? "enter" : "exit"); 13951 return; 13952 } 13953 13954 stmt = enter ? make_node (OACC_ENTER_DATA) : make_node (OACC_EXIT_DATA); 13955 TREE_TYPE (stmt) = void_type_node; 13956 OMP_STANDALONE_CLAUSES (stmt) = clauses; 13957 SET_EXPR_LOCATION (stmt, loc); 13958 add_stmt (stmt); 13959 } 13960 13961 13962 /* OpenACC 2.0: 13963 # pragma acc host_data oacc-data-clause[optseq] new-line 13964 structured-block 13965 */ 13966 13967 #define OACC_HOST_DATA_CLAUSE_MASK \ 13968 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_USE_DEVICE) ) 13969 13970 static tree 13971 c_parser_oacc_host_data (location_t loc, c_parser *parser, bool *if_p) 13972 { 13973 tree stmt, clauses, block; 13974 13975 clauses = c_parser_oacc_all_clauses (parser, OACC_HOST_DATA_CLAUSE_MASK, 13976 "#pragma acc host_data"); 13977 13978 block = c_begin_omp_parallel (); 13979 add_stmt (c_parser_omp_structured_block (parser, if_p)); 13980 stmt = c_finish_oacc_host_data (loc, clauses, block); 13981 return stmt; 13982 } 13983 13984 13985 /* OpenACC 2.0: 13986 13987 # pragma acc loop oacc-loop-clause[optseq] new-line 13988 structured-block 13989 13990 LOC is the location of the #pragma token. 13991 */ 13992 13993 #define OACC_LOOP_CLAUSE_MASK \ 13994 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_COLLAPSE) \ 13995 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRIVATE) \ 13996 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_REDUCTION) \ 13997 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_GANG) \ 13998 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_WORKER) \ 13999 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_VECTOR) \ 14000 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_AUTO) \ 14001 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_INDEPENDENT) \ 14002 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_SEQ) \ 14003 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_TILE) ) 14004 static tree 14005 c_parser_oacc_loop (location_t loc, c_parser *parser, char *p_name, 14006 omp_clause_mask mask, tree *cclauses, bool *if_p) 14007 { 14008 bool is_parallel = ((mask >> PRAGMA_OACC_CLAUSE_REDUCTION) & 1) == 1; 14009 14010 strcat (p_name, " loop"); 14011 mask |= OACC_LOOP_CLAUSE_MASK; 14012 14013 tree clauses = c_parser_oacc_all_clauses (parser, mask, p_name, 14014 cclauses == NULL); 14015 if (cclauses) 14016 { 14017 clauses = c_oacc_split_loop_clauses (clauses, cclauses, is_parallel); 14018 if (*cclauses) 14019 *cclauses = c_finish_omp_clauses (*cclauses, C_ORT_ACC); 14020 if (clauses) 14021 clauses = c_finish_omp_clauses (clauses, C_ORT_ACC); 14022 } 14023 14024 tree block = c_begin_compound_stmt (true); 14025 tree stmt = c_parser_omp_for_loop (loc, parser, OACC_LOOP, clauses, NULL, 14026 if_p); 14027 block = c_end_compound_stmt (loc, block, true); 14028 add_stmt (block); 14029 14030 return stmt; 14031 } 14032 14033 /* OpenACC 2.0: 14034 # pragma acc kernels oacc-kernels-clause[optseq] new-line 14035 structured-block 14036 14037 or 14038 14039 # pragma acc parallel oacc-parallel-clause[optseq] new-line 14040 structured-block 14041 14042 LOC is the location of the #pragma token. 14043 */ 14044 14045 #define OACC_KERNELS_CLAUSE_MASK \ 14046 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_ASYNC) \ 14047 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_COPY) \ 14048 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_COPYIN) \ 14049 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_COPYOUT) \ 14050 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_CREATE) \ 14051 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_DEFAULT) \ 14052 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_DEVICEPTR) \ 14053 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_IF) \ 14054 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT) \ 14055 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_COPY) \ 14056 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYIN) \ 14057 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYOUT) \ 14058 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_CREATE) \ 14059 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_WAIT) ) 14060 14061 #define OACC_PARALLEL_CLAUSE_MASK \ 14062 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_ASYNC) \ 14063 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_COPY) \ 14064 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_COPYIN) \ 14065 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_COPYOUT) \ 14066 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_CREATE) \ 14067 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_DEFAULT) \ 14068 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_DEVICEPTR) \ 14069 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_IF) \ 14070 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRIVATE) \ 14071 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_FIRSTPRIVATE) \ 14072 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_NUM_GANGS) \ 14073 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_NUM_WORKERS) \ 14074 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT) \ 14075 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_COPY) \ 14076 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYIN) \ 14077 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYOUT) \ 14078 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_CREATE) \ 14079 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_REDUCTION) \ 14080 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_VECTOR_LENGTH) \ 14081 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_WAIT) ) 14082 14083 static tree 14084 c_parser_oacc_kernels_parallel (location_t loc, c_parser *parser, 14085 enum pragma_kind p_kind, char *p_name, 14086 bool *if_p) 14087 { 14088 omp_clause_mask mask; 14089 enum tree_code code; 14090 switch (p_kind) 14091 { 14092 case PRAGMA_OACC_KERNELS: 14093 strcat (p_name, " kernels"); 14094 mask = OACC_KERNELS_CLAUSE_MASK; 14095 code = OACC_KERNELS; 14096 break; 14097 case PRAGMA_OACC_PARALLEL: 14098 strcat (p_name, " parallel"); 14099 mask = OACC_PARALLEL_CLAUSE_MASK; 14100 code = OACC_PARALLEL; 14101 break; 14102 default: 14103 gcc_unreachable (); 14104 } 14105 14106 if (c_parser_next_token_is (parser, CPP_NAME)) 14107 { 14108 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value); 14109 if (strcmp (p, "loop") == 0) 14110 { 14111 c_parser_consume_token (parser); 14112 tree block = c_begin_omp_parallel (); 14113 tree clauses; 14114 c_parser_oacc_loop (loc, parser, p_name, mask, &clauses, if_p); 14115 return c_finish_omp_construct (loc, code, block, clauses); 14116 } 14117 } 14118 14119 tree clauses = c_parser_oacc_all_clauses (parser, mask, p_name); 14120 14121 tree block = c_begin_omp_parallel (); 14122 add_stmt (c_parser_omp_structured_block (parser, if_p)); 14123 14124 return c_finish_omp_construct (loc, code, block, clauses); 14125 } 14126 14127 /* OpenACC 2.0: 14128 # pragma acc routine oacc-routine-clause[optseq] new-line 14129 function-definition 14130 14131 # pragma acc routine ( name ) oacc-routine-clause[optseq] new-line 14132 */ 14133 14134 #define OACC_ROUTINE_CLAUSE_MASK \ 14135 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_GANG) \ 14136 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_WORKER) \ 14137 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_VECTOR) \ 14138 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_SEQ) ) 14139 14140 /* Parse an OpenACC routine directive. For named directives, we apply 14141 immediately to the named function. For unnamed ones we then parse 14142 a declaration or definition, which must be for a function. */ 14143 14144 static void 14145 c_parser_oacc_routine (c_parser *parser, enum pragma_context context) 14146 { 14147 gcc_checking_assert (context == pragma_external); 14148 14149 oacc_routine_data data; 14150 data.error_seen = false; 14151 data.fndecl_seen = false; 14152 data.clauses = NULL_TREE; 14153 data.loc = c_parser_peek_token (parser)->location; 14154 14155 c_parser_consume_pragma (parser); 14156 14157 /* Look for optional '( name )'. */ 14158 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)) 14159 { 14160 c_parser_consume_token (parser); /* '(' */ 14161 14162 tree decl = NULL_TREE; 14163 c_token *name_token = c_parser_peek_token (parser); 14164 location_t name_loc = name_token->location; 14165 if (name_token->type == CPP_NAME 14166 && (name_token->id_kind == C_ID_ID 14167 || name_token->id_kind == C_ID_TYPENAME)) 14168 { 14169 decl = lookup_name (name_token->value); 14170 if (!decl) 14171 error_at (name_loc, 14172 "%qE has not been declared", name_token->value); 14173 c_parser_consume_token (parser); 14174 } 14175 else 14176 c_parser_error (parser, "expected function name"); 14177 14178 if (!decl 14179 || !c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>")) 14180 { 14181 c_parser_skip_to_pragma_eol (parser, false); 14182 return; 14183 } 14184 14185 data.clauses 14186 = c_parser_oacc_all_clauses (parser, OACC_ROUTINE_CLAUSE_MASK, 14187 "#pragma acc routine"); 14188 14189 if (TREE_CODE (decl) != FUNCTION_DECL) 14190 { 14191 error_at (name_loc, "%qD does not refer to a function", decl); 14192 return; 14193 } 14194 14195 c_finish_oacc_routine (&data, decl, false); 14196 } 14197 else /* No optional '( name )'. */ 14198 { 14199 data.clauses 14200 = c_parser_oacc_all_clauses (parser, OACC_ROUTINE_CLAUSE_MASK, 14201 "#pragma acc routine"); 14202 14203 /* Emit a helpful diagnostic if there's another pragma following this 14204 one. Also don't allow a static assertion declaration, as in the 14205 following we'll just parse a *single* "declaration or function 14206 definition", and the static assertion counts an one. */ 14207 if (c_parser_next_token_is (parser, CPP_PRAGMA) 14208 || c_parser_next_token_is_keyword (parser, RID_STATIC_ASSERT)) 14209 { 14210 error_at (data.loc, 14211 "%<#pragma acc routine%> not immediately followed by" 14212 " function declaration or definition"); 14213 /* ..., and then just keep going. */ 14214 return; 14215 } 14216 14217 /* We only have to consider the pragma_external case here. */ 14218 if (c_parser_next_token_is (parser, CPP_KEYWORD) 14219 && c_parser_peek_token (parser)->keyword == RID_EXTENSION) 14220 { 14221 int ext = disable_extension_diagnostics (); 14222 do 14223 c_parser_consume_token (parser); 14224 while (c_parser_next_token_is (parser, CPP_KEYWORD) 14225 && c_parser_peek_token (parser)->keyword == RID_EXTENSION); 14226 c_parser_declaration_or_fndef (parser, true, true, true, false, true, 14227 NULL, vNULL, &data); 14228 restore_extension_diagnostics (ext); 14229 } 14230 else 14231 c_parser_declaration_or_fndef (parser, true, true, true, false, true, 14232 NULL, vNULL, &data); 14233 } 14234 } 14235 14236 /* Finalize an OpenACC routine pragma, applying it to FNDECL. 14237 IS_DEFN is true if we're applying it to the definition. */ 14238 14239 static void 14240 c_finish_oacc_routine (struct oacc_routine_data *data, tree fndecl, 14241 bool is_defn) 14242 { 14243 /* Keep going if we're in error reporting mode. */ 14244 if (data->error_seen 14245 || fndecl == error_mark_node) 14246 return; 14247 14248 if (data->fndecl_seen) 14249 { 14250 error_at (data->loc, 14251 "%<#pragma acc routine%> not immediately followed by" 14252 " a single function declaration or definition"); 14253 data->error_seen = true; 14254 return; 14255 } 14256 if (fndecl == NULL_TREE || TREE_CODE (fndecl) != FUNCTION_DECL) 14257 { 14258 error_at (data->loc, 14259 "%<#pragma acc routine%> not immediately followed by" 14260 " function declaration or definition"); 14261 data->error_seen = true; 14262 return; 14263 } 14264 14265 if (oacc_get_fn_attrib (fndecl)) 14266 { 14267 error_at (data->loc, 14268 "%<#pragma acc routine%> already applied to %qD", fndecl); 14269 data->error_seen = true; 14270 return; 14271 } 14272 14273 if (TREE_USED (fndecl) || (!is_defn && DECL_SAVED_TREE (fndecl))) 14274 { 14275 error_at (data->loc, 14276 TREE_USED (fndecl) 14277 ? G_("%<#pragma acc routine%> must be applied before use") 14278 : G_("%<#pragma acc routine%> must be applied before " 14279 "definition")); 14280 data->error_seen = true; 14281 return; 14282 } 14283 14284 /* Process the routine's dimension clauses. */ 14285 tree dims = oacc_build_routine_dims (data->clauses); 14286 oacc_replace_fn_attrib (fndecl, dims); 14287 14288 /* Add an "omp declare target" attribute. */ 14289 DECL_ATTRIBUTES (fndecl) 14290 = tree_cons (get_identifier ("omp declare target"), 14291 NULL_TREE, DECL_ATTRIBUTES (fndecl)); 14292 14293 /* Remember that we've used this "#pragma acc routine". */ 14294 data->fndecl_seen = true; 14295 } 14296 14297 /* OpenACC 2.0: 14298 # pragma acc update oacc-update-clause[optseq] new-line 14299 */ 14300 14301 #define OACC_UPDATE_CLAUSE_MASK \ 14302 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_ASYNC) \ 14303 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_DEVICE) \ 14304 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_HOST) \ 14305 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_IF) \ 14306 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_SELF) \ 14307 | (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_WAIT) ) 14308 14309 static void 14310 c_parser_oacc_update (c_parser *parser) 14311 { 14312 location_t loc = c_parser_peek_token (parser)->location; 14313 14314 c_parser_consume_pragma (parser); 14315 14316 tree clauses = c_parser_oacc_all_clauses (parser, OACC_UPDATE_CLAUSE_MASK, 14317 "#pragma acc update"); 14318 if (omp_find_clause (clauses, OMP_CLAUSE_MAP) == NULL_TREE) 14319 { 14320 error_at (loc, 14321 "%<#pragma acc update%> must contain at least one " 14322 "%<device%> or %<host%> or %<self%> clause"); 14323 return; 14324 } 14325 14326 if (parser->error) 14327 return; 14328 14329 tree stmt = make_node (OACC_UPDATE); 14330 TREE_TYPE (stmt) = void_type_node; 14331 OACC_UPDATE_CLAUSES (stmt) = clauses; 14332 SET_EXPR_LOCATION (stmt, loc); 14333 add_stmt (stmt); 14334 } 14335 14336 /* OpenACC 2.0: 14337 # pragma acc wait [(intseq)] oacc-wait-clause[optseq] new-line 14338 14339 LOC is the location of the #pragma token. 14340 */ 14341 14342 #define OACC_WAIT_CLAUSE_MASK \ 14343 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_ASYNC) ) 14344 14345 static tree 14346 c_parser_oacc_wait (location_t loc, c_parser *parser, char *p_name) 14347 { 14348 tree clauses, list = NULL_TREE, stmt = NULL_TREE; 14349 14350 if (c_parser_peek_token (parser)->type == CPP_OPEN_PAREN) 14351 list = c_parser_oacc_wait_list (parser, loc, list); 14352 14353 strcpy (p_name, " wait"); 14354 clauses = c_parser_oacc_all_clauses (parser, OACC_WAIT_CLAUSE_MASK, p_name); 14355 stmt = c_finish_oacc_wait (loc, list, clauses); 14356 add_stmt (stmt); 14357 14358 return stmt; 14359 } 14360 14361 /* OpenMP 2.5: 14362 # pragma omp atomic new-line 14363 expression-stmt 14364 14365 expression-stmt: 14366 x binop= expr | x++ | ++x | x-- | --x 14367 binop: 14368 +, *, -, /, &, ^, |, <<, >> 14369 14370 where x is an lvalue expression with scalar type. 14371 14372 OpenMP 3.1: 14373 # pragma omp atomic new-line 14374 update-stmt 14375 14376 # pragma omp atomic read new-line 14377 read-stmt 14378 14379 # pragma omp atomic write new-line 14380 write-stmt 14381 14382 # pragma omp atomic update new-line 14383 update-stmt 14384 14385 # pragma omp atomic capture new-line 14386 capture-stmt 14387 14388 # pragma omp atomic capture new-line 14389 capture-block 14390 14391 read-stmt: 14392 v = x 14393 write-stmt: 14394 x = expr 14395 update-stmt: 14396 expression-stmt | x = x binop expr 14397 capture-stmt: 14398 v = expression-stmt 14399 capture-block: 14400 { v = x; update-stmt; } | { update-stmt; v = x; } 14401 14402 OpenMP 4.0: 14403 update-stmt: 14404 expression-stmt | x = x binop expr | x = expr binop x 14405 capture-stmt: 14406 v = update-stmt 14407 capture-block: 14408 { v = x; update-stmt; } | { update-stmt; v = x; } | { v = x; x = expr; } 14409 14410 where x and v are lvalue expressions with scalar type. 14411 14412 LOC is the location of the #pragma token. */ 14413 14414 static void 14415 c_parser_omp_atomic (location_t loc, c_parser *parser) 14416 { 14417 tree lhs = NULL_TREE, rhs = NULL_TREE, v = NULL_TREE; 14418 tree lhs1 = NULL_TREE, rhs1 = NULL_TREE; 14419 tree stmt, orig_lhs, unfolded_lhs = NULL_TREE, unfolded_lhs1 = NULL_TREE; 14420 enum tree_code code = OMP_ATOMIC, opcode = NOP_EXPR; 14421 struct c_expr expr; 14422 location_t eloc; 14423 bool structured_block = false; 14424 bool swapped = false; 14425 bool seq_cst = false; 14426 bool non_lvalue_p; 14427 14428 if (c_parser_next_token_is (parser, CPP_NAME)) 14429 { 14430 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value); 14431 if (!strcmp (p, "seq_cst")) 14432 { 14433 seq_cst = true; 14434 c_parser_consume_token (parser); 14435 if (c_parser_next_token_is (parser, CPP_COMMA) 14436 && c_parser_peek_2nd_token (parser)->type == CPP_NAME) 14437 c_parser_consume_token (parser); 14438 } 14439 } 14440 if (c_parser_next_token_is (parser, CPP_NAME)) 14441 { 14442 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value); 14443 14444 if (!strcmp (p, "read")) 14445 code = OMP_ATOMIC_READ; 14446 else if (!strcmp (p, "write")) 14447 code = NOP_EXPR; 14448 else if (!strcmp (p, "update")) 14449 code = OMP_ATOMIC; 14450 else if (!strcmp (p, "capture")) 14451 code = OMP_ATOMIC_CAPTURE_NEW; 14452 else 14453 p = NULL; 14454 if (p) 14455 c_parser_consume_token (parser); 14456 } 14457 if (!seq_cst) 14458 { 14459 if (c_parser_next_token_is (parser, CPP_COMMA) 14460 && c_parser_peek_2nd_token (parser)->type == CPP_NAME) 14461 c_parser_consume_token (parser); 14462 14463 if (c_parser_next_token_is (parser, CPP_NAME)) 14464 { 14465 const char *p 14466 = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value); 14467 if (!strcmp (p, "seq_cst")) 14468 { 14469 seq_cst = true; 14470 c_parser_consume_token (parser); 14471 } 14472 } 14473 } 14474 c_parser_skip_to_pragma_eol (parser); 14475 14476 switch (code) 14477 { 14478 case OMP_ATOMIC_READ: 14479 case NOP_EXPR: /* atomic write */ 14480 v = c_parser_cast_expression (parser, NULL).value; 14481 non_lvalue_p = !lvalue_p (v); 14482 v = c_fully_fold (v, false, NULL); 14483 if (v == error_mark_node) 14484 goto saw_error; 14485 if (non_lvalue_p) 14486 v = non_lvalue (v); 14487 loc = c_parser_peek_token (parser)->location; 14488 if (!c_parser_require (parser, CPP_EQ, "expected %<=%>")) 14489 goto saw_error; 14490 if (code == NOP_EXPR) 14491 { 14492 lhs = c_parser_expression (parser).value; 14493 lhs = c_fully_fold (lhs, false, NULL); 14494 if (lhs == error_mark_node) 14495 goto saw_error; 14496 } 14497 else 14498 { 14499 lhs = c_parser_cast_expression (parser, NULL).value; 14500 non_lvalue_p = !lvalue_p (lhs); 14501 lhs = c_fully_fold (lhs, false, NULL); 14502 if (lhs == error_mark_node) 14503 goto saw_error; 14504 if (non_lvalue_p) 14505 lhs = non_lvalue (lhs); 14506 } 14507 if (code == NOP_EXPR) 14508 { 14509 /* atomic write is represented by OMP_ATOMIC with NOP_EXPR 14510 opcode. */ 14511 code = OMP_ATOMIC; 14512 rhs = lhs; 14513 lhs = v; 14514 v = NULL_TREE; 14515 } 14516 goto done; 14517 case OMP_ATOMIC_CAPTURE_NEW: 14518 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE)) 14519 { 14520 c_parser_consume_token (parser); 14521 structured_block = true; 14522 } 14523 else 14524 { 14525 v = c_parser_cast_expression (parser, NULL).value; 14526 non_lvalue_p = !lvalue_p (v); 14527 v = c_fully_fold (v, false, NULL); 14528 if (v == error_mark_node) 14529 goto saw_error; 14530 if (non_lvalue_p) 14531 v = non_lvalue (v); 14532 if (!c_parser_require (parser, CPP_EQ, "expected %<=%>")) 14533 goto saw_error; 14534 } 14535 break; 14536 default: 14537 break; 14538 } 14539 14540 /* For structured_block case we don't know yet whether 14541 old or new x should be captured. */ 14542 restart: 14543 eloc = c_parser_peek_token (parser)->location; 14544 expr = c_parser_cast_expression (parser, NULL); 14545 lhs = expr.value; 14546 expr = default_function_array_conversion (eloc, expr); 14547 unfolded_lhs = expr.value; 14548 lhs = c_fully_fold (lhs, false, NULL); 14549 orig_lhs = lhs; 14550 switch (TREE_CODE (lhs)) 14551 { 14552 case ERROR_MARK: 14553 saw_error: 14554 c_parser_skip_to_end_of_block_or_statement (parser); 14555 if (structured_block) 14556 { 14557 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE)) 14558 c_parser_consume_token (parser); 14559 else if (code == OMP_ATOMIC_CAPTURE_NEW) 14560 { 14561 c_parser_skip_to_end_of_block_or_statement (parser); 14562 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE)) 14563 c_parser_consume_token (parser); 14564 } 14565 } 14566 return; 14567 14568 case POSTINCREMENT_EXPR: 14569 if (code == OMP_ATOMIC_CAPTURE_NEW && !structured_block) 14570 code = OMP_ATOMIC_CAPTURE_OLD; 14571 /* FALLTHROUGH */ 14572 case PREINCREMENT_EXPR: 14573 lhs = TREE_OPERAND (lhs, 0); 14574 unfolded_lhs = NULL_TREE; 14575 opcode = PLUS_EXPR; 14576 rhs = integer_one_node; 14577 break; 14578 14579 case POSTDECREMENT_EXPR: 14580 if (code == OMP_ATOMIC_CAPTURE_NEW && !structured_block) 14581 code = OMP_ATOMIC_CAPTURE_OLD; 14582 /* FALLTHROUGH */ 14583 case PREDECREMENT_EXPR: 14584 lhs = TREE_OPERAND (lhs, 0); 14585 unfolded_lhs = NULL_TREE; 14586 opcode = MINUS_EXPR; 14587 rhs = integer_one_node; 14588 break; 14589 14590 case COMPOUND_EXPR: 14591 if (TREE_CODE (TREE_OPERAND (lhs, 0)) == SAVE_EXPR 14592 && TREE_CODE (TREE_OPERAND (lhs, 1)) == COMPOUND_EXPR 14593 && TREE_CODE (TREE_OPERAND (TREE_OPERAND (lhs, 1), 0)) == MODIFY_EXPR 14594 && TREE_OPERAND (TREE_OPERAND (lhs, 1), 1) == TREE_OPERAND (lhs, 0) 14595 && TREE_CODE (TREE_TYPE (TREE_OPERAND (TREE_OPERAND 14596 (TREE_OPERAND (lhs, 1), 0), 0))) 14597 == BOOLEAN_TYPE) 14598 /* Undo effects of boolean_increment for post {in,de}crement. */ 14599 lhs = TREE_OPERAND (TREE_OPERAND (lhs, 1), 0); 14600 /* FALLTHRU */ 14601 case MODIFY_EXPR: 14602 if (TREE_CODE (lhs) == MODIFY_EXPR 14603 && TREE_CODE (TREE_TYPE (TREE_OPERAND (lhs, 0))) == BOOLEAN_TYPE) 14604 { 14605 /* Undo effects of boolean_increment. */ 14606 if (integer_onep (TREE_OPERAND (lhs, 1))) 14607 { 14608 /* This is pre or post increment. */ 14609 rhs = TREE_OPERAND (lhs, 1); 14610 lhs = TREE_OPERAND (lhs, 0); 14611 unfolded_lhs = NULL_TREE; 14612 opcode = NOP_EXPR; 14613 if (code == OMP_ATOMIC_CAPTURE_NEW 14614 && !structured_block 14615 && TREE_CODE (orig_lhs) == COMPOUND_EXPR) 14616 code = OMP_ATOMIC_CAPTURE_OLD; 14617 break; 14618 } 14619 if (TREE_CODE (TREE_OPERAND (lhs, 1)) == TRUTH_NOT_EXPR 14620 && TREE_OPERAND (lhs, 0) 14621 == TREE_OPERAND (TREE_OPERAND (lhs, 1), 0)) 14622 { 14623 /* This is pre or post decrement. */ 14624 rhs = TREE_OPERAND (lhs, 1); 14625 lhs = TREE_OPERAND (lhs, 0); 14626 unfolded_lhs = NULL_TREE; 14627 opcode = NOP_EXPR; 14628 if (code == OMP_ATOMIC_CAPTURE_NEW 14629 && !structured_block 14630 && TREE_CODE (orig_lhs) == COMPOUND_EXPR) 14631 code = OMP_ATOMIC_CAPTURE_OLD; 14632 break; 14633 } 14634 } 14635 /* FALLTHRU */ 14636 default: 14637 if (!lvalue_p (unfolded_lhs)) 14638 lhs = non_lvalue (lhs); 14639 switch (c_parser_peek_token (parser)->type) 14640 { 14641 case CPP_MULT_EQ: 14642 opcode = MULT_EXPR; 14643 break; 14644 case CPP_DIV_EQ: 14645 opcode = TRUNC_DIV_EXPR; 14646 break; 14647 case CPP_PLUS_EQ: 14648 opcode = PLUS_EXPR; 14649 break; 14650 case CPP_MINUS_EQ: 14651 opcode = MINUS_EXPR; 14652 break; 14653 case CPP_LSHIFT_EQ: 14654 opcode = LSHIFT_EXPR; 14655 break; 14656 case CPP_RSHIFT_EQ: 14657 opcode = RSHIFT_EXPR; 14658 break; 14659 case CPP_AND_EQ: 14660 opcode = BIT_AND_EXPR; 14661 break; 14662 case CPP_OR_EQ: 14663 opcode = BIT_IOR_EXPR; 14664 break; 14665 case CPP_XOR_EQ: 14666 opcode = BIT_XOR_EXPR; 14667 break; 14668 case CPP_EQ: 14669 c_parser_consume_token (parser); 14670 eloc = c_parser_peek_token (parser)->location; 14671 expr = c_parser_expr_no_commas (parser, NULL, unfolded_lhs); 14672 rhs1 = expr.value; 14673 switch (TREE_CODE (rhs1)) 14674 { 14675 case MULT_EXPR: 14676 case TRUNC_DIV_EXPR: 14677 case RDIV_EXPR: 14678 case PLUS_EXPR: 14679 case MINUS_EXPR: 14680 case LSHIFT_EXPR: 14681 case RSHIFT_EXPR: 14682 case BIT_AND_EXPR: 14683 case BIT_IOR_EXPR: 14684 case BIT_XOR_EXPR: 14685 if (c_tree_equal (TREE_OPERAND (rhs1, 0), unfolded_lhs)) 14686 { 14687 opcode = TREE_CODE (rhs1); 14688 rhs = c_fully_fold (TREE_OPERAND (rhs1, 1), false, NULL); 14689 rhs1 = c_fully_fold (TREE_OPERAND (rhs1, 0), false, NULL); 14690 goto stmt_done; 14691 } 14692 if (c_tree_equal (TREE_OPERAND (rhs1, 1), unfolded_lhs)) 14693 { 14694 opcode = TREE_CODE (rhs1); 14695 rhs = c_fully_fold (TREE_OPERAND (rhs1, 0), false, NULL); 14696 rhs1 = c_fully_fold (TREE_OPERAND (rhs1, 1), false, NULL); 14697 swapped = !commutative_tree_code (opcode); 14698 goto stmt_done; 14699 } 14700 break; 14701 case ERROR_MARK: 14702 goto saw_error; 14703 default: 14704 break; 14705 } 14706 if (c_parser_peek_token (parser)->type == CPP_SEMICOLON) 14707 { 14708 if (structured_block && code == OMP_ATOMIC_CAPTURE_NEW) 14709 { 14710 code = OMP_ATOMIC_CAPTURE_OLD; 14711 v = lhs; 14712 lhs = NULL_TREE; 14713 expr = default_function_array_read_conversion (eloc, expr); 14714 unfolded_lhs1 = expr.value; 14715 lhs1 = c_fully_fold (unfolded_lhs1, false, NULL); 14716 rhs1 = NULL_TREE; 14717 c_parser_consume_token (parser); 14718 goto restart; 14719 } 14720 if (structured_block) 14721 { 14722 opcode = NOP_EXPR; 14723 expr = default_function_array_read_conversion (eloc, expr); 14724 rhs = c_fully_fold (expr.value, false, NULL); 14725 rhs1 = NULL_TREE; 14726 goto stmt_done; 14727 } 14728 } 14729 c_parser_error (parser, "invalid form of %<#pragma omp atomic%>"); 14730 goto saw_error; 14731 default: 14732 c_parser_error (parser, 14733 "invalid operator for %<#pragma omp atomic%>"); 14734 goto saw_error; 14735 } 14736 14737 /* Arrange to pass the location of the assignment operator to 14738 c_finish_omp_atomic. */ 14739 loc = c_parser_peek_token (parser)->location; 14740 c_parser_consume_token (parser); 14741 eloc = c_parser_peek_token (parser)->location; 14742 expr = c_parser_expression (parser); 14743 expr = default_function_array_read_conversion (eloc, expr); 14744 rhs = expr.value; 14745 rhs = c_fully_fold (rhs, false, NULL); 14746 break; 14747 } 14748 stmt_done: 14749 if (structured_block && code == OMP_ATOMIC_CAPTURE_NEW) 14750 { 14751 if (!c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>")) 14752 goto saw_error; 14753 v = c_parser_cast_expression (parser, NULL).value; 14754 non_lvalue_p = !lvalue_p (v); 14755 v = c_fully_fold (v, false, NULL); 14756 if (v == error_mark_node) 14757 goto saw_error; 14758 if (non_lvalue_p) 14759 v = non_lvalue (v); 14760 if (!c_parser_require (parser, CPP_EQ, "expected %<=%>")) 14761 goto saw_error; 14762 eloc = c_parser_peek_token (parser)->location; 14763 expr = c_parser_cast_expression (parser, NULL); 14764 lhs1 = expr.value; 14765 expr = default_function_array_read_conversion (eloc, expr); 14766 unfolded_lhs1 = expr.value; 14767 lhs1 = c_fully_fold (lhs1, false, NULL); 14768 if (lhs1 == error_mark_node) 14769 goto saw_error; 14770 if (!lvalue_p (unfolded_lhs1)) 14771 lhs1 = non_lvalue (lhs1); 14772 } 14773 if (structured_block) 14774 { 14775 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>"); 14776 c_parser_require (parser, CPP_CLOSE_BRACE, "expected %<}%>"); 14777 } 14778 done: 14779 if (unfolded_lhs && unfolded_lhs1 14780 && !c_tree_equal (unfolded_lhs, unfolded_lhs1)) 14781 { 14782 error ("%<#pragma omp atomic capture%> uses two different " 14783 "expressions for memory"); 14784 stmt = error_mark_node; 14785 } 14786 else 14787 stmt = c_finish_omp_atomic (loc, code, opcode, lhs, rhs, v, lhs1, rhs1, 14788 swapped, seq_cst); 14789 if (stmt != error_mark_node) 14790 add_stmt (stmt); 14791 14792 if (!structured_block) 14793 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>"); 14794 } 14795 14796 14797 /* OpenMP 2.5: 14798 # pragma omp barrier new-line 14799 */ 14800 14801 static void 14802 c_parser_omp_barrier (c_parser *parser) 14803 { 14804 location_t loc = c_parser_peek_token (parser)->location; 14805 c_parser_consume_pragma (parser); 14806 c_parser_skip_to_pragma_eol (parser); 14807 14808 c_finish_omp_barrier (loc); 14809 } 14810 14811 /* OpenMP 2.5: 14812 # pragma omp critical [(name)] new-line 14813 structured-block 14814 14815 OpenMP 4.5: 14816 # pragma omp critical [(name) [hint(expression)]] new-line 14817 14818 LOC is the location of the #pragma itself. */ 14819 14820 #define OMP_CRITICAL_CLAUSE_MASK \ 14821 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_HINT) ) 14822 14823 static tree 14824 c_parser_omp_critical (location_t loc, c_parser *parser, bool *if_p) 14825 { 14826 tree stmt, name = NULL_TREE, clauses = NULL_TREE; 14827 14828 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)) 14829 { 14830 c_parser_consume_token (parser); 14831 if (c_parser_next_token_is (parser, CPP_NAME)) 14832 { 14833 name = c_parser_peek_token (parser)->value; 14834 c_parser_consume_token (parser); 14835 c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 14836 } 14837 else 14838 c_parser_error (parser, "expected identifier"); 14839 14840 clauses = c_parser_omp_all_clauses (parser, 14841 OMP_CRITICAL_CLAUSE_MASK, 14842 "#pragma omp critical"); 14843 } 14844 else 14845 { 14846 if (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL)) 14847 c_parser_error (parser, "expected %<(%> or end of line"); 14848 c_parser_skip_to_pragma_eol (parser); 14849 } 14850 14851 stmt = c_parser_omp_structured_block (parser, if_p); 14852 return c_finish_omp_critical (loc, stmt, name, clauses); 14853 } 14854 14855 /* OpenMP 2.5: 14856 # pragma omp flush flush-vars[opt] new-line 14857 14858 flush-vars: 14859 ( variable-list ) */ 14860 14861 static void 14862 c_parser_omp_flush (c_parser *parser) 14863 { 14864 location_t loc = c_parser_peek_token (parser)->location; 14865 c_parser_consume_pragma (parser); 14866 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)) 14867 c_parser_omp_var_list_parens (parser, OMP_CLAUSE_ERROR, NULL); 14868 else if (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL)) 14869 c_parser_error (parser, "expected %<(%> or end of line"); 14870 c_parser_skip_to_pragma_eol (parser); 14871 14872 c_finish_omp_flush (loc); 14873 } 14874 14875 /* Parse the restricted form of loop statements allowed by OpenACC and OpenMP. 14876 The real trick here is to determine the loop control variable early 14877 so that we can push a new decl if necessary to make it private. 14878 LOC is the location of the "acc" or "omp" in "#pragma acc" or "#pragma omp", 14879 respectively. */ 14880 14881 static tree 14882 c_parser_omp_for_loop (location_t loc, c_parser *parser, enum tree_code code, 14883 tree clauses, tree *cclauses, bool *if_p) 14884 { 14885 tree decl, cond, incr, save_break, save_cont, body, init, stmt, cl; 14886 tree declv, condv, incrv, initv, ret = NULL_TREE; 14887 tree pre_body = NULL_TREE, this_pre_body; 14888 tree ordered_cl = NULL_TREE; 14889 bool fail = false, open_brace_parsed = false; 14890 int i, collapse = 1, ordered = 0, count, nbraces = 0; 14891 location_t for_loc; 14892 bool tiling = false; 14893 vec<tree, va_gc> *for_block = make_tree_vector (); 14894 14895 for (cl = clauses; cl; cl = OMP_CLAUSE_CHAIN (cl)) 14896 if (OMP_CLAUSE_CODE (cl) == OMP_CLAUSE_COLLAPSE) 14897 collapse = tree_to_shwi (OMP_CLAUSE_COLLAPSE_EXPR (cl)); 14898 else if (OMP_CLAUSE_CODE (cl) == OMP_CLAUSE_TILE) 14899 { 14900 tiling = true; 14901 collapse = list_length (OMP_CLAUSE_TILE_LIST (cl)); 14902 } 14903 else if (OMP_CLAUSE_CODE (cl) == OMP_CLAUSE_ORDERED 14904 && OMP_CLAUSE_ORDERED_EXPR (cl)) 14905 { 14906 ordered_cl = cl; 14907 ordered = tree_to_shwi (OMP_CLAUSE_ORDERED_EXPR (cl)); 14908 } 14909 14910 if (ordered && ordered < collapse) 14911 { 14912 error_at (OMP_CLAUSE_LOCATION (ordered_cl), 14913 "%<ordered%> clause parameter is less than %<collapse%>"); 14914 OMP_CLAUSE_ORDERED_EXPR (ordered_cl) 14915 = build_int_cst (NULL_TREE, collapse); 14916 ordered = collapse; 14917 } 14918 if (ordered) 14919 { 14920 for (tree *pc = &clauses; *pc; ) 14921 if (OMP_CLAUSE_CODE (*pc) == OMP_CLAUSE_LINEAR) 14922 { 14923 error_at (OMP_CLAUSE_LOCATION (*pc), 14924 "%<linear%> clause may not be specified together " 14925 "with %<ordered%> clause with a parameter"); 14926 *pc = OMP_CLAUSE_CHAIN (*pc); 14927 } 14928 else 14929 pc = &OMP_CLAUSE_CHAIN (*pc); 14930 } 14931 14932 gcc_assert (tiling || (collapse >= 1 && ordered >= 0)); 14933 count = ordered ? ordered : collapse; 14934 14935 declv = make_tree_vec (count); 14936 initv = make_tree_vec (count); 14937 condv = make_tree_vec (count); 14938 incrv = make_tree_vec (count); 14939 14940 if (code != CILK_FOR 14941 && !c_parser_next_token_is_keyword (parser, RID_FOR)) 14942 { 14943 c_parser_error (parser, "for statement expected"); 14944 return NULL; 14945 } 14946 if (code == CILK_FOR 14947 && !c_parser_next_token_is_keyword (parser, RID_CILK_FOR)) 14948 { 14949 c_parser_error (parser, "_Cilk_for statement expected"); 14950 return NULL; 14951 } 14952 for_loc = c_parser_peek_token (parser)->location; 14953 c_parser_consume_token (parser); 14954 14955 for (i = 0; i < count; i++) 14956 { 14957 int bracecount = 0; 14958 14959 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 14960 goto pop_scopes; 14961 14962 /* Parse the initialization declaration or expression. */ 14963 if (c_parser_next_tokens_start_declaration (parser)) 14964 { 14965 if (i > 0) 14966 vec_safe_push (for_block, c_begin_compound_stmt (true)); 14967 this_pre_body = push_stmt_list (); 14968 c_parser_declaration_or_fndef (parser, true, true, true, true, true, 14969 NULL, vNULL); 14970 if (this_pre_body) 14971 { 14972 this_pre_body = pop_stmt_list (this_pre_body); 14973 if (pre_body) 14974 { 14975 tree t = pre_body; 14976 pre_body = push_stmt_list (); 14977 add_stmt (t); 14978 add_stmt (this_pre_body); 14979 pre_body = pop_stmt_list (pre_body); 14980 } 14981 else 14982 pre_body = this_pre_body; 14983 } 14984 decl = check_for_loop_decls (for_loc, flag_isoc99); 14985 if (decl == NULL) 14986 goto error_init; 14987 if (DECL_INITIAL (decl) == error_mark_node) 14988 decl = error_mark_node; 14989 init = decl; 14990 } 14991 else if (c_parser_next_token_is (parser, CPP_NAME) 14992 && c_parser_peek_2nd_token (parser)->type == CPP_EQ) 14993 { 14994 struct c_expr decl_exp; 14995 struct c_expr init_exp; 14996 location_t init_loc; 14997 14998 decl_exp = c_parser_postfix_expression (parser); 14999 decl = decl_exp.value; 15000 15001 c_parser_require (parser, CPP_EQ, "expected %<=%>"); 15002 15003 init_loc = c_parser_peek_token (parser)->location; 15004 init_exp = c_parser_expr_no_commas (parser, NULL); 15005 init_exp = default_function_array_read_conversion (init_loc, 15006 init_exp); 15007 init = build_modify_expr (init_loc, decl, decl_exp.original_type, 15008 NOP_EXPR, init_loc, init_exp.value, 15009 init_exp.original_type); 15010 init = c_process_expr_stmt (init_loc, init); 15011 15012 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>"); 15013 } 15014 else 15015 { 15016 error_init: 15017 c_parser_error (parser, 15018 "expected iteration declaration or initialization"); 15019 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 15020 "expected %<)%>"); 15021 fail = true; 15022 goto parse_next; 15023 } 15024 15025 /* Parse the loop condition. */ 15026 cond = NULL_TREE; 15027 if (c_parser_next_token_is_not (parser, CPP_SEMICOLON)) 15028 { 15029 location_t cond_loc = c_parser_peek_token (parser)->location; 15030 struct c_expr cond_expr 15031 = c_parser_binary_expression (parser, NULL, NULL_TREE); 15032 15033 cond = cond_expr.value; 15034 cond = c_objc_common_truthvalue_conversion (cond_loc, cond); 15035 if (COMPARISON_CLASS_P (cond)) 15036 { 15037 tree op0 = TREE_OPERAND (cond, 0), op1 = TREE_OPERAND (cond, 1); 15038 op0 = c_fully_fold (op0, false, NULL); 15039 op1 = c_fully_fold (op1, false, NULL); 15040 TREE_OPERAND (cond, 0) = op0; 15041 TREE_OPERAND (cond, 1) = op1; 15042 } 15043 switch (cond_expr.original_code) 15044 { 15045 case GT_EXPR: 15046 case GE_EXPR: 15047 case LT_EXPR: 15048 case LE_EXPR: 15049 break; 15050 case NE_EXPR: 15051 if (code == CILK_SIMD || code == CILK_FOR) 15052 break; 15053 /* FALLTHRU. */ 15054 default: 15055 /* Can't be cond = error_mark_node, because we want to preserve 15056 the location until c_finish_omp_for. */ 15057 cond = build1 (NOP_EXPR, boolean_type_node, error_mark_node); 15058 break; 15059 } 15060 protected_set_expr_location (cond, cond_loc); 15061 } 15062 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>"); 15063 15064 /* Parse the increment expression. */ 15065 incr = NULL_TREE; 15066 if (c_parser_next_token_is_not (parser, CPP_CLOSE_PAREN)) 15067 { 15068 location_t incr_loc = c_parser_peek_token (parser)->location; 15069 15070 incr = c_process_expr_stmt (incr_loc, 15071 c_parser_expression (parser).value); 15072 } 15073 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 15074 15075 if (decl == NULL || decl == error_mark_node || init == error_mark_node) 15076 fail = true; 15077 else 15078 { 15079 TREE_VEC_ELT (declv, i) = decl; 15080 TREE_VEC_ELT (initv, i) = init; 15081 TREE_VEC_ELT (condv, i) = cond; 15082 TREE_VEC_ELT (incrv, i) = incr; 15083 } 15084 15085 parse_next: 15086 if (i == count - 1) 15087 break; 15088 15089 /* FIXME: OpenMP 3.0 draft isn't very clear on what exactly is allowed 15090 in between the collapsed for loops to be still considered perfectly 15091 nested. Hopefully the final version clarifies this. 15092 For now handle (multiple) {'s and empty statements. */ 15093 do 15094 { 15095 if (c_parser_next_token_is_keyword (parser, RID_FOR)) 15096 { 15097 c_parser_consume_token (parser); 15098 break; 15099 } 15100 else if (c_parser_next_token_is (parser, CPP_OPEN_BRACE)) 15101 { 15102 c_parser_consume_token (parser); 15103 bracecount++; 15104 } 15105 else if (bracecount 15106 && c_parser_next_token_is (parser, CPP_SEMICOLON)) 15107 c_parser_consume_token (parser); 15108 else 15109 { 15110 c_parser_error (parser, "not enough perfectly nested loops"); 15111 if (bracecount) 15112 { 15113 open_brace_parsed = true; 15114 bracecount--; 15115 } 15116 fail = true; 15117 count = 0; 15118 break; 15119 } 15120 } 15121 while (1); 15122 15123 nbraces += bracecount; 15124 } 15125 15126 if (nbraces) 15127 if_p = NULL; 15128 15129 save_break = c_break_label; 15130 if (code == CILK_SIMD) 15131 c_break_label = build_int_cst (size_type_node, 2); 15132 else 15133 c_break_label = size_one_node; 15134 save_cont = c_cont_label; 15135 c_cont_label = NULL_TREE; 15136 body = push_stmt_list (); 15137 15138 if (open_brace_parsed) 15139 { 15140 location_t here = c_parser_peek_token (parser)->location; 15141 stmt = c_begin_compound_stmt (true); 15142 c_parser_compound_statement_nostart (parser); 15143 add_stmt (c_end_compound_stmt (here, stmt, true)); 15144 } 15145 else 15146 add_stmt (c_parser_c99_block_statement (parser, if_p)); 15147 if (c_cont_label) 15148 { 15149 tree t = build1 (LABEL_EXPR, void_type_node, c_cont_label); 15150 SET_EXPR_LOCATION (t, loc); 15151 add_stmt (t); 15152 } 15153 15154 body = pop_stmt_list (body); 15155 c_break_label = save_break; 15156 c_cont_label = save_cont; 15157 15158 while (nbraces) 15159 { 15160 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE)) 15161 { 15162 c_parser_consume_token (parser); 15163 nbraces--; 15164 } 15165 else if (c_parser_next_token_is (parser, CPP_SEMICOLON)) 15166 c_parser_consume_token (parser); 15167 else 15168 { 15169 c_parser_error (parser, "collapsed loops not perfectly nested"); 15170 while (nbraces) 15171 { 15172 location_t here = c_parser_peek_token (parser)->location; 15173 stmt = c_begin_compound_stmt (true); 15174 add_stmt (body); 15175 c_parser_compound_statement_nostart (parser); 15176 body = c_end_compound_stmt (here, stmt, true); 15177 nbraces--; 15178 } 15179 goto pop_scopes; 15180 } 15181 } 15182 15183 /* Only bother calling c_finish_omp_for if we haven't already generated 15184 an error from the initialization parsing. */ 15185 if (!fail) 15186 { 15187 stmt = c_finish_omp_for (loc, code, declv, NULL, initv, condv, 15188 incrv, body, pre_body); 15189 15190 /* Check for iterators appearing in lb, b or incr expressions. */ 15191 if (stmt && !c_omp_check_loop_iv (stmt, declv, NULL)) 15192 stmt = NULL_TREE; 15193 15194 if (stmt) 15195 { 15196 add_stmt (stmt); 15197 15198 if (cclauses != NULL 15199 && cclauses[C_OMP_CLAUSE_SPLIT_PARALLEL] != NULL) 15200 { 15201 tree *c; 15202 for (c = &cclauses[C_OMP_CLAUSE_SPLIT_PARALLEL]; *c ; ) 15203 if (OMP_CLAUSE_CODE (*c) != OMP_CLAUSE_FIRSTPRIVATE 15204 && OMP_CLAUSE_CODE (*c) != OMP_CLAUSE_LASTPRIVATE) 15205 c = &OMP_CLAUSE_CHAIN (*c); 15206 else 15207 { 15208 for (i = 0; i < count; i++) 15209 if (TREE_VEC_ELT (declv, i) == OMP_CLAUSE_DECL (*c)) 15210 break; 15211 if (i == count) 15212 c = &OMP_CLAUSE_CHAIN (*c); 15213 else if (OMP_CLAUSE_CODE (*c) == OMP_CLAUSE_FIRSTPRIVATE) 15214 { 15215 error_at (loc, 15216 "iteration variable %qD should not be firstprivate", 15217 OMP_CLAUSE_DECL (*c)); 15218 *c = OMP_CLAUSE_CHAIN (*c); 15219 } 15220 else 15221 { 15222 /* Move lastprivate (decl) clause to OMP_FOR_CLAUSES. */ 15223 tree l = *c; 15224 *c = OMP_CLAUSE_CHAIN (*c); 15225 if (code == OMP_SIMD) 15226 { 15227 OMP_CLAUSE_CHAIN (l) 15228 = cclauses[C_OMP_CLAUSE_SPLIT_FOR]; 15229 cclauses[C_OMP_CLAUSE_SPLIT_FOR] = l; 15230 } 15231 else 15232 { 15233 OMP_CLAUSE_CHAIN (l) = clauses; 15234 clauses = l; 15235 } 15236 } 15237 } 15238 } 15239 OMP_FOR_CLAUSES (stmt) = clauses; 15240 } 15241 ret = stmt; 15242 } 15243 pop_scopes: 15244 while (!for_block->is_empty ()) 15245 { 15246 /* FIXME diagnostics: LOC below should be the actual location of 15247 this particular for block. We need to build a list of 15248 locations to go along with FOR_BLOCK. */ 15249 stmt = c_end_compound_stmt (loc, for_block->pop (), true); 15250 add_stmt (stmt); 15251 } 15252 release_tree_vector (for_block); 15253 return ret; 15254 } 15255 15256 /* Helper function for OpenMP parsing, split clauses and call 15257 finish_omp_clauses on each of the set of clauses afterwards. */ 15258 15259 static void 15260 omp_split_clauses (location_t loc, enum tree_code code, 15261 omp_clause_mask mask, tree clauses, tree *cclauses) 15262 { 15263 int i; 15264 c_omp_split_clauses (loc, code, mask, clauses, cclauses); 15265 for (i = 0; i < C_OMP_CLAUSE_SPLIT_COUNT; i++) 15266 if (cclauses[i]) 15267 cclauses[i] = c_finish_omp_clauses (cclauses[i], C_ORT_OMP); 15268 } 15269 15270 /* OpenMP 4.0: 15271 #pragma omp simd simd-clause[optseq] new-line 15272 for-loop 15273 15274 LOC is the location of the #pragma token. 15275 */ 15276 15277 #define OMP_SIMD_CLAUSE_MASK \ 15278 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_SAFELEN) \ 15279 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_SIMDLEN) \ 15280 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_LINEAR) \ 15281 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_ALIGNED) \ 15282 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRIVATE) \ 15283 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_LASTPRIVATE) \ 15284 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_REDUCTION) \ 15285 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_COLLAPSE)) 15286 15287 static tree 15288 c_parser_omp_simd (location_t loc, c_parser *parser, 15289 char *p_name, omp_clause_mask mask, tree *cclauses, 15290 bool *if_p) 15291 { 15292 tree block, clauses, ret; 15293 15294 strcat (p_name, " simd"); 15295 mask |= OMP_SIMD_CLAUSE_MASK; 15296 15297 clauses = c_parser_omp_all_clauses (parser, mask, p_name, cclauses == NULL); 15298 if (cclauses) 15299 { 15300 omp_split_clauses (loc, OMP_SIMD, mask, clauses, cclauses); 15301 clauses = cclauses[C_OMP_CLAUSE_SPLIT_SIMD]; 15302 tree c = omp_find_clause (cclauses[C_OMP_CLAUSE_SPLIT_FOR], 15303 OMP_CLAUSE_ORDERED); 15304 if (c && OMP_CLAUSE_ORDERED_EXPR (c)) 15305 { 15306 error_at (OMP_CLAUSE_LOCATION (c), 15307 "%<ordered%> clause with parameter may not be specified " 15308 "on %qs construct", p_name); 15309 OMP_CLAUSE_ORDERED_EXPR (c) = NULL_TREE; 15310 } 15311 } 15312 15313 block = c_begin_compound_stmt (true); 15314 ret = c_parser_omp_for_loop (loc, parser, OMP_SIMD, clauses, cclauses, if_p); 15315 block = c_end_compound_stmt (loc, block, true); 15316 add_stmt (block); 15317 15318 return ret; 15319 } 15320 15321 /* OpenMP 2.5: 15322 #pragma omp for for-clause[optseq] new-line 15323 for-loop 15324 15325 OpenMP 4.0: 15326 #pragma omp for simd for-simd-clause[optseq] new-line 15327 for-loop 15328 15329 LOC is the location of the #pragma token. 15330 */ 15331 15332 #define OMP_FOR_CLAUSE_MASK \ 15333 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRIVATE) \ 15334 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE) \ 15335 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_LASTPRIVATE) \ 15336 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_LINEAR) \ 15337 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_REDUCTION) \ 15338 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_ORDERED) \ 15339 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_SCHEDULE) \ 15340 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_COLLAPSE) \ 15341 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOWAIT)) 15342 15343 static tree 15344 c_parser_omp_for (location_t loc, c_parser *parser, 15345 char *p_name, omp_clause_mask mask, tree *cclauses, 15346 bool *if_p) 15347 { 15348 tree block, clauses, ret; 15349 15350 strcat (p_name, " for"); 15351 mask |= OMP_FOR_CLAUSE_MASK; 15352 /* parallel for{, simd} disallows nowait clause, but for 15353 target {teams distribute ,}parallel for{, simd} it should be accepted. */ 15354 if (cclauses && (mask & (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_MAP)) == 0) 15355 mask &= ~(OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOWAIT); 15356 /* Composite distribute parallel for{, simd} disallows ordered clause. */ 15357 if ((mask & (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DIST_SCHEDULE)) != 0) 15358 mask &= ~(OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_ORDERED); 15359 15360 if (c_parser_next_token_is (parser, CPP_NAME)) 15361 { 15362 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value); 15363 15364 if (strcmp (p, "simd") == 0) 15365 { 15366 tree cclauses_buf[C_OMP_CLAUSE_SPLIT_COUNT]; 15367 if (cclauses == NULL) 15368 cclauses = cclauses_buf; 15369 15370 c_parser_consume_token (parser); 15371 if (!flag_openmp) /* flag_openmp_simd */ 15372 return c_parser_omp_simd (loc, parser, p_name, mask, cclauses, 15373 if_p); 15374 block = c_begin_compound_stmt (true); 15375 ret = c_parser_omp_simd (loc, parser, p_name, mask, cclauses, if_p); 15376 block = c_end_compound_stmt (loc, block, true); 15377 if (ret == NULL_TREE) 15378 return ret; 15379 ret = make_node (OMP_FOR); 15380 TREE_TYPE (ret) = void_type_node; 15381 OMP_FOR_BODY (ret) = block; 15382 OMP_FOR_CLAUSES (ret) = cclauses[C_OMP_CLAUSE_SPLIT_FOR]; 15383 SET_EXPR_LOCATION (ret, loc); 15384 add_stmt (ret); 15385 return ret; 15386 } 15387 } 15388 if (!flag_openmp) /* flag_openmp_simd */ 15389 { 15390 c_parser_skip_to_pragma_eol (parser, false); 15391 return NULL_TREE; 15392 } 15393 15394 /* Composite distribute parallel for disallows linear clause. */ 15395 if ((mask & (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DIST_SCHEDULE)) != 0) 15396 mask &= ~(OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_LINEAR); 15397 15398 clauses = c_parser_omp_all_clauses (parser, mask, p_name, cclauses == NULL); 15399 if (cclauses) 15400 { 15401 omp_split_clauses (loc, OMP_FOR, mask, clauses, cclauses); 15402 clauses = cclauses[C_OMP_CLAUSE_SPLIT_FOR]; 15403 } 15404 15405 block = c_begin_compound_stmt (true); 15406 ret = c_parser_omp_for_loop (loc, parser, OMP_FOR, clauses, cclauses, if_p); 15407 block = c_end_compound_stmt (loc, block, true); 15408 add_stmt (block); 15409 15410 return ret; 15411 } 15412 15413 /* OpenMP 2.5: 15414 # pragma omp master new-line 15415 structured-block 15416 15417 LOC is the location of the #pragma token. 15418 */ 15419 15420 static tree 15421 c_parser_omp_master (location_t loc, c_parser *parser, bool *if_p) 15422 { 15423 c_parser_skip_to_pragma_eol (parser); 15424 return c_finish_omp_master (loc, c_parser_omp_structured_block (parser, 15425 if_p)); 15426 } 15427 15428 /* OpenMP 2.5: 15429 # pragma omp ordered new-line 15430 structured-block 15431 15432 OpenMP 4.5: 15433 # pragma omp ordered ordered-clauses new-line 15434 structured-block 15435 15436 # pragma omp ordered depend-clauses new-line */ 15437 15438 #define OMP_ORDERED_CLAUSE_MASK \ 15439 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_THREADS) \ 15440 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_SIMD)) 15441 15442 #define OMP_ORDERED_DEPEND_CLAUSE_MASK \ 15443 (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEPEND) 15444 15445 static bool 15446 c_parser_omp_ordered (c_parser *parser, enum pragma_context context, 15447 bool *if_p) 15448 { 15449 location_t loc = c_parser_peek_token (parser)->location; 15450 c_parser_consume_pragma (parser); 15451 15452 if (context != pragma_stmt && context != pragma_compound) 15453 { 15454 c_parser_error (parser, "expected declaration specifiers"); 15455 c_parser_skip_to_pragma_eol (parser, false); 15456 return false; 15457 } 15458 15459 if (c_parser_next_token_is (parser, CPP_NAME)) 15460 { 15461 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value); 15462 15463 if (!strcmp ("depend", p)) 15464 { 15465 if (context == pragma_stmt) 15466 { 15467 error_at (loc, 15468 "%<#pragma omp ordered%> with %<depend%> clause may " 15469 "only be used in compound statements"); 15470 c_parser_skip_to_pragma_eol (parser, false); 15471 return false; 15472 } 15473 15474 tree clauses 15475 = c_parser_omp_all_clauses (parser, 15476 OMP_ORDERED_DEPEND_CLAUSE_MASK, 15477 "#pragma omp ordered"); 15478 c_finish_omp_ordered (loc, clauses, NULL_TREE); 15479 return false; 15480 } 15481 } 15482 15483 tree clauses = c_parser_omp_all_clauses (parser, OMP_ORDERED_CLAUSE_MASK, 15484 "#pragma omp ordered"); 15485 c_finish_omp_ordered (loc, clauses, 15486 c_parser_omp_structured_block (parser, if_p)); 15487 return true; 15488 } 15489 15490 /* OpenMP 2.5: 15491 15492 section-scope: 15493 { section-sequence } 15494 15495 section-sequence: 15496 section-directive[opt] structured-block 15497 section-sequence section-directive structured-block 15498 15499 SECTIONS_LOC is the location of the #pragma omp sections. */ 15500 15501 static tree 15502 c_parser_omp_sections_scope (location_t sections_loc, c_parser *parser) 15503 { 15504 tree stmt, substmt; 15505 bool error_suppress = false; 15506 location_t loc; 15507 15508 loc = c_parser_peek_token (parser)->location; 15509 if (!c_parser_require (parser, CPP_OPEN_BRACE, "expected %<{%>")) 15510 { 15511 /* Avoid skipping until the end of the block. */ 15512 parser->error = false; 15513 return NULL_TREE; 15514 } 15515 15516 stmt = push_stmt_list (); 15517 15518 if (c_parser_peek_token (parser)->pragma_kind != PRAGMA_OMP_SECTION) 15519 { 15520 substmt = c_parser_omp_structured_block (parser, NULL); 15521 substmt = build1 (OMP_SECTION, void_type_node, substmt); 15522 SET_EXPR_LOCATION (substmt, loc); 15523 add_stmt (substmt); 15524 } 15525 15526 while (1) 15527 { 15528 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE)) 15529 break; 15530 if (c_parser_next_token_is (parser, CPP_EOF)) 15531 break; 15532 15533 loc = c_parser_peek_token (parser)->location; 15534 if (c_parser_peek_token (parser)->pragma_kind == PRAGMA_OMP_SECTION) 15535 { 15536 c_parser_consume_pragma (parser); 15537 c_parser_skip_to_pragma_eol (parser); 15538 error_suppress = false; 15539 } 15540 else if (!error_suppress) 15541 { 15542 error_at (loc, "expected %<#pragma omp section%> or %<}%>"); 15543 error_suppress = true; 15544 } 15545 15546 substmt = c_parser_omp_structured_block (parser, NULL); 15547 substmt = build1 (OMP_SECTION, void_type_node, substmt); 15548 SET_EXPR_LOCATION (substmt, loc); 15549 add_stmt (substmt); 15550 } 15551 c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, 15552 "expected %<#pragma omp section%> or %<}%>"); 15553 15554 substmt = pop_stmt_list (stmt); 15555 15556 stmt = make_node (OMP_SECTIONS); 15557 SET_EXPR_LOCATION (stmt, sections_loc); 15558 TREE_TYPE (stmt) = void_type_node; 15559 OMP_SECTIONS_BODY (stmt) = substmt; 15560 15561 return add_stmt (stmt); 15562 } 15563 15564 /* OpenMP 2.5: 15565 # pragma omp sections sections-clause[optseq] newline 15566 sections-scope 15567 15568 LOC is the location of the #pragma token. 15569 */ 15570 15571 #define OMP_SECTIONS_CLAUSE_MASK \ 15572 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRIVATE) \ 15573 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE) \ 15574 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_LASTPRIVATE) \ 15575 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_REDUCTION) \ 15576 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOWAIT)) 15577 15578 static tree 15579 c_parser_omp_sections (location_t loc, c_parser *parser, 15580 char *p_name, omp_clause_mask mask, tree *cclauses) 15581 { 15582 tree block, clauses, ret; 15583 15584 strcat (p_name, " sections"); 15585 mask |= OMP_SECTIONS_CLAUSE_MASK; 15586 if (cclauses) 15587 mask &= ~(OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOWAIT); 15588 15589 clauses = c_parser_omp_all_clauses (parser, mask, p_name, cclauses == NULL); 15590 if (cclauses) 15591 { 15592 omp_split_clauses (loc, OMP_SECTIONS, mask, clauses, cclauses); 15593 clauses = cclauses[C_OMP_CLAUSE_SPLIT_SECTIONS]; 15594 } 15595 15596 block = c_begin_compound_stmt (true); 15597 ret = c_parser_omp_sections_scope (loc, parser); 15598 if (ret) 15599 OMP_SECTIONS_CLAUSES (ret) = clauses; 15600 block = c_end_compound_stmt (loc, block, true); 15601 add_stmt (block); 15602 15603 return ret; 15604 } 15605 15606 /* OpenMP 2.5: 15607 # pragma omp parallel parallel-clause[optseq] new-line 15608 structured-block 15609 # pragma omp parallel for parallel-for-clause[optseq] new-line 15610 structured-block 15611 # pragma omp parallel sections parallel-sections-clause[optseq] new-line 15612 structured-block 15613 15614 OpenMP 4.0: 15615 # pragma omp parallel for simd parallel-for-simd-clause[optseq] new-line 15616 structured-block 15617 15618 LOC is the location of the #pragma token. 15619 */ 15620 15621 #define OMP_PARALLEL_CLAUSE_MASK \ 15622 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IF) \ 15623 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRIVATE) \ 15624 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE) \ 15625 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEFAULT) \ 15626 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_SHARED) \ 15627 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_COPYIN) \ 15628 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_REDUCTION) \ 15629 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NUM_THREADS) \ 15630 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PROC_BIND)) 15631 15632 static tree 15633 c_parser_omp_parallel (location_t loc, c_parser *parser, 15634 char *p_name, omp_clause_mask mask, tree *cclauses, 15635 bool *if_p) 15636 { 15637 tree stmt, clauses, block; 15638 15639 strcat (p_name, " parallel"); 15640 mask |= OMP_PARALLEL_CLAUSE_MASK; 15641 /* #pragma omp target parallel{, for, for simd} disallow copyin clause. */ 15642 if ((mask & (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_MAP)) != 0 15643 && (mask & (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DIST_SCHEDULE)) == 0) 15644 mask &= ~(OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_COPYIN); 15645 15646 if (c_parser_next_token_is_keyword (parser, RID_FOR)) 15647 { 15648 tree cclauses_buf[C_OMP_CLAUSE_SPLIT_COUNT]; 15649 if (cclauses == NULL) 15650 cclauses = cclauses_buf; 15651 15652 c_parser_consume_token (parser); 15653 if (!flag_openmp) /* flag_openmp_simd */ 15654 return c_parser_omp_for (loc, parser, p_name, mask, cclauses, if_p); 15655 block = c_begin_omp_parallel (); 15656 tree ret = c_parser_omp_for (loc, parser, p_name, mask, cclauses, if_p); 15657 stmt 15658 = c_finish_omp_parallel (loc, cclauses[C_OMP_CLAUSE_SPLIT_PARALLEL], 15659 block); 15660 if (ret == NULL_TREE) 15661 return ret; 15662 OMP_PARALLEL_COMBINED (stmt) = 1; 15663 return stmt; 15664 } 15665 /* When combined with distribute, parallel has to be followed by for. 15666 #pragma omp target parallel is allowed though. */ 15667 else if (cclauses 15668 && (mask & (OMP_CLAUSE_MASK_1 15669 << PRAGMA_OMP_CLAUSE_DIST_SCHEDULE)) != 0) 15670 { 15671 error_at (loc, "expected %<for%> after %qs", p_name); 15672 c_parser_skip_to_pragma_eol (parser); 15673 return NULL_TREE; 15674 } 15675 else if (!flag_openmp) /* flag_openmp_simd */ 15676 { 15677 c_parser_skip_to_pragma_eol (parser, false); 15678 return NULL_TREE; 15679 } 15680 else if (cclauses == NULL && c_parser_next_token_is (parser, CPP_NAME)) 15681 { 15682 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value); 15683 if (strcmp (p, "sections") == 0) 15684 { 15685 tree cclauses_buf[C_OMP_CLAUSE_SPLIT_COUNT]; 15686 if (cclauses == NULL) 15687 cclauses = cclauses_buf; 15688 15689 c_parser_consume_token (parser); 15690 block = c_begin_omp_parallel (); 15691 c_parser_omp_sections (loc, parser, p_name, mask, cclauses); 15692 stmt = c_finish_omp_parallel (loc, 15693 cclauses[C_OMP_CLAUSE_SPLIT_PARALLEL], 15694 block); 15695 OMP_PARALLEL_COMBINED (stmt) = 1; 15696 return stmt; 15697 } 15698 } 15699 15700 clauses = c_parser_omp_all_clauses (parser, mask, p_name, cclauses == NULL); 15701 if (cclauses) 15702 { 15703 omp_split_clauses (loc, OMP_PARALLEL, mask, clauses, cclauses); 15704 clauses = cclauses[C_OMP_CLAUSE_SPLIT_PARALLEL]; 15705 } 15706 15707 block = c_begin_omp_parallel (); 15708 c_parser_statement (parser, if_p); 15709 stmt = c_finish_omp_parallel (loc, clauses, block); 15710 15711 return stmt; 15712 } 15713 15714 /* OpenMP 2.5: 15715 # pragma omp single single-clause[optseq] new-line 15716 structured-block 15717 15718 LOC is the location of the #pragma. 15719 */ 15720 15721 #define OMP_SINGLE_CLAUSE_MASK \ 15722 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRIVATE) \ 15723 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE) \ 15724 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_COPYPRIVATE) \ 15725 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOWAIT)) 15726 15727 static tree 15728 c_parser_omp_single (location_t loc, c_parser *parser, bool *if_p) 15729 { 15730 tree stmt = make_node (OMP_SINGLE); 15731 SET_EXPR_LOCATION (stmt, loc); 15732 TREE_TYPE (stmt) = void_type_node; 15733 15734 OMP_SINGLE_CLAUSES (stmt) 15735 = c_parser_omp_all_clauses (parser, OMP_SINGLE_CLAUSE_MASK, 15736 "#pragma omp single"); 15737 OMP_SINGLE_BODY (stmt) = c_parser_omp_structured_block (parser, if_p); 15738 15739 return add_stmt (stmt); 15740 } 15741 15742 /* OpenMP 3.0: 15743 # pragma omp task task-clause[optseq] new-line 15744 15745 LOC is the location of the #pragma. 15746 */ 15747 15748 #define OMP_TASK_CLAUSE_MASK \ 15749 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IF) \ 15750 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_UNTIED) \ 15751 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEFAULT) \ 15752 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRIVATE) \ 15753 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE) \ 15754 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_SHARED) \ 15755 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FINAL) \ 15756 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_MERGEABLE) \ 15757 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEPEND) \ 15758 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRIORITY)) 15759 15760 static tree 15761 c_parser_omp_task (location_t loc, c_parser *parser, bool *if_p) 15762 { 15763 tree clauses, block; 15764 15765 clauses = c_parser_omp_all_clauses (parser, OMP_TASK_CLAUSE_MASK, 15766 "#pragma omp task"); 15767 15768 block = c_begin_omp_task (); 15769 c_parser_statement (parser, if_p); 15770 return c_finish_omp_task (loc, clauses, block); 15771 } 15772 15773 /* OpenMP 3.0: 15774 # pragma omp taskwait new-line 15775 */ 15776 15777 static void 15778 c_parser_omp_taskwait (c_parser *parser) 15779 { 15780 location_t loc = c_parser_peek_token (parser)->location; 15781 c_parser_consume_pragma (parser); 15782 c_parser_skip_to_pragma_eol (parser); 15783 15784 c_finish_omp_taskwait (loc); 15785 } 15786 15787 /* OpenMP 3.1: 15788 # pragma omp taskyield new-line 15789 */ 15790 15791 static void 15792 c_parser_omp_taskyield (c_parser *parser) 15793 { 15794 location_t loc = c_parser_peek_token (parser)->location; 15795 c_parser_consume_pragma (parser); 15796 c_parser_skip_to_pragma_eol (parser); 15797 15798 c_finish_omp_taskyield (loc); 15799 } 15800 15801 /* OpenMP 4.0: 15802 # pragma omp taskgroup new-line 15803 */ 15804 15805 static tree 15806 c_parser_omp_taskgroup (c_parser *parser, bool *if_p) 15807 { 15808 location_t loc = c_parser_peek_token (parser)->location; 15809 c_parser_skip_to_pragma_eol (parser); 15810 return c_finish_omp_taskgroup (loc, c_parser_omp_structured_block (parser, 15811 if_p)); 15812 } 15813 15814 /* OpenMP 4.0: 15815 # pragma omp cancel cancel-clause[optseq] new-line 15816 15817 LOC is the location of the #pragma. 15818 */ 15819 15820 #define OMP_CANCEL_CLAUSE_MASK \ 15821 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PARALLEL) \ 15822 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FOR) \ 15823 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_SECTIONS) \ 15824 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_TASKGROUP) \ 15825 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IF)) 15826 15827 static void 15828 c_parser_omp_cancel (c_parser *parser) 15829 { 15830 location_t loc = c_parser_peek_token (parser)->location; 15831 15832 c_parser_consume_pragma (parser); 15833 tree clauses = c_parser_omp_all_clauses (parser, OMP_CANCEL_CLAUSE_MASK, 15834 "#pragma omp cancel"); 15835 15836 c_finish_omp_cancel (loc, clauses); 15837 } 15838 15839 /* OpenMP 4.0: 15840 # pragma omp cancellation point cancelpt-clause[optseq] new-line 15841 15842 LOC is the location of the #pragma. 15843 */ 15844 15845 #define OMP_CANCELLATION_POINT_CLAUSE_MASK \ 15846 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PARALLEL) \ 15847 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FOR) \ 15848 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_SECTIONS) \ 15849 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_TASKGROUP)) 15850 15851 static void 15852 c_parser_omp_cancellation_point (c_parser *parser, enum pragma_context context) 15853 { 15854 location_t loc = c_parser_peek_token (parser)->location; 15855 tree clauses; 15856 bool point_seen = false; 15857 15858 c_parser_consume_pragma (parser); 15859 if (c_parser_next_token_is (parser, CPP_NAME)) 15860 { 15861 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value); 15862 if (strcmp (p, "point") == 0) 15863 { 15864 c_parser_consume_token (parser); 15865 point_seen = true; 15866 } 15867 } 15868 if (!point_seen) 15869 { 15870 c_parser_error (parser, "expected %<point%>"); 15871 c_parser_skip_to_pragma_eol (parser); 15872 return; 15873 } 15874 15875 if (context != pragma_compound) 15876 { 15877 if (context == pragma_stmt) 15878 error_at (loc, 15879 "%<#pragma %s%> may only be used in compound statements", 15880 "omp cancellation point"); 15881 else 15882 c_parser_error (parser, "expected declaration specifiers"); 15883 c_parser_skip_to_pragma_eol (parser, false); 15884 return; 15885 } 15886 15887 clauses 15888 = c_parser_omp_all_clauses (parser, OMP_CANCELLATION_POINT_CLAUSE_MASK, 15889 "#pragma omp cancellation point"); 15890 15891 c_finish_omp_cancellation_point (loc, clauses); 15892 } 15893 15894 /* OpenMP 4.0: 15895 #pragma omp distribute distribute-clause[optseq] new-line 15896 for-loop */ 15897 15898 #define OMP_DISTRIBUTE_CLAUSE_MASK \ 15899 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRIVATE) \ 15900 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE) \ 15901 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_LASTPRIVATE) \ 15902 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DIST_SCHEDULE)\ 15903 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_COLLAPSE)) 15904 15905 static tree 15906 c_parser_omp_distribute (location_t loc, c_parser *parser, 15907 char *p_name, omp_clause_mask mask, tree *cclauses, 15908 bool *if_p) 15909 { 15910 tree clauses, block, ret; 15911 15912 strcat (p_name, " distribute"); 15913 mask |= OMP_DISTRIBUTE_CLAUSE_MASK; 15914 15915 if (c_parser_next_token_is (parser, CPP_NAME)) 15916 { 15917 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value); 15918 bool simd = false; 15919 bool parallel = false; 15920 15921 if (strcmp (p, "simd") == 0) 15922 simd = true; 15923 else 15924 parallel = strcmp (p, "parallel") == 0; 15925 if (parallel || simd) 15926 { 15927 tree cclauses_buf[C_OMP_CLAUSE_SPLIT_COUNT]; 15928 if (cclauses == NULL) 15929 cclauses = cclauses_buf; 15930 c_parser_consume_token (parser); 15931 if (!flag_openmp) /* flag_openmp_simd */ 15932 { 15933 if (simd) 15934 return c_parser_omp_simd (loc, parser, p_name, mask, cclauses, 15935 if_p); 15936 else 15937 return c_parser_omp_parallel (loc, parser, p_name, mask, 15938 cclauses, if_p); 15939 } 15940 block = c_begin_compound_stmt (true); 15941 if (simd) 15942 ret = c_parser_omp_simd (loc, parser, p_name, mask, cclauses, 15943 if_p); 15944 else 15945 ret = c_parser_omp_parallel (loc, parser, p_name, mask, cclauses, 15946 if_p); 15947 block = c_end_compound_stmt (loc, block, true); 15948 if (ret == NULL) 15949 return ret; 15950 ret = make_node (OMP_DISTRIBUTE); 15951 TREE_TYPE (ret) = void_type_node; 15952 OMP_FOR_BODY (ret) = block; 15953 OMP_FOR_CLAUSES (ret) = cclauses[C_OMP_CLAUSE_SPLIT_DISTRIBUTE]; 15954 SET_EXPR_LOCATION (ret, loc); 15955 add_stmt (ret); 15956 return ret; 15957 } 15958 } 15959 if (!flag_openmp) /* flag_openmp_simd */ 15960 { 15961 c_parser_skip_to_pragma_eol (parser, false); 15962 return NULL_TREE; 15963 } 15964 15965 clauses = c_parser_omp_all_clauses (parser, mask, p_name, cclauses == NULL); 15966 if (cclauses) 15967 { 15968 omp_split_clauses (loc, OMP_DISTRIBUTE, mask, clauses, cclauses); 15969 clauses = cclauses[C_OMP_CLAUSE_SPLIT_DISTRIBUTE]; 15970 } 15971 15972 block = c_begin_compound_stmt (true); 15973 ret = c_parser_omp_for_loop (loc, parser, OMP_DISTRIBUTE, clauses, NULL, 15974 if_p); 15975 block = c_end_compound_stmt (loc, block, true); 15976 add_stmt (block); 15977 15978 return ret; 15979 } 15980 15981 /* OpenMP 4.0: 15982 # pragma omp teams teams-clause[optseq] new-line 15983 structured-block */ 15984 15985 #define OMP_TEAMS_CLAUSE_MASK \ 15986 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRIVATE) \ 15987 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE) \ 15988 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_SHARED) \ 15989 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_REDUCTION) \ 15990 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NUM_TEAMS) \ 15991 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_THREAD_LIMIT) \ 15992 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEFAULT)) 15993 15994 static tree 15995 c_parser_omp_teams (location_t loc, c_parser *parser, 15996 char *p_name, omp_clause_mask mask, tree *cclauses, 15997 bool *if_p) 15998 { 15999 tree clauses, block, ret; 16000 16001 strcat (p_name, " teams"); 16002 mask |= OMP_TEAMS_CLAUSE_MASK; 16003 16004 if (c_parser_next_token_is (parser, CPP_NAME)) 16005 { 16006 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value); 16007 if (strcmp (p, "distribute") == 0) 16008 { 16009 tree cclauses_buf[C_OMP_CLAUSE_SPLIT_COUNT]; 16010 if (cclauses == NULL) 16011 cclauses = cclauses_buf; 16012 16013 c_parser_consume_token (parser); 16014 if (!flag_openmp) /* flag_openmp_simd */ 16015 return c_parser_omp_distribute (loc, parser, p_name, mask, 16016 cclauses, if_p); 16017 block = c_begin_compound_stmt (true); 16018 ret = c_parser_omp_distribute (loc, parser, p_name, mask, cclauses, 16019 if_p); 16020 block = c_end_compound_stmt (loc, block, true); 16021 if (ret == NULL) 16022 return ret; 16023 clauses = cclauses[C_OMP_CLAUSE_SPLIT_TEAMS]; 16024 ret = make_node (OMP_TEAMS); 16025 TREE_TYPE (ret) = void_type_node; 16026 OMP_TEAMS_CLAUSES (ret) = clauses; 16027 OMP_TEAMS_BODY (ret) = block; 16028 OMP_TEAMS_COMBINED (ret) = 1; 16029 return add_stmt (ret); 16030 } 16031 } 16032 if (!flag_openmp) /* flag_openmp_simd */ 16033 { 16034 c_parser_skip_to_pragma_eol (parser, false); 16035 return NULL_TREE; 16036 } 16037 16038 clauses = c_parser_omp_all_clauses (parser, mask, p_name, cclauses == NULL); 16039 if (cclauses) 16040 { 16041 omp_split_clauses (loc, OMP_TEAMS, mask, clauses, cclauses); 16042 clauses = cclauses[C_OMP_CLAUSE_SPLIT_TEAMS]; 16043 } 16044 16045 tree stmt = make_node (OMP_TEAMS); 16046 TREE_TYPE (stmt) = void_type_node; 16047 OMP_TEAMS_CLAUSES (stmt) = clauses; 16048 OMP_TEAMS_BODY (stmt) = c_parser_omp_structured_block (parser, if_p); 16049 16050 return add_stmt (stmt); 16051 } 16052 16053 /* OpenMP 4.0: 16054 # pragma omp target data target-data-clause[optseq] new-line 16055 structured-block */ 16056 16057 #define OMP_TARGET_DATA_CLAUSE_MASK \ 16058 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEVICE) \ 16059 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_MAP) \ 16060 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IF) \ 16061 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_USE_DEVICE_PTR)) 16062 16063 static tree 16064 c_parser_omp_target_data (location_t loc, c_parser *parser, bool *if_p) 16065 { 16066 tree clauses 16067 = c_parser_omp_all_clauses (parser, OMP_TARGET_DATA_CLAUSE_MASK, 16068 "#pragma omp target data"); 16069 int map_seen = 0; 16070 for (tree *pc = &clauses; *pc;) 16071 { 16072 if (OMP_CLAUSE_CODE (*pc) == OMP_CLAUSE_MAP) 16073 switch (OMP_CLAUSE_MAP_KIND (*pc)) 16074 { 16075 case GOMP_MAP_TO: 16076 case GOMP_MAP_ALWAYS_TO: 16077 case GOMP_MAP_FROM: 16078 case GOMP_MAP_ALWAYS_FROM: 16079 case GOMP_MAP_TOFROM: 16080 case GOMP_MAP_ALWAYS_TOFROM: 16081 case GOMP_MAP_ALLOC: 16082 map_seen = 3; 16083 break; 16084 case GOMP_MAP_FIRSTPRIVATE_POINTER: 16085 case GOMP_MAP_ALWAYS_POINTER: 16086 break; 16087 default: 16088 map_seen |= 1; 16089 error_at (OMP_CLAUSE_LOCATION (*pc), 16090 "%<#pragma omp target data%> with map-type other " 16091 "than %<to%>, %<from%>, %<tofrom%> or %<alloc%> " 16092 "on %<map%> clause"); 16093 *pc = OMP_CLAUSE_CHAIN (*pc); 16094 continue; 16095 } 16096 pc = &OMP_CLAUSE_CHAIN (*pc); 16097 } 16098 16099 if (map_seen != 3) 16100 { 16101 if (map_seen == 0) 16102 error_at (loc, 16103 "%<#pragma omp target data%> must contain at least " 16104 "one %<map%> clause"); 16105 return NULL_TREE; 16106 } 16107 16108 tree stmt = make_node (OMP_TARGET_DATA); 16109 TREE_TYPE (stmt) = void_type_node; 16110 OMP_TARGET_DATA_CLAUSES (stmt) = clauses; 16111 keep_next_level (); 16112 tree block = c_begin_compound_stmt (true); 16113 add_stmt (c_parser_omp_structured_block (parser, if_p)); 16114 OMP_TARGET_DATA_BODY (stmt) = c_end_compound_stmt (loc, block, true); 16115 16116 SET_EXPR_LOCATION (stmt, loc); 16117 return add_stmt (stmt); 16118 } 16119 16120 /* OpenMP 4.0: 16121 # pragma omp target update target-update-clause[optseq] new-line */ 16122 16123 #define OMP_TARGET_UPDATE_CLAUSE_MASK \ 16124 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FROM) \ 16125 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_TO) \ 16126 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEVICE) \ 16127 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IF) \ 16128 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEPEND) \ 16129 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOWAIT)) 16130 16131 static bool 16132 c_parser_omp_target_update (location_t loc, c_parser *parser, 16133 enum pragma_context context) 16134 { 16135 if (context == pragma_stmt) 16136 { 16137 error_at (loc, "%<#pragma %s%> may only be used in compound statements", 16138 "omp target update"); 16139 c_parser_skip_to_pragma_eol (parser, false); 16140 return false; 16141 } 16142 16143 tree clauses 16144 = c_parser_omp_all_clauses (parser, OMP_TARGET_UPDATE_CLAUSE_MASK, 16145 "#pragma omp target update"); 16146 if (omp_find_clause (clauses, OMP_CLAUSE_TO) == NULL_TREE 16147 && omp_find_clause (clauses, OMP_CLAUSE_FROM) == NULL_TREE) 16148 { 16149 error_at (loc, 16150 "%<#pragma omp target update%> must contain at least one " 16151 "%<from%> or %<to%> clauses"); 16152 return false; 16153 } 16154 16155 tree stmt = make_node (OMP_TARGET_UPDATE); 16156 TREE_TYPE (stmt) = void_type_node; 16157 OMP_TARGET_UPDATE_CLAUSES (stmt) = clauses; 16158 SET_EXPR_LOCATION (stmt, loc); 16159 add_stmt (stmt); 16160 return false; 16161 } 16162 16163 /* OpenMP 4.5: 16164 # pragma omp target enter data target-data-clause[optseq] new-line */ 16165 16166 #define OMP_TARGET_ENTER_DATA_CLAUSE_MASK \ 16167 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEVICE) \ 16168 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_MAP) \ 16169 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IF) \ 16170 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEPEND) \ 16171 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOWAIT)) 16172 16173 static tree 16174 c_parser_omp_target_enter_data (location_t loc, c_parser *parser, 16175 enum pragma_context context) 16176 { 16177 bool data_seen = false; 16178 if (c_parser_next_token_is (parser, CPP_NAME)) 16179 { 16180 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value); 16181 if (strcmp (p, "data") == 0) 16182 { 16183 c_parser_consume_token (parser); 16184 data_seen = true; 16185 } 16186 } 16187 if (!data_seen) 16188 { 16189 c_parser_error (parser, "expected %<data%>"); 16190 c_parser_skip_to_pragma_eol (parser); 16191 return NULL_TREE; 16192 } 16193 16194 if (context == pragma_stmt) 16195 { 16196 error_at (loc, "%<#pragma %s%> may only be used in compound statements", 16197 "omp target enter data"); 16198 c_parser_skip_to_pragma_eol (parser, false); 16199 return NULL_TREE; 16200 } 16201 16202 tree clauses 16203 = c_parser_omp_all_clauses (parser, OMP_TARGET_ENTER_DATA_CLAUSE_MASK, 16204 "#pragma omp target enter data"); 16205 int map_seen = 0; 16206 for (tree *pc = &clauses; *pc;) 16207 { 16208 if (OMP_CLAUSE_CODE (*pc) == OMP_CLAUSE_MAP) 16209 switch (OMP_CLAUSE_MAP_KIND (*pc)) 16210 { 16211 case GOMP_MAP_TO: 16212 case GOMP_MAP_ALWAYS_TO: 16213 case GOMP_MAP_ALLOC: 16214 map_seen = 3; 16215 break; 16216 case GOMP_MAP_FIRSTPRIVATE_POINTER: 16217 case GOMP_MAP_ALWAYS_POINTER: 16218 break; 16219 default: 16220 map_seen |= 1; 16221 error_at (OMP_CLAUSE_LOCATION (*pc), 16222 "%<#pragma omp target enter data%> with map-type other " 16223 "than %<to%> or %<alloc%> on %<map%> clause"); 16224 *pc = OMP_CLAUSE_CHAIN (*pc); 16225 continue; 16226 } 16227 pc = &OMP_CLAUSE_CHAIN (*pc); 16228 } 16229 16230 if (map_seen != 3) 16231 { 16232 if (map_seen == 0) 16233 error_at (loc, 16234 "%<#pragma omp target enter data%> must contain at least " 16235 "one %<map%> clause"); 16236 return NULL_TREE; 16237 } 16238 16239 tree stmt = make_node (OMP_TARGET_ENTER_DATA); 16240 TREE_TYPE (stmt) = void_type_node; 16241 OMP_TARGET_ENTER_DATA_CLAUSES (stmt) = clauses; 16242 SET_EXPR_LOCATION (stmt, loc); 16243 add_stmt (stmt); 16244 return stmt; 16245 } 16246 16247 /* OpenMP 4.5: 16248 # pragma omp target exit data target-data-clause[optseq] new-line */ 16249 16250 #define OMP_TARGET_EXIT_DATA_CLAUSE_MASK \ 16251 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEVICE) \ 16252 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_MAP) \ 16253 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IF) \ 16254 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEPEND) \ 16255 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOWAIT)) 16256 16257 static tree 16258 c_parser_omp_target_exit_data (location_t loc, c_parser *parser, 16259 enum pragma_context context) 16260 { 16261 bool data_seen = false; 16262 if (c_parser_next_token_is (parser, CPP_NAME)) 16263 { 16264 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value); 16265 if (strcmp (p, "data") == 0) 16266 { 16267 c_parser_consume_token (parser); 16268 data_seen = true; 16269 } 16270 } 16271 if (!data_seen) 16272 { 16273 c_parser_error (parser, "expected %<data%>"); 16274 c_parser_skip_to_pragma_eol (parser); 16275 return NULL_TREE; 16276 } 16277 16278 if (context == pragma_stmt) 16279 { 16280 error_at (loc, "%<#pragma %s%> may only be used in compound statements", 16281 "omp target exit data"); 16282 c_parser_skip_to_pragma_eol (parser, false); 16283 return NULL_TREE; 16284 } 16285 16286 tree clauses 16287 = c_parser_omp_all_clauses (parser, OMP_TARGET_EXIT_DATA_CLAUSE_MASK, 16288 "#pragma omp target exit data"); 16289 16290 int map_seen = 0; 16291 for (tree *pc = &clauses; *pc;) 16292 { 16293 if (OMP_CLAUSE_CODE (*pc) == OMP_CLAUSE_MAP) 16294 switch (OMP_CLAUSE_MAP_KIND (*pc)) 16295 { 16296 case GOMP_MAP_FROM: 16297 case GOMP_MAP_ALWAYS_FROM: 16298 case GOMP_MAP_RELEASE: 16299 case GOMP_MAP_DELETE: 16300 map_seen = 3; 16301 break; 16302 case GOMP_MAP_FIRSTPRIVATE_POINTER: 16303 case GOMP_MAP_ALWAYS_POINTER: 16304 break; 16305 default: 16306 map_seen |= 1; 16307 error_at (OMP_CLAUSE_LOCATION (*pc), 16308 "%<#pragma omp target exit data%> with map-type other " 16309 "than %<from%>, %<release%> or %<delete%> on %<map%>" 16310 " clause"); 16311 *pc = OMP_CLAUSE_CHAIN (*pc); 16312 continue; 16313 } 16314 pc = &OMP_CLAUSE_CHAIN (*pc); 16315 } 16316 16317 if (map_seen != 3) 16318 { 16319 if (map_seen == 0) 16320 error_at (loc, 16321 "%<#pragma omp target exit data%> must contain at least one " 16322 "%<map%> clause"); 16323 return NULL_TREE; 16324 } 16325 16326 tree stmt = make_node (OMP_TARGET_EXIT_DATA); 16327 TREE_TYPE (stmt) = void_type_node; 16328 OMP_TARGET_EXIT_DATA_CLAUSES (stmt) = clauses; 16329 SET_EXPR_LOCATION (stmt, loc); 16330 add_stmt (stmt); 16331 return stmt; 16332 } 16333 16334 /* OpenMP 4.0: 16335 # pragma omp target target-clause[optseq] new-line 16336 structured-block */ 16337 16338 #define OMP_TARGET_CLAUSE_MASK \ 16339 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEVICE) \ 16340 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_MAP) \ 16341 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IF) \ 16342 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEPEND) \ 16343 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOWAIT) \ 16344 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRIVATE) \ 16345 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE) \ 16346 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEFAULTMAP) \ 16347 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IS_DEVICE_PTR)) 16348 16349 static bool 16350 c_parser_omp_target (c_parser *parser, enum pragma_context context, bool *if_p) 16351 { 16352 location_t loc = c_parser_peek_token (parser)->location; 16353 c_parser_consume_pragma (parser); 16354 tree *pc = NULL, stmt, block; 16355 16356 if (context != pragma_stmt && context != pragma_compound) 16357 { 16358 c_parser_error (parser, "expected declaration specifiers"); 16359 c_parser_skip_to_pragma_eol (parser); 16360 return false; 16361 } 16362 16363 if (c_parser_next_token_is (parser, CPP_NAME)) 16364 { 16365 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value); 16366 enum tree_code ccode = ERROR_MARK; 16367 16368 if (strcmp (p, "teams") == 0) 16369 ccode = OMP_TEAMS; 16370 else if (strcmp (p, "parallel") == 0) 16371 ccode = OMP_PARALLEL; 16372 else if (strcmp (p, "simd") == 0) 16373 ccode = OMP_SIMD; 16374 if (ccode != ERROR_MARK) 16375 { 16376 tree cclauses[C_OMP_CLAUSE_SPLIT_COUNT]; 16377 char p_name[sizeof ("#pragma omp target teams distribute " 16378 "parallel for simd")]; 16379 16380 c_parser_consume_token (parser); 16381 strcpy (p_name, "#pragma omp target"); 16382 if (!flag_openmp) /* flag_openmp_simd */ 16383 { 16384 tree stmt; 16385 switch (ccode) 16386 { 16387 case OMP_TEAMS: 16388 stmt = c_parser_omp_teams (loc, parser, p_name, 16389 OMP_TARGET_CLAUSE_MASK, 16390 cclauses, if_p); 16391 break; 16392 case OMP_PARALLEL: 16393 stmt = c_parser_omp_parallel (loc, parser, p_name, 16394 OMP_TARGET_CLAUSE_MASK, 16395 cclauses, if_p); 16396 break; 16397 case OMP_SIMD: 16398 stmt = c_parser_omp_simd (loc, parser, p_name, 16399 OMP_TARGET_CLAUSE_MASK, 16400 cclauses, if_p); 16401 break; 16402 default: 16403 gcc_unreachable (); 16404 } 16405 return stmt != NULL_TREE; 16406 } 16407 keep_next_level (); 16408 tree block = c_begin_compound_stmt (true), ret; 16409 switch (ccode) 16410 { 16411 case OMP_TEAMS: 16412 ret = c_parser_omp_teams (loc, parser, p_name, 16413 OMP_TARGET_CLAUSE_MASK, cclauses, 16414 if_p); 16415 break; 16416 case OMP_PARALLEL: 16417 ret = c_parser_omp_parallel (loc, parser, p_name, 16418 OMP_TARGET_CLAUSE_MASK, cclauses, 16419 if_p); 16420 break; 16421 case OMP_SIMD: 16422 ret = c_parser_omp_simd (loc, parser, p_name, 16423 OMP_TARGET_CLAUSE_MASK, cclauses, 16424 if_p); 16425 break; 16426 default: 16427 gcc_unreachable (); 16428 } 16429 block = c_end_compound_stmt (loc, block, true); 16430 if (ret == NULL_TREE) 16431 return false; 16432 if (ccode == OMP_TEAMS) 16433 { 16434 /* For combined target teams, ensure the num_teams and 16435 thread_limit clause expressions are evaluated on the host, 16436 before entering the target construct. */ 16437 tree c; 16438 for (c = cclauses[C_OMP_CLAUSE_SPLIT_TEAMS]; 16439 c; c = OMP_CLAUSE_CHAIN (c)) 16440 if ((OMP_CLAUSE_CODE (c) == OMP_CLAUSE_NUM_TEAMS 16441 || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_THREAD_LIMIT) 16442 && TREE_CODE (OMP_CLAUSE_OPERAND (c, 0)) != INTEGER_CST) 16443 { 16444 tree expr = OMP_CLAUSE_OPERAND (c, 0); 16445 tree tmp = create_tmp_var_raw (TREE_TYPE (expr)); 16446 expr = build4 (TARGET_EXPR, TREE_TYPE (expr), tmp, 16447 expr, NULL_TREE, NULL_TREE); 16448 add_stmt (expr); 16449 OMP_CLAUSE_OPERAND (c, 0) = expr; 16450 tree tc = build_omp_clause (OMP_CLAUSE_LOCATION (c), 16451 OMP_CLAUSE_FIRSTPRIVATE); 16452 OMP_CLAUSE_DECL (tc) = tmp; 16453 OMP_CLAUSE_CHAIN (tc) 16454 = cclauses[C_OMP_CLAUSE_SPLIT_TARGET]; 16455 cclauses[C_OMP_CLAUSE_SPLIT_TARGET] = tc; 16456 } 16457 } 16458 tree stmt = make_node (OMP_TARGET); 16459 TREE_TYPE (stmt) = void_type_node; 16460 OMP_TARGET_CLAUSES (stmt) = cclauses[C_OMP_CLAUSE_SPLIT_TARGET]; 16461 OMP_TARGET_BODY (stmt) = block; 16462 OMP_TARGET_COMBINED (stmt) = 1; 16463 add_stmt (stmt); 16464 pc = &OMP_TARGET_CLAUSES (stmt); 16465 goto check_clauses; 16466 } 16467 else if (!flag_openmp) /* flag_openmp_simd */ 16468 { 16469 c_parser_skip_to_pragma_eol (parser, false); 16470 return false; 16471 } 16472 else if (strcmp (p, "data") == 0) 16473 { 16474 c_parser_consume_token (parser); 16475 c_parser_omp_target_data (loc, parser, if_p); 16476 return true; 16477 } 16478 else if (strcmp (p, "enter") == 0) 16479 { 16480 c_parser_consume_token (parser); 16481 c_parser_omp_target_enter_data (loc, parser, context); 16482 return false; 16483 } 16484 else if (strcmp (p, "exit") == 0) 16485 { 16486 c_parser_consume_token (parser); 16487 c_parser_omp_target_exit_data (loc, parser, context); 16488 return false; 16489 } 16490 else if (strcmp (p, "update") == 0) 16491 { 16492 c_parser_consume_token (parser); 16493 return c_parser_omp_target_update (loc, parser, context); 16494 } 16495 } 16496 if (!flag_openmp) /* flag_openmp_simd */ 16497 { 16498 c_parser_skip_to_pragma_eol (parser, false); 16499 return false; 16500 } 16501 16502 stmt = make_node (OMP_TARGET); 16503 TREE_TYPE (stmt) = void_type_node; 16504 16505 OMP_TARGET_CLAUSES (stmt) 16506 = c_parser_omp_all_clauses (parser, OMP_TARGET_CLAUSE_MASK, 16507 "#pragma omp target"); 16508 pc = &OMP_TARGET_CLAUSES (stmt); 16509 keep_next_level (); 16510 block = c_begin_compound_stmt (true); 16511 add_stmt (c_parser_omp_structured_block (parser, if_p)); 16512 OMP_TARGET_BODY (stmt) = c_end_compound_stmt (loc, block, true); 16513 16514 SET_EXPR_LOCATION (stmt, loc); 16515 add_stmt (stmt); 16516 16517 check_clauses: 16518 while (*pc) 16519 { 16520 if (OMP_CLAUSE_CODE (*pc) == OMP_CLAUSE_MAP) 16521 switch (OMP_CLAUSE_MAP_KIND (*pc)) 16522 { 16523 case GOMP_MAP_TO: 16524 case GOMP_MAP_ALWAYS_TO: 16525 case GOMP_MAP_FROM: 16526 case GOMP_MAP_ALWAYS_FROM: 16527 case GOMP_MAP_TOFROM: 16528 case GOMP_MAP_ALWAYS_TOFROM: 16529 case GOMP_MAP_ALLOC: 16530 case GOMP_MAP_FIRSTPRIVATE_POINTER: 16531 case GOMP_MAP_ALWAYS_POINTER: 16532 break; 16533 default: 16534 error_at (OMP_CLAUSE_LOCATION (*pc), 16535 "%<#pragma omp target%> with map-type other " 16536 "than %<to%>, %<from%>, %<tofrom%> or %<alloc%> " 16537 "on %<map%> clause"); 16538 *pc = OMP_CLAUSE_CHAIN (*pc); 16539 continue; 16540 } 16541 pc = &OMP_CLAUSE_CHAIN (*pc); 16542 } 16543 return true; 16544 } 16545 16546 /* OpenMP 4.0: 16547 # pragma omp declare simd declare-simd-clauses[optseq] new-line */ 16548 16549 #define OMP_DECLARE_SIMD_CLAUSE_MASK \ 16550 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_SIMDLEN) \ 16551 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_LINEAR) \ 16552 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_ALIGNED) \ 16553 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_UNIFORM) \ 16554 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_INBRANCH) \ 16555 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOTINBRANCH)) 16556 16557 static void 16558 c_parser_omp_declare_simd (c_parser *parser, enum pragma_context context) 16559 { 16560 auto_vec<c_token> clauses; 16561 while (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL)) 16562 { 16563 c_token *token = c_parser_peek_token (parser); 16564 if (token->type == CPP_EOF) 16565 { 16566 c_parser_skip_to_pragma_eol (parser); 16567 return; 16568 } 16569 clauses.safe_push (*token); 16570 c_parser_consume_token (parser); 16571 } 16572 clauses.safe_push (*c_parser_peek_token (parser)); 16573 c_parser_skip_to_pragma_eol (parser); 16574 16575 while (c_parser_next_token_is (parser, CPP_PRAGMA)) 16576 { 16577 if (c_parser_peek_token (parser)->pragma_kind 16578 != PRAGMA_OMP_DECLARE 16579 || c_parser_peek_2nd_token (parser)->type != CPP_NAME 16580 || strcmp (IDENTIFIER_POINTER 16581 (c_parser_peek_2nd_token (parser)->value), 16582 "simd") != 0) 16583 { 16584 c_parser_error (parser, 16585 "%<#pragma omp declare simd%> must be followed by " 16586 "function declaration or definition or another " 16587 "%<#pragma omp declare simd%>"); 16588 return; 16589 } 16590 c_parser_consume_pragma (parser); 16591 while (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL)) 16592 { 16593 c_token *token = c_parser_peek_token (parser); 16594 if (token->type == CPP_EOF) 16595 { 16596 c_parser_skip_to_pragma_eol (parser); 16597 return; 16598 } 16599 clauses.safe_push (*token); 16600 c_parser_consume_token (parser); 16601 } 16602 clauses.safe_push (*c_parser_peek_token (parser)); 16603 c_parser_skip_to_pragma_eol (parser); 16604 } 16605 16606 /* Make sure nothing tries to read past the end of the tokens. */ 16607 c_token eof_token; 16608 memset (&eof_token, 0, sizeof (eof_token)); 16609 eof_token.type = CPP_EOF; 16610 clauses.safe_push (eof_token); 16611 clauses.safe_push (eof_token); 16612 16613 switch (context) 16614 { 16615 case pragma_external: 16616 if (c_parser_next_token_is (parser, CPP_KEYWORD) 16617 && c_parser_peek_token (parser)->keyword == RID_EXTENSION) 16618 { 16619 int ext = disable_extension_diagnostics (); 16620 do 16621 c_parser_consume_token (parser); 16622 while (c_parser_next_token_is (parser, CPP_KEYWORD) 16623 && c_parser_peek_token (parser)->keyword == RID_EXTENSION); 16624 c_parser_declaration_or_fndef (parser, true, true, true, false, true, 16625 NULL, clauses); 16626 restore_extension_diagnostics (ext); 16627 } 16628 else 16629 c_parser_declaration_or_fndef (parser, true, true, true, false, true, 16630 NULL, clauses); 16631 break; 16632 case pragma_struct: 16633 case pragma_param: 16634 c_parser_error (parser, "%<#pragma omp declare simd%> must be followed by " 16635 "function declaration or definition"); 16636 break; 16637 case pragma_compound: 16638 case pragma_stmt: 16639 if (c_parser_next_token_is (parser, CPP_KEYWORD) 16640 && c_parser_peek_token (parser)->keyword == RID_EXTENSION) 16641 { 16642 int ext = disable_extension_diagnostics (); 16643 do 16644 c_parser_consume_token (parser); 16645 while (c_parser_next_token_is (parser, CPP_KEYWORD) 16646 && c_parser_peek_token (parser)->keyword == RID_EXTENSION); 16647 if (c_parser_next_tokens_start_declaration (parser)) 16648 { 16649 c_parser_declaration_or_fndef (parser, true, true, true, true, 16650 true, NULL, clauses); 16651 restore_extension_diagnostics (ext); 16652 break; 16653 } 16654 restore_extension_diagnostics (ext); 16655 } 16656 else if (c_parser_next_tokens_start_declaration (parser)) 16657 { 16658 c_parser_declaration_or_fndef (parser, true, true, true, true, true, 16659 NULL, clauses); 16660 break; 16661 } 16662 c_parser_error (parser, "%<#pragma omp declare simd%> must be followed by " 16663 "function declaration or definition"); 16664 break; 16665 default: 16666 gcc_unreachable (); 16667 } 16668 } 16669 16670 /* Finalize #pragma omp declare simd clauses after FNDECL has been parsed, 16671 and put that into "omp declare simd" attribute. */ 16672 16673 static void 16674 c_finish_omp_declare_simd (c_parser *parser, tree fndecl, tree parms, 16675 vec<c_token> clauses) 16676 { 16677 if (flag_cilkplus 16678 && (clauses.exists () 16679 || lookup_attribute ("simd", DECL_ATTRIBUTES (fndecl))) 16680 && !vec_safe_is_empty (parser->cilk_simd_fn_tokens)) 16681 { 16682 error ("%<#pragma omp declare simd%> or %<simd%> attribute cannot be " 16683 "used in the same function marked as a Cilk Plus SIMD-enabled " 16684 "function"); 16685 vec_free (parser->cilk_simd_fn_tokens); 16686 return; 16687 } 16688 16689 /* Normally first token is CPP_NAME "simd". CPP_EOF there indicates 16690 error has been reported and CPP_PRAGMA that c_finish_omp_declare_simd 16691 has already processed the tokens. */ 16692 if (clauses.exists () && clauses[0].type == CPP_EOF) 16693 return; 16694 if (fndecl == NULL_TREE || TREE_CODE (fndecl) != FUNCTION_DECL) 16695 { 16696 error ("%<#pragma omp declare simd%> not immediately followed by " 16697 "a function declaration or definition"); 16698 clauses[0].type = CPP_EOF; 16699 return; 16700 } 16701 if (clauses.exists () && clauses[0].type != CPP_NAME) 16702 { 16703 error_at (DECL_SOURCE_LOCATION (fndecl), 16704 "%<#pragma omp declare simd%> not immediately followed by " 16705 "a single function declaration or definition"); 16706 clauses[0].type = CPP_EOF; 16707 return; 16708 } 16709 16710 if (parms == NULL_TREE) 16711 parms = DECL_ARGUMENTS (fndecl); 16712 16713 unsigned int tokens_avail = parser->tokens_avail; 16714 gcc_assert (parser->tokens == &parser->tokens_buf[0]); 16715 bool is_cilkplus_cilk_simd_fn = false; 16716 16717 if (flag_cilkplus && !vec_safe_is_empty (parser->cilk_simd_fn_tokens)) 16718 { 16719 parser->tokens = parser->cilk_simd_fn_tokens->address (); 16720 parser->tokens_avail = vec_safe_length (parser->cilk_simd_fn_tokens); 16721 is_cilkplus_cilk_simd_fn = true; 16722 16723 if (lookup_attribute ("simd", DECL_ATTRIBUTES (fndecl)) != NULL) 16724 { 16725 error_at (DECL_SOURCE_LOCATION (fndecl), 16726 "%<__simd__%> attribute cannot be used in the same " 16727 "function marked as a Cilk Plus SIMD-enabled function"); 16728 vec_free (parser->cilk_simd_fn_tokens); 16729 return; 16730 } 16731 16732 } 16733 else 16734 { 16735 parser->tokens = clauses.address (); 16736 parser->tokens_avail = clauses.length (); 16737 } 16738 16739 /* c_parser_omp_declare_simd pushed 2 extra CPP_EOF tokens at the end. */ 16740 while (parser->tokens_avail > 3) 16741 { 16742 c_token *token = c_parser_peek_token (parser); 16743 if (!is_cilkplus_cilk_simd_fn) 16744 gcc_assert (token->type == CPP_NAME 16745 && strcmp (IDENTIFIER_POINTER (token->value), "simd") == 0); 16746 else 16747 gcc_assert (token->type == CPP_NAME 16748 && is_cilkplus_vector_p (token->value)); 16749 c_parser_consume_token (parser); 16750 parser->in_pragma = true; 16751 16752 tree c = NULL_TREE; 16753 if (is_cilkplus_cilk_simd_fn) 16754 c = c_parser_omp_all_clauses (parser, CILK_SIMD_FN_CLAUSE_MASK, 16755 "SIMD-enabled functions attribute"); 16756 else 16757 c = c_parser_omp_all_clauses (parser, OMP_DECLARE_SIMD_CLAUSE_MASK, 16758 "#pragma omp declare simd"); 16759 c = c_omp_declare_simd_clauses_to_numbers (parms, c); 16760 if (c != NULL_TREE) 16761 c = tree_cons (NULL_TREE, c, NULL_TREE); 16762 if (is_cilkplus_cilk_simd_fn) 16763 { 16764 tree k = build_tree_list (get_identifier ("cilk simd function"), 16765 NULL_TREE); 16766 TREE_CHAIN (k) = DECL_ATTRIBUTES (fndecl); 16767 DECL_ATTRIBUTES (fndecl) = k; 16768 } 16769 c = build_tree_list (get_identifier ("omp declare simd"), c); 16770 TREE_CHAIN (c) = DECL_ATTRIBUTES (fndecl); 16771 DECL_ATTRIBUTES (fndecl) = c; 16772 } 16773 16774 parser->tokens = &parser->tokens_buf[0]; 16775 parser->tokens_avail = tokens_avail; 16776 if (clauses.exists ()) 16777 clauses[0].type = CPP_PRAGMA; 16778 16779 if (!vec_safe_is_empty (parser->cilk_simd_fn_tokens)) 16780 vec_free (parser->cilk_simd_fn_tokens); 16781 } 16782 16783 16784 /* OpenMP 4.0: 16785 # pragma omp declare target new-line 16786 declarations and definitions 16787 # pragma omp end declare target new-line 16788 16789 OpenMP 4.5: 16790 # pragma omp declare target ( extended-list ) new-line 16791 16792 # pragma omp declare target declare-target-clauses[seq] new-line */ 16793 16794 #define OMP_DECLARE_TARGET_CLAUSE_MASK \ 16795 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_TO) \ 16796 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_LINK)) 16797 16798 static void 16799 c_parser_omp_declare_target (c_parser *parser) 16800 { 16801 location_t loc = c_parser_peek_token (parser)->location; 16802 tree clauses = NULL_TREE; 16803 if (c_parser_next_token_is (parser, CPP_NAME)) 16804 clauses = c_parser_omp_all_clauses (parser, OMP_DECLARE_TARGET_CLAUSE_MASK, 16805 "#pragma omp declare target"); 16806 else if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)) 16807 { 16808 clauses = c_parser_omp_var_list_parens (parser, OMP_CLAUSE_TO_DECLARE, 16809 clauses); 16810 clauses = c_finish_omp_clauses (clauses, C_ORT_OMP); 16811 c_parser_skip_to_pragma_eol (parser); 16812 } 16813 else 16814 { 16815 c_parser_skip_to_pragma_eol (parser); 16816 current_omp_declare_target_attribute++; 16817 return; 16818 } 16819 if (current_omp_declare_target_attribute) 16820 error_at (loc, "%<#pragma omp declare target%> with clauses in between " 16821 "%<#pragma omp declare target%> without clauses and " 16822 "%<#pragma omp end declare target%>"); 16823 for (tree c = clauses; c; c = OMP_CLAUSE_CHAIN (c)) 16824 { 16825 tree t = OMP_CLAUSE_DECL (c), id; 16826 tree at1 = lookup_attribute ("omp declare target", DECL_ATTRIBUTES (t)); 16827 tree at2 = lookup_attribute ("omp declare target link", 16828 DECL_ATTRIBUTES (t)); 16829 if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LINK) 16830 { 16831 id = get_identifier ("omp declare target link"); 16832 std::swap (at1, at2); 16833 } 16834 else 16835 id = get_identifier ("omp declare target"); 16836 if (at2) 16837 { 16838 error_at (OMP_CLAUSE_LOCATION (c), 16839 "%qD specified both in declare target %<link%> and %<to%>" 16840 " clauses", t); 16841 continue; 16842 } 16843 if (!at1) 16844 { 16845 DECL_ATTRIBUTES (t) = tree_cons (id, NULL_TREE, DECL_ATTRIBUTES (t)); 16846 if (TREE_CODE (t) != FUNCTION_DECL && !is_global_var (t)) 16847 continue; 16848 16849 symtab_node *node = symtab_node::get (t); 16850 if (node != NULL) 16851 { 16852 node->offloadable = 1; 16853 if (ENABLE_OFFLOADING) 16854 { 16855 g->have_offload = true; 16856 if (is_a <varpool_node *> (node)) 16857 vec_safe_push (offload_vars, t); 16858 } 16859 } 16860 } 16861 } 16862 } 16863 16864 static void 16865 c_parser_omp_end_declare_target (c_parser *parser) 16866 { 16867 location_t loc = c_parser_peek_token (parser)->location; 16868 c_parser_consume_pragma (parser); 16869 if (c_parser_next_token_is (parser, CPP_NAME) 16870 && strcmp (IDENTIFIER_POINTER (c_parser_peek_token (parser)->value), 16871 "declare") == 0) 16872 { 16873 c_parser_consume_token (parser); 16874 if (c_parser_next_token_is (parser, CPP_NAME) 16875 && strcmp (IDENTIFIER_POINTER (c_parser_peek_token (parser)->value), 16876 "target") == 0) 16877 c_parser_consume_token (parser); 16878 else 16879 { 16880 c_parser_error (parser, "expected %<target%>"); 16881 c_parser_skip_to_pragma_eol (parser); 16882 return; 16883 } 16884 } 16885 else 16886 { 16887 c_parser_error (parser, "expected %<declare%>"); 16888 c_parser_skip_to_pragma_eol (parser); 16889 return; 16890 } 16891 c_parser_skip_to_pragma_eol (parser); 16892 if (!current_omp_declare_target_attribute) 16893 error_at (loc, "%<#pragma omp end declare target%> without corresponding " 16894 "%<#pragma omp declare target%>"); 16895 else 16896 current_omp_declare_target_attribute--; 16897 } 16898 16899 16900 /* OpenMP 4.0 16901 #pragma omp declare reduction (reduction-id : typename-list : expression) \ 16902 initializer-clause[opt] new-line 16903 16904 initializer-clause: 16905 initializer (omp_priv = initializer) 16906 initializer (function-name (argument-list)) */ 16907 16908 static void 16909 c_parser_omp_declare_reduction (c_parser *parser, enum pragma_context context) 16910 { 16911 unsigned int tokens_avail = 0, i; 16912 vec<tree> types = vNULL; 16913 vec<c_token> clauses = vNULL; 16914 enum tree_code reduc_code = ERROR_MARK; 16915 tree reduc_id = NULL_TREE; 16916 tree type; 16917 location_t rloc = c_parser_peek_token (parser)->location; 16918 16919 if (context == pragma_struct || context == pragma_param) 16920 { 16921 error ("%<#pragma omp declare reduction%> not at file or block scope"); 16922 goto fail; 16923 } 16924 16925 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 16926 goto fail; 16927 16928 switch (c_parser_peek_token (parser)->type) 16929 { 16930 case CPP_PLUS: 16931 reduc_code = PLUS_EXPR; 16932 break; 16933 case CPP_MULT: 16934 reduc_code = MULT_EXPR; 16935 break; 16936 case CPP_MINUS: 16937 reduc_code = MINUS_EXPR; 16938 break; 16939 case CPP_AND: 16940 reduc_code = BIT_AND_EXPR; 16941 break; 16942 case CPP_XOR: 16943 reduc_code = BIT_XOR_EXPR; 16944 break; 16945 case CPP_OR: 16946 reduc_code = BIT_IOR_EXPR; 16947 break; 16948 case CPP_AND_AND: 16949 reduc_code = TRUTH_ANDIF_EXPR; 16950 break; 16951 case CPP_OR_OR: 16952 reduc_code = TRUTH_ORIF_EXPR; 16953 break; 16954 case CPP_NAME: 16955 const char *p; 16956 p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value); 16957 if (strcmp (p, "min") == 0) 16958 { 16959 reduc_code = MIN_EXPR; 16960 break; 16961 } 16962 if (strcmp (p, "max") == 0) 16963 { 16964 reduc_code = MAX_EXPR; 16965 break; 16966 } 16967 reduc_id = c_parser_peek_token (parser)->value; 16968 break; 16969 default: 16970 c_parser_error (parser, 16971 "expected %<+%>, %<*%>, %<-%>, %<&%>, " 16972 "%<^%>, %<|%>, %<&&%>, %<||%> or identifier"); 16973 goto fail; 16974 } 16975 16976 tree orig_reduc_id, reduc_decl; 16977 orig_reduc_id = reduc_id; 16978 reduc_id = c_omp_reduction_id (reduc_code, reduc_id); 16979 reduc_decl = c_omp_reduction_decl (reduc_id); 16980 c_parser_consume_token (parser); 16981 16982 if (!c_parser_require (parser, CPP_COLON, "expected %<:%>")) 16983 goto fail; 16984 16985 while (true) 16986 { 16987 location_t loc = c_parser_peek_token (parser)->location; 16988 struct c_type_name *ctype = c_parser_type_name (parser); 16989 if (ctype != NULL) 16990 { 16991 type = groktypename (ctype, NULL, NULL); 16992 if (type == error_mark_node) 16993 ; 16994 else if ((INTEGRAL_TYPE_P (type) 16995 || TREE_CODE (type) == REAL_TYPE 16996 || TREE_CODE (type) == COMPLEX_TYPE) 16997 && orig_reduc_id == NULL_TREE) 16998 error_at (loc, "predeclared arithmetic type in " 16999 "%<#pragma omp declare reduction%>"); 17000 else if (TREE_CODE (type) == FUNCTION_TYPE 17001 || TREE_CODE (type) == ARRAY_TYPE) 17002 error_at (loc, "function or array type in " 17003 "%<#pragma omp declare reduction%>"); 17004 else if (TYPE_ATOMIC (type)) 17005 error_at (loc, "%<_Atomic%> qualified type in " 17006 "%<#pragma omp declare reduction%>"); 17007 else if (TYPE_QUALS_NO_ADDR_SPACE (type)) 17008 error_at (loc, "const, volatile or restrict qualified type in " 17009 "%<#pragma omp declare reduction%>"); 17010 else 17011 { 17012 tree t; 17013 for (t = DECL_INITIAL (reduc_decl); t; t = TREE_CHAIN (t)) 17014 if (comptypes (TREE_PURPOSE (t), type)) 17015 { 17016 error_at (loc, "redeclaration of %qs " 17017 "%<#pragma omp declare reduction%> for " 17018 "type %qT", 17019 IDENTIFIER_POINTER (reduc_id) 17020 + sizeof ("omp declare reduction ") - 1, 17021 type); 17022 location_t ploc 17023 = DECL_SOURCE_LOCATION (TREE_VEC_ELT (TREE_VALUE (t), 17024 0)); 17025 error_at (ploc, "previous %<#pragma omp declare " 17026 "reduction%>"); 17027 break; 17028 } 17029 if (t == NULL_TREE) 17030 types.safe_push (type); 17031 } 17032 if (c_parser_next_token_is (parser, CPP_COMMA)) 17033 c_parser_consume_token (parser); 17034 else 17035 break; 17036 } 17037 else 17038 break; 17039 } 17040 17041 if (!c_parser_require (parser, CPP_COLON, "expected %<:%>") 17042 || types.is_empty ()) 17043 { 17044 fail: 17045 clauses.release (); 17046 types.release (); 17047 while (true) 17048 { 17049 c_token *token = c_parser_peek_token (parser); 17050 if (token->type == CPP_EOF || token->type == CPP_PRAGMA_EOL) 17051 break; 17052 c_parser_consume_token (parser); 17053 } 17054 c_parser_skip_to_pragma_eol (parser); 17055 return; 17056 } 17057 17058 if (types.length () > 1) 17059 { 17060 while (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL)) 17061 { 17062 c_token *token = c_parser_peek_token (parser); 17063 if (token->type == CPP_EOF) 17064 goto fail; 17065 clauses.safe_push (*token); 17066 c_parser_consume_token (parser); 17067 } 17068 clauses.safe_push (*c_parser_peek_token (parser)); 17069 c_parser_skip_to_pragma_eol (parser); 17070 17071 /* Make sure nothing tries to read past the end of the tokens. */ 17072 c_token eof_token; 17073 memset (&eof_token, 0, sizeof (eof_token)); 17074 eof_token.type = CPP_EOF; 17075 clauses.safe_push (eof_token); 17076 clauses.safe_push (eof_token); 17077 } 17078 17079 int errs = errorcount; 17080 FOR_EACH_VEC_ELT (types, i, type) 17081 { 17082 tokens_avail = parser->tokens_avail; 17083 gcc_assert (parser->tokens == &parser->tokens_buf[0]); 17084 if (!clauses.is_empty ()) 17085 { 17086 parser->tokens = clauses.address (); 17087 parser->tokens_avail = clauses.length (); 17088 parser->in_pragma = true; 17089 } 17090 17091 bool nested = current_function_decl != NULL_TREE; 17092 if (nested) 17093 c_push_function_context (); 17094 tree fndecl = build_decl (BUILTINS_LOCATION, FUNCTION_DECL, 17095 reduc_id, default_function_type); 17096 current_function_decl = fndecl; 17097 allocate_struct_function (fndecl, true); 17098 push_scope (); 17099 tree stmt = push_stmt_list (); 17100 /* Intentionally BUILTINS_LOCATION, so that -Wshadow doesn't 17101 warn about these. */ 17102 tree omp_out = build_decl (BUILTINS_LOCATION, VAR_DECL, 17103 get_identifier ("omp_out"), type); 17104 DECL_ARTIFICIAL (omp_out) = 1; 17105 DECL_CONTEXT (omp_out) = fndecl; 17106 pushdecl (omp_out); 17107 tree omp_in = build_decl (BUILTINS_LOCATION, VAR_DECL, 17108 get_identifier ("omp_in"), type); 17109 DECL_ARTIFICIAL (omp_in) = 1; 17110 DECL_CONTEXT (omp_in) = fndecl; 17111 pushdecl (omp_in); 17112 struct c_expr combiner = c_parser_expression (parser); 17113 struct c_expr initializer; 17114 tree omp_priv = NULL_TREE, omp_orig = NULL_TREE; 17115 bool bad = false; 17116 initializer.value = error_mark_node; 17117 if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>")) 17118 bad = true; 17119 else if (c_parser_next_token_is (parser, CPP_NAME) 17120 && strcmp (IDENTIFIER_POINTER 17121 (c_parser_peek_token (parser)->value), 17122 "initializer") == 0) 17123 { 17124 c_parser_consume_token (parser); 17125 pop_scope (); 17126 push_scope (); 17127 omp_priv = build_decl (BUILTINS_LOCATION, VAR_DECL, 17128 get_identifier ("omp_priv"), type); 17129 DECL_ARTIFICIAL (omp_priv) = 1; 17130 DECL_INITIAL (omp_priv) = error_mark_node; 17131 DECL_CONTEXT (omp_priv) = fndecl; 17132 pushdecl (omp_priv); 17133 omp_orig = build_decl (BUILTINS_LOCATION, VAR_DECL, 17134 get_identifier ("omp_orig"), type); 17135 DECL_ARTIFICIAL (omp_orig) = 1; 17136 DECL_CONTEXT (omp_orig) = fndecl; 17137 pushdecl (omp_orig); 17138 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 17139 bad = true; 17140 else if (!c_parser_next_token_is (parser, CPP_NAME)) 17141 { 17142 c_parser_error (parser, "expected %<omp_priv%> or " 17143 "function-name"); 17144 bad = true; 17145 } 17146 else if (strcmp (IDENTIFIER_POINTER 17147 (c_parser_peek_token (parser)->value), 17148 "omp_priv") != 0) 17149 { 17150 if (c_parser_peek_2nd_token (parser)->type != CPP_OPEN_PAREN 17151 || c_parser_peek_token (parser)->id_kind != C_ID_ID) 17152 { 17153 c_parser_error (parser, "expected function-name %<(%>"); 17154 bad = true; 17155 } 17156 else 17157 initializer = c_parser_postfix_expression (parser); 17158 if (initializer.value 17159 && TREE_CODE (initializer.value) == CALL_EXPR) 17160 { 17161 int j; 17162 tree c = initializer.value; 17163 for (j = 0; j < call_expr_nargs (c); j++) 17164 { 17165 tree a = CALL_EXPR_ARG (c, j); 17166 STRIP_NOPS (a); 17167 if (TREE_CODE (a) == ADDR_EXPR 17168 && TREE_OPERAND (a, 0) == omp_priv) 17169 break; 17170 } 17171 if (j == call_expr_nargs (c)) 17172 error ("one of the initializer call arguments should be " 17173 "%<&omp_priv%>"); 17174 } 17175 } 17176 else 17177 { 17178 c_parser_consume_token (parser); 17179 if (!c_parser_require (parser, CPP_EQ, "expected %<=%>")) 17180 bad = true; 17181 else 17182 { 17183 tree st = push_stmt_list (); 17184 location_t loc = c_parser_peek_token (parser)->location; 17185 rich_location richloc (line_table, loc); 17186 start_init (omp_priv, NULL_TREE, 0, &richloc); 17187 struct c_expr init = c_parser_initializer (parser); 17188 finish_init (); 17189 finish_decl (omp_priv, loc, init.value, 17190 init.original_type, NULL_TREE); 17191 pop_stmt_list (st); 17192 } 17193 } 17194 if (!bad 17195 && !c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>")) 17196 bad = true; 17197 } 17198 17199 if (!bad) 17200 { 17201 c_parser_skip_to_pragma_eol (parser); 17202 17203 tree t = tree_cons (type, make_tree_vec (omp_priv ? 6 : 3), 17204 DECL_INITIAL (reduc_decl)); 17205 DECL_INITIAL (reduc_decl) = t; 17206 DECL_SOURCE_LOCATION (omp_out) = rloc; 17207 TREE_VEC_ELT (TREE_VALUE (t), 0) = omp_out; 17208 TREE_VEC_ELT (TREE_VALUE (t), 1) = omp_in; 17209 TREE_VEC_ELT (TREE_VALUE (t), 2) = combiner.value; 17210 walk_tree (&combiner.value, c_check_omp_declare_reduction_r, 17211 &TREE_VEC_ELT (TREE_VALUE (t), 0), NULL); 17212 if (omp_priv) 17213 { 17214 DECL_SOURCE_LOCATION (omp_priv) = rloc; 17215 TREE_VEC_ELT (TREE_VALUE (t), 3) = omp_priv; 17216 TREE_VEC_ELT (TREE_VALUE (t), 4) = omp_orig; 17217 TREE_VEC_ELT (TREE_VALUE (t), 5) = initializer.value; 17218 walk_tree (&initializer.value, c_check_omp_declare_reduction_r, 17219 &TREE_VEC_ELT (TREE_VALUE (t), 3), NULL); 17220 walk_tree (&DECL_INITIAL (omp_priv), 17221 c_check_omp_declare_reduction_r, 17222 &TREE_VEC_ELT (TREE_VALUE (t), 3), NULL); 17223 } 17224 } 17225 17226 pop_stmt_list (stmt); 17227 pop_scope (); 17228 if (cfun->language != NULL) 17229 { 17230 ggc_free (cfun->language); 17231 cfun->language = NULL; 17232 } 17233 set_cfun (NULL); 17234 current_function_decl = NULL_TREE; 17235 if (nested) 17236 c_pop_function_context (); 17237 17238 if (!clauses.is_empty ()) 17239 { 17240 parser->tokens = &parser->tokens_buf[0]; 17241 parser->tokens_avail = tokens_avail; 17242 } 17243 if (bad) 17244 goto fail; 17245 if (errs != errorcount) 17246 break; 17247 } 17248 17249 clauses.release (); 17250 types.release (); 17251 } 17252 17253 17254 /* OpenMP 4.0 17255 #pragma omp declare simd declare-simd-clauses[optseq] new-line 17256 #pragma omp declare reduction (reduction-id : typename-list : expression) \ 17257 initializer-clause[opt] new-line 17258 #pragma omp declare target new-line */ 17259 17260 static void 17261 c_parser_omp_declare (c_parser *parser, enum pragma_context context) 17262 { 17263 c_parser_consume_pragma (parser); 17264 if (c_parser_next_token_is (parser, CPP_NAME)) 17265 { 17266 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value); 17267 if (strcmp (p, "simd") == 0) 17268 { 17269 /* c_parser_consume_token (parser); done in 17270 c_parser_omp_declare_simd. */ 17271 c_parser_omp_declare_simd (parser, context); 17272 return; 17273 } 17274 if (strcmp (p, "reduction") == 0) 17275 { 17276 c_parser_consume_token (parser); 17277 c_parser_omp_declare_reduction (parser, context); 17278 return; 17279 } 17280 if (!flag_openmp) /* flag_openmp_simd */ 17281 { 17282 c_parser_skip_to_pragma_eol (parser, false); 17283 return; 17284 } 17285 if (strcmp (p, "target") == 0) 17286 { 17287 c_parser_consume_token (parser); 17288 c_parser_omp_declare_target (parser); 17289 return; 17290 } 17291 } 17292 17293 c_parser_error (parser, "expected %<simd%> or %<reduction%> " 17294 "or %<target%>"); 17295 c_parser_skip_to_pragma_eol (parser); 17296 } 17297 17298 /* OpenMP 4.5: 17299 #pragma omp taskloop taskloop-clause[optseq] new-line 17300 for-loop 17301 17302 #pragma omp taskloop simd taskloop-simd-clause[optseq] new-line 17303 for-loop */ 17304 17305 #define OMP_TASKLOOP_CLAUSE_MASK \ 17306 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_SHARED) \ 17307 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRIVATE) \ 17308 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE) \ 17309 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_LASTPRIVATE) \ 17310 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEFAULT) \ 17311 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_GRAINSIZE) \ 17312 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NUM_TASKS) \ 17313 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_COLLAPSE) \ 17314 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_UNTIED) \ 17315 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IF) \ 17316 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FINAL) \ 17317 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_MERGEABLE) \ 17318 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOGROUP) \ 17319 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRIORITY)) 17320 17321 static tree 17322 c_parser_omp_taskloop (location_t loc, c_parser *parser, 17323 char *p_name, omp_clause_mask mask, tree *cclauses, 17324 bool *if_p) 17325 { 17326 tree clauses, block, ret; 17327 17328 strcat (p_name, " taskloop"); 17329 mask |= OMP_TASKLOOP_CLAUSE_MASK; 17330 17331 if (c_parser_next_token_is (parser, CPP_NAME)) 17332 { 17333 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value); 17334 17335 if (strcmp (p, "simd") == 0) 17336 { 17337 tree cclauses_buf[C_OMP_CLAUSE_SPLIT_COUNT]; 17338 if (cclauses == NULL) 17339 cclauses = cclauses_buf; 17340 mask &= ~(OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_REDUCTION); 17341 c_parser_consume_token (parser); 17342 if (!flag_openmp) /* flag_openmp_simd */ 17343 return c_parser_omp_simd (loc, parser, p_name, mask, cclauses, 17344 if_p); 17345 block = c_begin_compound_stmt (true); 17346 ret = c_parser_omp_simd (loc, parser, p_name, mask, cclauses, if_p); 17347 block = c_end_compound_stmt (loc, block, true); 17348 if (ret == NULL) 17349 return ret; 17350 ret = make_node (OMP_TASKLOOP); 17351 TREE_TYPE (ret) = void_type_node; 17352 OMP_FOR_BODY (ret) = block; 17353 OMP_FOR_CLAUSES (ret) = cclauses[C_OMP_CLAUSE_SPLIT_TASKLOOP]; 17354 SET_EXPR_LOCATION (ret, loc); 17355 add_stmt (ret); 17356 return ret; 17357 } 17358 } 17359 if (!flag_openmp) /* flag_openmp_simd */ 17360 { 17361 c_parser_skip_to_pragma_eol (parser, false); 17362 return NULL_TREE; 17363 } 17364 17365 clauses = c_parser_omp_all_clauses (parser, mask, p_name, cclauses == NULL); 17366 if (cclauses) 17367 { 17368 omp_split_clauses (loc, OMP_TASKLOOP, mask, clauses, cclauses); 17369 clauses = cclauses[C_OMP_CLAUSE_SPLIT_TASKLOOP]; 17370 } 17371 17372 block = c_begin_compound_stmt (true); 17373 ret = c_parser_omp_for_loop (loc, parser, OMP_TASKLOOP, clauses, NULL, if_p); 17374 block = c_end_compound_stmt (loc, block, true); 17375 add_stmt (block); 17376 17377 return ret; 17378 } 17379 17380 /* Main entry point to parsing most OpenMP pragmas. */ 17381 17382 static void 17383 c_parser_omp_construct (c_parser *parser, bool *if_p) 17384 { 17385 enum pragma_kind p_kind; 17386 location_t loc; 17387 tree stmt; 17388 char p_name[sizeof "#pragma omp teams distribute parallel for simd"]; 17389 omp_clause_mask mask (0); 17390 17391 loc = c_parser_peek_token (parser)->location; 17392 p_kind = c_parser_peek_token (parser)->pragma_kind; 17393 c_parser_consume_pragma (parser); 17394 17395 switch (p_kind) 17396 { 17397 case PRAGMA_OACC_ATOMIC: 17398 c_parser_omp_atomic (loc, parser); 17399 return; 17400 case PRAGMA_OACC_CACHE: 17401 strcpy (p_name, "#pragma acc"); 17402 stmt = c_parser_oacc_cache (loc, parser); 17403 break; 17404 case PRAGMA_OACC_DATA: 17405 stmt = c_parser_oacc_data (loc, parser, if_p); 17406 break; 17407 case PRAGMA_OACC_HOST_DATA: 17408 stmt = c_parser_oacc_host_data (loc, parser, if_p); 17409 break; 17410 case PRAGMA_OACC_KERNELS: 17411 case PRAGMA_OACC_PARALLEL: 17412 strcpy (p_name, "#pragma acc"); 17413 stmt = c_parser_oacc_kernels_parallel (loc, parser, p_kind, p_name, 17414 if_p); 17415 break; 17416 case PRAGMA_OACC_LOOP: 17417 strcpy (p_name, "#pragma acc"); 17418 stmt = c_parser_oacc_loop (loc, parser, p_name, mask, NULL, if_p); 17419 break; 17420 case PRAGMA_OACC_WAIT: 17421 strcpy (p_name, "#pragma wait"); 17422 stmt = c_parser_oacc_wait (loc, parser, p_name); 17423 break; 17424 case PRAGMA_OMP_ATOMIC: 17425 c_parser_omp_atomic (loc, parser); 17426 return; 17427 case PRAGMA_OMP_CRITICAL: 17428 stmt = c_parser_omp_critical (loc, parser, if_p); 17429 break; 17430 case PRAGMA_OMP_DISTRIBUTE: 17431 strcpy (p_name, "#pragma omp"); 17432 stmt = c_parser_omp_distribute (loc, parser, p_name, mask, NULL, if_p); 17433 break; 17434 case PRAGMA_OMP_FOR: 17435 strcpy (p_name, "#pragma omp"); 17436 stmt = c_parser_omp_for (loc, parser, p_name, mask, NULL, if_p); 17437 break; 17438 case PRAGMA_OMP_MASTER: 17439 stmt = c_parser_omp_master (loc, parser, if_p); 17440 break; 17441 case PRAGMA_OMP_PARALLEL: 17442 strcpy (p_name, "#pragma omp"); 17443 stmt = c_parser_omp_parallel (loc, parser, p_name, mask, NULL, if_p); 17444 break; 17445 case PRAGMA_OMP_SECTIONS: 17446 strcpy (p_name, "#pragma omp"); 17447 stmt = c_parser_omp_sections (loc, parser, p_name, mask, NULL); 17448 break; 17449 case PRAGMA_OMP_SIMD: 17450 strcpy (p_name, "#pragma omp"); 17451 stmt = c_parser_omp_simd (loc, parser, p_name, mask, NULL, if_p); 17452 break; 17453 case PRAGMA_OMP_SINGLE: 17454 stmt = c_parser_omp_single (loc, parser, if_p); 17455 break; 17456 case PRAGMA_OMP_TASK: 17457 stmt = c_parser_omp_task (loc, parser, if_p); 17458 break; 17459 case PRAGMA_OMP_TASKGROUP: 17460 stmt = c_parser_omp_taskgroup (parser, if_p); 17461 break; 17462 case PRAGMA_OMP_TASKLOOP: 17463 strcpy (p_name, "#pragma omp"); 17464 stmt = c_parser_omp_taskloop (loc, parser, p_name, mask, NULL, if_p); 17465 break; 17466 case PRAGMA_OMP_TEAMS: 17467 strcpy (p_name, "#pragma omp"); 17468 stmt = c_parser_omp_teams (loc, parser, p_name, mask, NULL, if_p); 17469 break; 17470 default: 17471 gcc_unreachable (); 17472 } 17473 17474 if (stmt) 17475 gcc_assert (EXPR_LOCATION (stmt) != UNKNOWN_LOCATION); 17476 } 17477 17478 17479 /* OpenMP 2.5: 17480 # pragma omp threadprivate (variable-list) */ 17481 17482 static void 17483 c_parser_omp_threadprivate (c_parser *parser) 17484 { 17485 tree vars, t; 17486 location_t loc; 17487 17488 c_parser_consume_pragma (parser); 17489 loc = c_parser_peek_token (parser)->location; 17490 vars = c_parser_omp_var_list_parens (parser, OMP_CLAUSE_ERROR, NULL); 17491 17492 /* Mark every variable in VARS to be assigned thread local storage. */ 17493 for (t = vars; t; t = TREE_CHAIN (t)) 17494 { 17495 tree v = TREE_PURPOSE (t); 17496 17497 /* FIXME diagnostics: Ideally we should keep individual 17498 locations for all the variables in the var list to make the 17499 following errors more precise. Perhaps 17500 c_parser_omp_var_list_parens() should construct a list of 17501 locations to go along with the var list. */ 17502 17503 /* If V had already been marked threadprivate, it doesn't matter 17504 whether it had been used prior to this point. */ 17505 if (!VAR_P (v)) 17506 error_at (loc, "%qD is not a variable", v); 17507 else if (TREE_USED (v) && !C_DECL_THREADPRIVATE_P (v)) 17508 error_at (loc, "%qE declared %<threadprivate%> after first use", v); 17509 else if (! is_global_var (v)) 17510 error_at (loc, "automatic variable %qE cannot be %<threadprivate%>", v); 17511 else if (TREE_TYPE (v) == error_mark_node) 17512 ; 17513 else if (! COMPLETE_TYPE_P (TREE_TYPE (v))) 17514 error_at (loc, "%<threadprivate%> %qE has incomplete type", v); 17515 else 17516 { 17517 if (! DECL_THREAD_LOCAL_P (v)) 17518 { 17519 set_decl_tls_model (v, decl_default_tls_model (v)); 17520 /* If rtl has been already set for this var, call 17521 make_decl_rtl once again, so that encode_section_info 17522 has a chance to look at the new decl flags. */ 17523 if (DECL_RTL_SET_P (v)) 17524 make_decl_rtl (v); 17525 } 17526 C_DECL_THREADPRIVATE_P (v) = 1; 17527 } 17528 } 17529 17530 c_parser_skip_to_pragma_eol (parser); 17531 } 17532 17533 /* Cilk Plus <#pragma simd> parsing routines. */ 17534 17535 /* Helper function for c_parser_pragma. Perform some sanity checking 17536 for <#pragma simd> constructs. Returns FALSE if there was a 17537 problem. */ 17538 17539 static bool 17540 c_parser_cilk_verify_simd (c_parser *parser, 17541 enum pragma_context context) 17542 { 17543 if (!flag_cilkplus) 17544 { 17545 warning (0, "pragma simd ignored because -fcilkplus is not enabled"); 17546 c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL); 17547 return false; 17548 } 17549 if (context == pragma_external) 17550 { 17551 c_parser_error (parser,"pragma simd must be inside a function"); 17552 c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL); 17553 return false; 17554 } 17555 return true; 17556 } 17557 17558 /* Cilk Plus: 17559 This function is shared by SIMD-enabled functions and #pragma simd. 17560 If IS_SIMD_FN is true then it is parsing a SIMD-enabled function and 17561 CLAUSES is unused. The main purpose of this function is to parse a 17562 vectorlength attribute or clause and check for parse errors. 17563 When IS_SIMD_FN is true then the function is merely caching the tokens 17564 in PARSER->CILK_SIMD_FN_TOKENS. If errors are found then the token 17565 cache is cleared since there is no reason to continue. 17566 Syntax: 17567 vectorlength ( constant-expression ) */ 17568 17569 static tree 17570 c_parser_cilk_clause_vectorlength (c_parser *parser, tree clauses, 17571 bool is_simd_fn) 17572 { 17573 if (is_simd_fn) 17574 check_no_duplicate_clause (clauses, OMP_CLAUSE_SIMDLEN, "vectorlength"); 17575 else 17576 /* The vectorlength clause behaves exactly like OpenMP's safelen 17577 clause. Represent it in OpenMP terms. */ 17578 check_no_duplicate_clause (clauses, OMP_CLAUSE_SAFELEN, "vectorlength"); 17579 17580 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 17581 return clauses; 17582 17583 location_t loc = c_parser_peek_token (parser)->location; 17584 tree expr = c_parser_expr_no_commas (parser, NULL).value; 17585 expr = c_fully_fold (expr, false, NULL); 17586 17587 /* If expr is an error_mark_node then the above function would have 17588 emitted an error. No reason to do it twice. */ 17589 if (expr == error_mark_node) 17590 ; 17591 else if (!TREE_TYPE (expr) 17592 || !TREE_CONSTANT (expr) 17593 || !INTEGRAL_TYPE_P (TREE_TYPE (expr))) 17594 17595 error_at (loc, "vectorlength must be an integer constant"); 17596 else if (wi::exact_log2 (expr) == -1) 17597 error_at (loc, "vectorlength must be a power of 2"); 17598 else 17599 { 17600 if (is_simd_fn) 17601 { 17602 tree u = build_omp_clause (loc, OMP_CLAUSE_SIMDLEN); 17603 OMP_CLAUSE_SIMDLEN_EXPR (u) = expr; 17604 OMP_CLAUSE_CHAIN (u) = clauses; 17605 clauses = u; 17606 } 17607 else 17608 { 17609 tree u = build_omp_clause (loc, OMP_CLAUSE_SAFELEN); 17610 OMP_CLAUSE_SAFELEN_EXPR (u) = expr; 17611 OMP_CLAUSE_CHAIN (u) = clauses; 17612 clauses = u; 17613 } 17614 } 17615 17616 c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 17617 17618 return clauses; 17619 } 17620 17621 /* Cilk Plus: 17622 linear ( simd-linear-variable-list ) 17623 17624 simd-linear-variable-list: 17625 simd-linear-variable 17626 simd-linear-variable-list , simd-linear-variable 17627 17628 simd-linear-variable: 17629 id-expression 17630 id-expression : simd-linear-step 17631 17632 simd-linear-step: 17633 conditional-expression */ 17634 17635 static tree 17636 c_parser_cilk_clause_linear (c_parser *parser, tree clauses) 17637 { 17638 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 17639 return clauses; 17640 17641 location_t loc = c_parser_peek_token (parser)->location; 17642 17643 if (c_parser_next_token_is_not (parser, CPP_NAME) 17644 || c_parser_peek_token (parser)->id_kind != C_ID_ID) 17645 c_parser_error (parser, "expected identifier"); 17646 17647 while (c_parser_next_token_is (parser, CPP_NAME) 17648 && c_parser_peek_token (parser)->id_kind == C_ID_ID) 17649 { 17650 tree var = lookup_name (c_parser_peek_token (parser)->value); 17651 17652 if (var == NULL) 17653 { 17654 undeclared_variable (c_parser_peek_token (parser)->location, 17655 c_parser_peek_token (parser)->value); 17656 c_parser_consume_token (parser); 17657 } 17658 else if (var == error_mark_node) 17659 c_parser_consume_token (parser); 17660 else 17661 { 17662 tree step = integer_one_node; 17663 17664 /* Parse the linear step if present. */ 17665 if (c_parser_peek_2nd_token (parser)->type == CPP_COLON) 17666 { 17667 c_parser_consume_token (parser); 17668 c_parser_consume_token (parser); 17669 17670 tree expr = c_parser_expr_no_commas (parser, NULL).value; 17671 expr = c_fully_fold (expr, false, NULL); 17672 17673 if (TREE_TYPE (expr) 17674 && INTEGRAL_TYPE_P (TREE_TYPE (expr)) 17675 && (TREE_CONSTANT (expr) 17676 || DECL_P (expr))) 17677 step = expr; 17678 else 17679 c_parser_error (parser, 17680 "step size must be an integer constant " 17681 "expression or an integer variable"); 17682 } 17683 else 17684 c_parser_consume_token (parser); 17685 17686 /* Use OMP_CLAUSE_LINEAR, which has the same semantics. */ 17687 tree u = build_omp_clause (loc, OMP_CLAUSE_LINEAR); 17688 OMP_CLAUSE_DECL (u) = var; 17689 OMP_CLAUSE_LINEAR_STEP (u) = step; 17690 OMP_CLAUSE_CHAIN (u) = clauses; 17691 clauses = u; 17692 } 17693 17694 if (c_parser_next_token_is_not (parser, CPP_COMMA)) 17695 break; 17696 17697 c_parser_consume_token (parser); 17698 } 17699 17700 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); 17701 17702 return clauses; 17703 } 17704 17705 /* Returns the name of the next clause. If the clause is not 17706 recognized SIMD_OMP_CLAUSE_NONE is returned and the next token is 17707 not consumed. Otherwise, the appropriate pragma_simd_clause is 17708 returned and the token is consumed. */ 17709 17710 static pragma_omp_clause 17711 c_parser_cilk_clause_name (c_parser *parser) 17712 { 17713 pragma_omp_clause result; 17714 c_token *token = c_parser_peek_token (parser); 17715 17716 if (!token->value || token->type != CPP_NAME) 17717 return PRAGMA_CILK_CLAUSE_NONE; 17718 17719 const char *p = IDENTIFIER_POINTER (token->value); 17720 17721 if (!strcmp (p, "vectorlength")) 17722 result = PRAGMA_CILK_CLAUSE_VECTORLENGTH; 17723 else if (!strcmp (p, "linear")) 17724 result = PRAGMA_CILK_CLAUSE_LINEAR; 17725 else if (!strcmp (p, "private")) 17726 result = PRAGMA_CILK_CLAUSE_PRIVATE; 17727 else if (!strcmp (p, "firstprivate")) 17728 result = PRAGMA_CILK_CLAUSE_FIRSTPRIVATE; 17729 else if (!strcmp (p, "lastprivate")) 17730 result = PRAGMA_CILK_CLAUSE_LASTPRIVATE; 17731 else if (!strcmp (p, "reduction")) 17732 result = PRAGMA_CILK_CLAUSE_REDUCTION; 17733 else 17734 return PRAGMA_CILK_CLAUSE_NONE; 17735 17736 c_parser_consume_token (parser); 17737 return result; 17738 } 17739 17740 /* Parse all #<pragma simd> clauses. Return the list of clauses 17741 found. */ 17742 17743 static tree 17744 c_parser_cilk_all_clauses (c_parser *parser) 17745 { 17746 tree clauses = NULL; 17747 17748 while (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL)) 17749 { 17750 pragma_omp_clause c_kind; 17751 17752 c_kind = c_parser_cilk_clause_name (parser); 17753 17754 switch (c_kind) 17755 { 17756 case PRAGMA_CILK_CLAUSE_VECTORLENGTH: 17757 clauses = c_parser_cilk_clause_vectorlength (parser, clauses, false); 17758 break; 17759 case PRAGMA_CILK_CLAUSE_LINEAR: 17760 clauses = c_parser_cilk_clause_linear (parser, clauses); 17761 break; 17762 case PRAGMA_CILK_CLAUSE_PRIVATE: 17763 /* Use the OpenMP counterpart. */ 17764 clauses = c_parser_omp_clause_private (parser, clauses); 17765 break; 17766 case PRAGMA_CILK_CLAUSE_FIRSTPRIVATE: 17767 /* Use the OpenMP counterpart. */ 17768 clauses = c_parser_omp_clause_firstprivate (parser, clauses); 17769 break; 17770 case PRAGMA_CILK_CLAUSE_LASTPRIVATE: 17771 /* Use the OpenMP counterpart. */ 17772 clauses = c_parser_omp_clause_lastprivate (parser, clauses); 17773 break; 17774 case PRAGMA_CILK_CLAUSE_REDUCTION: 17775 /* Use the OpenMP counterpart. */ 17776 clauses = c_parser_omp_clause_reduction (parser, clauses); 17777 break; 17778 default: 17779 c_parser_error (parser, "expected %<#pragma simd%> clause"); 17780 goto saw_error; 17781 } 17782 } 17783 17784 saw_error: 17785 c_parser_skip_to_pragma_eol (parser); 17786 return c_finish_omp_clauses (clauses, C_ORT_CILK); 17787 } 17788 17789 /* This function helps parse the grainsize pragma for a _Cilk_for statement. 17790 Here is the correct syntax of this pragma: 17791 #pragma cilk grainsize = <EXP> 17792 */ 17793 17794 static void 17795 c_parser_cilk_grainsize (c_parser *parser, bool *if_p) 17796 { 17797 extern tree convert_to_integer (tree, tree); 17798 17799 /* consume the 'grainsize' keyword. */ 17800 c_parser_consume_pragma (parser); 17801 17802 if (c_parser_require (parser, CPP_EQ, "expected %<=%>") != 0) 17803 { 17804 struct c_expr g_expr = c_parser_binary_expression (parser, NULL, NULL); 17805 if (g_expr.value == error_mark_node) 17806 { 17807 c_parser_skip_to_pragma_eol (parser); 17808 return; 17809 } 17810 tree grain = convert_to_integer (long_integer_type_node, 17811 c_fully_fold (g_expr.value, false, 17812 NULL)); 17813 c_parser_skip_to_pragma_eol (parser); 17814 c_token *token = c_parser_peek_token (parser); 17815 if (token && token->type == CPP_KEYWORD 17816 && token->keyword == RID_CILK_FOR) 17817 { 17818 if (grain == NULL_TREE || grain == error_mark_node) 17819 grain = integer_zero_node; 17820 c_parser_cilk_for (parser, grain, if_p); 17821 } 17822 else 17823 warning (0, "%<#pragma cilk grainsize%> is not followed by " 17824 "%<_Cilk_for%>"); 17825 } 17826 else 17827 c_parser_skip_to_pragma_eol (parser); 17828 } 17829 17830 /* Main entry point for parsing Cilk Plus <#pragma simd> for loops. */ 17831 17832 static void 17833 c_parser_cilk_simd (c_parser *parser, bool *if_p) 17834 { 17835 tree clauses = c_parser_cilk_all_clauses (parser); 17836 tree block = c_begin_compound_stmt (true); 17837 location_t loc = c_parser_peek_token (parser)->location; 17838 c_parser_omp_for_loop (loc, parser, CILK_SIMD, clauses, NULL, if_p); 17839 block = c_end_compound_stmt (loc, block, true); 17840 add_stmt (block); 17841 } 17842 17843 /* Create an artificial decl with TYPE and emit initialization of it with 17844 INIT. */ 17845 17846 static tree 17847 c_get_temp_regvar (tree type, tree init) 17848 { 17849 location_t loc = EXPR_LOCATION (init); 17850 tree decl = build_decl (loc, VAR_DECL, NULL_TREE, type); 17851 DECL_ARTIFICIAL (decl) = 1; 17852 DECL_IGNORED_P (decl) = 1; 17853 pushdecl (decl); 17854 tree t = build2 (INIT_EXPR, type, decl, init); 17855 add_stmt (t); 17856 return decl; 17857 } 17858 17859 /* Main entry point for parsing Cilk Plus _Cilk_for loops. 17860 GRAIN is the grain value passed in through pragma or 0. */ 17861 17862 static void 17863 c_parser_cilk_for (c_parser *parser, tree grain, bool *if_p) 17864 { 17865 tree clauses = build_omp_clause (EXPR_LOCATION (grain), OMP_CLAUSE_SCHEDULE); 17866 OMP_CLAUSE_SCHEDULE_KIND (clauses) = OMP_CLAUSE_SCHEDULE_CILKFOR; 17867 OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clauses) = grain; 17868 clauses = c_finish_omp_clauses (clauses, C_ORT_CILK); 17869 17870 tree block = c_begin_compound_stmt (true); 17871 tree sb = push_stmt_list (); 17872 location_t loc = c_parser_peek_token (parser)->location; 17873 tree omp_for = c_parser_omp_for_loop (loc, parser, CILK_FOR, clauses, NULL, 17874 if_p); 17875 sb = pop_stmt_list (sb); 17876 17877 if (omp_for) 17878 { 17879 tree omp_par = make_node (OMP_PARALLEL); 17880 TREE_TYPE (omp_par) = void_type_node; 17881 OMP_PARALLEL_CLAUSES (omp_par) = NULL_TREE; 17882 tree bind = build3 (BIND_EXPR, void_type_node, NULL, NULL, NULL); 17883 TREE_SIDE_EFFECTS (bind) = 1; 17884 BIND_EXPR_BODY (bind) = sb; 17885 OMP_PARALLEL_BODY (omp_par) = bind; 17886 if (OMP_FOR_PRE_BODY (omp_for)) 17887 { 17888 add_stmt (OMP_FOR_PRE_BODY (omp_for)); 17889 OMP_FOR_PRE_BODY (omp_for) = NULL_TREE; 17890 } 17891 tree init = TREE_VEC_ELT (OMP_FOR_INIT (omp_for), 0); 17892 tree decl = TREE_OPERAND (init, 0); 17893 tree cond = TREE_VEC_ELT (OMP_FOR_COND (omp_for), 0); 17894 tree incr = TREE_VEC_ELT (OMP_FOR_INCR (omp_for), 0); 17895 tree t = TREE_OPERAND (cond, 1), c, clauses = NULL_TREE; 17896 if (TREE_CODE (t) != INTEGER_CST) 17897 { 17898 TREE_OPERAND (cond, 1) = c_get_temp_regvar (TREE_TYPE (t), t); 17899 c = build_omp_clause (input_location, OMP_CLAUSE_FIRSTPRIVATE); 17900 OMP_CLAUSE_DECL (c) = TREE_OPERAND (cond, 1); 17901 OMP_CLAUSE_CHAIN (c) = clauses; 17902 clauses = c; 17903 } 17904 if (TREE_CODE (incr) == MODIFY_EXPR) 17905 { 17906 t = TREE_OPERAND (TREE_OPERAND (incr, 1), 1); 17907 if (TREE_CODE (t) != INTEGER_CST) 17908 { 17909 TREE_OPERAND (TREE_OPERAND (incr, 1), 1) 17910 = c_get_temp_regvar (TREE_TYPE (t), t); 17911 c = build_omp_clause (input_location, OMP_CLAUSE_FIRSTPRIVATE); 17912 OMP_CLAUSE_DECL (c) = TREE_OPERAND (TREE_OPERAND (incr, 1), 1); 17913 OMP_CLAUSE_CHAIN (c) = clauses; 17914 clauses = c; 17915 } 17916 } 17917 t = TREE_OPERAND (init, 1); 17918 if (TREE_CODE (t) != INTEGER_CST) 17919 { 17920 TREE_OPERAND (init, 1) = c_get_temp_regvar (TREE_TYPE (t), t); 17921 c = build_omp_clause (input_location, OMP_CLAUSE_FIRSTPRIVATE); 17922 OMP_CLAUSE_DECL (c) = TREE_OPERAND (init, 1); 17923 OMP_CLAUSE_CHAIN (c) = clauses; 17924 clauses = c; 17925 } 17926 c = build_omp_clause (input_location, OMP_CLAUSE_PRIVATE); 17927 OMP_CLAUSE_DECL (c) = decl; 17928 OMP_CLAUSE_CHAIN (c) = clauses; 17929 clauses = c; 17930 c = build_omp_clause (input_location, OMP_CLAUSE__CILK_FOR_COUNT_); 17931 OMP_CLAUSE_OPERAND (c, 0) 17932 = cilk_for_number_of_iterations (omp_for); 17933 OMP_CLAUSE_CHAIN (c) = clauses; 17934 OMP_PARALLEL_CLAUSES (omp_par) = c_finish_omp_clauses (c, C_ORT_CILK); 17935 add_stmt (omp_par); 17936 } 17937 17938 block = c_end_compound_stmt (loc, block, true); 17939 add_stmt (block); 17940 } 17941 17942 17943 /* Parse a transaction attribute (GCC Extension). 17944 17945 transaction-attribute: 17946 attributes 17947 [ [ any-word ] ] 17948 17949 The transactional memory language description is written for C++, 17950 and uses the C++0x attribute syntax. For compatibility, allow the 17951 bracket style for transactions in C as well. */ 17952 17953 static tree 17954 c_parser_transaction_attributes (c_parser *parser) 17955 { 17956 tree attr_name, attr = NULL; 17957 17958 if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE)) 17959 return c_parser_attributes (parser); 17960 17961 if (!c_parser_next_token_is (parser, CPP_OPEN_SQUARE)) 17962 return NULL_TREE; 17963 c_parser_consume_token (parser); 17964 if (!c_parser_require (parser, CPP_OPEN_SQUARE, "expected %<[%>")) 17965 goto error1; 17966 17967 attr_name = c_parser_attribute_any_word (parser); 17968 if (attr_name) 17969 { 17970 c_parser_consume_token (parser); 17971 attr = build_tree_list (attr_name, NULL_TREE); 17972 } 17973 else 17974 c_parser_error (parser, "expected identifier"); 17975 17976 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, "expected %<]%>"); 17977 error1: 17978 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, "expected %<]%>"); 17979 return attr; 17980 } 17981 17982 /* Parse a __transaction_atomic or __transaction_relaxed statement 17983 (GCC Extension). 17984 17985 transaction-statement: 17986 __transaction_atomic transaction-attribute[opt] compound-statement 17987 __transaction_relaxed compound-statement 17988 17989 Note that the only valid attribute is: "outer". 17990 */ 17991 17992 static tree 17993 c_parser_transaction (c_parser *parser, enum rid keyword) 17994 { 17995 unsigned int old_in = parser->in_transaction; 17996 unsigned int this_in = 1, new_in; 17997 location_t loc = c_parser_peek_token (parser)->location; 17998 tree stmt, attrs; 17999 18000 gcc_assert ((keyword == RID_TRANSACTION_ATOMIC 18001 || keyword == RID_TRANSACTION_RELAXED) 18002 && c_parser_next_token_is_keyword (parser, keyword)); 18003 c_parser_consume_token (parser); 18004 18005 if (keyword == RID_TRANSACTION_RELAXED) 18006 this_in |= TM_STMT_ATTR_RELAXED; 18007 else 18008 { 18009 attrs = c_parser_transaction_attributes (parser); 18010 if (attrs) 18011 this_in |= parse_tm_stmt_attr (attrs, TM_STMT_ATTR_OUTER); 18012 } 18013 18014 /* Keep track if we're in the lexical scope of an outer transaction. */ 18015 new_in = this_in | (old_in & TM_STMT_ATTR_OUTER); 18016 18017 parser->in_transaction = new_in; 18018 stmt = c_parser_compound_statement (parser); 18019 parser->in_transaction = old_in; 18020 18021 if (flag_tm) 18022 stmt = c_finish_transaction (loc, stmt, this_in); 18023 else 18024 error_at (loc, (keyword == RID_TRANSACTION_ATOMIC ? 18025 "%<__transaction_atomic%> without transactional memory support enabled" 18026 : "%<__transaction_relaxed %> " 18027 "without transactional memory support enabled")); 18028 18029 return stmt; 18030 } 18031 18032 /* Parse a __transaction_atomic or __transaction_relaxed expression 18033 (GCC Extension). 18034 18035 transaction-expression: 18036 __transaction_atomic ( expression ) 18037 __transaction_relaxed ( expression ) 18038 */ 18039 18040 static struct c_expr 18041 c_parser_transaction_expression (c_parser *parser, enum rid keyword) 18042 { 18043 struct c_expr ret; 18044 unsigned int old_in = parser->in_transaction; 18045 unsigned int this_in = 1; 18046 location_t loc = c_parser_peek_token (parser)->location; 18047 tree attrs; 18048 18049 gcc_assert ((keyword == RID_TRANSACTION_ATOMIC 18050 || keyword == RID_TRANSACTION_RELAXED) 18051 && c_parser_next_token_is_keyword (parser, keyword)); 18052 c_parser_consume_token (parser); 18053 18054 if (keyword == RID_TRANSACTION_RELAXED) 18055 this_in |= TM_STMT_ATTR_RELAXED; 18056 else 18057 { 18058 attrs = c_parser_transaction_attributes (parser); 18059 if (attrs) 18060 this_in |= parse_tm_stmt_attr (attrs, 0); 18061 } 18062 18063 parser->in_transaction = this_in; 18064 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) 18065 { 18066 tree expr = c_parser_expression (parser).value; 18067 ret.original_type = TREE_TYPE (expr); 18068 ret.value = build1 (TRANSACTION_EXPR, ret.original_type, expr); 18069 if (this_in & TM_STMT_ATTR_RELAXED) 18070 TRANSACTION_EXPR_RELAXED (ret.value) = 1; 18071 SET_EXPR_LOCATION (ret.value, loc); 18072 ret.original_code = TRANSACTION_EXPR; 18073 if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>")) 18074 { 18075 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL); 18076 goto error; 18077 } 18078 } 18079 else 18080 { 18081 error: 18082 ret.value = error_mark_node; 18083 ret.original_code = ERROR_MARK; 18084 ret.original_type = NULL; 18085 } 18086 parser->in_transaction = old_in; 18087 18088 if (!flag_tm) 18089 error_at (loc, (keyword == RID_TRANSACTION_ATOMIC ? 18090 "%<__transaction_atomic%> without transactional memory support enabled" 18091 : "%<__transaction_relaxed %> " 18092 "without transactional memory support enabled")); 18093 18094 set_c_expr_source_range (&ret, loc, loc); 18095 18096 return ret; 18097 } 18098 18099 /* Parse a __transaction_cancel statement (GCC Extension). 18100 18101 transaction-cancel-statement: 18102 __transaction_cancel transaction-attribute[opt] ; 18103 18104 Note that the only valid attribute is "outer". 18105 */ 18106 18107 static tree 18108 c_parser_transaction_cancel (c_parser *parser) 18109 { 18110 location_t loc = c_parser_peek_token (parser)->location; 18111 tree attrs; 18112 bool is_outer = false; 18113 18114 gcc_assert (c_parser_next_token_is_keyword (parser, RID_TRANSACTION_CANCEL)); 18115 c_parser_consume_token (parser); 18116 18117 attrs = c_parser_transaction_attributes (parser); 18118 if (attrs) 18119 is_outer = (parse_tm_stmt_attr (attrs, TM_STMT_ATTR_OUTER) != 0); 18120 18121 if (!flag_tm) 18122 { 18123 error_at (loc, "%<__transaction_cancel%> without " 18124 "transactional memory support enabled"); 18125 goto ret_error; 18126 } 18127 else if (parser->in_transaction & TM_STMT_ATTR_RELAXED) 18128 { 18129 error_at (loc, "%<__transaction_cancel%> within a " 18130 "%<__transaction_relaxed%>"); 18131 goto ret_error; 18132 } 18133 else if (is_outer) 18134 { 18135 if ((parser->in_transaction & TM_STMT_ATTR_OUTER) == 0 18136 && !is_tm_may_cancel_outer (current_function_decl)) 18137 { 18138 error_at (loc, "outer %<__transaction_cancel%> not " 18139 "within outer %<__transaction_atomic%>"); 18140 error_at (loc, " or a %<transaction_may_cancel_outer%> function"); 18141 goto ret_error; 18142 } 18143 } 18144 else if (parser->in_transaction == 0) 18145 { 18146 error_at (loc, "%<__transaction_cancel%> not within " 18147 "%<__transaction_atomic%>"); 18148 goto ret_error; 18149 } 18150 18151 return add_stmt (build_tm_abort_call (loc, is_outer)); 18152 18153 ret_error: 18154 return build1 (NOP_EXPR, void_type_node, error_mark_node); 18155 } 18156 18157 /* Parse a single source file. */ 18158 18159 void 18160 c_parse_file (void) 18161 { 18162 /* Use local storage to begin. If the first token is a pragma, parse it. 18163 If it is #pragma GCC pch_preprocess, then this will load a PCH file 18164 which will cause garbage collection. */ 18165 c_parser tparser; 18166 18167 memset (&tparser, 0, sizeof tparser); 18168 tparser.tokens = &tparser.tokens_buf[0]; 18169 the_parser = &tparser; 18170 18171 if (c_parser_peek_token (&tparser)->pragma_kind == PRAGMA_GCC_PCH_PREPROCESS) 18172 c_parser_pragma_pch_preprocess (&tparser); 18173 18174 the_parser = ggc_alloc<c_parser> (); 18175 *the_parser = tparser; 18176 if (tparser.tokens == &tparser.tokens_buf[0]) 18177 the_parser->tokens = &the_parser->tokens_buf[0]; 18178 18179 /* Initialize EH, if we've been told to do so. */ 18180 if (flag_exceptions) 18181 using_eh_for_cleanups (); 18182 18183 c_parser_translation_unit (the_parser); 18184 the_parser = NULL; 18185 } 18186 18187 /* This function parses Cilk Plus array notation. The starting index is 18188 passed in INITIAL_INDEX and the array name is passes in ARRAY_VALUE. The 18189 return value of this function is a tree_node called VALUE_TREE of type 18190 ARRAY_NOTATION_REF. */ 18191 18192 static tree 18193 c_parser_array_notation (location_t loc, c_parser *parser, tree initial_index, 18194 tree array_value) 18195 { 18196 c_token *token = NULL; 18197 tree start_index = NULL_TREE, end_index = NULL_TREE, stride = NULL_TREE; 18198 tree value_tree = NULL_TREE, type = NULL_TREE, array_type = NULL_TREE; 18199 tree array_type_domain = NULL_TREE; 18200 18201 if (array_value == error_mark_node || initial_index == error_mark_node) 18202 { 18203 /* No need to continue. If either of these 2 were true, then an error 18204 must be emitted already. Thus, no need to emit them twice. */ 18205 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, NULL); 18206 return error_mark_node; 18207 } 18208 18209 array_type = TREE_TYPE (array_value); 18210 gcc_assert (array_type); 18211 if (TREE_CODE (array_type) != ARRAY_TYPE 18212 && TREE_CODE (array_type) != POINTER_TYPE) 18213 { 18214 error_at (loc, "base of array section must be pointer or array type"); 18215 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, NULL); 18216 return error_mark_node; 18217 } 18218 type = TREE_TYPE (array_type); 18219 token = c_parser_peek_token (parser); 18220 18221 if (token->type == CPP_EOF) 18222 { 18223 c_parser_error (parser, "expected %<:%> or numeral"); 18224 return value_tree; 18225 } 18226 else if (token->type == CPP_COLON) 18227 { 18228 if (!initial_index) 18229 { 18230 /* If we are here, then we have a case like this A[:]. */ 18231 c_parser_consume_token (parser); 18232 if (TREE_CODE (array_type) == POINTER_TYPE) 18233 { 18234 error_at (loc, "start-index and length fields necessary for " 18235 "using array notations in pointers"); 18236 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, NULL); 18237 return error_mark_node; 18238 } 18239 if (TREE_CODE (array_type) == FUNCTION_TYPE) 18240 { 18241 error_at (loc, "array notations cannot be used with function " 18242 "type"); 18243 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, NULL); 18244 return error_mark_node; 18245 } 18246 array_type_domain = TYPE_DOMAIN (array_type); 18247 18248 if (!array_type_domain) 18249 { 18250 error_at (loc, "start-index and length fields necessary for " 18251 "using array notations in dimensionless arrays"); 18252 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, NULL); 18253 return error_mark_node; 18254 } 18255 18256 start_index = TYPE_MINVAL (array_type_domain); 18257 start_index = fold_build1 (CONVERT_EXPR, ptrdiff_type_node, 18258 start_index); 18259 if (!TYPE_MAXVAL (array_type_domain) 18260 || !TREE_CONSTANT (TYPE_MAXVAL (array_type_domain))) 18261 { 18262 error_at (loc, "start-index and length fields necessary for " 18263 "using array notations in variable-length arrays"); 18264 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, NULL); 18265 return error_mark_node; 18266 } 18267 end_index = TYPE_MAXVAL (array_type_domain); 18268 end_index = fold_build2 (PLUS_EXPR, TREE_TYPE (end_index), 18269 end_index, integer_one_node); 18270 end_index = fold_build1 (CONVERT_EXPR, ptrdiff_type_node, end_index); 18271 stride = build_int_cst (integer_type_node, 1); 18272 stride = fold_build1 (CONVERT_EXPR, ptrdiff_type_node, stride); 18273 } 18274 else if (initial_index != error_mark_node) 18275 { 18276 /* If we are here, then there should be 2 possibilities: 18277 1. Array [EXPR : EXPR] 18278 2. Array [EXPR : EXPR : EXPR] 18279 */ 18280 start_index = initial_index; 18281 18282 if (TREE_CODE (array_type) == FUNCTION_TYPE) 18283 { 18284 error_at (loc, "array notations cannot be used with function " 18285 "type"); 18286 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, NULL); 18287 return error_mark_node; 18288 } 18289 c_parser_consume_token (parser); /* consume the ':' */ 18290 struct c_expr ce = c_parser_expression (parser); 18291 ce = convert_lvalue_to_rvalue (loc, ce, false, false); 18292 end_index = ce.value; 18293 if (!end_index || end_index == error_mark_node) 18294 { 18295 c_parser_skip_to_end_of_block_or_statement (parser); 18296 return error_mark_node; 18297 } 18298 if (c_parser_peek_token (parser)->type == CPP_COLON) 18299 { 18300 c_parser_consume_token (parser); 18301 ce = c_parser_expression (parser); 18302 ce = convert_lvalue_to_rvalue (loc, ce, false, false); 18303 stride = ce.value; 18304 if (!stride || stride == error_mark_node) 18305 { 18306 c_parser_skip_to_end_of_block_or_statement (parser); 18307 return error_mark_node; 18308 } 18309 } 18310 } 18311 else 18312 c_parser_error (parser, "expected array notation expression"); 18313 } 18314 else 18315 c_parser_error (parser, "expected array notation expression"); 18316 18317 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, "expected %<]%>"); 18318 18319 value_tree = build_array_notation_ref (loc, array_value, start_index, 18320 end_index, stride, type); 18321 if (value_tree != error_mark_node) 18322 SET_EXPR_LOCATION (value_tree, loc); 18323 return value_tree; 18324 } 18325 18326 /* Parse the body of a function declaration marked with "__RTL". 18327 18328 The RTL parser works on the level of characters read from a 18329 FILE *, whereas c_parser works at the level of tokens. 18330 Square this circle by consuming all of the tokens up to and 18331 including the closing brace, recording the start/end of the RTL 18332 fragment, and reopening the file and re-reading the relevant 18333 lines within the RTL parser. 18334 18335 This requires the opening and closing braces of the C function 18336 to be on separate lines from the RTL they wrap. 18337 18338 Take ownership of START_WITH_PASS, if non-NULL. */ 18339 18340 void 18341 c_parser_parse_rtl_body (c_parser *parser, char *start_with_pass) 18342 { 18343 if (!c_parser_require (parser, CPP_OPEN_BRACE, "expected %<{%>")) 18344 { 18345 free (start_with_pass); 18346 return; 18347 } 18348 18349 location_t start_loc = c_parser_peek_token (parser)->location; 18350 18351 /* Consume all tokens, up to the closing brace, handling 18352 matching pairs of braces in the rtl dump. */ 18353 int num_open_braces = 1; 18354 while (1) 18355 { 18356 switch (c_parser_peek_token (parser)->type) 18357 { 18358 case CPP_OPEN_BRACE: 18359 num_open_braces++; 18360 break; 18361 case CPP_CLOSE_BRACE: 18362 if (--num_open_braces == 0) 18363 goto found_closing_brace; 18364 break; 18365 case CPP_EOF: 18366 error_at (start_loc, "no closing brace"); 18367 free (start_with_pass); 18368 return; 18369 default: 18370 break; 18371 } 18372 c_parser_consume_token (parser); 18373 } 18374 18375 found_closing_brace: 18376 /* At the closing brace; record its location. */ 18377 location_t end_loc = c_parser_peek_token (parser)->location; 18378 18379 /* Consume the closing brace. */ 18380 c_parser_consume_token (parser); 18381 18382 /* Invoke the RTL parser. */ 18383 if (!read_rtl_function_body_from_file_range (start_loc, end_loc)) 18384 { 18385 free (start_with_pass); 18386 return; 18387 } 18388 18389 /* If a pass name was provided for START_WITH_PASS, run the backend 18390 accordingly now, on the cfun created above, transferring 18391 ownership of START_WITH_PASS. */ 18392 if (start_with_pass) 18393 run_rtl_passes (start_with_pass); 18394 } 18395 18396 #include "gt-c-c-parser.h" 18397