1/* Main parser. 2 Copyright (C) 2000-2022 Free Software Foundation, Inc. 3 Contributed by Andy Vaught 4 5This file is part of GCC. 6 7GCC is free software; you can redistribute it and/or modify it under 8the terms of the GNU General Public License as published by the Free 9Software Foundation; either version 3, or (at your option) any later 10version. 11 12GCC is distributed in the hope that it will be useful, but WITHOUT ANY 13WARRANTY; without even the implied warranty of MERCHANTABILITY or 14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 15for more details. 16 17You should have received a copy of the GNU General Public License 18along with GCC; see the file COPYING3. If not see 19<http://www.gnu.org/licenses/>. */ 20 21#include "config.h" 22#include "system.h" 23#include "coretypes.h" 24#include "options.h" 25#include "gfortran.h" 26#include <setjmp.h> 27#include "match.h" 28#include "parse.h" 29#include "tree-core.h" 30#include "omp-general.h" 31 32/* Current statement label. Zero means no statement label. Because new_st 33 can get wiped during statement matching, we have to keep it separate. */ 34 35gfc_st_label *gfc_statement_label; 36 37static locus label_locus; 38static jmp_buf eof_buf; 39 40gfc_state_data *gfc_state_stack; 41static bool last_was_use_stmt = false; 42 43/* TODO: Re-order functions to kill these forward decls. */ 44static void check_statement_label (gfc_statement); 45static void undo_new_statement (void); 46static void reject_statement (void); 47 48 49/* A sort of half-matching function. We try to match the word on the 50 input with the passed string. If this succeeds, we call the 51 keyword-dependent matching function that will match the rest of the 52 statement. For single keywords, the matching subroutine is 53 gfc_match_eos(). */ 54 55static match 56match_word (const char *str, match (*subr) (void), locus *old_locus) 57{ 58 match m; 59 60 if (str != NULL) 61 { 62 m = gfc_match (str); 63 if (m != MATCH_YES) 64 return m; 65 } 66 67 m = (*subr) (); 68 69 if (m != MATCH_YES) 70 { 71 gfc_current_locus = *old_locus; 72 reject_statement (); 73 } 74 75 return m; 76} 77 78 79/* Like match_word, but if str is matched, set a flag that it 80 was matched. */ 81static match 82match_word_omp_simd (const char *str, match (*subr) (void), locus *old_locus, 83 bool *simd_matched) 84{ 85 match m; 86 87 if (str != NULL) 88 { 89 m = gfc_match (str); 90 if (m != MATCH_YES) 91 return m; 92 *simd_matched = true; 93 } 94 95 m = (*subr) (); 96 97 if (m != MATCH_YES) 98 { 99 gfc_current_locus = *old_locus; 100 reject_statement (); 101 } 102 103 return m; 104} 105 106 107/* Load symbols from all USE statements encountered in this scoping unit. */ 108 109static void 110use_modules (void) 111{ 112 gfc_error_buffer old_error; 113 114 gfc_push_error (&old_error); 115 gfc_buffer_error (false); 116 gfc_use_modules (); 117 gfc_buffer_error (true); 118 gfc_pop_error (&old_error); 119 gfc_commit_symbols (); 120 gfc_warning_check (); 121 gfc_current_ns->old_equiv = gfc_current_ns->equiv; 122 gfc_current_ns->old_data = gfc_current_ns->data; 123 last_was_use_stmt = false; 124} 125 126 127/* Figure out what the next statement is, (mostly) regardless of 128 proper ordering. The do...while(0) is there to prevent if/else 129 ambiguity. */ 130 131#define match(keyword, subr, st) \ 132 do { \ 133 if (match_word (keyword, subr, &old_locus) == MATCH_YES) \ 134 return st; \ 135 else \ 136 undo_new_statement (); \ 137 } while (0) 138 139 140/* This is a specialist version of decode_statement that is used 141 for the specification statements in a function, whose 142 characteristics are deferred into the specification statements. 143 eg.: INTEGER (king = mykind) foo () 144 USE mymodule, ONLY mykind..... 145 The KIND parameter needs a return after USE or IMPORT, whereas 146 derived type declarations can occur anywhere, up the executable 147 block. ST_GET_FCN_CHARACTERISTICS is returned when we have run 148 out of the correct kind of specification statements. */ 149static gfc_statement 150decode_specification_statement (void) 151{ 152 gfc_statement st; 153 locus old_locus; 154 char c; 155 156 if (gfc_match_eos () == MATCH_YES) 157 return ST_NONE; 158 159 old_locus = gfc_current_locus; 160 161 if (match_word ("use", gfc_match_use, &old_locus) == MATCH_YES) 162 { 163 last_was_use_stmt = true; 164 return ST_USE; 165 } 166 else 167 { 168 undo_new_statement (); 169 if (last_was_use_stmt) 170 use_modules (); 171 } 172 173 match ("import", gfc_match_import, ST_IMPORT); 174 175 if (gfc_current_block ()->result->ts.type != BT_DERIVED) 176 goto end_of_block; 177 178 match (NULL, gfc_match_st_function, ST_STATEMENT_FUNCTION); 179 match (NULL, gfc_match_data_decl, ST_DATA_DECL); 180 match (NULL, gfc_match_enumerator_def, ST_ENUMERATOR); 181 182 /* General statement matching: Instead of testing every possible 183 statement, we eliminate most possibilities by peeking at the 184 first character. */ 185 186 c = gfc_peek_ascii_char (); 187 188 switch (c) 189 { 190 case 'a': 191 match ("abstract% interface", gfc_match_abstract_interface, 192 ST_INTERFACE); 193 match ("allocatable", gfc_match_allocatable, ST_ATTR_DECL); 194 match ("asynchronous", gfc_match_asynchronous, ST_ATTR_DECL); 195 match ("automatic", gfc_match_automatic, ST_ATTR_DECL); 196 break; 197 198 case 'b': 199 match (NULL, gfc_match_bind_c_stmt, ST_ATTR_DECL); 200 break; 201 202 case 'c': 203 match ("codimension", gfc_match_codimension, ST_ATTR_DECL); 204 match ("contiguous", gfc_match_contiguous, ST_ATTR_DECL); 205 break; 206 207 case 'd': 208 match ("data", gfc_match_data, ST_DATA); 209 match ("dimension", gfc_match_dimension, ST_ATTR_DECL); 210 break; 211 212 case 'e': 213 match ("enum , bind ( c )", gfc_match_enum, ST_ENUM); 214 match ("entry% ", gfc_match_entry, ST_ENTRY); 215 match ("equivalence", gfc_match_equivalence, ST_EQUIVALENCE); 216 match ("external", gfc_match_external, ST_ATTR_DECL); 217 break; 218 219 case 'f': 220 match ("format", gfc_match_format, ST_FORMAT); 221 break; 222 223 case 'g': 224 break; 225 226 case 'i': 227 match ("implicit", gfc_match_implicit, ST_IMPLICIT); 228 match ("implicit% none", gfc_match_implicit_none, ST_IMPLICIT_NONE); 229 match ("interface", gfc_match_interface, ST_INTERFACE); 230 match ("intent", gfc_match_intent, ST_ATTR_DECL); 231 match ("intrinsic", gfc_match_intrinsic, ST_ATTR_DECL); 232 break; 233 234 case 'm': 235 break; 236 237 case 'n': 238 match ("namelist", gfc_match_namelist, ST_NAMELIST); 239 break; 240 241 case 'o': 242 match ("optional", gfc_match_optional, ST_ATTR_DECL); 243 break; 244 245 case 'p': 246 match ("parameter", gfc_match_parameter, ST_PARAMETER); 247 match ("pointer", gfc_match_pointer, ST_ATTR_DECL); 248 if (gfc_match_private (&st) == MATCH_YES) 249 return st; 250 match ("procedure", gfc_match_procedure, ST_PROCEDURE); 251 if (gfc_match_public (&st) == MATCH_YES) 252 return st; 253 match ("protected", gfc_match_protected, ST_ATTR_DECL); 254 break; 255 256 case 'r': 257 break; 258 259 case 's': 260 match ("save", gfc_match_save, ST_ATTR_DECL); 261 match ("static", gfc_match_static, ST_ATTR_DECL); 262 match ("structure", gfc_match_structure_decl, ST_STRUCTURE_DECL); 263 break; 264 265 case 't': 266 match ("target", gfc_match_target, ST_ATTR_DECL); 267 match ("type", gfc_match_derived_decl, ST_DERIVED_DECL); 268 break; 269 270 case 'u': 271 break; 272 273 case 'v': 274 match ("value", gfc_match_value, ST_ATTR_DECL); 275 match ("volatile", gfc_match_volatile, ST_ATTR_DECL); 276 break; 277 278 case 'w': 279 break; 280 } 281 282 /* This is not a specification statement. See if any of the matchers 283 has stored an error message of some sort. */ 284 285end_of_block: 286 gfc_clear_error (); 287 gfc_buffer_error (false); 288 gfc_current_locus = old_locus; 289 290 return ST_GET_FCN_CHARACTERISTICS; 291} 292 293static bool in_specification_block; 294 295/* This is the primary 'decode_statement'. */ 296static gfc_statement 297decode_statement (void) 298{ 299 gfc_statement st; 300 locus old_locus; 301 match m = MATCH_NO; 302 char c; 303 304 gfc_enforce_clean_symbol_state (); 305 306 gfc_clear_error (); /* Clear any pending errors. */ 307 gfc_clear_warning (); /* Clear any pending warnings. */ 308 309 gfc_matching_function = false; 310 311 if (gfc_match_eos () == MATCH_YES) 312 return ST_NONE; 313 314 if (gfc_current_state () == COMP_FUNCTION 315 && gfc_current_block ()->result->ts.kind == -1) 316 return decode_specification_statement (); 317 318 old_locus = gfc_current_locus; 319 320 c = gfc_peek_ascii_char (); 321 322 if (c == 'u') 323 { 324 if (match_word ("use", gfc_match_use, &old_locus) == MATCH_YES) 325 { 326 last_was_use_stmt = true; 327 return ST_USE; 328 } 329 else 330 undo_new_statement (); 331 } 332 333 if (last_was_use_stmt) 334 use_modules (); 335 336 /* Try matching a data declaration or function declaration. The 337 input "REALFUNCTIONA(N)" can mean several things in different 338 contexts, so it (and its relatives) get special treatment. */ 339 340 if (gfc_current_state () == COMP_NONE 341 || gfc_current_state () == COMP_INTERFACE 342 || gfc_current_state () == COMP_CONTAINS) 343 { 344 gfc_matching_function = true; 345 m = gfc_match_function_decl (); 346 if (m == MATCH_YES) 347 return ST_FUNCTION; 348 else if (m == MATCH_ERROR) 349 reject_statement (); 350 else 351 gfc_undo_symbols (); 352 gfc_current_locus = old_locus; 353 } 354 gfc_matching_function = false; 355 356 /* Legacy parameter statements are ambiguous with assignments so try parameter 357 first. */ 358 match ("parameter", gfc_match_parameter, ST_PARAMETER); 359 360 /* Match statements whose error messages are meant to be overwritten 361 by something better. */ 362 363 match (NULL, gfc_match_assignment, ST_ASSIGNMENT); 364 match (NULL, gfc_match_pointer_assignment, ST_POINTER_ASSIGNMENT); 365 366 if (in_specification_block) 367 { 368 m = match_word (NULL, gfc_match_st_function, &old_locus); 369 if (m == MATCH_YES) 370 return ST_STATEMENT_FUNCTION; 371 } 372 373 if (!(in_specification_block && m == MATCH_ERROR)) 374 { 375 match (NULL, gfc_match_ptr_fcn_assign, ST_ASSIGNMENT); 376 } 377 378 match (NULL, gfc_match_data_decl, ST_DATA_DECL); 379 match (NULL, gfc_match_enumerator_def, ST_ENUMERATOR); 380 381 /* Try to match a subroutine statement, which has the same optional 382 prefixes that functions can have. */ 383 384 if (gfc_match_subroutine () == MATCH_YES) 385 return ST_SUBROUTINE; 386 gfc_undo_symbols (); 387 gfc_current_locus = old_locus; 388 389 if (gfc_match_submod_proc () == MATCH_YES) 390 { 391 if (gfc_new_block->attr.subroutine) 392 return ST_SUBROUTINE; 393 else if (gfc_new_block->attr.function) 394 return ST_FUNCTION; 395 } 396 gfc_undo_symbols (); 397 gfc_current_locus = old_locus; 398 399 /* Check for the IF, DO, SELECT, WHERE, FORALL, CRITICAL, BLOCK and ASSOCIATE 400 statements, which might begin with a block label. The match functions for 401 these statements are unusual in that their keyword is not seen before 402 the matcher is called. */ 403 404 if (gfc_match_if (&st) == MATCH_YES) 405 return st; 406 gfc_undo_symbols (); 407 gfc_current_locus = old_locus; 408 409 if (gfc_match_where (&st) == MATCH_YES) 410 return st; 411 gfc_undo_symbols (); 412 gfc_current_locus = old_locus; 413 414 if (gfc_match_forall (&st) == MATCH_YES) 415 return st; 416 gfc_undo_symbols (); 417 gfc_current_locus = old_locus; 418 419 /* Try to match TYPE as an alias for PRINT. */ 420 if (gfc_match_type (&st) == MATCH_YES) 421 return st; 422 gfc_undo_symbols (); 423 gfc_current_locus = old_locus; 424 425 match (NULL, gfc_match_do, ST_DO); 426 match (NULL, gfc_match_block, ST_BLOCK); 427 match (NULL, gfc_match_associate, ST_ASSOCIATE); 428 match (NULL, gfc_match_critical, ST_CRITICAL); 429 match (NULL, gfc_match_select, ST_SELECT_CASE); 430 match (NULL, gfc_match_select_type, ST_SELECT_TYPE); 431 match (NULL, gfc_match_select_rank, ST_SELECT_RANK); 432 433 /* General statement matching: Instead of testing every possible 434 statement, we eliminate most possibilities by peeking at the 435 first character. */ 436 437 switch (c) 438 { 439 case 'a': 440 match ("abstract% interface", gfc_match_abstract_interface, 441 ST_INTERFACE); 442 match ("allocate", gfc_match_allocate, ST_ALLOCATE); 443 match ("allocatable", gfc_match_allocatable, ST_ATTR_DECL); 444 match ("assign", gfc_match_assign, ST_LABEL_ASSIGNMENT); 445 match ("asynchronous", gfc_match_asynchronous, ST_ATTR_DECL); 446 match ("automatic", gfc_match_automatic, ST_ATTR_DECL); 447 break; 448 449 case 'b': 450 match ("backspace", gfc_match_backspace, ST_BACKSPACE); 451 match ("block data", gfc_match_block_data, ST_BLOCK_DATA); 452 match (NULL, gfc_match_bind_c_stmt, ST_ATTR_DECL); 453 break; 454 455 case 'c': 456 match ("call", gfc_match_call, ST_CALL); 457 match ("change team", gfc_match_change_team, ST_CHANGE_TEAM); 458 match ("close", gfc_match_close, ST_CLOSE); 459 match ("continue", gfc_match_continue, ST_CONTINUE); 460 match ("contiguous", gfc_match_contiguous, ST_ATTR_DECL); 461 match ("cycle", gfc_match_cycle, ST_CYCLE); 462 match ("case", gfc_match_case, ST_CASE); 463 match ("common", gfc_match_common, ST_COMMON); 464 match ("contains", gfc_match_eos, ST_CONTAINS); 465 match ("class", gfc_match_class_is, ST_CLASS_IS); 466 match ("codimension", gfc_match_codimension, ST_ATTR_DECL); 467 break; 468 469 case 'd': 470 match ("deallocate", gfc_match_deallocate, ST_DEALLOCATE); 471 match ("data", gfc_match_data, ST_DATA); 472 match ("dimension", gfc_match_dimension, ST_ATTR_DECL); 473 break; 474 475 case 'e': 476 match ("end file", gfc_match_endfile, ST_END_FILE); 477 match ("end team", gfc_match_end_team, ST_END_TEAM); 478 match ("exit", gfc_match_exit, ST_EXIT); 479 match ("else", gfc_match_else, ST_ELSE); 480 match ("else where", gfc_match_elsewhere, ST_ELSEWHERE); 481 match ("else if", gfc_match_elseif, ST_ELSEIF); 482 match ("error stop", gfc_match_error_stop, ST_ERROR_STOP); 483 match ("enum , bind ( c )", gfc_match_enum, ST_ENUM); 484 485 if (gfc_match_end (&st) == MATCH_YES) 486 return st; 487 488 match ("entry% ", gfc_match_entry, ST_ENTRY); 489 match ("equivalence", gfc_match_equivalence, ST_EQUIVALENCE); 490 match ("external", gfc_match_external, ST_ATTR_DECL); 491 match ("event post", gfc_match_event_post, ST_EVENT_POST); 492 match ("event wait", gfc_match_event_wait, ST_EVENT_WAIT); 493 break; 494 495 case 'f': 496 match ("fail image", gfc_match_fail_image, ST_FAIL_IMAGE); 497 match ("final", gfc_match_final_decl, ST_FINAL); 498 match ("flush", gfc_match_flush, ST_FLUSH); 499 match ("form team", gfc_match_form_team, ST_FORM_TEAM); 500 match ("format", gfc_match_format, ST_FORMAT); 501 break; 502 503 case 'g': 504 match ("generic", gfc_match_generic, ST_GENERIC); 505 match ("go to", gfc_match_goto, ST_GOTO); 506 break; 507 508 case 'i': 509 match ("inquire", gfc_match_inquire, ST_INQUIRE); 510 match ("implicit", gfc_match_implicit, ST_IMPLICIT); 511 match ("implicit% none", gfc_match_implicit_none, ST_IMPLICIT_NONE); 512 match ("import", gfc_match_import, ST_IMPORT); 513 match ("interface", gfc_match_interface, ST_INTERFACE); 514 match ("intent", gfc_match_intent, ST_ATTR_DECL); 515 match ("intrinsic", gfc_match_intrinsic, ST_ATTR_DECL); 516 break; 517 518 case 'l': 519 match ("lock", gfc_match_lock, ST_LOCK); 520 break; 521 522 case 'm': 523 match ("map", gfc_match_map, ST_MAP); 524 match ("module% procedure", gfc_match_modproc, ST_MODULE_PROC); 525 match ("module", gfc_match_module, ST_MODULE); 526 break; 527 528 case 'n': 529 match ("nullify", gfc_match_nullify, ST_NULLIFY); 530 match ("namelist", gfc_match_namelist, ST_NAMELIST); 531 break; 532 533 case 'o': 534 match ("open", gfc_match_open, ST_OPEN); 535 match ("optional", gfc_match_optional, ST_ATTR_DECL); 536 break; 537 538 case 'p': 539 match ("print", gfc_match_print, ST_WRITE); 540 match ("pause", gfc_match_pause, ST_PAUSE); 541 match ("pointer", gfc_match_pointer, ST_ATTR_DECL); 542 if (gfc_match_private (&st) == MATCH_YES) 543 return st; 544 match ("procedure", gfc_match_procedure, ST_PROCEDURE); 545 match ("program", gfc_match_program, ST_PROGRAM); 546 if (gfc_match_public (&st) == MATCH_YES) 547 return st; 548 match ("protected", gfc_match_protected, ST_ATTR_DECL); 549 break; 550 551 case 'r': 552 match ("rank", gfc_match_rank_is, ST_RANK); 553 match ("read", gfc_match_read, ST_READ); 554 match ("return", gfc_match_return, ST_RETURN); 555 match ("rewind", gfc_match_rewind, ST_REWIND); 556 break; 557 558 case 's': 559 match ("structure", gfc_match_structure_decl, ST_STRUCTURE_DECL); 560 match ("sequence", gfc_match_eos, ST_SEQUENCE); 561 match ("stop", gfc_match_stop, ST_STOP); 562 match ("save", gfc_match_save, ST_ATTR_DECL); 563 match ("static", gfc_match_static, ST_ATTR_DECL); 564 match ("submodule", gfc_match_submodule, ST_SUBMODULE); 565 match ("sync all", gfc_match_sync_all, ST_SYNC_ALL); 566 match ("sync images", gfc_match_sync_images, ST_SYNC_IMAGES); 567 match ("sync memory", gfc_match_sync_memory, ST_SYNC_MEMORY); 568 match ("sync team", gfc_match_sync_team, ST_SYNC_TEAM); 569 break; 570 571 case 't': 572 match ("target", gfc_match_target, ST_ATTR_DECL); 573 match ("type", gfc_match_derived_decl, ST_DERIVED_DECL); 574 match ("type is", gfc_match_type_is, ST_TYPE_IS); 575 break; 576 577 case 'u': 578 match ("union", gfc_match_union, ST_UNION); 579 match ("unlock", gfc_match_unlock, ST_UNLOCK); 580 break; 581 582 case 'v': 583 match ("value", gfc_match_value, ST_ATTR_DECL); 584 match ("volatile", gfc_match_volatile, ST_ATTR_DECL); 585 break; 586 587 case 'w': 588 match ("wait", gfc_match_wait, ST_WAIT); 589 match ("write", gfc_match_write, ST_WRITE); 590 break; 591 } 592 593 /* All else has failed, so give up. See if any of the matchers has 594 stored an error message of some sort. Suppress the "Unclassifiable 595 statement" if a previous error message was emitted, e.g., by 596 gfc_error_now (). */ 597 if (!gfc_error_check ()) 598 { 599 int ecnt; 600 gfc_get_errors (NULL, &ecnt); 601 if (ecnt <= 0) 602 gfc_error_now ("Unclassifiable statement at %C"); 603 } 604 605 reject_statement (); 606 607 gfc_error_recovery (); 608 609 return ST_NONE; 610} 611 612/* Like match and if spec_only, goto do_spec_only without actually 613 matching. */ 614/* If the directive matched but the clauses failed, do not start 615 matching the next directive in the same switch statement. */ 616#define matcha(keyword, subr, st) \ 617 do { \ 618 match m2; \ 619 if (spec_only && gfc_match (keyword) == MATCH_YES) \ 620 goto do_spec_only; \ 621 else if ((m2 = match_word (keyword, subr, &old_locus)) \ 622 == MATCH_YES) \ 623 return st; \ 624 else if (m2 == MATCH_ERROR) \ 625 goto error_handling; \ 626 else \ 627 undo_new_statement (); \ 628 } while (0) 629 630static gfc_statement 631decode_oacc_directive (void) 632{ 633 locus old_locus; 634 char c; 635 bool spec_only = false; 636 637 gfc_enforce_clean_symbol_state (); 638 639 gfc_clear_error (); /* Clear any pending errors. */ 640 gfc_clear_warning (); /* Clear any pending warnings. */ 641 642 gfc_matching_function = false; 643 644 if (gfc_current_state () == COMP_FUNCTION 645 && gfc_current_block ()->result->ts.kind == -1) 646 spec_only = true; 647 648 old_locus = gfc_current_locus; 649 650 /* General OpenACC directive matching: Instead of testing every possible 651 statement, we eliminate most possibilities by peeking at the 652 first character. */ 653 654 c = gfc_peek_ascii_char (); 655 656 switch (c) 657 { 658 case 'r': 659 matcha ("routine", gfc_match_oacc_routine, ST_OACC_ROUTINE); 660 break; 661 } 662 663 gfc_unset_implicit_pure (NULL); 664 if (gfc_pure (NULL)) 665 { 666 gfc_error_now ("OpenACC directives other than ROUTINE may not appear in PURE " 667 "procedures at %C"); 668 goto error_handling; 669 } 670 671 switch (c) 672 { 673 case 'a': 674 matcha ("atomic", gfc_match_oacc_atomic, ST_OACC_ATOMIC); 675 break; 676 case 'c': 677 matcha ("cache", gfc_match_oacc_cache, ST_OACC_CACHE); 678 break; 679 case 'd': 680 matcha ("data", gfc_match_oacc_data, ST_OACC_DATA); 681 match ("declare", gfc_match_oacc_declare, ST_OACC_DECLARE); 682 break; 683 case 'e': 684 matcha ("end atomic", gfc_match_omp_eos_error, ST_OACC_END_ATOMIC); 685 matcha ("end data", gfc_match_omp_eos_error, ST_OACC_END_DATA); 686 matcha ("end host_data", gfc_match_omp_eos_error, ST_OACC_END_HOST_DATA); 687 matcha ("end kernels loop", gfc_match_omp_eos_error, ST_OACC_END_KERNELS_LOOP); 688 matcha ("end kernels", gfc_match_omp_eos_error, ST_OACC_END_KERNELS); 689 matcha ("end loop", gfc_match_omp_eos_error, ST_OACC_END_LOOP); 690 matcha ("end parallel loop", gfc_match_omp_eos_error, 691 ST_OACC_END_PARALLEL_LOOP); 692 matcha ("end parallel", gfc_match_omp_eos_error, ST_OACC_END_PARALLEL); 693 matcha ("end serial loop", gfc_match_omp_eos_error, 694 ST_OACC_END_SERIAL_LOOP); 695 matcha ("end serial", gfc_match_omp_eos_error, ST_OACC_END_SERIAL); 696 matcha ("enter data", gfc_match_oacc_enter_data, ST_OACC_ENTER_DATA); 697 matcha ("exit data", gfc_match_oacc_exit_data, ST_OACC_EXIT_DATA); 698 break; 699 case 'h': 700 matcha ("host_data", gfc_match_oacc_host_data, ST_OACC_HOST_DATA); 701 break; 702 case 'p': 703 matcha ("parallel loop", gfc_match_oacc_parallel_loop, 704 ST_OACC_PARALLEL_LOOP); 705 matcha ("parallel", gfc_match_oacc_parallel, ST_OACC_PARALLEL); 706 break; 707 case 'k': 708 matcha ("kernels loop", gfc_match_oacc_kernels_loop, 709 ST_OACC_KERNELS_LOOP); 710 matcha ("kernels", gfc_match_oacc_kernels, ST_OACC_KERNELS); 711 break; 712 case 'l': 713 matcha ("loop", gfc_match_oacc_loop, ST_OACC_LOOP); 714 break; 715 case 's': 716 matcha ("serial loop", gfc_match_oacc_serial_loop, ST_OACC_SERIAL_LOOP); 717 matcha ("serial", gfc_match_oacc_serial, ST_OACC_SERIAL); 718 break; 719 case 'u': 720 matcha ("update", gfc_match_oacc_update, ST_OACC_UPDATE); 721 break; 722 case 'w': 723 matcha ("wait", gfc_match_oacc_wait, ST_OACC_WAIT); 724 break; 725 } 726 727 /* Directive not found or stored an error message. 728 Check and give up. */ 729 730 error_handling: 731 if (gfc_error_check () == 0) 732 gfc_error_now ("Unclassifiable OpenACC directive at %C"); 733 734 reject_statement (); 735 736 gfc_error_recovery (); 737 738 return ST_NONE; 739 740 do_spec_only: 741 reject_statement (); 742 gfc_clear_error (); 743 gfc_buffer_error (false); 744 gfc_current_locus = old_locus; 745 return ST_GET_FCN_CHARACTERISTICS; 746} 747 748/* Like match, but set a flag simd_matched if keyword matched 749 and if spec_only, goto do_spec_only without actually matching. */ 750#define matchs(keyword, subr, st) \ 751 do { \ 752 match m2; \ 753 if (spec_only && gfc_match (keyword) == MATCH_YES) \ 754 goto do_spec_only; \ 755 if ((m2 = match_word_omp_simd (keyword, subr, &old_locus, \ 756 &simd_matched)) == MATCH_YES) \ 757 { \ 758 ret = st; \ 759 goto finish; \ 760 } \ 761 else if (m2 == MATCH_ERROR) \ 762 goto error_handling; \ 763 else \ 764 undo_new_statement (); \ 765 } while (0) 766 767/* Like match, but don't match anything if not -fopenmp 768 and if spec_only, goto do_spec_only without actually matching. */ 769/* If the directive matched but the clauses failed, do not start 770 matching the next directive in the same switch statement. */ 771#define matcho(keyword, subr, st) \ 772 do { \ 773 match m2; \ 774 if (!flag_openmp) \ 775 ; \ 776 else if (spec_only && gfc_match (keyword) == MATCH_YES) \ 777 goto do_spec_only; \ 778 else if ((m2 = match_word (keyword, subr, &old_locus)) \ 779 == MATCH_YES) \ 780 { \ 781 ret = st; \ 782 goto finish; \ 783 } \ 784 else if (m2 == MATCH_ERROR) \ 785 goto error_handling; \ 786 else \ 787 undo_new_statement (); \ 788 } while (0) 789 790/* Like match, but set a flag simd_matched if keyword matched. */ 791#define matchds(keyword, subr, st) \ 792 do { \ 793 match m2; \ 794 if ((m2 = match_word_omp_simd (keyword, subr, &old_locus, \ 795 &simd_matched)) == MATCH_YES) \ 796 { \ 797 ret = st; \ 798 goto finish; \ 799 } \ 800 else if (m2 == MATCH_ERROR) \ 801 goto error_handling; \ 802 else \ 803 undo_new_statement (); \ 804 } while (0) 805 806/* Like match, but don't match anything if not -fopenmp. */ 807#define matchdo(keyword, subr, st) \ 808 do { \ 809 match m2; \ 810 if (!flag_openmp) \ 811 ; \ 812 else if ((m2 = match_word (keyword, subr, &old_locus)) \ 813 == MATCH_YES) \ 814 { \ 815 ret = st; \ 816 goto finish; \ 817 } \ 818 else if (m2 == MATCH_ERROR) \ 819 goto error_handling; \ 820 else \ 821 undo_new_statement (); \ 822 } while (0) 823 824static gfc_statement 825decode_omp_directive (void) 826{ 827 locus old_locus; 828 char c; 829 bool simd_matched = false; 830 bool spec_only = false; 831 gfc_statement ret = ST_NONE; 832 bool pure_ok = true; 833 834 gfc_enforce_clean_symbol_state (); 835 836 gfc_clear_error (); /* Clear any pending errors. */ 837 gfc_clear_warning (); /* Clear any pending warnings. */ 838 839 gfc_matching_function = false; 840 841 if (gfc_current_state () == COMP_FUNCTION 842 && gfc_current_block ()->result->ts.kind == -1) 843 spec_only = true; 844 845 old_locus = gfc_current_locus; 846 847 /* General OpenMP directive matching: Instead of testing every possible 848 statement, we eliminate most possibilities by peeking at the 849 first character. */ 850 851 c = gfc_peek_ascii_char (); 852 853 /* match is for directives that should be recognized only if 854 -fopenmp, matchs for directives that should be recognized 855 if either -fopenmp or -fopenmp-simd. 856 Handle only the directives allowed in PURE procedures 857 first (those also shall not turn off implicit pure). */ 858 switch (c) 859 { 860 case 'd': 861 matchds ("declare simd", gfc_match_omp_declare_simd, 862 ST_OMP_DECLARE_SIMD); 863 matchdo ("declare target", gfc_match_omp_declare_target, 864 ST_OMP_DECLARE_TARGET); 865 matchdo ("declare variant", gfc_match_omp_declare_variant, 866 ST_OMP_DECLARE_VARIANT); 867 break; 868 case 's': 869 matchs ("simd", gfc_match_omp_simd, ST_OMP_SIMD); 870 break; 871 } 872 873 pure_ok = false; 874 if (flag_openmp && gfc_pure (NULL)) 875 { 876 gfc_error_now ("OpenMP directives other than SIMD or DECLARE TARGET " 877 "at %C may not appear in PURE procedures"); 878 gfc_error_recovery (); 879 return ST_NONE; 880 } 881 882 /* match is for directives that should be recognized only if 883 -fopenmp, matchs for directives that should be recognized 884 if either -fopenmp or -fopenmp-simd. */ 885 switch (c) 886 { 887 case 'a': 888 matcho ("atomic", gfc_match_omp_atomic, ST_OMP_ATOMIC); 889 break; 890 case 'b': 891 matcho ("barrier", gfc_match_omp_barrier, ST_OMP_BARRIER); 892 break; 893 case 'c': 894 matcho ("cancellation% point", gfc_match_omp_cancellation_point, 895 ST_OMP_CANCELLATION_POINT); 896 matcho ("cancel", gfc_match_omp_cancel, ST_OMP_CANCEL); 897 matcho ("critical", gfc_match_omp_critical, ST_OMP_CRITICAL); 898 break; 899 case 'd': 900 matchds ("declare reduction", gfc_match_omp_declare_reduction, 901 ST_OMP_DECLARE_REDUCTION); 902 matcho ("depobj", gfc_match_omp_depobj, ST_OMP_DEPOBJ); 903 matchs ("distribute parallel do simd", 904 gfc_match_omp_distribute_parallel_do_simd, 905 ST_OMP_DISTRIBUTE_PARALLEL_DO_SIMD); 906 matcho ("distribute parallel do", gfc_match_omp_distribute_parallel_do, 907 ST_OMP_DISTRIBUTE_PARALLEL_DO); 908 matchs ("distribute simd", gfc_match_omp_distribute_simd, 909 ST_OMP_DISTRIBUTE_SIMD); 910 matcho ("distribute", gfc_match_omp_distribute, ST_OMP_DISTRIBUTE); 911 matchs ("do simd", gfc_match_omp_do_simd, ST_OMP_DO_SIMD); 912 matcho ("do", gfc_match_omp_do, ST_OMP_DO); 913 break; 914 case 'e': 915 matcho ("error", gfc_match_omp_error, ST_OMP_ERROR); 916 matcho ("end atomic", gfc_match_omp_eos_error, ST_OMP_END_ATOMIC); 917 matcho ("end critical", gfc_match_omp_end_critical, ST_OMP_END_CRITICAL); 918 matchs ("end distribute parallel do simd", gfc_match_omp_eos_error, 919 ST_OMP_END_DISTRIBUTE_PARALLEL_DO_SIMD); 920 matcho ("end distribute parallel do", gfc_match_omp_eos_error, 921 ST_OMP_END_DISTRIBUTE_PARALLEL_DO); 922 matchs ("end distribute simd", gfc_match_omp_eos_error, 923 ST_OMP_END_DISTRIBUTE_SIMD); 924 matcho ("end distribute", gfc_match_omp_eos_error, ST_OMP_END_DISTRIBUTE); 925 matchs ("end do simd", gfc_match_omp_end_nowait, ST_OMP_END_DO_SIMD); 926 matcho ("end do", gfc_match_omp_end_nowait, ST_OMP_END_DO); 927 matcho ("end loop", gfc_match_omp_eos_error, ST_OMP_END_LOOP); 928 matchs ("end simd", gfc_match_omp_eos_error, ST_OMP_END_SIMD); 929 matcho ("end masked taskloop simd", gfc_match_omp_eos_error, 930 ST_OMP_END_MASKED_TASKLOOP_SIMD); 931 matcho ("end masked taskloop", gfc_match_omp_eos_error, 932 ST_OMP_END_MASKED_TASKLOOP); 933 matcho ("end masked", gfc_match_omp_eos_error, ST_OMP_END_MASKED); 934 matcho ("end master taskloop simd", gfc_match_omp_eos_error, 935 ST_OMP_END_MASTER_TASKLOOP_SIMD); 936 matcho ("end master taskloop", gfc_match_omp_eos_error, 937 ST_OMP_END_MASTER_TASKLOOP); 938 matcho ("end master", gfc_match_omp_eos_error, ST_OMP_END_MASTER); 939 matchs ("end ordered", gfc_match_omp_eos_error, ST_OMP_END_ORDERED); 940 matchs ("end parallel do simd", gfc_match_omp_eos_error, 941 ST_OMP_END_PARALLEL_DO_SIMD); 942 matcho ("end parallel do", gfc_match_omp_eos_error, ST_OMP_END_PARALLEL_DO); 943 matcho ("end parallel loop", gfc_match_omp_eos_error, 944 ST_OMP_END_PARALLEL_LOOP); 945 matcho ("end parallel masked taskloop simd", gfc_match_omp_eos_error, 946 ST_OMP_END_PARALLEL_MASKED_TASKLOOP_SIMD); 947 matcho ("end parallel masked taskloop", gfc_match_omp_eos_error, 948 ST_OMP_END_PARALLEL_MASKED_TASKLOOP); 949 matcho ("end parallel masked", gfc_match_omp_eos_error, 950 ST_OMP_END_PARALLEL_MASKED); 951 matcho ("end parallel master taskloop simd", gfc_match_omp_eos_error, 952 ST_OMP_END_PARALLEL_MASTER_TASKLOOP_SIMD); 953 matcho ("end parallel master taskloop", gfc_match_omp_eos_error, 954 ST_OMP_END_PARALLEL_MASTER_TASKLOOP); 955 matcho ("end parallel master", gfc_match_omp_eos_error, 956 ST_OMP_END_PARALLEL_MASTER); 957 matcho ("end parallel sections", gfc_match_omp_eos_error, 958 ST_OMP_END_PARALLEL_SECTIONS); 959 matcho ("end parallel workshare", gfc_match_omp_eos_error, 960 ST_OMP_END_PARALLEL_WORKSHARE); 961 matcho ("end parallel", gfc_match_omp_eos_error, ST_OMP_END_PARALLEL); 962 matcho ("end scope", gfc_match_omp_end_nowait, ST_OMP_END_SCOPE); 963 matcho ("end sections", gfc_match_omp_end_nowait, ST_OMP_END_SECTIONS); 964 matcho ("end single", gfc_match_omp_end_single, ST_OMP_END_SINGLE); 965 matcho ("end target data", gfc_match_omp_eos_error, ST_OMP_END_TARGET_DATA); 966 matchs ("end target parallel do simd", gfc_match_omp_end_nowait, 967 ST_OMP_END_TARGET_PARALLEL_DO_SIMD); 968 matcho ("end target parallel do", gfc_match_omp_end_nowait, 969 ST_OMP_END_TARGET_PARALLEL_DO); 970 matcho ("end target parallel loop", gfc_match_omp_end_nowait, 971 ST_OMP_END_TARGET_PARALLEL_LOOP); 972 matcho ("end target parallel", gfc_match_omp_end_nowait, 973 ST_OMP_END_TARGET_PARALLEL); 974 matchs ("end target simd", gfc_match_omp_end_nowait, ST_OMP_END_TARGET_SIMD); 975 matchs ("end target teams distribute parallel do simd", 976 gfc_match_omp_end_nowait, 977 ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD); 978 matcho ("end target teams distribute parallel do", gfc_match_omp_end_nowait, 979 ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO); 980 matchs ("end target teams distribute simd", gfc_match_omp_end_nowait, 981 ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_SIMD); 982 matcho ("end target teams distribute", gfc_match_omp_end_nowait, 983 ST_OMP_END_TARGET_TEAMS_DISTRIBUTE); 984 matcho ("end target teams loop", gfc_match_omp_end_nowait, 985 ST_OMP_END_TARGET_TEAMS_LOOP); 986 matcho ("end target teams", gfc_match_omp_end_nowait, 987 ST_OMP_END_TARGET_TEAMS); 988 matcho ("end target", gfc_match_omp_end_nowait, ST_OMP_END_TARGET); 989 matcho ("end taskgroup", gfc_match_omp_eos_error, ST_OMP_END_TASKGROUP); 990 matchs ("end taskloop simd", gfc_match_omp_eos_error, 991 ST_OMP_END_TASKLOOP_SIMD); 992 matcho ("end taskloop", gfc_match_omp_eos_error, ST_OMP_END_TASKLOOP); 993 matcho ("end task", gfc_match_omp_eos_error, ST_OMP_END_TASK); 994 matchs ("end teams distribute parallel do simd", gfc_match_omp_eos_error, 995 ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD); 996 matcho ("end teams distribute parallel do", gfc_match_omp_eos_error, 997 ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO); 998 matchs ("end teams distribute simd", gfc_match_omp_eos_error, 999 ST_OMP_END_TEAMS_DISTRIBUTE_SIMD); 1000 matcho ("end teams distribute", gfc_match_omp_eos_error, 1001 ST_OMP_END_TEAMS_DISTRIBUTE); 1002 matcho ("end teams loop", gfc_match_omp_eos_error, ST_OMP_END_TEAMS_LOOP); 1003 matcho ("end teams", gfc_match_omp_eos_error, ST_OMP_END_TEAMS); 1004 matcho ("end workshare", gfc_match_omp_end_nowait, 1005 ST_OMP_END_WORKSHARE); 1006 break; 1007 case 'f': 1008 matcho ("flush", gfc_match_omp_flush, ST_OMP_FLUSH); 1009 break; 1010 case 'm': 1011 matcho ("masked taskloop simd", gfc_match_omp_masked_taskloop_simd, 1012 ST_OMP_MASKED_TASKLOOP_SIMD); 1013 matcho ("masked taskloop", gfc_match_omp_masked_taskloop, 1014 ST_OMP_MASKED_TASKLOOP); 1015 matcho ("masked", gfc_match_omp_masked, ST_OMP_MASKED); 1016 matcho ("master taskloop simd", gfc_match_omp_master_taskloop_simd, 1017 ST_OMP_MASTER_TASKLOOP_SIMD); 1018 matcho ("master taskloop", gfc_match_omp_master_taskloop, 1019 ST_OMP_MASTER_TASKLOOP); 1020 matcho ("master", gfc_match_omp_master, ST_OMP_MASTER); 1021 break; 1022 case 'n': 1023 matcho ("nothing", gfc_match_omp_nothing, ST_NONE); 1024 break; 1025 case 'l': 1026 matcho ("loop", gfc_match_omp_loop, ST_OMP_LOOP); 1027 break; 1028 case 'o': 1029 if (gfc_match ("ordered depend (") == MATCH_YES) 1030 { 1031 gfc_current_locus = old_locus; 1032 if (!flag_openmp) 1033 break; 1034 matcho ("ordered", gfc_match_omp_ordered_depend, 1035 ST_OMP_ORDERED_DEPEND); 1036 } 1037 else 1038 matchs ("ordered", gfc_match_omp_ordered, ST_OMP_ORDERED); 1039 break; 1040 case 'p': 1041 matchs ("parallel do simd", gfc_match_omp_parallel_do_simd, 1042 ST_OMP_PARALLEL_DO_SIMD); 1043 matcho ("parallel do", gfc_match_omp_parallel_do, ST_OMP_PARALLEL_DO); 1044 matcho ("parallel loop", gfc_match_omp_parallel_loop, 1045 ST_OMP_PARALLEL_LOOP); 1046 matcho ("parallel masked taskloop simd", 1047 gfc_match_omp_parallel_masked_taskloop_simd, 1048 ST_OMP_PARALLEL_MASKED_TASKLOOP_SIMD); 1049 matcho ("parallel masked taskloop", 1050 gfc_match_omp_parallel_masked_taskloop, 1051 ST_OMP_PARALLEL_MASKED_TASKLOOP); 1052 matcho ("parallel masked", gfc_match_omp_parallel_masked, 1053 ST_OMP_PARALLEL_MASKED); 1054 matcho ("parallel master taskloop simd", 1055 gfc_match_omp_parallel_master_taskloop_simd, 1056 ST_OMP_PARALLEL_MASTER_TASKLOOP_SIMD); 1057 matcho ("parallel master taskloop", 1058 gfc_match_omp_parallel_master_taskloop, 1059 ST_OMP_PARALLEL_MASTER_TASKLOOP); 1060 matcho ("parallel master", gfc_match_omp_parallel_master, 1061 ST_OMP_PARALLEL_MASTER); 1062 matcho ("parallel sections", gfc_match_omp_parallel_sections, 1063 ST_OMP_PARALLEL_SECTIONS); 1064 matcho ("parallel workshare", gfc_match_omp_parallel_workshare, 1065 ST_OMP_PARALLEL_WORKSHARE); 1066 matcho ("parallel", gfc_match_omp_parallel, ST_OMP_PARALLEL); 1067 break; 1068 case 'r': 1069 matcho ("requires", gfc_match_omp_requires, ST_OMP_REQUIRES); 1070 break; 1071 case 's': 1072 matcho ("scan", gfc_match_omp_scan, ST_OMP_SCAN); 1073 matcho ("scope", gfc_match_omp_scope, ST_OMP_SCOPE); 1074 matcho ("sections", gfc_match_omp_sections, ST_OMP_SECTIONS); 1075 matcho ("section", gfc_match_omp_eos_error, ST_OMP_SECTION); 1076 matcho ("single", gfc_match_omp_single, ST_OMP_SINGLE); 1077 break; 1078 case 't': 1079 matcho ("target data", gfc_match_omp_target_data, ST_OMP_TARGET_DATA); 1080 matcho ("target enter data", gfc_match_omp_target_enter_data, 1081 ST_OMP_TARGET_ENTER_DATA); 1082 matcho ("target exit data", gfc_match_omp_target_exit_data, 1083 ST_OMP_TARGET_EXIT_DATA); 1084 matchs ("target parallel do simd", gfc_match_omp_target_parallel_do_simd, 1085 ST_OMP_TARGET_PARALLEL_DO_SIMD); 1086 matcho ("target parallel do", gfc_match_omp_target_parallel_do, 1087 ST_OMP_TARGET_PARALLEL_DO); 1088 matcho ("target parallel loop", gfc_match_omp_target_parallel_loop, 1089 ST_OMP_TARGET_PARALLEL_LOOP); 1090 matcho ("target parallel", gfc_match_omp_target_parallel, 1091 ST_OMP_TARGET_PARALLEL); 1092 matchs ("target simd", gfc_match_omp_target_simd, ST_OMP_TARGET_SIMD); 1093 matchs ("target teams distribute parallel do simd", 1094 gfc_match_omp_target_teams_distribute_parallel_do_simd, 1095 ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD); 1096 matcho ("target teams distribute parallel do", 1097 gfc_match_omp_target_teams_distribute_parallel_do, 1098 ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO); 1099 matchs ("target teams distribute simd", 1100 gfc_match_omp_target_teams_distribute_simd, 1101 ST_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD); 1102 matcho ("target teams distribute", gfc_match_omp_target_teams_distribute, 1103 ST_OMP_TARGET_TEAMS_DISTRIBUTE); 1104 matcho ("target teams loop", gfc_match_omp_target_teams_loop, 1105 ST_OMP_TARGET_TEAMS_LOOP); 1106 matcho ("target teams", gfc_match_omp_target_teams, ST_OMP_TARGET_TEAMS); 1107 matcho ("target update", gfc_match_omp_target_update, 1108 ST_OMP_TARGET_UPDATE); 1109 matcho ("target", gfc_match_omp_target, ST_OMP_TARGET); 1110 matcho ("taskgroup", gfc_match_omp_taskgroup, ST_OMP_TASKGROUP); 1111 matchs ("taskloop simd", gfc_match_omp_taskloop_simd, 1112 ST_OMP_TASKLOOP_SIMD); 1113 matcho ("taskloop", gfc_match_omp_taskloop, ST_OMP_TASKLOOP); 1114 matcho ("taskwait", gfc_match_omp_taskwait, ST_OMP_TASKWAIT); 1115 matcho ("taskyield", gfc_match_omp_taskyield, ST_OMP_TASKYIELD); 1116 matcho ("task", gfc_match_omp_task, ST_OMP_TASK); 1117 matchs ("teams distribute parallel do simd", 1118 gfc_match_omp_teams_distribute_parallel_do_simd, 1119 ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD); 1120 matcho ("teams distribute parallel do", 1121 gfc_match_omp_teams_distribute_parallel_do, 1122 ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO); 1123 matchs ("teams distribute simd", gfc_match_omp_teams_distribute_simd, 1124 ST_OMP_TEAMS_DISTRIBUTE_SIMD); 1125 matcho ("teams distribute", gfc_match_omp_teams_distribute, 1126 ST_OMP_TEAMS_DISTRIBUTE); 1127 matcho ("teams loop", gfc_match_omp_teams_loop, ST_OMP_TEAMS_LOOP); 1128 matcho ("teams", gfc_match_omp_teams, ST_OMP_TEAMS); 1129 matchdo ("threadprivate", gfc_match_omp_threadprivate, 1130 ST_OMP_THREADPRIVATE); 1131 break; 1132 case 'w': 1133 matcho ("workshare", gfc_match_omp_workshare, ST_OMP_WORKSHARE); 1134 break; 1135 } 1136 1137 /* All else has failed, so give up. See if any of the matchers has 1138 stored an error message of some sort. Don't error out if 1139 not -fopenmp and simd_matched is false, i.e. if a directive other 1140 than one marked with match has been seen. */ 1141 1142 error_handling: 1143 if (flag_openmp || simd_matched) 1144 { 1145 if (!gfc_error_check ()) 1146 gfc_error_now ("Unclassifiable OpenMP directive at %C"); 1147 } 1148 1149 reject_statement (); 1150 1151 gfc_error_recovery (); 1152 1153 return ST_NONE; 1154 1155 finish: 1156 if (!pure_ok) 1157 { 1158 gfc_unset_implicit_pure (NULL); 1159 1160 if (!flag_openmp && gfc_pure (NULL)) 1161 { 1162 gfc_error_now ("OpenMP directives other than SIMD or DECLARE TARGET " 1163 "at %C may not appear in PURE procedures"); 1164 reject_statement (); 1165 gfc_error_recovery (); 1166 return ST_NONE; 1167 } 1168 } 1169 switch (ret) 1170 { 1171 case ST_OMP_DECLARE_TARGET: 1172 case ST_OMP_TARGET: 1173 case ST_OMP_TARGET_DATA: 1174 case ST_OMP_TARGET_ENTER_DATA: 1175 case ST_OMP_TARGET_EXIT_DATA: 1176 case ST_OMP_TARGET_TEAMS: 1177 case ST_OMP_TARGET_TEAMS_DISTRIBUTE: 1178 case ST_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD: 1179 case ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO: 1180 case ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: 1181 case ST_OMP_TARGET_TEAMS_LOOP: 1182 case ST_OMP_TARGET_PARALLEL: 1183 case ST_OMP_TARGET_PARALLEL_DO: 1184 case ST_OMP_TARGET_PARALLEL_DO_SIMD: 1185 case ST_OMP_TARGET_PARALLEL_LOOP: 1186 case ST_OMP_TARGET_SIMD: 1187 case ST_OMP_TARGET_UPDATE: 1188 { 1189 gfc_namespace *prog_unit = gfc_current_ns; 1190 while (prog_unit->parent) 1191 { 1192 if (gfc_state_stack->previous 1193 && gfc_state_stack->previous->state == COMP_INTERFACE) 1194 break; 1195 prog_unit = prog_unit->parent; 1196 } 1197 prog_unit->omp_target_seen = true; 1198 break; 1199 } 1200 case ST_OMP_ERROR: 1201 if (new_st.ext.omp_clauses->at != OMP_AT_EXECUTION) 1202 return ST_NONE; 1203 default: 1204 break; 1205 } 1206 return ret; 1207 1208 do_spec_only: 1209 reject_statement (); 1210 gfc_clear_error (); 1211 gfc_buffer_error (false); 1212 gfc_current_locus = old_locus; 1213 return ST_GET_FCN_CHARACTERISTICS; 1214} 1215 1216static gfc_statement 1217decode_gcc_attribute (void) 1218{ 1219 locus old_locus; 1220 1221 gfc_enforce_clean_symbol_state (); 1222 1223 gfc_clear_error (); /* Clear any pending errors. */ 1224 gfc_clear_warning (); /* Clear any pending warnings. */ 1225 old_locus = gfc_current_locus; 1226 1227 match ("attributes", gfc_match_gcc_attributes, ST_ATTR_DECL); 1228 match ("unroll", gfc_match_gcc_unroll, ST_NONE); 1229 match ("builtin", gfc_match_gcc_builtin, ST_NONE); 1230 match ("ivdep", gfc_match_gcc_ivdep, ST_NONE); 1231 match ("vector", gfc_match_gcc_vector, ST_NONE); 1232 match ("novector", gfc_match_gcc_novector, ST_NONE); 1233 1234 /* All else has failed, so give up. See if any of the matchers has 1235 stored an error message of some sort. */ 1236 1237 if (!gfc_error_check ()) 1238 { 1239 if (pedantic) 1240 gfc_error_now ("Unclassifiable GCC directive at %C"); 1241 else 1242 gfc_warning_now (0, "Unclassifiable GCC directive at %C, ignored"); 1243 } 1244 1245 reject_statement (); 1246 1247 gfc_error_recovery (); 1248 1249 return ST_NONE; 1250} 1251 1252#undef match 1253 1254/* Assert next length characters to be equal to token in free form. */ 1255 1256static void 1257verify_token_free (const char* token, int length, bool last_was_use_stmt) 1258{ 1259 int i; 1260 char c; 1261 1262 c = gfc_next_ascii_char (); 1263 for (i = 0; i < length; i++, c = gfc_next_ascii_char ()) 1264 gcc_assert (c == token[i]); 1265 1266 gcc_assert (gfc_is_whitespace(c)); 1267 gfc_gobble_whitespace (); 1268 if (last_was_use_stmt) 1269 use_modules (); 1270} 1271 1272/* Get the next statement in free form source. */ 1273 1274static gfc_statement 1275next_free (void) 1276{ 1277 match m; 1278 int i, cnt, at_bol; 1279 char c; 1280 1281 at_bol = gfc_at_bol (); 1282 gfc_gobble_whitespace (); 1283 1284 c = gfc_peek_ascii_char (); 1285 1286 if (ISDIGIT (c)) 1287 { 1288 char d; 1289 1290 /* Found a statement label? */ 1291 m = gfc_match_st_label (&gfc_statement_label); 1292 1293 d = gfc_peek_ascii_char (); 1294 if (m != MATCH_YES || !gfc_is_whitespace (d)) 1295 { 1296 gfc_match_small_literal_int (&i, &cnt); 1297 1298 if (cnt > 5) 1299 gfc_error_now ("Too many digits in statement label at %C"); 1300 1301 if (i == 0) 1302 gfc_error_now ("Zero is not a valid statement label at %C"); 1303 1304 do 1305 c = gfc_next_ascii_char (); 1306 while (ISDIGIT(c)); 1307 1308 if (!gfc_is_whitespace (c)) 1309 gfc_error_now ("Non-numeric character in statement label at %C"); 1310 1311 return ST_NONE; 1312 } 1313 else 1314 { 1315 label_locus = gfc_current_locus; 1316 1317 gfc_gobble_whitespace (); 1318 1319 if (at_bol && gfc_peek_ascii_char () == ';') 1320 { 1321 gfc_error_now ("Semicolon at %C needs to be preceded by " 1322 "statement"); 1323 gfc_next_ascii_char (); /* Eat up the semicolon. */ 1324 return ST_NONE; 1325 } 1326 1327 if (gfc_match_eos () == MATCH_YES) 1328 gfc_error_now ("Statement label without statement at %L", 1329 &label_locus); 1330 } 1331 } 1332 else if (c == '!') 1333 { 1334 /* Comments have already been skipped by the time we get here, 1335 except for GCC attributes and OpenMP/OpenACC directives. */ 1336 1337 gfc_next_ascii_char (); /* Eat up the exclamation sign. */ 1338 c = gfc_peek_ascii_char (); 1339 1340 if (c == 'g') 1341 { 1342 int i; 1343 1344 c = gfc_next_ascii_char (); 1345 for (i = 0; i < 4; i++, c = gfc_next_ascii_char ()) 1346 gcc_assert (c == "gcc$"[i]); 1347 1348 gfc_gobble_whitespace (); 1349 return decode_gcc_attribute (); 1350 1351 } 1352 else if (c == '$') 1353 { 1354 /* Since both OpenMP and OpenACC directives starts with 1355 !$ character sequence, we must check all flags combinations */ 1356 if ((flag_openmp || flag_openmp_simd) 1357 && !flag_openacc) 1358 { 1359 verify_token_free ("$omp", 4, last_was_use_stmt); 1360 return decode_omp_directive (); 1361 } 1362 else if ((flag_openmp || flag_openmp_simd) 1363 && flag_openacc) 1364 { 1365 gfc_next_ascii_char (); /* Eat up dollar character */ 1366 c = gfc_peek_ascii_char (); 1367 1368 if (c == 'o') 1369 { 1370 verify_token_free ("omp", 3, last_was_use_stmt); 1371 return decode_omp_directive (); 1372 } 1373 else if (c == 'a') 1374 { 1375 verify_token_free ("acc", 3, last_was_use_stmt); 1376 return decode_oacc_directive (); 1377 } 1378 } 1379 else if (flag_openacc) 1380 { 1381 verify_token_free ("$acc", 4, last_was_use_stmt); 1382 return decode_oacc_directive (); 1383 } 1384 } 1385 gcc_unreachable (); 1386 } 1387 1388 if (at_bol && c == ';') 1389 { 1390 if (!(gfc_option.allow_std & GFC_STD_F2008)) 1391 gfc_error_now ("Fortran 2008: Semicolon at %C without preceding " 1392 "statement"); 1393 gfc_next_ascii_char (); /* Eat up the semicolon. */ 1394 return ST_NONE; 1395 } 1396 1397 return decode_statement (); 1398} 1399 1400/* Assert next length characters to be equal to token in fixed form. */ 1401 1402static bool 1403verify_token_fixed (const char *token, int length, bool last_was_use_stmt) 1404{ 1405 int i; 1406 char c = gfc_next_char_literal (NONSTRING); 1407 1408 for (i = 0; i < length; i++, c = gfc_next_char_literal (NONSTRING)) 1409 gcc_assert ((char) gfc_wide_tolower (c) == token[i]); 1410 1411 if (c != ' ' && c != '0') 1412 { 1413 gfc_buffer_error (false); 1414 gfc_error ("Bad continuation line at %C"); 1415 return false; 1416 } 1417 if (last_was_use_stmt) 1418 use_modules (); 1419 1420 return true; 1421} 1422 1423/* Get the next statement in fixed-form source. */ 1424 1425static gfc_statement 1426next_fixed (void) 1427{ 1428 int label, digit_flag, i; 1429 locus loc; 1430 gfc_char_t c; 1431 1432 if (!gfc_at_bol ()) 1433 return decode_statement (); 1434 1435 /* Skip past the current label field, parsing a statement label if 1436 one is there. This is a weird number parser, since the number is 1437 contained within five columns and can have any kind of embedded 1438 spaces. We also check for characters that make the rest of the 1439 line a comment. */ 1440 1441 label = 0; 1442 digit_flag = 0; 1443 1444 for (i = 0; i < 5; i++) 1445 { 1446 c = gfc_next_char_literal (NONSTRING); 1447 1448 switch (c) 1449 { 1450 case ' ': 1451 break; 1452 1453 case '0': 1454 case '1': 1455 case '2': 1456 case '3': 1457 case '4': 1458 case '5': 1459 case '6': 1460 case '7': 1461 case '8': 1462 case '9': 1463 label = label * 10 + ((unsigned char) c - '0'); 1464 label_locus = gfc_current_locus; 1465 digit_flag = 1; 1466 break; 1467 1468 /* Comments have already been skipped by the time we get 1469 here, except for GCC attributes and OpenMP directives. */ 1470 1471 case '*': 1472 c = gfc_next_char_literal (NONSTRING); 1473 1474 if (TOLOWER (c) == 'g') 1475 { 1476 for (i = 0; i < 4; i++, c = gfc_next_char_literal (NONSTRING)) 1477 gcc_assert (TOLOWER (c) == "gcc$"[i]); 1478 1479 return decode_gcc_attribute (); 1480 } 1481 else if (c == '$') 1482 { 1483 if ((flag_openmp || flag_openmp_simd) 1484 && !flag_openacc) 1485 { 1486 if (!verify_token_fixed ("omp", 3, last_was_use_stmt)) 1487 return ST_NONE; 1488 return decode_omp_directive (); 1489 } 1490 else if ((flag_openmp || flag_openmp_simd) 1491 && flag_openacc) 1492 { 1493 c = gfc_next_char_literal(NONSTRING); 1494 if (c == 'o' || c == 'O') 1495 { 1496 if (!verify_token_fixed ("mp", 2, last_was_use_stmt)) 1497 return ST_NONE; 1498 return decode_omp_directive (); 1499 } 1500 else if (c == 'a' || c == 'A') 1501 { 1502 if (!verify_token_fixed ("cc", 2, last_was_use_stmt)) 1503 return ST_NONE; 1504 return decode_oacc_directive (); 1505 } 1506 } 1507 else if (flag_openacc) 1508 { 1509 if (!verify_token_fixed ("acc", 3, last_was_use_stmt)) 1510 return ST_NONE; 1511 return decode_oacc_directive (); 1512 } 1513 } 1514 gcc_fallthrough (); 1515 1516 /* Comments have already been skipped by the time we get 1517 here so don't bother checking for them. */ 1518 1519 default: 1520 gfc_buffer_error (false); 1521 gfc_error ("Non-numeric character in statement label at %C"); 1522 return ST_NONE; 1523 } 1524 } 1525 1526 if (digit_flag) 1527 { 1528 if (label == 0) 1529 gfc_warning_now (0, "Zero is not a valid statement label at %C"); 1530 else 1531 { 1532 /* We've found a valid statement label. */ 1533 gfc_statement_label = gfc_get_st_label (label); 1534 } 1535 } 1536 1537 /* Since this line starts a statement, it cannot be a continuation 1538 of a previous statement. If we see something here besides a 1539 space or zero, it must be a bad continuation line. */ 1540 1541 c = gfc_next_char_literal (NONSTRING); 1542 if (c == '\n') 1543 goto blank_line; 1544 1545 if (c != ' ' && c != '0') 1546 { 1547 gfc_buffer_error (false); 1548 gfc_error ("Bad continuation line at %C"); 1549 return ST_NONE; 1550 } 1551 1552 /* Now that we've taken care of the statement label columns, we have 1553 to make sure that the first nonblank character is not a '!'. If 1554 it is, the rest of the line is a comment. */ 1555 1556 do 1557 { 1558 loc = gfc_current_locus; 1559 c = gfc_next_char_literal (NONSTRING); 1560 } 1561 while (gfc_is_whitespace (c)); 1562 1563 if (c == '!') 1564 goto blank_line; 1565 gfc_current_locus = loc; 1566 1567 if (c == ';') 1568 { 1569 if (digit_flag) 1570 gfc_error_now ("Semicolon at %C needs to be preceded by statement"); 1571 else if (!(gfc_option.allow_std & GFC_STD_F2008)) 1572 gfc_error_now ("Fortran 2008: Semicolon at %C without preceding " 1573 "statement"); 1574 return ST_NONE; 1575 } 1576 1577 if (gfc_match_eos () == MATCH_YES) 1578 goto blank_line; 1579 1580 /* At this point, we've got a nonblank statement to parse. */ 1581 return decode_statement (); 1582 1583blank_line: 1584 if (digit_flag) 1585 gfc_error_now ("Statement label without statement at %L", &label_locus); 1586 1587 gfc_current_locus.lb->truncated = 0; 1588 gfc_advance_line (); 1589 return ST_NONE; 1590} 1591 1592 1593/* Return the next non-ST_NONE statement to the caller. We also worry 1594 about including files and the ends of include files at this stage. */ 1595 1596static gfc_statement 1597next_statement (void) 1598{ 1599 gfc_statement st; 1600 locus old_locus; 1601 1602 gfc_enforce_clean_symbol_state (); 1603 1604 gfc_new_block = NULL; 1605 1606 gfc_current_ns->old_equiv = gfc_current_ns->equiv; 1607 gfc_current_ns->old_data = gfc_current_ns->data; 1608 for (;;) 1609 { 1610 gfc_statement_label = NULL; 1611 gfc_buffer_error (true); 1612 1613 if (gfc_at_eol ()) 1614 gfc_advance_line (); 1615 1616 gfc_skip_comments (); 1617 1618 if (gfc_at_end ()) 1619 { 1620 st = ST_NONE; 1621 break; 1622 } 1623 1624 if (gfc_define_undef_line ()) 1625 continue; 1626 1627 old_locus = gfc_current_locus; 1628 1629 st = (gfc_current_form == FORM_FIXED) ? next_fixed () : next_free (); 1630 1631 if (st != ST_NONE) 1632 break; 1633 } 1634 1635 gfc_buffer_error (false); 1636 1637 if (st == ST_GET_FCN_CHARACTERISTICS) 1638 { 1639 if (gfc_statement_label != NULL) 1640 { 1641 gfc_free_st_label (gfc_statement_label); 1642 gfc_statement_label = NULL; 1643 } 1644 gfc_current_locus = old_locus; 1645 } 1646 1647 if (st != ST_NONE) 1648 check_statement_label (st); 1649 1650 return st; 1651} 1652 1653 1654/****************************** Parser ***********************************/ 1655 1656/* The parser subroutines are of type 'try' that fail if the file ends 1657 unexpectedly. */ 1658 1659/* Macros that expand to case-labels for various classes of 1660 statements. Start with executable statements that directly do 1661 things. */ 1662 1663#define case_executable case ST_ALLOCATE: case ST_BACKSPACE: case ST_CALL: \ 1664 case ST_CLOSE: case ST_CONTINUE: case ST_DEALLOCATE: case ST_END_FILE: \ 1665 case ST_GOTO: case ST_INQUIRE: case ST_NULLIFY: case ST_OPEN: \ 1666 case ST_READ: case ST_RETURN: case ST_REWIND: case ST_SIMPLE_IF: \ 1667 case ST_PAUSE: case ST_STOP: case ST_WAIT: case ST_WRITE: \ 1668 case ST_POINTER_ASSIGNMENT: case ST_EXIT: case ST_CYCLE: \ 1669 case ST_ASSIGNMENT: case ST_ARITHMETIC_IF: case ST_WHERE: case ST_FORALL: \ 1670 case ST_LABEL_ASSIGNMENT: case ST_FLUSH: case ST_OMP_FLUSH: \ 1671 case ST_OMP_BARRIER: case ST_OMP_TASKWAIT: case ST_OMP_TASKYIELD: \ 1672 case ST_OMP_CANCEL: case ST_OMP_CANCELLATION_POINT: case ST_OMP_DEPOBJ: \ 1673 case ST_OMP_TARGET_UPDATE: case ST_OMP_TARGET_ENTER_DATA: \ 1674 case ST_OMP_TARGET_EXIT_DATA: case ST_OMP_ORDERED_DEPEND: case ST_OMP_ERROR: \ 1675 case ST_ERROR_STOP: case ST_OMP_SCAN: case ST_SYNC_ALL: \ 1676 case ST_SYNC_IMAGES: case ST_SYNC_MEMORY: case ST_LOCK: case ST_UNLOCK: \ 1677 case ST_FORM_TEAM: case ST_CHANGE_TEAM: \ 1678 case ST_END_TEAM: case ST_SYNC_TEAM: \ 1679 case ST_EVENT_POST: case ST_EVENT_WAIT: case ST_FAIL_IMAGE: \ 1680 case ST_OACC_UPDATE: case ST_OACC_WAIT: case ST_OACC_CACHE: \ 1681 case ST_OACC_ENTER_DATA: case ST_OACC_EXIT_DATA 1682 1683/* Statements that mark other executable statements. */ 1684 1685#define case_exec_markers case ST_DO: case ST_FORALL_BLOCK: \ 1686 case ST_IF_BLOCK: case ST_BLOCK: case ST_ASSOCIATE: \ 1687 case ST_WHERE_BLOCK: case ST_SELECT_CASE: case ST_SELECT_TYPE: \ 1688 case ST_SELECT_RANK: case ST_OMP_PARALLEL: case ST_OMP_PARALLEL_MASKED: \ 1689 case ST_OMP_PARALLEL_MASKED_TASKLOOP: \ 1690 case ST_OMP_PARALLEL_MASKED_TASKLOOP_SIMD: case ST_OMP_PARALLEL_MASTER: \ 1691 case ST_OMP_PARALLEL_MASTER_TASKLOOP: \ 1692 case ST_OMP_PARALLEL_MASTER_TASKLOOP_SIMD: \ 1693 case ST_OMP_PARALLEL_SECTIONS: case ST_OMP_SECTIONS: case ST_OMP_ORDERED: \ 1694 case ST_OMP_CRITICAL: case ST_OMP_MASKED: case ST_OMP_MASKED_TASKLOOP: \ 1695 case ST_OMP_MASKED_TASKLOOP_SIMD: \ 1696 case ST_OMP_MASTER: case ST_OMP_MASTER_TASKLOOP: \ 1697 case ST_OMP_MASTER_TASKLOOP_SIMD: case ST_OMP_SCOPE: case ST_OMP_SINGLE: \ 1698 case ST_OMP_DO: case ST_OMP_PARALLEL_DO: case ST_OMP_ATOMIC: \ 1699 case ST_OMP_WORKSHARE: case ST_OMP_PARALLEL_WORKSHARE: \ 1700 case ST_OMP_TASK: case ST_OMP_TASKGROUP: case ST_OMP_SIMD: \ 1701 case ST_OMP_DO_SIMD: case ST_OMP_PARALLEL_DO_SIMD: case ST_OMP_TARGET: \ 1702 case ST_OMP_TARGET_DATA: case ST_OMP_TARGET_TEAMS: \ 1703 case ST_OMP_TARGET_TEAMS_DISTRIBUTE: \ 1704 case ST_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD: \ 1705 case ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO: \ 1706 case ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: \ 1707 case ST_OMP_TEAMS: case ST_OMP_TEAMS_DISTRIBUTE: \ 1708 case ST_OMP_TEAMS_DISTRIBUTE_SIMD: \ 1709 case ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO: \ 1710 case ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: case ST_OMP_DISTRIBUTE: \ 1711 case ST_OMP_DISTRIBUTE_SIMD: case ST_OMP_DISTRIBUTE_PARALLEL_DO: \ 1712 case ST_OMP_DISTRIBUTE_PARALLEL_DO_SIMD: case ST_OMP_TARGET_PARALLEL: \ 1713 case ST_OMP_TARGET_PARALLEL_DO: case ST_OMP_TARGET_PARALLEL_DO_SIMD: \ 1714 case ST_OMP_TARGET_SIMD: case ST_OMP_TASKLOOP: case ST_OMP_TASKLOOP_SIMD: \ 1715 case ST_OMP_LOOP: case ST_OMP_PARALLEL_LOOP: case ST_OMP_TEAMS_LOOP: \ 1716 case ST_OMP_TARGET_PARALLEL_LOOP: case ST_OMP_TARGET_TEAMS_LOOP: \ 1717 case ST_CRITICAL: \ 1718 case ST_OACC_PARALLEL_LOOP: case ST_OACC_PARALLEL: case ST_OACC_KERNELS: \ 1719 case ST_OACC_DATA: case ST_OACC_HOST_DATA: case ST_OACC_LOOP: \ 1720 case ST_OACC_KERNELS_LOOP: case ST_OACC_SERIAL_LOOP: case ST_OACC_SERIAL: \ 1721 case ST_OACC_ATOMIC 1722 1723/* Declaration statements */ 1724 1725#define case_decl case ST_ATTR_DECL: case ST_COMMON: case ST_DATA_DECL: \ 1726 case ST_EQUIVALENCE: case ST_NAMELIST: case ST_STATEMENT_FUNCTION: \ 1727 case ST_TYPE: case ST_INTERFACE: case ST_PROCEDURE 1728 1729/* OpenMP and OpenACC declaration statements, which may appear anywhere in 1730 the specification part. */ 1731 1732#define case_omp_decl case ST_OMP_THREADPRIVATE: case ST_OMP_DECLARE_SIMD: \ 1733 case ST_OMP_DECLARE_TARGET: case ST_OMP_DECLARE_REDUCTION: \ 1734 case ST_OMP_DECLARE_VARIANT: \ 1735 case ST_OMP_REQUIRES: case ST_OACC_ROUTINE: case ST_OACC_DECLARE 1736 1737/* Block end statements. Errors associated with interchanging these 1738 are detected in gfc_match_end(). */ 1739 1740#define case_end case ST_END_BLOCK_DATA: case ST_END_FUNCTION: \ 1741 case ST_END_PROGRAM: case ST_END_SUBROUTINE: \ 1742 case ST_END_BLOCK: case ST_END_ASSOCIATE 1743 1744 1745/* Push a new state onto the stack. */ 1746 1747static void 1748push_state (gfc_state_data *p, gfc_compile_state new_state, gfc_symbol *sym) 1749{ 1750 p->state = new_state; 1751 p->previous = gfc_state_stack; 1752 p->sym = sym; 1753 p->head = p->tail = NULL; 1754 p->do_variable = NULL; 1755 if (p->state != COMP_DO && p->state != COMP_DO_CONCURRENT) 1756 p->ext.oacc_declare_clauses = NULL; 1757 1758 /* If this the state of a construct like BLOCK, DO or IF, the corresponding 1759 construct statement was accepted right before pushing the state. Thus, 1760 the construct's gfc_code is available as tail of the parent state. */ 1761 gcc_assert (gfc_state_stack); 1762 p->construct = gfc_state_stack->tail; 1763 1764 gfc_state_stack = p; 1765} 1766 1767 1768/* Pop the current state. */ 1769static void 1770pop_state (void) 1771{ 1772 gfc_state_stack = gfc_state_stack->previous; 1773} 1774 1775 1776/* Try to find the given state in the state stack. */ 1777 1778bool 1779gfc_find_state (gfc_compile_state state) 1780{ 1781 gfc_state_data *p; 1782 1783 for (p = gfc_state_stack; p; p = p->previous) 1784 if (p->state == state) 1785 break; 1786 1787 return (p == NULL) ? false : true; 1788} 1789 1790 1791/* Starts a new level in the statement list. */ 1792 1793static gfc_code * 1794new_level (gfc_code *q) 1795{ 1796 gfc_code *p; 1797 1798 p = q->block = gfc_get_code (EXEC_NOP); 1799 1800 gfc_state_stack->head = gfc_state_stack->tail = p; 1801 1802 return p; 1803} 1804 1805 1806/* Add the current new_st code structure and adds it to the current 1807 program unit. As a side-effect, it zeroes the new_st. */ 1808 1809static gfc_code * 1810add_statement (void) 1811{ 1812 gfc_code *p; 1813 1814 p = XCNEW (gfc_code); 1815 *p = new_st; 1816 1817 p->loc = gfc_current_locus; 1818 1819 if (gfc_state_stack->head == NULL) 1820 gfc_state_stack->head = p; 1821 else 1822 gfc_state_stack->tail->next = p; 1823 1824 while (p->next != NULL) 1825 p = p->next; 1826 1827 gfc_state_stack->tail = p; 1828 1829 gfc_clear_new_st (); 1830 1831 return p; 1832} 1833 1834 1835/* Frees everything associated with the current statement. */ 1836 1837static void 1838undo_new_statement (void) 1839{ 1840 gfc_free_statements (new_st.block); 1841 gfc_free_statements (new_st.next); 1842 gfc_free_statement (&new_st); 1843 gfc_clear_new_st (); 1844} 1845 1846 1847/* If the current statement has a statement label, make sure that it 1848 is allowed to, or should have one. */ 1849 1850static void 1851check_statement_label (gfc_statement st) 1852{ 1853 gfc_sl_type type; 1854 1855 if (gfc_statement_label == NULL) 1856 { 1857 if (st == ST_FORMAT) 1858 gfc_error ("FORMAT statement at %L does not have a statement label", 1859 &new_st.loc); 1860 return; 1861 } 1862 1863 switch (st) 1864 { 1865 case ST_END_PROGRAM: 1866 case ST_END_FUNCTION: 1867 case ST_END_SUBROUTINE: 1868 case ST_ENDDO: 1869 case ST_ENDIF: 1870 case ST_END_SELECT: 1871 case ST_END_CRITICAL: 1872 case ST_END_BLOCK: 1873 case ST_END_ASSOCIATE: 1874 case_executable: 1875 case_exec_markers: 1876 if (st == ST_ENDDO || st == ST_CONTINUE) 1877 type = ST_LABEL_DO_TARGET; 1878 else 1879 type = ST_LABEL_TARGET; 1880 break; 1881 1882 case ST_FORMAT: 1883 type = ST_LABEL_FORMAT; 1884 break; 1885 1886 /* Statement labels are not restricted from appearing on a 1887 particular line. However, there are plenty of situations 1888 where the resulting label can't be referenced. */ 1889 1890 default: 1891 type = ST_LABEL_BAD_TARGET; 1892 break; 1893 } 1894 1895 gfc_define_st_label (gfc_statement_label, type, &label_locus); 1896 1897 new_st.here = gfc_statement_label; 1898} 1899 1900 1901/* Figures out what the enclosing program unit is. This will be a 1902 function, subroutine, program, block data or module. */ 1903 1904gfc_state_data * 1905gfc_enclosing_unit (gfc_compile_state * result) 1906{ 1907 gfc_state_data *p; 1908 1909 for (p = gfc_state_stack; p; p = p->previous) 1910 if (p->state == COMP_FUNCTION || p->state == COMP_SUBROUTINE 1911 || p->state == COMP_MODULE || p->state == COMP_SUBMODULE 1912 || p->state == COMP_BLOCK_DATA || p->state == COMP_PROGRAM) 1913 { 1914 1915 if (result != NULL) 1916 *result = p->state; 1917 return p; 1918 } 1919 1920 if (result != NULL) 1921 *result = COMP_PROGRAM; 1922 return NULL; 1923} 1924 1925 1926/* Translate a statement enum to a string. */ 1927 1928const char * 1929gfc_ascii_statement (gfc_statement st) 1930{ 1931 const char *p; 1932 1933 switch (st) 1934 { 1935 case ST_ARITHMETIC_IF: 1936 p = _("arithmetic IF"); 1937 break; 1938 case ST_ALLOCATE: 1939 p = "ALLOCATE"; 1940 break; 1941 case ST_ASSOCIATE: 1942 p = "ASSOCIATE"; 1943 break; 1944 case ST_ATTR_DECL: 1945 p = _("attribute declaration"); 1946 break; 1947 case ST_BACKSPACE: 1948 p = "BACKSPACE"; 1949 break; 1950 case ST_BLOCK: 1951 p = "BLOCK"; 1952 break; 1953 case ST_BLOCK_DATA: 1954 p = "BLOCK DATA"; 1955 break; 1956 case ST_CALL: 1957 p = "CALL"; 1958 break; 1959 case ST_CASE: 1960 p = "CASE"; 1961 break; 1962 case ST_CLOSE: 1963 p = "CLOSE"; 1964 break; 1965 case ST_COMMON: 1966 p = "COMMON"; 1967 break; 1968 case ST_CONTINUE: 1969 p = "CONTINUE"; 1970 break; 1971 case ST_CONTAINS: 1972 p = "CONTAINS"; 1973 break; 1974 case ST_CRITICAL: 1975 p = "CRITICAL"; 1976 break; 1977 case ST_CYCLE: 1978 p = "CYCLE"; 1979 break; 1980 case ST_DATA_DECL: 1981 p = _("data declaration"); 1982 break; 1983 case ST_DATA: 1984 p = "DATA"; 1985 break; 1986 case ST_DEALLOCATE: 1987 p = "DEALLOCATE"; 1988 break; 1989 case ST_MAP: 1990 p = "MAP"; 1991 break; 1992 case ST_UNION: 1993 p = "UNION"; 1994 break; 1995 case ST_STRUCTURE_DECL: 1996 p = "STRUCTURE"; 1997 break; 1998 case ST_DERIVED_DECL: 1999 p = _("derived type declaration"); 2000 break; 2001 case ST_DO: 2002 p = "DO"; 2003 break; 2004 case ST_ELSE: 2005 p = "ELSE"; 2006 break; 2007 case ST_ELSEIF: 2008 p = "ELSE IF"; 2009 break; 2010 case ST_ELSEWHERE: 2011 p = "ELSEWHERE"; 2012 break; 2013 case ST_EVENT_POST: 2014 p = "EVENT POST"; 2015 break; 2016 case ST_EVENT_WAIT: 2017 p = "EVENT WAIT"; 2018 break; 2019 case ST_FAIL_IMAGE: 2020 p = "FAIL IMAGE"; 2021 break; 2022 case ST_CHANGE_TEAM: 2023 p = "CHANGE TEAM"; 2024 break; 2025 case ST_END_TEAM: 2026 p = "END TEAM"; 2027 break; 2028 case ST_FORM_TEAM: 2029 p = "FORM TEAM"; 2030 break; 2031 case ST_SYNC_TEAM: 2032 p = "SYNC TEAM"; 2033 break; 2034 case ST_END_ASSOCIATE: 2035 p = "END ASSOCIATE"; 2036 break; 2037 case ST_END_BLOCK: 2038 p = "END BLOCK"; 2039 break; 2040 case ST_END_BLOCK_DATA: 2041 p = "END BLOCK DATA"; 2042 break; 2043 case ST_END_CRITICAL: 2044 p = "END CRITICAL"; 2045 break; 2046 case ST_ENDDO: 2047 p = "END DO"; 2048 break; 2049 case ST_END_FILE: 2050 p = "END FILE"; 2051 break; 2052 case ST_END_FORALL: 2053 p = "END FORALL"; 2054 break; 2055 case ST_END_FUNCTION: 2056 p = "END FUNCTION"; 2057 break; 2058 case ST_ENDIF: 2059 p = "END IF"; 2060 break; 2061 case ST_END_INTERFACE: 2062 p = "END INTERFACE"; 2063 break; 2064 case ST_END_MODULE: 2065 p = "END MODULE"; 2066 break; 2067 case ST_END_SUBMODULE: 2068 p = "END SUBMODULE"; 2069 break; 2070 case ST_END_PROGRAM: 2071 p = "END PROGRAM"; 2072 break; 2073 case ST_END_SELECT: 2074 p = "END SELECT"; 2075 break; 2076 case ST_END_SUBROUTINE: 2077 p = "END SUBROUTINE"; 2078 break; 2079 case ST_END_WHERE: 2080 p = "END WHERE"; 2081 break; 2082 case ST_END_STRUCTURE: 2083 p = "END STRUCTURE"; 2084 break; 2085 case ST_END_UNION: 2086 p = "END UNION"; 2087 break; 2088 case ST_END_MAP: 2089 p = "END MAP"; 2090 break; 2091 case ST_END_TYPE: 2092 p = "END TYPE"; 2093 break; 2094 case ST_ENTRY: 2095 p = "ENTRY"; 2096 break; 2097 case ST_EQUIVALENCE: 2098 p = "EQUIVALENCE"; 2099 break; 2100 case ST_ERROR_STOP: 2101 p = "ERROR STOP"; 2102 break; 2103 case ST_EXIT: 2104 p = "EXIT"; 2105 break; 2106 case ST_FLUSH: 2107 p = "FLUSH"; 2108 break; 2109 case ST_FORALL_BLOCK: /* Fall through */ 2110 case ST_FORALL: 2111 p = "FORALL"; 2112 break; 2113 case ST_FORMAT: 2114 p = "FORMAT"; 2115 break; 2116 case ST_FUNCTION: 2117 p = "FUNCTION"; 2118 break; 2119 case ST_GENERIC: 2120 p = "GENERIC"; 2121 break; 2122 case ST_GOTO: 2123 p = "GOTO"; 2124 break; 2125 case ST_IF_BLOCK: 2126 p = _("block IF"); 2127 break; 2128 case ST_IMPLICIT: 2129 p = "IMPLICIT"; 2130 break; 2131 case ST_IMPLICIT_NONE: 2132 p = "IMPLICIT NONE"; 2133 break; 2134 case ST_IMPLIED_ENDDO: 2135 p = _("implied END DO"); 2136 break; 2137 case ST_IMPORT: 2138 p = "IMPORT"; 2139 break; 2140 case ST_INQUIRE: 2141 p = "INQUIRE"; 2142 break; 2143 case ST_INTERFACE: 2144 p = "INTERFACE"; 2145 break; 2146 case ST_LOCK: 2147 p = "LOCK"; 2148 break; 2149 case ST_PARAMETER: 2150 p = "PARAMETER"; 2151 break; 2152 case ST_PRIVATE: 2153 p = "PRIVATE"; 2154 break; 2155 case ST_PUBLIC: 2156 p = "PUBLIC"; 2157 break; 2158 case ST_MODULE: 2159 p = "MODULE"; 2160 break; 2161 case ST_SUBMODULE: 2162 p = "SUBMODULE"; 2163 break; 2164 case ST_PAUSE: 2165 p = "PAUSE"; 2166 break; 2167 case ST_MODULE_PROC: 2168 p = "MODULE PROCEDURE"; 2169 break; 2170 case ST_NAMELIST: 2171 p = "NAMELIST"; 2172 break; 2173 case ST_NULLIFY: 2174 p = "NULLIFY"; 2175 break; 2176 case ST_OPEN: 2177 p = "OPEN"; 2178 break; 2179 case ST_PROGRAM: 2180 p = "PROGRAM"; 2181 break; 2182 case ST_PROCEDURE: 2183 p = "PROCEDURE"; 2184 break; 2185 case ST_READ: 2186 p = "READ"; 2187 break; 2188 case ST_RETURN: 2189 p = "RETURN"; 2190 break; 2191 case ST_REWIND: 2192 p = "REWIND"; 2193 break; 2194 case ST_STOP: 2195 p = "STOP"; 2196 break; 2197 case ST_SYNC_ALL: 2198 p = "SYNC ALL"; 2199 break; 2200 case ST_SYNC_IMAGES: 2201 p = "SYNC IMAGES"; 2202 break; 2203 case ST_SYNC_MEMORY: 2204 p = "SYNC MEMORY"; 2205 break; 2206 case ST_SUBROUTINE: 2207 p = "SUBROUTINE"; 2208 break; 2209 case ST_TYPE: 2210 p = "TYPE"; 2211 break; 2212 case ST_UNLOCK: 2213 p = "UNLOCK"; 2214 break; 2215 case ST_USE: 2216 p = "USE"; 2217 break; 2218 case ST_WHERE_BLOCK: /* Fall through */ 2219 case ST_WHERE: 2220 p = "WHERE"; 2221 break; 2222 case ST_WAIT: 2223 p = "WAIT"; 2224 break; 2225 case ST_WRITE: 2226 p = "WRITE"; 2227 break; 2228 case ST_ASSIGNMENT: 2229 p = _("assignment"); 2230 break; 2231 case ST_POINTER_ASSIGNMENT: 2232 p = _("pointer assignment"); 2233 break; 2234 case ST_SELECT_CASE: 2235 p = "SELECT CASE"; 2236 break; 2237 case ST_SELECT_TYPE: 2238 p = "SELECT TYPE"; 2239 break; 2240 case ST_SELECT_RANK: 2241 p = "SELECT RANK"; 2242 break; 2243 case ST_TYPE_IS: 2244 p = "TYPE IS"; 2245 break; 2246 case ST_CLASS_IS: 2247 p = "CLASS IS"; 2248 break; 2249 case ST_RANK: 2250 p = "RANK"; 2251 break; 2252 case ST_SEQUENCE: 2253 p = "SEQUENCE"; 2254 break; 2255 case ST_SIMPLE_IF: 2256 p = _("simple IF"); 2257 break; 2258 case ST_STATEMENT_FUNCTION: 2259 p = "STATEMENT FUNCTION"; 2260 break; 2261 case ST_LABEL_ASSIGNMENT: 2262 p = "LABEL ASSIGNMENT"; 2263 break; 2264 case ST_ENUM: 2265 p = "ENUM DEFINITION"; 2266 break; 2267 case ST_ENUMERATOR: 2268 p = "ENUMERATOR DEFINITION"; 2269 break; 2270 case ST_END_ENUM: 2271 p = "END ENUM"; 2272 break; 2273 case ST_OACC_PARALLEL_LOOP: 2274 p = "!$ACC PARALLEL LOOP"; 2275 break; 2276 case ST_OACC_END_PARALLEL_LOOP: 2277 p = "!$ACC END PARALLEL LOOP"; 2278 break; 2279 case ST_OACC_PARALLEL: 2280 p = "!$ACC PARALLEL"; 2281 break; 2282 case ST_OACC_END_PARALLEL: 2283 p = "!$ACC END PARALLEL"; 2284 break; 2285 case ST_OACC_KERNELS: 2286 p = "!$ACC KERNELS"; 2287 break; 2288 case ST_OACC_END_KERNELS: 2289 p = "!$ACC END KERNELS"; 2290 break; 2291 case ST_OACC_KERNELS_LOOP: 2292 p = "!$ACC KERNELS LOOP"; 2293 break; 2294 case ST_OACC_END_KERNELS_LOOP: 2295 p = "!$ACC END KERNELS LOOP"; 2296 break; 2297 case ST_OACC_SERIAL_LOOP: 2298 p = "!$ACC SERIAL LOOP"; 2299 break; 2300 case ST_OACC_END_SERIAL_LOOP: 2301 p = "!$ACC END SERIAL LOOP"; 2302 break; 2303 case ST_OACC_SERIAL: 2304 p = "!$ACC SERIAL"; 2305 break; 2306 case ST_OACC_END_SERIAL: 2307 p = "!$ACC END SERIAL"; 2308 break; 2309 case ST_OACC_DATA: 2310 p = "!$ACC DATA"; 2311 break; 2312 case ST_OACC_END_DATA: 2313 p = "!$ACC END DATA"; 2314 break; 2315 case ST_OACC_HOST_DATA: 2316 p = "!$ACC HOST_DATA"; 2317 break; 2318 case ST_OACC_END_HOST_DATA: 2319 p = "!$ACC END HOST_DATA"; 2320 break; 2321 case ST_OACC_LOOP: 2322 p = "!$ACC LOOP"; 2323 break; 2324 case ST_OACC_END_LOOP: 2325 p = "!$ACC END LOOP"; 2326 break; 2327 case ST_OACC_DECLARE: 2328 p = "!$ACC DECLARE"; 2329 break; 2330 case ST_OACC_UPDATE: 2331 p = "!$ACC UPDATE"; 2332 break; 2333 case ST_OACC_WAIT: 2334 p = "!$ACC WAIT"; 2335 break; 2336 case ST_OACC_CACHE: 2337 p = "!$ACC CACHE"; 2338 break; 2339 case ST_OACC_ENTER_DATA: 2340 p = "!$ACC ENTER DATA"; 2341 break; 2342 case ST_OACC_EXIT_DATA: 2343 p = "!$ACC EXIT DATA"; 2344 break; 2345 case ST_OACC_ROUTINE: 2346 p = "!$ACC ROUTINE"; 2347 break; 2348 case ST_OACC_ATOMIC: 2349 p = "!$ACC ATOMIC"; 2350 break; 2351 case ST_OACC_END_ATOMIC: 2352 p = "!$ACC END ATOMIC"; 2353 break; 2354 case ST_OMP_ATOMIC: 2355 p = "!$OMP ATOMIC"; 2356 break; 2357 case ST_OMP_BARRIER: 2358 p = "!$OMP BARRIER"; 2359 break; 2360 case ST_OMP_CANCEL: 2361 p = "!$OMP CANCEL"; 2362 break; 2363 case ST_OMP_CANCELLATION_POINT: 2364 p = "!$OMP CANCELLATION POINT"; 2365 break; 2366 case ST_OMP_CRITICAL: 2367 p = "!$OMP CRITICAL"; 2368 break; 2369 case ST_OMP_DECLARE_REDUCTION: 2370 p = "!$OMP DECLARE REDUCTION"; 2371 break; 2372 case ST_OMP_DECLARE_SIMD: 2373 p = "!$OMP DECLARE SIMD"; 2374 break; 2375 case ST_OMP_DECLARE_TARGET: 2376 p = "!$OMP DECLARE TARGET"; 2377 break; 2378 case ST_OMP_DECLARE_VARIANT: 2379 p = "!$OMP DECLARE VARIANT"; 2380 break; 2381 case ST_OMP_DEPOBJ: 2382 p = "!$OMP DEPOBJ"; 2383 break; 2384 case ST_OMP_DISTRIBUTE: 2385 p = "!$OMP DISTRIBUTE"; 2386 break; 2387 case ST_OMP_DISTRIBUTE_PARALLEL_DO: 2388 p = "!$OMP DISTRIBUTE PARALLEL DO"; 2389 break; 2390 case ST_OMP_DISTRIBUTE_PARALLEL_DO_SIMD: 2391 p = "!$OMP DISTRIBUTE PARALLEL DO SIMD"; 2392 break; 2393 case ST_OMP_DISTRIBUTE_SIMD: 2394 p = "!$OMP DISTRIBUTE SIMD"; 2395 break; 2396 case ST_OMP_DO: 2397 p = "!$OMP DO"; 2398 break; 2399 case ST_OMP_DO_SIMD: 2400 p = "!$OMP DO SIMD"; 2401 break; 2402 case ST_OMP_END_ATOMIC: 2403 p = "!$OMP END ATOMIC"; 2404 break; 2405 case ST_OMP_END_CRITICAL: 2406 p = "!$OMP END CRITICAL"; 2407 break; 2408 case ST_OMP_END_DISTRIBUTE: 2409 p = "!$OMP END DISTRIBUTE"; 2410 break; 2411 case ST_OMP_END_DISTRIBUTE_PARALLEL_DO: 2412 p = "!$OMP END DISTRIBUTE PARALLEL DO"; 2413 break; 2414 case ST_OMP_END_DISTRIBUTE_PARALLEL_DO_SIMD: 2415 p = "!$OMP END DISTRIBUTE PARALLEL DO SIMD"; 2416 break; 2417 case ST_OMP_END_DISTRIBUTE_SIMD: 2418 p = "!$OMP END DISTRIBUTE SIMD"; 2419 break; 2420 case ST_OMP_END_DO: 2421 p = "!$OMP END DO"; 2422 break; 2423 case ST_OMP_END_DO_SIMD: 2424 p = "!$OMP END DO SIMD"; 2425 break; 2426 case ST_OMP_END_SCOPE: 2427 p = "!$OMP END SCOPE"; 2428 break; 2429 case ST_OMP_END_SIMD: 2430 p = "!$OMP END SIMD"; 2431 break; 2432 case ST_OMP_END_LOOP: 2433 p = "!$OMP END LOOP"; 2434 break; 2435 case ST_OMP_END_MASKED: 2436 p = "!$OMP END MASKED"; 2437 break; 2438 case ST_OMP_END_MASKED_TASKLOOP: 2439 p = "!$OMP END MASKED TASKLOOP"; 2440 break; 2441 case ST_OMP_END_MASKED_TASKLOOP_SIMD: 2442 p = "!$OMP END MASKED TASKLOOP SIMD"; 2443 break; 2444 case ST_OMP_END_MASTER: 2445 p = "!$OMP END MASTER"; 2446 break; 2447 case ST_OMP_END_MASTER_TASKLOOP: 2448 p = "!$OMP END MASTER TASKLOOP"; 2449 break; 2450 case ST_OMP_END_MASTER_TASKLOOP_SIMD: 2451 p = "!$OMP END MASTER TASKLOOP SIMD"; 2452 break; 2453 case ST_OMP_END_ORDERED: 2454 p = "!$OMP END ORDERED"; 2455 break; 2456 case ST_OMP_END_PARALLEL: 2457 p = "!$OMP END PARALLEL"; 2458 break; 2459 case ST_OMP_END_PARALLEL_DO: 2460 p = "!$OMP END PARALLEL DO"; 2461 break; 2462 case ST_OMP_END_PARALLEL_DO_SIMD: 2463 p = "!$OMP END PARALLEL DO SIMD"; 2464 break; 2465 case ST_OMP_END_PARALLEL_LOOP: 2466 p = "!$OMP END PARALLEL LOOP"; 2467 break; 2468 case ST_OMP_END_PARALLEL_MASKED: 2469 p = "!$OMP END PARALLEL MASKED"; 2470 break; 2471 case ST_OMP_END_PARALLEL_MASKED_TASKLOOP: 2472 p = "!$OMP END PARALLEL MASKED TASKLOOP"; 2473 break; 2474 case ST_OMP_END_PARALLEL_MASKED_TASKLOOP_SIMD: 2475 p = "!$OMP END PARALLEL MASKED TASKLOOP SIMD"; 2476 break; 2477 case ST_OMP_END_PARALLEL_MASTER: 2478 p = "!$OMP END PARALLEL MASTER"; 2479 break; 2480 case ST_OMP_END_PARALLEL_MASTER_TASKLOOP: 2481 p = "!$OMP END PARALLEL MASTER TASKLOOP"; 2482 break; 2483 case ST_OMP_END_PARALLEL_MASTER_TASKLOOP_SIMD: 2484 p = "!$OMP END PARALLEL MASTER TASKLOOP SIMD"; 2485 break; 2486 case ST_OMP_END_PARALLEL_SECTIONS: 2487 p = "!$OMP END PARALLEL SECTIONS"; 2488 break; 2489 case ST_OMP_END_PARALLEL_WORKSHARE: 2490 p = "!$OMP END PARALLEL WORKSHARE"; 2491 break; 2492 case ST_OMP_END_SECTIONS: 2493 p = "!$OMP END SECTIONS"; 2494 break; 2495 case ST_OMP_END_SINGLE: 2496 p = "!$OMP END SINGLE"; 2497 break; 2498 case ST_OMP_END_TASK: 2499 p = "!$OMP END TASK"; 2500 break; 2501 case ST_OMP_END_TARGET: 2502 p = "!$OMP END TARGET"; 2503 break; 2504 case ST_OMP_END_TARGET_DATA: 2505 p = "!$OMP END TARGET DATA"; 2506 break; 2507 case ST_OMP_END_TARGET_PARALLEL: 2508 p = "!$OMP END TARGET PARALLEL"; 2509 break; 2510 case ST_OMP_END_TARGET_PARALLEL_DO: 2511 p = "!$OMP END TARGET PARALLEL DO"; 2512 break; 2513 case ST_OMP_END_TARGET_PARALLEL_DO_SIMD: 2514 p = "!$OMP END TARGET PARALLEL DO SIMD"; 2515 break; 2516 case ST_OMP_END_TARGET_PARALLEL_LOOP: 2517 p = "!$OMP END TARGET PARALLEL LOOP"; 2518 break; 2519 case ST_OMP_END_TARGET_SIMD: 2520 p = "!$OMP END TARGET SIMD"; 2521 break; 2522 case ST_OMP_END_TARGET_TEAMS: 2523 p = "!$OMP END TARGET TEAMS"; 2524 break; 2525 case ST_OMP_END_TARGET_TEAMS_DISTRIBUTE: 2526 p = "!$OMP END TARGET TEAMS DISTRIBUTE"; 2527 break; 2528 case ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO: 2529 p = "!$OMP END TARGET TEAMS DISTRIBUTE PARALLEL DO"; 2530 break; 2531 case ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: 2532 p = "!$OMP END TARGET TEAMS DISTRIBUTE PARALLEL DO SIMD"; 2533 break; 2534 case ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_SIMD: 2535 p = "!$OMP END TARGET TEAMS DISTRIBUTE SIMD"; 2536 break; 2537 case ST_OMP_END_TARGET_TEAMS_LOOP: 2538 p = "!$OMP END TARGET TEAMS LOOP"; 2539 break; 2540 case ST_OMP_END_TASKGROUP: 2541 p = "!$OMP END TASKGROUP"; 2542 break; 2543 case ST_OMP_END_TASKLOOP: 2544 p = "!$OMP END TASKLOOP"; 2545 break; 2546 case ST_OMP_END_TASKLOOP_SIMD: 2547 p = "!$OMP END TASKLOOP SIMD"; 2548 break; 2549 case ST_OMP_END_TEAMS: 2550 p = "!$OMP END TEAMS"; 2551 break; 2552 case ST_OMP_END_TEAMS_DISTRIBUTE: 2553 p = "!$OMP END TEAMS DISTRIBUTE"; 2554 break; 2555 case ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO: 2556 p = "!$OMP END TEAMS DISTRIBUTE PARALLEL DO"; 2557 break; 2558 case ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: 2559 p = "!$OMP END TEAMS DISTRIBUTE PARALLEL DO SIMD"; 2560 break; 2561 case ST_OMP_END_TEAMS_DISTRIBUTE_SIMD: 2562 p = "!$OMP END TEAMS DISTRIBUTE SIMD"; 2563 break; 2564 case ST_OMP_END_TEAMS_LOOP: 2565 p = "!$OMP END TEAMS LOOP"; 2566 break; 2567 case ST_OMP_END_WORKSHARE: 2568 p = "!$OMP END WORKSHARE"; 2569 break; 2570 case ST_OMP_ERROR: 2571 p = "!$OMP ERROR"; 2572 break; 2573 case ST_OMP_FLUSH: 2574 p = "!$OMP FLUSH"; 2575 break; 2576 case ST_OMP_LOOP: 2577 p = "!$OMP LOOP"; 2578 break; 2579 case ST_OMP_MASKED: 2580 p = "!$OMP MASKED"; 2581 break; 2582 case ST_OMP_MASKED_TASKLOOP: 2583 p = "!$OMP MASKED TASKLOOP"; 2584 break; 2585 case ST_OMP_MASKED_TASKLOOP_SIMD: 2586 p = "!$OMP MASKED TASKLOOP SIMD"; 2587 break; 2588 case ST_OMP_MASTER: 2589 p = "!$OMP MASTER"; 2590 break; 2591 case ST_OMP_MASTER_TASKLOOP: 2592 p = "!$OMP MASTER TASKLOOP"; 2593 break; 2594 case ST_OMP_MASTER_TASKLOOP_SIMD: 2595 p = "!$OMP MASTER TASKLOOP SIMD"; 2596 break; 2597 case ST_OMP_ORDERED: 2598 case ST_OMP_ORDERED_DEPEND: 2599 p = "!$OMP ORDERED"; 2600 break; 2601 case ST_OMP_PARALLEL: 2602 p = "!$OMP PARALLEL"; 2603 break; 2604 case ST_OMP_PARALLEL_DO: 2605 p = "!$OMP PARALLEL DO"; 2606 break; 2607 case ST_OMP_PARALLEL_LOOP: 2608 p = "!$OMP PARALLEL LOOP"; 2609 break; 2610 case ST_OMP_PARALLEL_DO_SIMD: 2611 p = "!$OMP PARALLEL DO SIMD"; 2612 break; 2613 case ST_OMP_PARALLEL_MASKED: 2614 p = "!$OMP PARALLEL MASKED"; 2615 break; 2616 case ST_OMP_PARALLEL_MASKED_TASKLOOP: 2617 p = "!$OMP PARALLEL MASKED TASKLOOP"; 2618 break; 2619 case ST_OMP_PARALLEL_MASKED_TASKLOOP_SIMD: 2620 p = "!$OMP PARALLEL MASKED TASKLOOP SIMD"; 2621 break; 2622 case ST_OMP_PARALLEL_MASTER: 2623 p = "!$OMP PARALLEL MASTER"; 2624 break; 2625 case ST_OMP_PARALLEL_MASTER_TASKLOOP: 2626 p = "!$OMP PARALLEL MASTER TASKLOOP"; 2627 break; 2628 case ST_OMP_PARALLEL_MASTER_TASKLOOP_SIMD: 2629 p = "!$OMP PARALLEL MASTER TASKLOOP SIMD"; 2630 break; 2631 case ST_OMP_PARALLEL_SECTIONS: 2632 p = "!$OMP PARALLEL SECTIONS"; 2633 break; 2634 case ST_OMP_PARALLEL_WORKSHARE: 2635 p = "!$OMP PARALLEL WORKSHARE"; 2636 break; 2637 case ST_OMP_REQUIRES: 2638 p = "!$OMP REQUIRES"; 2639 break; 2640 case ST_OMP_SCAN: 2641 p = "!$OMP SCAN"; 2642 break; 2643 case ST_OMP_SCOPE: 2644 p = "!$OMP SCOPE"; 2645 break; 2646 case ST_OMP_SECTIONS: 2647 p = "!$OMP SECTIONS"; 2648 break; 2649 case ST_OMP_SECTION: 2650 p = "!$OMP SECTION"; 2651 break; 2652 case ST_OMP_SIMD: 2653 p = "!$OMP SIMD"; 2654 break; 2655 case ST_OMP_SINGLE: 2656 p = "!$OMP SINGLE"; 2657 break; 2658 case ST_OMP_TARGET: 2659 p = "!$OMP TARGET"; 2660 break; 2661 case ST_OMP_TARGET_DATA: 2662 p = "!$OMP TARGET DATA"; 2663 break; 2664 case ST_OMP_TARGET_ENTER_DATA: 2665 p = "!$OMP TARGET ENTER DATA"; 2666 break; 2667 case ST_OMP_TARGET_EXIT_DATA: 2668 p = "!$OMP TARGET EXIT DATA"; 2669 break; 2670 case ST_OMP_TARGET_PARALLEL: 2671 p = "!$OMP TARGET PARALLEL"; 2672 break; 2673 case ST_OMP_TARGET_PARALLEL_DO: 2674 p = "!$OMP TARGET PARALLEL DO"; 2675 break; 2676 case ST_OMP_TARGET_PARALLEL_DO_SIMD: 2677 p = "!$OMP TARGET PARALLEL DO SIMD"; 2678 break; 2679 case ST_OMP_TARGET_PARALLEL_LOOP: 2680 p = "!$OMP TARGET PARALLEL LOOP"; 2681 break; 2682 case ST_OMP_TARGET_SIMD: 2683 p = "!$OMP TARGET SIMD"; 2684 break; 2685 case ST_OMP_TARGET_TEAMS: 2686 p = "!$OMP TARGET TEAMS"; 2687 break; 2688 case ST_OMP_TARGET_TEAMS_DISTRIBUTE: 2689 p = "!$OMP TARGET TEAMS DISTRIBUTE"; 2690 break; 2691 case ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO: 2692 p = "!$OMP TARGET TEAMS DISTRIBUTE PARALLEL DO"; 2693 break; 2694 case ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: 2695 p = "!$OMP TARGET TEAMS DISTRIBUTE PARALLEL DO SIMD"; 2696 break; 2697 case ST_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD: 2698 p = "!$OMP TARGET TEAMS DISTRIBUTE SIMD"; 2699 break; 2700 case ST_OMP_TARGET_TEAMS_LOOP: 2701 p = "!$OMP TARGET TEAMS LOOP"; 2702 break; 2703 case ST_OMP_TARGET_UPDATE: 2704 p = "!$OMP TARGET UPDATE"; 2705 break; 2706 case ST_OMP_TASK: 2707 p = "!$OMP TASK"; 2708 break; 2709 case ST_OMP_TASKGROUP: 2710 p = "!$OMP TASKGROUP"; 2711 break; 2712 case ST_OMP_TASKLOOP: 2713 p = "!$OMP TASKLOOP"; 2714 break; 2715 case ST_OMP_TASKLOOP_SIMD: 2716 p = "!$OMP TASKLOOP SIMD"; 2717 break; 2718 case ST_OMP_TASKWAIT: 2719 p = "!$OMP TASKWAIT"; 2720 break; 2721 case ST_OMP_TASKYIELD: 2722 p = "!$OMP TASKYIELD"; 2723 break; 2724 case ST_OMP_TEAMS: 2725 p = "!$OMP TEAMS"; 2726 break; 2727 case ST_OMP_TEAMS_DISTRIBUTE: 2728 p = "!$OMP TEAMS DISTRIBUTE"; 2729 break; 2730 case ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO: 2731 p = "!$OMP TEAMS DISTRIBUTE PARALLEL DO"; 2732 break; 2733 case ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: 2734 p = "!$OMP TEAMS DISTRIBUTE PARALLEL DO SIMD"; 2735 break; 2736 case ST_OMP_TEAMS_DISTRIBUTE_SIMD: 2737 p = "!$OMP TEAMS DISTRIBUTE SIMD"; 2738 break; 2739 case ST_OMP_TEAMS_LOOP: 2740 p = "!$OMP TEAMS LOOP"; 2741 break; 2742 case ST_OMP_THREADPRIVATE: 2743 p = "!$OMP THREADPRIVATE"; 2744 break; 2745 case ST_OMP_WORKSHARE: 2746 p = "!$OMP WORKSHARE"; 2747 break; 2748 default: 2749 gfc_internal_error ("gfc_ascii_statement(): Bad statement code"); 2750 } 2751 2752 return p; 2753} 2754 2755 2756/* Create a symbol for the main program and assign it to ns->proc_name. */ 2757 2758static void 2759main_program_symbol (gfc_namespace *ns, const char *name) 2760{ 2761 gfc_symbol *main_program; 2762 symbol_attribute attr; 2763 2764 gfc_get_symbol (name, ns, &main_program); 2765 gfc_clear_attr (&attr); 2766 attr.flavor = FL_PROGRAM; 2767 attr.proc = PROC_UNKNOWN; 2768 attr.subroutine = 1; 2769 attr.access = ACCESS_PUBLIC; 2770 attr.is_main_program = 1; 2771 main_program->attr = attr; 2772 main_program->declared_at = gfc_current_locus; 2773 ns->proc_name = main_program; 2774 gfc_commit_symbols (); 2775} 2776 2777 2778/* Do whatever is necessary to accept the last statement. */ 2779 2780static void 2781accept_statement (gfc_statement st) 2782{ 2783 switch (st) 2784 { 2785 case ST_IMPLICIT_NONE: 2786 case ST_IMPLICIT: 2787 break; 2788 2789 case ST_FUNCTION: 2790 case ST_SUBROUTINE: 2791 case ST_MODULE: 2792 case ST_SUBMODULE: 2793 gfc_current_ns->proc_name = gfc_new_block; 2794 break; 2795 2796 /* If the statement is the end of a block, lay down a special code 2797 that allows a branch to the end of the block from within the 2798 construct. IF and SELECT are treated differently from DO 2799 (where EXEC_NOP is added inside the loop) for two 2800 reasons: 2801 1. END DO has a meaning in the sense that after a GOTO to 2802 it, the loop counter must be increased. 2803 2. IF blocks and SELECT blocks can consist of multiple 2804 parallel blocks (IF ... ELSE IF ... ELSE ... END IF). 2805 Putting the label before the END IF would make the jump 2806 from, say, the ELSE IF block to the END IF illegal. */ 2807 2808 case ST_ENDIF: 2809 case ST_END_SELECT: 2810 case ST_END_CRITICAL: 2811 if (gfc_statement_label != NULL) 2812 { 2813 new_st.op = EXEC_END_NESTED_BLOCK; 2814 add_statement (); 2815 } 2816 break; 2817 2818 /* In the case of BLOCK and ASSOCIATE blocks, there cannot be more than 2819 one parallel block. Thus, we add the special code to the nested block 2820 itself, instead of the parent one. */ 2821 case ST_END_BLOCK: 2822 case ST_END_ASSOCIATE: 2823 if (gfc_statement_label != NULL) 2824 { 2825 new_st.op = EXEC_END_BLOCK; 2826 add_statement (); 2827 } 2828 break; 2829 2830 /* The end-of-program unit statements do not get the special 2831 marker and require a statement of some sort if they are a 2832 branch target. */ 2833 2834 case ST_END_PROGRAM: 2835 case ST_END_FUNCTION: 2836 case ST_END_SUBROUTINE: 2837 if (gfc_statement_label != NULL) 2838 { 2839 new_st.op = EXEC_RETURN; 2840 add_statement (); 2841 } 2842 else 2843 { 2844 new_st.op = EXEC_END_PROCEDURE; 2845 add_statement (); 2846 } 2847 2848 break; 2849 2850 case ST_ENTRY: 2851 case_executable: 2852 case_exec_markers: 2853 add_statement (); 2854 break; 2855 2856 default: 2857 break; 2858 } 2859 2860 gfc_commit_symbols (); 2861 gfc_warning_check (); 2862 gfc_clear_new_st (); 2863} 2864 2865 2866/* Undo anything tentative that has been built for the current statement, 2867 except if a gfc_charlen structure has been added to current namespace's 2868 list of gfc_charlen structure. */ 2869 2870static void 2871reject_statement (void) 2872{ 2873 gfc_free_equiv_until (gfc_current_ns->equiv, gfc_current_ns->old_equiv); 2874 gfc_current_ns->equiv = gfc_current_ns->old_equiv; 2875 2876 gfc_reject_data (gfc_current_ns); 2877 2878 gfc_new_block = NULL; 2879 gfc_undo_symbols (); 2880 gfc_clear_warning (); 2881 undo_new_statement (); 2882} 2883 2884 2885/* Generic complaint about an out of order statement. We also do 2886 whatever is necessary to clean up. */ 2887 2888static void 2889unexpected_statement (gfc_statement st) 2890{ 2891 gfc_error ("Unexpected %s statement at %C", gfc_ascii_statement (st)); 2892 2893 reject_statement (); 2894} 2895 2896 2897/* Given the next statement seen by the matcher, make sure that it is 2898 in proper order with the last. This subroutine is initialized by 2899 calling it with an argument of ST_NONE. If there is a problem, we 2900 issue an error and return false. Otherwise we return true. 2901 2902 Individual parsers need to verify that the statements seen are 2903 valid before calling here, i.e., ENTRY statements are not allowed in 2904 INTERFACE blocks. The following diagram is taken from the standard: 2905 2906 +---------------------------------------+ 2907 | program subroutine function module | 2908 +---------------------------------------+ 2909 | use | 2910 +---------------------------------------+ 2911 | import | 2912 +---------------------------------------+ 2913 | | implicit none | 2914 | +-----------+------------------+ 2915 | | parameter | implicit | 2916 | +-----------+------------------+ 2917 | format | | derived type | 2918 | entry | parameter | interface | 2919 | | data | specification | 2920 | | | statement func | 2921 | +-----------+------------------+ 2922 | | data | executable | 2923 +--------+-----------+------------------+ 2924 | contains | 2925 +---------------------------------------+ 2926 | internal module/subprogram | 2927 +---------------------------------------+ 2928 | end | 2929 +---------------------------------------+ 2930 2931*/ 2932 2933enum state_order 2934{ 2935 ORDER_START, 2936 ORDER_USE, 2937 ORDER_IMPORT, 2938 ORDER_IMPLICIT_NONE, 2939 ORDER_IMPLICIT, 2940 ORDER_SPEC, 2941 ORDER_EXEC 2942}; 2943 2944typedef struct 2945{ 2946 enum state_order state; 2947 gfc_statement last_statement; 2948 locus where; 2949} 2950st_state; 2951 2952static bool 2953verify_st_order (st_state *p, gfc_statement st, bool silent) 2954{ 2955 2956 switch (st) 2957 { 2958 case ST_NONE: 2959 p->state = ORDER_START; 2960 break; 2961 2962 case ST_USE: 2963 if (p->state > ORDER_USE) 2964 goto order; 2965 p->state = ORDER_USE; 2966 break; 2967 2968 case ST_IMPORT: 2969 if (p->state > ORDER_IMPORT) 2970 goto order; 2971 p->state = ORDER_IMPORT; 2972 break; 2973 2974 case ST_IMPLICIT_NONE: 2975 if (p->state > ORDER_IMPLICIT) 2976 goto order; 2977 2978 /* The '>' sign cannot be a '>=', because a FORMAT or ENTRY 2979 statement disqualifies a USE but not an IMPLICIT NONE. 2980 Duplicate IMPLICIT NONEs are caught when the implicit types 2981 are set. */ 2982 2983 p->state = ORDER_IMPLICIT_NONE; 2984 break; 2985 2986 case ST_IMPLICIT: 2987 if (p->state > ORDER_IMPLICIT) 2988 goto order; 2989 p->state = ORDER_IMPLICIT; 2990 break; 2991 2992 case ST_FORMAT: 2993 case ST_ENTRY: 2994 if (p->state < ORDER_IMPLICIT_NONE) 2995 p->state = ORDER_IMPLICIT_NONE; 2996 break; 2997 2998 case ST_PARAMETER: 2999 if (p->state >= ORDER_EXEC) 3000 goto order; 3001 if (p->state < ORDER_IMPLICIT) 3002 p->state = ORDER_IMPLICIT; 3003 break; 3004 3005 case ST_DATA: 3006 if (p->state < ORDER_SPEC) 3007 p->state = ORDER_SPEC; 3008 break; 3009 3010 case ST_PUBLIC: 3011 case ST_PRIVATE: 3012 case ST_STRUCTURE_DECL: 3013 case ST_DERIVED_DECL: 3014 case_decl: 3015 if (p->state >= ORDER_EXEC) 3016 goto order; 3017 if (p->state < ORDER_SPEC) 3018 p->state = ORDER_SPEC; 3019 break; 3020 3021 case_omp_decl: 3022 /* The OpenMP/OpenACC directives have to be somewhere in the specification 3023 part, but there are no further requirements on their ordering. 3024 Thus don't adjust p->state, just ignore them. */ 3025 if (p->state >= ORDER_EXEC) 3026 goto order; 3027 break; 3028 3029 case_executable: 3030 case_exec_markers: 3031 if (p->state < ORDER_EXEC) 3032 p->state = ORDER_EXEC; 3033 break; 3034 3035 default: 3036 return false; 3037 } 3038 3039 /* All is well, record the statement in case we need it next time. */ 3040 p->where = gfc_current_locus; 3041 p->last_statement = st; 3042 return true; 3043 3044order: 3045 if (!silent) 3046 gfc_error ("%s statement at %C cannot follow %s statement at %L", 3047 gfc_ascii_statement (st), 3048 gfc_ascii_statement (p->last_statement), &p->where); 3049 3050 return false; 3051} 3052 3053 3054/* Handle an unexpected end of file. This is a show-stopper... */ 3055 3056static void unexpected_eof (void) ATTRIBUTE_NORETURN; 3057 3058static void 3059unexpected_eof (void) 3060{ 3061 gfc_state_data *p; 3062 3063 gfc_error ("Unexpected end of file in %qs", gfc_source_file); 3064 3065 /* Memory cleanup. Move to "second to last". */ 3066 for (p = gfc_state_stack; p && p->previous && p->previous->previous; 3067 p = p->previous); 3068 3069 gfc_current_ns->code = (p && p->previous) ? p->head : NULL; 3070 gfc_done_2 (); 3071 3072 longjmp (eof_buf, 1); 3073 3074 /* Avoids build error on systems where longjmp is not declared noreturn. */ 3075 gcc_unreachable (); 3076} 3077 3078 3079/* Parse the CONTAINS section of a derived type definition. */ 3080 3081gfc_access gfc_typebound_default_access; 3082 3083static bool 3084parse_derived_contains (void) 3085{ 3086 gfc_state_data s; 3087 bool seen_private = false; 3088 bool seen_comps = false; 3089 bool error_flag = false; 3090 bool to_finish; 3091 3092 gcc_assert (gfc_current_state () == COMP_DERIVED); 3093 gcc_assert (gfc_current_block ()); 3094 3095 /* Derived-types with SEQUENCE and/or BIND(C) must not have a CONTAINS 3096 section. */ 3097 if (gfc_current_block ()->attr.sequence) 3098 gfc_error ("Derived-type %qs with SEQUENCE must not have a CONTAINS" 3099 " section at %C", gfc_current_block ()->name); 3100 if (gfc_current_block ()->attr.is_bind_c) 3101 gfc_error ("Derived-type %qs with BIND(C) must not have a CONTAINS" 3102 " section at %C", gfc_current_block ()->name); 3103 3104 accept_statement (ST_CONTAINS); 3105 push_state (&s, COMP_DERIVED_CONTAINS, NULL); 3106 3107 gfc_typebound_default_access = ACCESS_PUBLIC; 3108 3109 to_finish = false; 3110 while (!to_finish) 3111 { 3112 gfc_statement st; 3113 st = next_statement (); 3114 switch (st) 3115 { 3116 case ST_NONE: 3117 unexpected_eof (); 3118 break; 3119 3120 case ST_DATA_DECL: 3121 gfc_error ("Components in TYPE at %C must precede CONTAINS"); 3122 goto error; 3123 3124 case ST_PROCEDURE: 3125 if (!gfc_notify_std (GFC_STD_F2003, "Type-bound procedure at %C")) 3126 goto error; 3127 3128 accept_statement (ST_PROCEDURE); 3129 seen_comps = true; 3130 break; 3131 3132 case ST_GENERIC: 3133 if (!gfc_notify_std (GFC_STD_F2003, "GENERIC binding at %C")) 3134 goto error; 3135 3136 accept_statement (ST_GENERIC); 3137 seen_comps = true; 3138 break; 3139 3140 case ST_FINAL: 3141 if (!gfc_notify_std (GFC_STD_F2003, "FINAL procedure declaration" 3142 " at %C")) 3143 goto error; 3144 3145 accept_statement (ST_FINAL); 3146 seen_comps = true; 3147 break; 3148 3149 case ST_END_TYPE: 3150 to_finish = true; 3151 3152 if (!seen_comps 3153 && (!gfc_notify_std(GFC_STD_F2008, "Derived type definition " 3154 "at %C with empty CONTAINS section"))) 3155 goto error; 3156 3157 /* ST_END_TYPE is accepted by parse_derived after return. */ 3158 break; 3159 3160 case ST_PRIVATE: 3161 if (!gfc_find_state (COMP_MODULE)) 3162 { 3163 gfc_error ("PRIVATE statement in TYPE at %C must be inside " 3164 "a MODULE"); 3165 goto error; 3166 } 3167 3168 if (seen_comps) 3169 { 3170 gfc_error ("PRIVATE statement at %C must precede procedure" 3171 " bindings"); 3172 goto error; 3173 } 3174 3175 if (seen_private) 3176 { 3177 gfc_error ("Duplicate PRIVATE statement at %C"); 3178 goto error; 3179 } 3180 3181 accept_statement (ST_PRIVATE); 3182 gfc_typebound_default_access = ACCESS_PRIVATE; 3183 seen_private = true; 3184 break; 3185 3186 case ST_SEQUENCE: 3187 gfc_error ("SEQUENCE statement at %C must precede CONTAINS"); 3188 goto error; 3189 3190 case ST_CONTAINS: 3191 gfc_error ("Already inside a CONTAINS block at %C"); 3192 goto error; 3193 3194 default: 3195 unexpected_statement (st); 3196 break; 3197 } 3198 3199 continue; 3200 3201error: 3202 error_flag = true; 3203 reject_statement (); 3204 } 3205 3206 pop_state (); 3207 gcc_assert (gfc_current_state () == COMP_DERIVED); 3208 3209 return error_flag; 3210} 3211 3212 3213/* Set attributes for the parent symbol based on the attributes of a component 3214 and raise errors if conflicting attributes are found for the component. */ 3215 3216static void 3217check_component (gfc_symbol *sym, gfc_component *c, gfc_component **lockp, 3218 gfc_component **eventp) 3219{ 3220 bool coarray, lock_type, event_type, allocatable, pointer; 3221 coarray = lock_type = event_type = allocatable = pointer = false; 3222 gfc_component *lock_comp = NULL, *event_comp = NULL; 3223 3224 if (lockp) lock_comp = *lockp; 3225 if (eventp) event_comp = *eventp; 3226 3227 /* Look for allocatable components. */ 3228 if (c->attr.allocatable 3229 || (c->ts.type == BT_CLASS && c->attr.class_ok 3230 && CLASS_DATA (c)->attr.allocatable) 3231 || (c->ts.type == BT_DERIVED && !c->attr.pointer 3232 && c->ts.u.derived->attr.alloc_comp)) 3233 { 3234 allocatable = true; 3235 sym->attr.alloc_comp = 1; 3236 } 3237 3238 /* Look for pointer components. */ 3239 if (c->attr.pointer 3240 || (c->ts.type == BT_CLASS && c->attr.class_ok 3241 && CLASS_DATA (c)->attr.class_pointer) 3242 || (c->ts.type == BT_DERIVED && c->ts.u.derived->attr.pointer_comp)) 3243 { 3244 pointer = true; 3245 sym->attr.pointer_comp = 1; 3246 } 3247 3248 /* Look for procedure pointer components. */ 3249 if (c->attr.proc_pointer 3250 || (c->ts.type == BT_DERIVED 3251 && c->ts.u.derived->attr.proc_pointer_comp)) 3252 sym->attr.proc_pointer_comp = 1; 3253 3254 /* Looking for coarray components. */ 3255 if (c->attr.codimension 3256 || (c->ts.type == BT_CLASS && c->attr.class_ok 3257 && CLASS_DATA (c)->attr.codimension)) 3258 { 3259 coarray = true; 3260 sym->attr.coarray_comp = 1; 3261 } 3262 3263 if (c->ts.type == BT_DERIVED && c->ts.u.derived->attr.coarray_comp 3264 && !c->attr.pointer) 3265 { 3266 coarray = true; 3267 sym->attr.coarray_comp = 1; 3268 } 3269 3270 /* Looking for lock_type components. */ 3271 if ((c->ts.type == BT_DERIVED 3272 && c->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV 3273 && c->ts.u.derived->intmod_sym_id == ISOFORTRAN_LOCK_TYPE) 3274 || (c->ts.type == BT_CLASS && c->attr.class_ok 3275 && CLASS_DATA (c)->ts.u.derived->from_intmod 3276 == INTMOD_ISO_FORTRAN_ENV 3277 && CLASS_DATA (c)->ts.u.derived->intmod_sym_id 3278 == ISOFORTRAN_LOCK_TYPE) 3279 || (c->ts.type == BT_DERIVED && c->ts.u.derived->attr.lock_comp 3280 && !allocatable && !pointer)) 3281 { 3282 lock_type = 1; 3283 lock_comp = c; 3284 sym->attr.lock_comp = 1; 3285 } 3286 3287 /* Looking for event_type components. */ 3288 if ((c->ts.type == BT_DERIVED 3289 && c->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV 3290 && c->ts.u.derived->intmod_sym_id == ISOFORTRAN_EVENT_TYPE) 3291 || (c->ts.type == BT_CLASS && c->attr.class_ok 3292 && CLASS_DATA (c)->ts.u.derived->from_intmod 3293 == INTMOD_ISO_FORTRAN_ENV 3294 && CLASS_DATA (c)->ts.u.derived->intmod_sym_id 3295 == ISOFORTRAN_EVENT_TYPE) 3296 || (c->ts.type == BT_DERIVED && c->ts.u.derived->attr.event_comp 3297 && !allocatable && !pointer)) 3298 { 3299 event_type = 1; 3300 event_comp = c; 3301 sym->attr.event_comp = 1; 3302 } 3303 3304 /* Check for F2008, C1302 - and recall that pointers may not be coarrays 3305 (5.3.14) and that subobjects of coarray are coarray themselves (2.4.7), 3306 unless there are nondirect [allocatable or pointer] components 3307 involved (cf. 1.3.33.1 and 1.3.33.3). */ 3308 3309 if (pointer && !coarray && lock_type) 3310 gfc_error ("Component %s at %L of type LOCK_TYPE must have a " 3311 "codimension or be a subcomponent of a coarray, " 3312 "which is not possible as the component has the " 3313 "pointer attribute", c->name, &c->loc); 3314 else if (pointer && !coarray && c->ts.type == BT_DERIVED 3315 && c->ts.u.derived->attr.lock_comp) 3316 gfc_error ("Pointer component %s at %L has a noncoarray subcomponent " 3317 "of type LOCK_TYPE, which must have a codimension or be a " 3318 "subcomponent of a coarray", c->name, &c->loc); 3319 3320 if (lock_type && allocatable && !coarray) 3321 gfc_error ("Allocatable component %s at %L of type LOCK_TYPE must have " 3322 "a codimension", c->name, &c->loc); 3323 else if (lock_type && allocatable && c->ts.type == BT_DERIVED 3324 && c->ts.u.derived->attr.lock_comp) 3325 gfc_error ("Allocatable component %s at %L must have a codimension as " 3326 "it has a noncoarray subcomponent of type LOCK_TYPE", 3327 c->name, &c->loc); 3328 3329 if (sym->attr.coarray_comp && !coarray && lock_type) 3330 gfc_error ("Noncoarray component %s at %L of type LOCK_TYPE or with " 3331 "subcomponent of type LOCK_TYPE must have a codimension or " 3332 "be a subcomponent of a coarray. (Variables of type %s may " 3333 "not have a codimension as already a coarray " 3334 "subcomponent exists)", c->name, &c->loc, sym->name); 3335 3336 if (sym->attr.lock_comp && coarray && !lock_type) 3337 gfc_error ("Noncoarray component %s at %L of type LOCK_TYPE or with " 3338 "subcomponent of type LOCK_TYPE must have a codimension or " 3339 "be a subcomponent of a coarray. (Variables of type %s may " 3340 "not have a codimension as %s at %L has a codimension or a " 3341 "coarray subcomponent)", lock_comp->name, &lock_comp->loc, 3342 sym->name, c->name, &c->loc); 3343 3344 /* Similarly for EVENT TYPE. */ 3345 3346 if (pointer && !coarray && event_type) 3347 gfc_error ("Component %s at %L of type EVENT_TYPE must have a " 3348 "codimension or be a subcomponent of a coarray, " 3349 "which is not possible as the component has the " 3350 "pointer attribute", c->name, &c->loc); 3351 else if (pointer && !coarray && c->ts.type == BT_DERIVED 3352 && c->ts.u.derived->attr.event_comp) 3353 gfc_error ("Pointer component %s at %L has a noncoarray subcomponent " 3354 "of type EVENT_TYPE, which must have a codimension or be a " 3355 "subcomponent of a coarray", c->name, &c->loc); 3356 3357 if (event_type && allocatable && !coarray) 3358 gfc_error ("Allocatable component %s at %L of type EVENT_TYPE must have " 3359 "a codimension", c->name, &c->loc); 3360 else if (event_type && allocatable && c->ts.type == BT_DERIVED 3361 && c->ts.u.derived->attr.event_comp) 3362 gfc_error ("Allocatable component %s at %L must have a codimension as " 3363 "it has a noncoarray subcomponent of type EVENT_TYPE", 3364 c->name, &c->loc); 3365 3366 if (sym->attr.coarray_comp && !coarray && event_type) 3367 gfc_error ("Noncoarray component %s at %L of type EVENT_TYPE or with " 3368 "subcomponent of type EVENT_TYPE must have a codimension or " 3369 "be a subcomponent of a coarray. (Variables of type %s may " 3370 "not have a codimension as already a coarray " 3371 "subcomponent exists)", c->name, &c->loc, sym->name); 3372 3373 if (sym->attr.event_comp && coarray && !event_type) 3374 gfc_error ("Noncoarray component %s at %L of type EVENT_TYPE or with " 3375 "subcomponent of type EVENT_TYPE must have a codimension or " 3376 "be a subcomponent of a coarray. (Variables of type %s may " 3377 "not have a codimension as %s at %L has a codimension or a " 3378 "coarray subcomponent)", event_comp->name, &event_comp->loc, 3379 sym->name, c->name, &c->loc); 3380 3381 /* Look for private components. */ 3382 if (sym->component_access == ACCESS_PRIVATE 3383 || c->attr.access == ACCESS_PRIVATE 3384 || (c->ts.type == BT_DERIVED && c->ts.u.derived->attr.private_comp)) 3385 sym->attr.private_comp = 1; 3386 3387 if (lockp) *lockp = lock_comp; 3388 if (eventp) *eventp = event_comp; 3389} 3390 3391 3392static void parse_struct_map (gfc_statement); 3393 3394/* Parse a union component definition within a structure definition. */ 3395 3396static void 3397parse_union (void) 3398{ 3399 int compiling; 3400 gfc_statement st; 3401 gfc_state_data s; 3402 gfc_component *c, *lock_comp = NULL, *event_comp = NULL; 3403 gfc_symbol *un; 3404 3405 accept_statement(ST_UNION); 3406 push_state (&s, COMP_UNION, gfc_new_block); 3407 un = gfc_new_block; 3408 3409 compiling = 1; 3410 3411 while (compiling) 3412 { 3413 st = next_statement (); 3414 /* Only MAP declarations valid within a union. */ 3415 switch (st) 3416 { 3417 case ST_NONE: 3418 unexpected_eof (); 3419 3420 case ST_MAP: 3421 accept_statement (ST_MAP); 3422 parse_struct_map (ST_MAP); 3423 /* Add a component to the union for each map. */ 3424 if (!gfc_add_component (un, gfc_new_block->name, &c)) 3425 { 3426 gfc_internal_error ("failed to create map component '%s'", 3427 gfc_new_block->name); 3428 reject_statement (); 3429 return; 3430 } 3431 c->ts.type = BT_DERIVED; 3432 c->ts.u.derived = gfc_new_block; 3433 /* Normally components get their initialization expressions when they 3434 are created in decl.cc (build_struct) so we can look through the 3435 flat component list for initializers during resolution. Unions and 3436 maps create components along with their type definitions so we 3437 have to generate initializers here. */ 3438 c->initializer = gfc_default_initializer (&c->ts); 3439 break; 3440 3441 case ST_END_UNION: 3442 compiling = 0; 3443 accept_statement (ST_END_UNION); 3444 break; 3445 3446 default: 3447 unexpected_statement (st); 3448 break; 3449 } 3450 } 3451 3452 for (c = un->components; c; c = c->next) 3453 check_component (un, c, &lock_comp, &event_comp); 3454 3455 /* Add the union as a component in its parent structure. */ 3456 pop_state (); 3457 if (!gfc_add_component (gfc_current_block (), un->name, &c)) 3458 { 3459 gfc_internal_error ("failed to create union component '%s'", un->name); 3460 reject_statement (); 3461 return; 3462 } 3463 c->ts.type = BT_UNION; 3464 c->ts.u.derived = un; 3465 c->initializer = gfc_default_initializer (&c->ts); 3466 3467 un->attr.zero_comp = un->components == NULL; 3468} 3469 3470 3471/* Parse a STRUCTURE or MAP. */ 3472 3473static void 3474parse_struct_map (gfc_statement block) 3475{ 3476 int compiling_type; 3477 gfc_statement st; 3478 gfc_state_data s; 3479 gfc_symbol *sym; 3480 gfc_component *c, *lock_comp = NULL, *event_comp = NULL; 3481 gfc_compile_state comp; 3482 gfc_statement ends; 3483 3484 if (block == ST_STRUCTURE_DECL) 3485 { 3486 comp = COMP_STRUCTURE; 3487 ends = ST_END_STRUCTURE; 3488 } 3489 else 3490 { 3491 gcc_assert (block == ST_MAP); 3492 comp = COMP_MAP; 3493 ends = ST_END_MAP; 3494 } 3495 3496 accept_statement(block); 3497 push_state (&s, comp, gfc_new_block); 3498 3499 gfc_new_block->component_access = ACCESS_PUBLIC; 3500 compiling_type = 1; 3501 3502 while (compiling_type) 3503 { 3504 st = next_statement (); 3505 switch (st) 3506 { 3507 case ST_NONE: 3508 unexpected_eof (); 3509 3510 /* Nested structure declarations will be captured as ST_DATA_DECL. */ 3511 case ST_STRUCTURE_DECL: 3512 /* Let a more specific error make it to decode_statement(). */ 3513 if (gfc_error_check () == 0) 3514 gfc_error ("Syntax error in nested structure declaration at %C"); 3515 reject_statement (); 3516 /* Skip the rest of this statement. */ 3517 gfc_error_recovery (); 3518 break; 3519 3520 case ST_UNION: 3521 accept_statement (ST_UNION); 3522 parse_union (); 3523 break; 3524 3525 case ST_DATA_DECL: 3526 /* The data declaration was a nested/ad-hoc STRUCTURE field. */ 3527 accept_statement (ST_DATA_DECL); 3528 if (gfc_new_block && gfc_new_block != gfc_current_block () 3529 && gfc_new_block->attr.flavor == FL_STRUCT) 3530 parse_struct_map (ST_STRUCTURE_DECL); 3531 break; 3532 3533 case ST_END_STRUCTURE: 3534 case ST_END_MAP: 3535 if (st == ends) 3536 { 3537 accept_statement (st); 3538 compiling_type = 0; 3539 } 3540 else 3541 unexpected_statement (st); 3542 break; 3543 3544 default: 3545 unexpected_statement (st); 3546 break; 3547 } 3548 } 3549 3550 /* Validate each component. */ 3551 sym = gfc_current_block (); 3552 for (c = sym->components; c; c = c->next) 3553 check_component (sym, c, &lock_comp, &event_comp); 3554 3555 sym->attr.zero_comp = (sym->components == NULL); 3556 3557 /* Allow parse_union to find this structure to add to its list of maps. */ 3558 if (block == ST_MAP) 3559 gfc_new_block = gfc_current_block (); 3560 3561 pop_state (); 3562} 3563 3564 3565/* Parse a derived type. */ 3566 3567static void 3568parse_derived (void) 3569{ 3570 int compiling_type, seen_private, seen_sequence, seen_component; 3571 gfc_statement st; 3572 gfc_state_data s; 3573 gfc_symbol *sym; 3574 gfc_component *c, *lock_comp = NULL, *event_comp = NULL; 3575 3576 accept_statement (ST_DERIVED_DECL); 3577 push_state (&s, COMP_DERIVED, gfc_new_block); 3578 3579 gfc_new_block->component_access = ACCESS_PUBLIC; 3580 seen_private = 0; 3581 seen_sequence = 0; 3582 seen_component = 0; 3583 3584 compiling_type = 1; 3585 3586 while (compiling_type) 3587 { 3588 st = next_statement (); 3589 switch (st) 3590 { 3591 case ST_NONE: 3592 unexpected_eof (); 3593 3594 case ST_DATA_DECL: 3595 case ST_PROCEDURE: 3596 accept_statement (st); 3597 seen_component = 1; 3598 break; 3599 3600 case ST_FINAL: 3601 gfc_error ("FINAL declaration at %C must be inside CONTAINS"); 3602 break; 3603 3604 case ST_END_TYPE: 3605endType: 3606 compiling_type = 0; 3607 3608 if (!seen_component) 3609 gfc_notify_std (GFC_STD_F2003, "Derived type " 3610 "definition at %C without components"); 3611 3612 accept_statement (ST_END_TYPE); 3613 break; 3614 3615 case ST_PRIVATE: 3616 if (!gfc_find_state (COMP_MODULE)) 3617 { 3618 gfc_error ("PRIVATE statement in TYPE at %C must be inside " 3619 "a MODULE"); 3620 break; 3621 } 3622 3623 if (seen_component) 3624 { 3625 gfc_error ("PRIVATE statement at %C must precede " 3626 "structure components"); 3627 break; 3628 } 3629 3630 if (seen_private) 3631 gfc_error ("Duplicate PRIVATE statement at %C"); 3632 3633 s.sym->component_access = ACCESS_PRIVATE; 3634 3635 accept_statement (ST_PRIVATE); 3636 seen_private = 1; 3637 break; 3638 3639 case ST_SEQUENCE: 3640 if (seen_component) 3641 { 3642 gfc_error ("SEQUENCE statement at %C must precede " 3643 "structure components"); 3644 break; 3645 } 3646 3647 if (gfc_current_block ()->attr.sequence) 3648 gfc_warning (0, "SEQUENCE attribute at %C already specified in " 3649 "TYPE statement"); 3650 3651 if (seen_sequence) 3652 { 3653 gfc_error ("Duplicate SEQUENCE statement at %C"); 3654 } 3655 3656 seen_sequence = 1; 3657 gfc_add_sequence (&gfc_current_block ()->attr, 3658 gfc_current_block ()->name, NULL); 3659 break; 3660 3661 case ST_CONTAINS: 3662 gfc_notify_std (GFC_STD_F2003, 3663 "CONTAINS block in derived type" 3664 " definition at %C"); 3665 3666 accept_statement (ST_CONTAINS); 3667 parse_derived_contains (); 3668 goto endType; 3669 3670 default: 3671 unexpected_statement (st); 3672 break; 3673 } 3674 } 3675 3676 /* need to verify that all fields of the derived type are 3677 * interoperable with C if the type is declared to be bind(c) 3678 */ 3679 sym = gfc_current_block (); 3680 for (c = sym->components; c; c = c->next) 3681 check_component (sym, c, &lock_comp, &event_comp); 3682 3683 if (!seen_component) 3684 sym->attr.zero_comp = 1; 3685 3686 pop_state (); 3687} 3688 3689 3690/* Parse an ENUM. */ 3691 3692static void 3693parse_enum (void) 3694{ 3695 gfc_statement st; 3696 int compiling_enum; 3697 gfc_state_data s; 3698 int seen_enumerator = 0; 3699 3700 push_state (&s, COMP_ENUM, gfc_new_block); 3701 3702 compiling_enum = 1; 3703 3704 while (compiling_enum) 3705 { 3706 st = next_statement (); 3707 switch (st) 3708 { 3709 case ST_NONE: 3710 unexpected_eof (); 3711 break; 3712 3713 case ST_ENUMERATOR: 3714 seen_enumerator = 1; 3715 accept_statement (st); 3716 break; 3717 3718 case ST_END_ENUM: 3719 compiling_enum = 0; 3720 if (!seen_enumerator) 3721 gfc_error ("ENUM declaration at %C has no ENUMERATORS"); 3722 accept_statement (st); 3723 break; 3724 3725 default: 3726 gfc_free_enum_history (); 3727 unexpected_statement (st); 3728 break; 3729 } 3730 } 3731 pop_state (); 3732} 3733 3734 3735/* Parse an interface. We must be able to deal with the possibility 3736 of recursive interfaces. The parse_spec() subroutine is mutually 3737 recursive with parse_interface(). */ 3738 3739static gfc_statement parse_spec (gfc_statement); 3740 3741static void 3742parse_interface (void) 3743{ 3744 gfc_compile_state new_state = COMP_NONE, current_state; 3745 gfc_symbol *prog_unit, *sym; 3746 gfc_interface_info save; 3747 gfc_state_data s1, s2; 3748 gfc_statement st; 3749 3750 accept_statement (ST_INTERFACE); 3751 3752 current_interface.ns = gfc_current_ns; 3753 save = current_interface; 3754 3755 sym = (current_interface.type == INTERFACE_GENERIC 3756 || current_interface.type == INTERFACE_USER_OP) 3757 ? gfc_new_block : NULL; 3758 3759 push_state (&s1, COMP_INTERFACE, sym); 3760 current_state = COMP_NONE; 3761 3762loop: 3763 gfc_current_ns = gfc_get_namespace (current_interface.ns, 0); 3764 3765 st = next_statement (); 3766 switch (st) 3767 { 3768 case ST_NONE: 3769 unexpected_eof (); 3770 3771 case ST_SUBROUTINE: 3772 case ST_FUNCTION: 3773 if (st == ST_SUBROUTINE) 3774 new_state = COMP_SUBROUTINE; 3775 else if (st == ST_FUNCTION) 3776 new_state = COMP_FUNCTION; 3777 if (gfc_new_block->attr.pointer) 3778 { 3779 gfc_new_block->attr.pointer = 0; 3780 gfc_new_block->attr.proc_pointer = 1; 3781 } 3782 if (!gfc_add_explicit_interface (gfc_new_block, IFSRC_IFBODY, 3783 gfc_new_block->formal, NULL)) 3784 { 3785 reject_statement (); 3786 gfc_free_namespace (gfc_current_ns); 3787 goto loop; 3788 } 3789 /* F2008 C1210 forbids the IMPORT statement in module procedure 3790 interface bodies and the flag is set to import symbols. */ 3791 if (gfc_new_block->attr.module_procedure) 3792 gfc_current_ns->has_import_set = 1; 3793 break; 3794 3795 case ST_PROCEDURE: 3796 case ST_MODULE_PROC: /* The module procedure matcher makes 3797 sure the context is correct. */ 3798 accept_statement (st); 3799 gfc_free_namespace (gfc_current_ns); 3800 goto loop; 3801 3802 case ST_END_INTERFACE: 3803 gfc_free_namespace (gfc_current_ns); 3804 gfc_current_ns = current_interface.ns; 3805 goto done; 3806 3807 default: 3808 gfc_error ("Unexpected %s statement in INTERFACE block at %C", 3809 gfc_ascii_statement (st)); 3810 reject_statement (); 3811 gfc_free_namespace (gfc_current_ns); 3812 goto loop; 3813 } 3814 3815 3816 /* Make sure that the generic name has the right attribute. */ 3817 if (current_interface.type == INTERFACE_GENERIC 3818 && current_state == COMP_NONE) 3819 { 3820 if (new_state == COMP_FUNCTION && sym) 3821 gfc_add_function (&sym->attr, sym->name, NULL); 3822 else if (new_state == COMP_SUBROUTINE && sym) 3823 gfc_add_subroutine (&sym->attr, sym->name, NULL); 3824 3825 current_state = new_state; 3826 } 3827 3828 if (current_interface.type == INTERFACE_ABSTRACT) 3829 { 3830 gfc_add_abstract (&gfc_new_block->attr, &gfc_current_locus); 3831 if (gfc_is_intrinsic_typename (gfc_new_block->name)) 3832 gfc_error ("Name %qs of ABSTRACT INTERFACE at %C " 3833 "cannot be the same as an intrinsic type", 3834 gfc_new_block->name); 3835 } 3836 3837 push_state (&s2, new_state, gfc_new_block); 3838 accept_statement (st); 3839 prog_unit = gfc_new_block; 3840 prog_unit->formal_ns = gfc_current_ns; 3841 if (prog_unit == prog_unit->formal_ns->proc_name 3842 && prog_unit->ns != prog_unit->formal_ns) 3843 prog_unit->refs++; 3844 3845decl: 3846 /* Read data declaration statements. */ 3847 st = parse_spec (ST_NONE); 3848 in_specification_block = true; 3849 3850 /* Since the interface block does not permit an IMPLICIT statement, 3851 the default type for the function or the result must be taken 3852 from the formal namespace. */ 3853 if (new_state == COMP_FUNCTION) 3854 { 3855 if (prog_unit->result == prog_unit 3856 && prog_unit->ts.type == BT_UNKNOWN) 3857 gfc_set_default_type (prog_unit, 1, prog_unit->formal_ns); 3858 else if (prog_unit->result != prog_unit 3859 && prog_unit->result->ts.type == BT_UNKNOWN) 3860 gfc_set_default_type (prog_unit->result, 1, 3861 prog_unit->formal_ns); 3862 } 3863 3864 if (st != ST_END_SUBROUTINE && st != ST_END_FUNCTION) 3865 { 3866 gfc_error ("Unexpected %s statement at %C in INTERFACE body", 3867 gfc_ascii_statement (st)); 3868 reject_statement (); 3869 goto decl; 3870 } 3871 3872 /* Add EXTERNAL attribute to function or subroutine. */ 3873 if (current_interface.type != INTERFACE_ABSTRACT && !prog_unit->attr.dummy) 3874 gfc_add_external (&prog_unit->attr, &gfc_current_locus); 3875 3876 current_interface = save; 3877 gfc_add_interface (prog_unit); 3878 pop_state (); 3879 3880 if (current_interface.ns 3881 && current_interface.ns->proc_name 3882 && strcmp (current_interface.ns->proc_name->name, 3883 prog_unit->name) == 0) 3884 gfc_error ("INTERFACE procedure %qs at %L has the same name as the " 3885 "enclosing procedure", prog_unit->name, 3886 ¤t_interface.ns->proc_name->declared_at); 3887 3888 goto loop; 3889 3890done: 3891 pop_state (); 3892} 3893 3894 3895/* Associate function characteristics by going back to the function 3896 declaration and rematching the prefix. */ 3897 3898static match 3899match_deferred_characteristics (gfc_typespec * ts) 3900{ 3901 locus loc; 3902 match m = MATCH_ERROR; 3903 char name[GFC_MAX_SYMBOL_LEN + 1]; 3904 3905 loc = gfc_current_locus; 3906 3907 gfc_current_locus = gfc_current_block ()->declared_at; 3908 3909 gfc_clear_error (); 3910 gfc_buffer_error (true); 3911 m = gfc_match_prefix (ts); 3912 gfc_buffer_error (false); 3913 3914 if (ts->type == BT_DERIVED || ts->type == BT_CLASS) 3915 { 3916 ts->kind = 0; 3917 3918 if (!ts->u.derived) 3919 m = MATCH_ERROR; 3920 } 3921 3922 /* Only permit one go at the characteristic association. */ 3923 if (ts->kind == -1) 3924 ts->kind = 0; 3925 3926 /* Set the function locus correctly. If we have not found the 3927 function name, there is an error. */ 3928 if (m == MATCH_YES 3929 && gfc_match ("function% %n", name) == MATCH_YES 3930 && strcmp (name, gfc_current_block ()->name) == 0) 3931 { 3932 gfc_current_block ()->declared_at = gfc_current_locus; 3933 gfc_commit_symbols (); 3934 } 3935 else 3936 { 3937 gfc_error_check (); 3938 gfc_undo_symbols (); 3939 } 3940 3941 gfc_current_locus =loc; 3942 return m; 3943} 3944 3945 3946/* Check specification-expressions in the function result of the currently 3947 parsed block and ensure they are typed (give an IMPLICIT type if necessary). 3948 For return types specified in a FUNCTION prefix, the IMPLICIT rules of the 3949 scope are not yet parsed so this has to be delayed up to parse_spec. */ 3950 3951static bool 3952check_function_result_typed (void) 3953{ 3954 gfc_typespec ts; 3955 3956 gcc_assert (gfc_current_state () == COMP_FUNCTION); 3957 3958 if (!gfc_current_ns->proc_name->result) 3959 return true; 3960 3961 ts = gfc_current_ns->proc_name->result->ts; 3962 3963 /* Check type-parameters, at the moment only CHARACTER lengths possible. */ 3964 /* TODO: Extend when KIND type parameters are implemented. */ 3965 if (ts.type == BT_CHARACTER && ts.u.cl && ts.u.cl->length) 3966 { 3967 /* Reject invalid type of specification expression for length. */ 3968 if (ts.u.cl->length->ts.type != BT_INTEGER) 3969 return false; 3970 3971 gfc_expr_check_typed (ts.u.cl->length, gfc_current_ns, true); 3972 } 3973 3974 return true; 3975} 3976 3977 3978/* Parse a set of specification statements. Returns the statement 3979 that doesn't fit. */ 3980 3981static gfc_statement 3982parse_spec (gfc_statement st) 3983{ 3984 st_state ss; 3985 bool function_result_typed = false; 3986 bool bad_characteristic = false; 3987 gfc_typespec *ts; 3988 3989 in_specification_block = true; 3990 3991 verify_st_order (&ss, ST_NONE, false); 3992 if (st == ST_NONE) 3993 st = next_statement (); 3994 3995 /* If we are not inside a function or don't have a result specified so far, 3996 do nothing special about it. */ 3997 if (gfc_current_state () != COMP_FUNCTION) 3998 function_result_typed = true; 3999 else 4000 { 4001 gfc_symbol* proc = gfc_current_ns->proc_name; 4002 gcc_assert (proc); 4003 4004 if (proc->result->ts.type == BT_UNKNOWN) 4005 function_result_typed = true; 4006 } 4007 4008loop: 4009 4010 /* If we're inside a BLOCK construct, some statements are disallowed. 4011 Check this here. Attribute declaration statements like INTENT, OPTIONAL 4012 or VALUE are also disallowed, but they don't have a particular ST_* 4013 key so we have to check for them individually in their matcher routine. */ 4014 if (gfc_current_state () == COMP_BLOCK) 4015 switch (st) 4016 { 4017 case ST_IMPLICIT: 4018 case ST_IMPLICIT_NONE: 4019 case ST_NAMELIST: 4020 case ST_COMMON: 4021 case ST_EQUIVALENCE: 4022 case ST_STATEMENT_FUNCTION: 4023 gfc_error ("%s statement is not allowed inside of BLOCK at %C", 4024 gfc_ascii_statement (st)); 4025 reject_statement (); 4026 break; 4027 4028 default: 4029 break; 4030 } 4031 else if (gfc_current_state () == COMP_BLOCK_DATA) 4032 /* Fortran 2008, C1116. */ 4033 switch (st) 4034 { 4035 case ST_ATTR_DECL: 4036 case ST_COMMON: 4037 case ST_DATA: 4038 case ST_DATA_DECL: 4039 case ST_DERIVED_DECL: 4040 case ST_END_BLOCK_DATA: 4041 case ST_EQUIVALENCE: 4042 case ST_IMPLICIT: 4043 case ST_IMPLICIT_NONE: 4044 case ST_OMP_THREADPRIVATE: 4045 case ST_PARAMETER: 4046 case ST_STRUCTURE_DECL: 4047 case ST_TYPE: 4048 case ST_USE: 4049 break; 4050 4051 case ST_NONE: 4052 break; 4053 4054 default: 4055 gfc_error ("%s statement is not allowed inside of BLOCK DATA at %C", 4056 gfc_ascii_statement (st)); 4057 reject_statement (); 4058 break; 4059 } 4060 4061 /* If we find a statement that cannot be followed by an IMPLICIT statement 4062 (and thus we can expect to see none any further), type the function result 4063 if it has not yet been typed. Be careful not to give the END statement 4064 to verify_st_order! */ 4065 if (!function_result_typed && st != ST_GET_FCN_CHARACTERISTICS) 4066 { 4067 bool verify_now = false; 4068 4069 if (st == ST_END_FUNCTION || st == ST_CONTAINS) 4070 verify_now = true; 4071 else 4072 { 4073 st_state dummyss; 4074 verify_st_order (&dummyss, ST_NONE, false); 4075 verify_st_order (&dummyss, st, false); 4076 4077 if (!verify_st_order (&dummyss, ST_IMPLICIT, true)) 4078 verify_now = true; 4079 } 4080 4081 if (verify_now) 4082 function_result_typed = check_function_result_typed (); 4083 } 4084 4085 switch (st) 4086 { 4087 case ST_NONE: 4088 unexpected_eof (); 4089 4090 case ST_IMPLICIT_NONE: 4091 case ST_IMPLICIT: 4092 if (!function_result_typed) 4093 function_result_typed = check_function_result_typed (); 4094 goto declSt; 4095 4096 case ST_FORMAT: 4097 case ST_ENTRY: 4098 case ST_DATA: /* Not allowed in interfaces */ 4099 if (gfc_current_state () == COMP_INTERFACE) 4100 break; 4101 4102 /* Fall through */ 4103 4104 case ST_USE: 4105 case ST_IMPORT: 4106 case ST_PARAMETER: 4107 case ST_PUBLIC: 4108 case ST_PRIVATE: 4109 case ST_STRUCTURE_DECL: 4110 case ST_DERIVED_DECL: 4111 case_decl: 4112 case_omp_decl: 4113declSt: 4114 if (!verify_st_order (&ss, st, false)) 4115 { 4116 reject_statement (); 4117 st = next_statement (); 4118 goto loop; 4119 } 4120 4121 switch (st) 4122 { 4123 case ST_INTERFACE: 4124 parse_interface (); 4125 break; 4126 4127 case ST_STRUCTURE_DECL: 4128 parse_struct_map (ST_STRUCTURE_DECL); 4129 break; 4130 4131 case ST_DERIVED_DECL: 4132 parse_derived (); 4133 break; 4134 4135 case ST_PUBLIC: 4136 case ST_PRIVATE: 4137 if (gfc_current_state () != COMP_MODULE) 4138 { 4139 gfc_error ("%s statement must appear in a MODULE", 4140 gfc_ascii_statement (st)); 4141 reject_statement (); 4142 break; 4143 } 4144 4145 if (gfc_current_ns->default_access != ACCESS_UNKNOWN) 4146 { 4147 gfc_error ("%s statement at %C follows another accessibility " 4148 "specification", gfc_ascii_statement (st)); 4149 reject_statement (); 4150 break; 4151 } 4152 4153 gfc_current_ns->default_access = (st == ST_PUBLIC) 4154 ? ACCESS_PUBLIC : ACCESS_PRIVATE; 4155 4156 break; 4157 4158 case ST_STATEMENT_FUNCTION: 4159 if (gfc_current_state () == COMP_MODULE 4160 || gfc_current_state () == COMP_SUBMODULE) 4161 { 4162 unexpected_statement (st); 4163 break; 4164 } 4165 4166 default: 4167 break; 4168 } 4169 4170 accept_statement (st); 4171 st = next_statement (); 4172 goto loop; 4173 4174 case ST_ENUM: 4175 accept_statement (st); 4176 parse_enum(); 4177 st = next_statement (); 4178 goto loop; 4179 4180 case ST_GET_FCN_CHARACTERISTICS: 4181 /* This statement triggers the association of a function's result 4182 characteristics. */ 4183 ts = &gfc_current_block ()->result->ts; 4184 if (match_deferred_characteristics (ts) != MATCH_YES) 4185 bad_characteristic = true; 4186 4187 st = next_statement (); 4188 goto loop; 4189 4190 default: 4191 break; 4192 } 4193 4194 /* If match_deferred_characteristics failed, then there is an error. */ 4195 if (bad_characteristic) 4196 { 4197 ts = &gfc_current_block ()->result->ts; 4198 if (ts->type != BT_DERIVED && ts->type != BT_CLASS) 4199 gfc_error ("Bad kind expression for function %qs at %L", 4200 gfc_current_block ()->name, 4201 &gfc_current_block ()->declared_at); 4202 else 4203 gfc_error ("The type for function %qs at %L is not accessible", 4204 gfc_current_block ()->name, 4205 &gfc_current_block ()->declared_at); 4206 4207 gfc_current_block ()->ts.kind = 0; 4208 /* Keep the derived type; if it's bad, it will be discovered later. */ 4209 if (!(ts->type == BT_DERIVED && ts->u.derived)) 4210 ts->type = BT_UNKNOWN; 4211 } 4212 4213 in_specification_block = false; 4214 4215 return st; 4216} 4217 4218 4219/* Parse a WHERE block, (not a simple WHERE statement). */ 4220 4221static void 4222parse_where_block (void) 4223{ 4224 int seen_empty_else; 4225 gfc_code *top, *d; 4226 gfc_state_data s; 4227 gfc_statement st; 4228 4229 accept_statement (ST_WHERE_BLOCK); 4230 top = gfc_state_stack->tail; 4231 4232 push_state (&s, COMP_WHERE, gfc_new_block); 4233 4234 d = add_statement (); 4235 d->expr1 = top->expr1; 4236 d->op = EXEC_WHERE; 4237 4238 top->expr1 = NULL; 4239 top->block = d; 4240 4241 seen_empty_else = 0; 4242 4243 do 4244 { 4245 st = next_statement (); 4246 switch (st) 4247 { 4248 case ST_NONE: 4249 unexpected_eof (); 4250 4251 case ST_WHERE_BLOCK: 4252 parse_where_block (); 4253 break; 4254 4255 case ST_ASSIGNMENT: 4256 case ST_WHERE: 4257 accept_statement (st); 4258 break; 4259 4260 case ST_ELSEWHERE: 4261 if (seen_empty_else) 4262 { 4263 gfc_error ("ELSEWHERE statement at %C follows previous " 4264 "unmasked ELSEWHERE"); 4265 reject_statement (); 4266 break; 4267 } 4268 4269 if (new_st.expr1 == NULL) 4270 seen_empty_else = 1; 4271 4272 d = new_level (gfc_state_stack->head); 4273 d->op = EXEC_WHERE; 4274 d->expr1 = new_st.expr1; 4275 4276 accept_statement (st); 4277 4278 break; 4279 4280 case ST_END_WHERE: 4281 accept_statement (st); 4282 break; 4283 4284 default: 4285 gfc_error ("Unexpected %s statement in WHERE block at %C", 4286 gfc_ascii_statement (st)); 4287 reject_statement (); 4288 break; 4289 } 4290 } 4291 while (st != ST_END_WHERE); 4292 4293 pop_state (); 4294} 4295 4296 4297/* Parse a FORALL block (not a simple FORALL statement). */ 4298 4299static void 4300parse_forall_block (void) 4301{ 4302 gfc_code *top, *d; 4303 gfc_state_data s; 4304 gfc_statement st; 4305 4306 accept_statement (ST_FORALL_BLOCK); 4307 top = gfc_state_stack->tail; 4308 4309 push_state (&s, COMP_FORALL, gfc_new_block); 4310 4311 d = add_statement (); 4312 d->op = EXEC_FORALL; 4313 top->block = d; 4314 4315 do 4316 { 4317 st = next_statement (); 4318 switch (st) 4319 { 4320 4321 case ST_ASSIGNMENT: 4322 case ST_POINTER_ASSIGNMENT: 4323 case ST_WHERE: 4324 case ST_FORALL: 4325 accept_statement (st); 4326 break; 4327 4328 case ST_WHERE_BLOCK: 4329 parse_where_block (); 4330 break; 4331 4332 case ST_FORALL_BLOCK: 4333 parse_forall_block (); 4334 break; 4335 4336 case ST_END_FORALL: 4337 accept_statement (st); 4338 break; 4339 4340 case ST_NONE: 4341 unexpected_eof (); 4342 4343 default: 4344 gfc_error ("Unexpected %s statement in FORALL block at %C", 4345 gfc_ascii_statement (st)); 4346 4347 reject_statement (); 4348 break; 4349 } 4350 } 4351 while (st != ST_END_FORALL); 4352 4353 pop_state (); 4354} 4355 4356 4357static gfc_statement parse_executable (gfc_statement); 4358 4359/* parse the statements of an IF-THEN-ELSEIF-ELSE-ENDIF block. */ 4360 4361static void 4362parse_if_block (void) 4363{ 4364 gfc_code *top, *d; 4365 gfc_statement st; 4366 locus else_locus; 4367 gfc_state_data s; 4368 int seen_else; 4369 4370 seen_else = 0; 4371 accept_statement (ST_IF_BLOCK); 4372 4373 top = gfc_state_stack->tail; 4374 push_state (&s, COMP_IF, gfc_new_block); 4375 4376 new_st.op = EXEC_IF; 4377 d = add_statement (); 4378 4379 d->expr1 = top->expr1; 4380 top->expr1 = NULL; 4381 top->block = d; 4382 4383 do 4384 { 4385 st = parse_executable (ST_NONE); 4386 4387 switch (st) 4388 { 4389 case ST_NONE: 4390 unexpected_eof (); 4391 4392 case ST_ELSEIF: 4393 if (seen_else) 4394 { 4395 gfc_error ("ELSE IF statement at %C cannot follow ELSE " 4396 "statement at %L", &else_locus); 4397 4398 reject_statement (); 4399 break; 4400 } 4401 4402 d = new_level (gfc_state_stack->head); 4403 d->op = EXEC_IF; 4404 d->expr1 = new_st.expr1; 4405 4406 accept_statement (st); 4407 4408 break; 4409 4410 case ST_ELSE: 4411 if (seen_else) 4412 { 4413 gfc_error ("Duplicate ELSE statements at %L and %C", 4414 &else_locus); 4415 reject_statement (); 4416 break; 4417 } 4418 4419 seen_else = 1; 4420 else_locus = gfc_current_locus; 4421 4422 d = new_level (gfc_state_stack->head); 4423 d->op = EXEC_IF; 4424 4425 accept_statement (st); 4426 4427 break; 4428 4429 case ST_ENDIF: 4430 break; 4431 4432 default: 4433 unexpected_statement (st); 4434 break; 4435 } 4436 } 4437 while (st != ST_ENDIF); 4438 4439 pop_state (); 4440 accept_statement (st); 4441} 4442 4443 4444/* Parse a SELECT block. */ 4445 4446static void 4447parse_select_block (void) 4448{ 4449 gfc_statement st; 4450 gfc_code *cp; 4451 gfc_state_data s; 4452 4453 accept_statement (ST_SELECT_CASE); 4454 4455 cp = gfc_state_stack->tail; 4456 push_state (&s, COMP_SELECT, gfc_new_block); 4457 4458 /* Make sure that the next statement is a CASE or END SELECT. */ 4459 for (;;) 4460 { 4461 st = next_statement (); 4462 if (st == ST_NONE) 4463 unexpected_eof (); 4464 if (st == ST_END_SELECT) 4465 { 4466 /* Empty SELECT CASE is OK. */ 4467 accept_statement (st); 4468 pop_state (); 4469 return; 4470 } 4471 if (st == ST_CASE) 4472 break; 4473 4474 gfc_error ("Expected a CASE or END SELECT statement following SELECT " 4475 "CASE at %C"); 4476 4477 reject_statement (); 4478 } 4479 4480 /* At this point, we've got a nonempty select block. */ 4481 cp = new_level (cp); 4482 *cp = new_st; 4483 4484 accept_statement (st); 4485 4486 do 4487 { 4488 st = parse_executable (ST_NONE); 4489 switch (st) 4490 { 4491 case ST_NONE: 4492 unexpected_eof (); 4493 4494 case ST_CASE: 4495 cp = new_level (gfc_state_stack->head); 4496 *cp = new_st; 4497 gfc_clear_new_st (); 4498 4499 accept_statement (st); 4500 /* Fall through */ 4501 4502 case ST_END_SELECT: 4503 break; 4504 4505 /* Can't have an executable statement because of 4506 parse_executable(). */ 4507 default: 4508 unexpected_statement (st); 4509 break; 4510 } 4511 } 4512 while (st != ST_END_SELECT); 4513 4514 pop_state (); 4515 accept_statement (st); 4516} 4517 4518 4519/* Pop the current selector from the SELECT TYPE stack. */ 4520 4521static void 4522select_type_pop (void) 4523{ 4524 gfc_select_type_stack *old = select_type_stack; 4525 select_type_stack = old->prev; 4526 free (old); 4527} 4528 4529 4530/* Parse a SELECT TYPE construct (F03:R821). */ 4531 4532static void 4533parse_select_type_block (void) 4534{ 4535 gfc_statement st; 4536 gfc_code *cp; 4537 gfc_state_data s; 4538 4539 gfc_current_ns = new_st.ext.block.ns; 4540 accept_statement (ST_SELECT_TYPE); 4541 4542 cp = gfc_state_stack->tail; 4543 push_state (&s, COMP_SELECT_TYPE, gfc_new_block); 4544 4545 /* Make sure that the next statement is a TYPE IS, CLASS IS, CLASS DEFAULT 4546 or END SELECT. */ 4547 for (;;) 4548 { 4549 st = next_statement (); 4550 if (st == ST_NONE) 4551 unexpected_eof (); 4552 if (st == ST_END_SELECT) 4553 /* Empty SELECT CASE is OK. */ 4554 goto done; 4555 if (st == ST_TYPE_IS || st == ST_CLASS_IS) 4556 break; 4557 4558 gfc_error ("Expected TYPE IS, CLASS IS or END SELECT statement " 4559 "following SELECT TYPE at %C"); 4560 4561 reject_statement (); 4562 } 4563 4564 /* At this point, we've got a nonempty select block. */ 4565 cp = new_level (cp); 4566 *cp = new_st; 4567 4568 accept_statement (st); 4569 4570 do 4571 { 4572 st = parse_executable (ST_NONE); 4573 switch (st) 4574 { 4575 case ST_NONE: 4576 unexpected_eof (); 4577 4578 case ST_TYPE_IS: 4579 case ST_CLASS_IS: 4580 cp = new_level (gfc_state_stack->head); 4581 *cp = new_st; 4582 gfc_clear_new_st (); 4583 4584 accept_statement (st); 4585 /* Fall through */ 4586 4587 case ST_END_SELECT: 4588 break; 4589 4590 /* Can't have an executable statement because of 4591 parse_executable(). */ 4592 default: 4593 unexpected_statement (st); 4594 break; 4595 } 4596 } 4597 while (st != ST_END_SELECT); 4598 4599done: 4600 pop_state (); 4601 accept_statement (st); 4602 gfc_current_ns = gfc_current_ns->parent; 4603 select_type_pop (); 4604} 4605 4606 4607/* Parse a SELECT RANK construct. */ 4608 4609static void 4610parse_select_rank_block (void) 4611{ 4612 gfc_statement st; 4613 gfc_code *cp; 4614 gfc_state_data s; 4615 4616 gfc_current_ns = new_st.ext.block.ns; 4617 accept_statement (ST_SELECT_RANK); 4618 4619 cp = gfc_state_stack->tail; 4620 push_state (&s, COMP_SELECT_RANK, gfc_new_block); 4621 4622 /* Make sure that the next statement is a RANK IS or RANK DEFAULT. */ 4623 for (;;) 4624 { 4625 st = next_statement (); 4626 if (st == ST_NONE) 4627 unexpected_eof (); 4628 if (st == ST_END_SELECT) 4629 /* Empty SELECT CASE is OK. */ 4630 goto done; 4631 if (st == ST_RANK) 4632 break; 4633 4634 gfc_error ("Expected RANK or RANK DEFAULT " 4635 "following SELECT RANK at %C"); 4636 4637 reject_statement (); 4638 } 4639 4640 /* At this point, we've got a nonempty select block. */ 4641 cp = new_level (cp); 4642 *cp = new_st; 4643 4644 accept_statement (st); 4645 4646 do 4647 { 4648 st = parse_executable (ST_NONE); 4649 switch (st) 4650 { 4651 case ST_NONE: 4652 unexpected_eof (); 4653 4654 case ST_RANK: 4655 cp = new_level (gfc_state_stack->head); 4656 *cp = new_st; 4657 gfc_clear_new_st (); 4658 4659 accept_statement (st); 4660 /* Fall through */ 4661 4662 case ST_END_SELECT: 4663 break; 4664 4665 /* Can't have an executable statement because of 4666 parse_executable(). */ 4667 default: 4668 unexpected_statement (st); 4669 break; 4670 } 4671 } 4672 while (st != ST_END_SELECT); 4673 4674done: 4675 pop_state (); 4676 accept_statement (st); 4677 gfc_current_ns = gfc_current_ns->parent; 4678 select_type_pop (); 4679} 4680 4681 4682/* Given a symbol, make sure it is not an iteration variable for a DO 4683 statement. This subroutine is called when the symbol is seen in a 4684 context that causes it to become redefined. If the symbol is an 4685 iterator, we generate an error message and return nonzero. */ 4686 4687int 4688gfc_check_do_variable (gfc_symtree *st) 4689{ 4690 gfc_state_data *s; 4691 4692 if (!st) 4693 return 0; 4694 4695 for (s=gfc_state_stack; s; s = s->previous) 4696 if (s->do_variable == st) 4697 { 4698 gfc_error_now ("Variable %qs at %C cannot be redefined inside " 4699 "loop beginning at %L", st->name, &s->head->loc); 4700 return 1; 4701 } 4702 4703 return 0; 4704} 4705 4706 4707/* Checks to see if the current statement label closes an enddo. 4708 Returns 0 if not, 1 if closes an ENDDO correctly, or 2 (and issues 4709 an error) if it incorrectly closes an ENDDO. */ 4710 4711static int 4712check_do_closure (void) 4713{ 4714 gfc_state_data *p; 4715 4716 if (gfc_statement_label == NULL) 4717 return 0; 4718 4719 for (p = gfc_state_stack; p; p = p->previous) 4720 if (p->state == COMP_DO || p->state == COMP_DO_CONCURRENT) 4721 break; 4722 4723 if (p == NULL) 4724 return 0; /* No loops to close */ 4725 4726 if (p->ext.end_do_label == gfc_statement_label) 4727 { 4728 if (p == gfc_state_stack) 4729 return 1; 4730 4731 gfc_error ("End of nonblock DO statement at %C is within another block"); 4732 return 2; 4733 } 4734 4735 /* At this point, the label doesn't terminate the innermost loop. 4736 Make sure it doesn't terminate another one. */ 4737 for (; p; p = p->previous) 4738 if ((p->state == COMP_DO || p->state == COMP_DO_CONCURRENT) 4739 && p->ext.end_do_label == gfc_statement_label) 4740 { 4741 gfc_error ("End of nonblock DO statement at %C is interwoven " 4742 "with another DO loop"); 4743 return 2; 4744 } 4745 4746 return 0; 4747} 4748 4749 4750/* Parse a series of contained program units. */ 4751 4752static void parse_progunit (gfc_statement); 4753 4754 4755/* Parse a CRITICAL block. */ 4756 4757static void 4758parse_critical_block (void) 4759{ 4760 gfc_code *top, *d; 4761 gfc_state_data s, *sd; 4762 gfc_statement st; 4763 4764 for (sd = gfc_state_stack; sd; sd = sd->previous) 4765 if (sd->state == COMP_OMP_STRUCTURED_BLOCK) 4766 gfc_error_now (is_oacc (sd) 4767 ? G_("CRITICAL block inside of OpenACC region at %C") 4768 : G_("CRITICAL block inside of OpenMP region at %C")); 4769 4770 s.ext.end_do_label = new_st.label1; 4771 4772 accept_statement (ST_CRITICAL); 4773 top = gfc_state_stack->tail; 4774 4775 push_state (&s, COMP_CRITICAL, gfc_new_block); 4776 4777 d = add_statement (); 4778 d->op = EXEC_CRITICAL; 4779 top->block = d; 4780 4781 do 4782 { 4783 st = parse_executable (ST_NONE); 4784 4785 switch (st) 4786 { 4787 case ST_NONE: 4788 unexpected_eof (); 4789 break; 4790 4791 case ST_END_CRITICAL: 4792 if (s.ext.end_do_label != NULL 4793 && s.ext.end_do_label != gfc_statement_label) 4794 gfc_error_now ("Statement label in END CRITICAL at %C does not " 4795 "match CRITICAL label"); 4796 4797 if (gfc_statement_label != NULL) 4798 { 4799 new_st.op = EXEC_NOP; 4800 add_statement (); 4801 } 4802 break; 4803 4804 default: 4805 unexpected_statement (st); 4806 break; 4807 } 4808 } 4809 while (st != ST_END_CRITICAL); 4810 4811 pop_state (); 4812 accept_statement (st); 4813} 4814 4815 4816/* Set up the local namespace for a BLOCK construct. */ 4817 4818gfc_namespace* 4819gfc_build_block_ns (gfc_namespace *parent_ns) 4820{ 4821 gfc_namespace* my_ns; 4822 static int numblock = 1; 4823 4824 my_ns = gfc_get_namespace (parent_ns, 1); 4825 my_ns->construct_entities = 1; 4826 4827 /* Give the BLOCK a symbol of flavor LABEL; this is later needed for correct 4828 code generation (so it must not be NULL). 4829 We set its recursive argument if our container procedure is recursive, so 4830 that local variables are accordingly placed on the stack when it 4831 will be necessary. */ 4832 if (gfc_new_block) 4833 my_ns->proc_name = gfc_new_block; 4834 else 4835 { 4836 bool t; 4837 char buffer[20]; /* Enough to hold "block@2147483648\n". */ 4838 4839 snprintf(buffer, sizeof(buffer), "block@%d", numblock++); 4840 gfc_get_symbol (buffer, my_ns, &my_ns->proc_name); 4841 t = gfc_add_flavor (&my_ns->proc_name->attr, FL_LABEL, 4842 my_ns->proc_name->name, NULL); 4843 gcc_assert (t); 4844 gfc_commit_symbol (my_ns->proc_name); 4845 } 4846 4847 if (parent_ns->proc_name) 4848 my_ns->proc_name->attr.recursive = parent_ns->proc_name->attr.recursive; 4849 4850 return my_ns; 4851} 4852 4853 4854/* Parse a BLOCK construct. */ 4855 4856static void 4857parse_block_construct (void) 4858{ 4859 gfc_namespace* my_ns; 4860 gfc_namespace* my_parent; 4861 gfc_state_data s; 4862 4863 gfc_notify_std (GFC_STD_F2008, "BLOCK construct at %C"); 4864 4865 my_ns = gfc_build_block_ns (gfc_current_ns); 4866 4867 new_st.op = EXEC_BLOCK; 4868 new_st.ext.block.ns = my_ns; 4869 new_st.ext.block.assoc = NULL; 4870 accept_statement (ST_BLOCK); 4871 4872 push_state (&s, COMP_BLOCK, my_ns->proc_name); 4873 gfc_current_ns = my_ns; 4874 my_parent = my_ns->parent; 4875 4876 parse_progunit (ST_NONE); 4877 4878 /* Don't depend on the value of gfc_current_ns; it might have been 4879 reset if the block had errors and was cleaned up. */ 4880 gfc_current_ns = my_parent; 4881 4882 pop_state (); 4883} 4884 4885 4886/* Parse an ASSOCIATE construct. This is essentially a BLOCK construct 4887 behind the scenes with compiler-generated variables. */ 4888 4889static void 4890parse_associate (void) 4891{ 4892 gfc_namespace* my_ns; 4893 gfc_state_data s; 4894 gfc_statement st; 4895 gfc_association_list* a; 4896 4897 gfc_notify_std (GFC_STD_F2003, "ASSOCIATE construct at %C"); 4898 4899 my_ns = gfc_build_block_ns (gfc_current_ns); 4900 4901 new_st.op = EXEC_BLOCK; 4902 new_st.ext.block.ns = my_ns; 4903 gcc_assert (new_st.ext.block.assoc); 4904 4905 /* Add all associate-names as BLOCK variables. Creating them is enough 4906 for now, they'll get their values during trans-* phase. */ 4907 gfc_current_ns = my_ns; 4908 for (a = new_st.ext.block.assoc; a; a = a->next) 4909 { 4910 gfc_symbol* sym; 4911 gfc_ref *ref; 4912 gfc_array_ref *array_ref; 4913 4914 if (gfc_get_sym_tree (a->name, NULL, &a->st, false)) 4915 gcc_unreachable (); 4916 4917 sym = a->st->n.sym; 4918 sym->attr.flavor = FL_VARIABLE; 4919 sym->assoc = a; 4920 sym->declared_at = a->where; 4921 gfc_set_sym_referenced (sym); 4922 4923 /* Initialize the typespec. It is not available in all cases, 4924 however, as it may only be set on the target during resolution. 4925 Still, sometimes it helps to have it right now -- especially 4926 for parsing component references on the associate-name 4927 in case of association to a derived-type. */ 4928 sym->ts = a->target->ts; 4929 4930 /* Don���t share the character length information between associate 4931 variable and target if the length is not a compile-time constant, 4932 as we don���t want to touch some other character length variable when 4933 we try to initialize the associate variable���s character length 4934 variable. 4935 We do it here rather than later so that expressions referencing the 4936 associate variable will automatically have the correctly setup length 4937 information. If we did it at resolution stage the expressions would 4938 use the original length information, and the variable a new different 4939 one, but only the latter one would be correctly initialized at 4940 translation stage, and the former one would need some additional setup 4941 there. */ 4942 if (sym->ts.type == BT_CHARACTER 4943 && sym->ts.u.cl 4944 && !(sym->ts.u.cl->length 4945 && sym->ts.u.cl->length->expr_type == EXPR_CONSTANT)) 4946 sym->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL); 4947 4948 /* Check if the target expression is array valued. This cannot always 4949 be done by looking at target.rank, because that might not have been 4950 set yet. Therefore traverse the chain of refs, looking for the last 4951 array ref and evaluate that. */ 4952 array_ref = NULL; 4953 for (ref = a->target->ref; ref; ref = ref->next) 4954 if (ref->type == REF_ARRAY) 4955 array_ref = &ref->u.ar; 4956 if (array_ref || a->target->rank) 4957 { 4958 gfc_array_spec *as; 4959 int dim, rank = 0; 4960 if (array_ref) 4961 { 4962 a->rankguessed = 1; 4963 /* Count the dimension, that have a non-scalar extend. */ 4964 for (dim = 0; dim < array_ref->dimen; ++dim) 4965 if (array_ref->dimen_type[dim] != DIMEN_ELEMENT 4966 && !(array_ref->dimen_type[dim] == DIMEN_UNKNOWN 4967 && array_ref->end[dim] == NULL 4968 && array_ref->start[dim] != NULL)) 4969 ++rank; 4970 } 4971 else 4972 rank = a->target->rank; 4973 /* When the rank is greater than zero then sym will be an array. */ 4974 if (sym->ts.type == BT_CLASS && CLASS_DATA (sym)) 4975 { 4976 if ((!CLASS_DATA (sym)->as && rank != 0) 4977 || (CLASS_DATA (sym)->as 4978 && CLASS_DATA (sym)->as->rank != rank)) 4979 { 4980 /* Don't just (re-)set the attr and as in the sym.ts, 4981 because this modifies the target's attr and as. Copy the 4982 data and do a build_class_symbol. */ 4983 symbol_attribute attr = CLASS_DATA (a->target)->attr; 4984 int corank = gfc_get_corank (a->target); 4985 gfc_typespec type; 4986 4987 if (rank || corank) 4988 { 4989 as = gfc_get_array_spec (); 4990 as->type = AS_DEFERRED; 4991 as->rank = rank; 4992 as->corank = corank; 4993 attr.dimension = rank ? 1 : 0; 4994 attr.codimension = corank ? 1 : 0; 4995 } 4996 else 4997 { 4998 as = NULL; 4999 attr.dimension = attr.codimension = 0; 5000 } 5001 attr.class_ok = 0; 5002 type = CLASS_DATA (sym)->ts; 5003 if (!gfc_build_class_symbol (&type, 5004 &attr, &as)) 5005 gcc_unreachable (); 5006 sym->ts = type; 5007 sym->ts.type = BT_CLASS; 5008 sym->attr.class_ok = 1; 5009 } 5010 else 5011 sym->attr.class_ok = 1; 5012 } 5013 else if ((!sym->as && rank != 0) 5014 || (sym->as && sym->as->rank != rank)) 5015 { 5016 as = gfc_get_array_spec (); 5017 as->type = AS_DEFERRED; 5018 as->rank = rank; 5019 as->corank = gfc_get_corank (a->target); 5020 sym->as = as; 5021 sym->attr.dimension = 1; 5022 if (as->corank) 5023 sym->attr.codimension = 1; 5024 } 5025 } 5026 } 5027 5028 accept_statement (ST_ASSOCIATE); 5029 push_state (&s, COMP_ASSOCIATE, my_ns->proc_name); 5030 5031loop: 5032 st = parse_executable (ST_NONE); 5033 switch (st) 5034 { 5035 case ST_NONE: 5036 unexpected_eof (); 5037 5038 case_end: 5039 accept_statement (st); 5040 my_ns->code = gfc_state_stack->head; 5041 break; 5042 5043 default: 5044 unexpected_statement (st); 5045 goto loop; 5046 } 5047 5048 gfc_current_ns = gfc_current_ns->parent; 5049 pop_state (); 5050} 5051 5052 5053/* Parse a DO loop. Note that the ST_CYCLE and ST_EXIT statements are 5054 handled inside of parse_executable(), because they aren't really 5055 loop statements. */ 5056 5057static void 5058parse_do_block (void) 5059{ 5060 gfc_statement st; 5061 gfc_code *top; 5062 gfc_state_data s; 5063 gfc_symtree *stree; 5064 gfc_exec_op do_op; 5065 5066 do_op = new_st.op; 5067 s.ext.end_do_label = new_st.label1; 5068 5069 if (new_st.ext.iterator != NULL) 5070 { 5071 stree = new_st.ext.iterator->var->symtree; 5072 if (directive_unroll != -1) 5073 { 5074 new_st.ext.iterator->unroll = directive_unroll; 5075 directive_unroll = -1; 5076 } 5077 if (directive_ivdep) 5078 { 5079 new_st.ext.iterator->ivdep = directive_ivdep; 5080 directive_ivdep = false; 5081 } 5082 if (directive_vector) 5083 { 5084 new_st.ext.iterator->vector = directive_vector; 5085 directive_vector = false; 5086 } 5087 if (directive_novector) 5088 { 5089 new_st.ext.iterator->novector = directive_novector; 5090 directive_novector = false; 5091 } 5092 } 5093 else 5094 stree = NULL; 5095 5096 accept_statement (ST_DO); 5097 5098 top = gfc_state_stack->tail; 5099 push_state (&s, do_op == EXEC_DO_CONCURRENT ? COMP_DO_CONCURRENT : COMP_DO, 5100 gfc_new_block); 5101 5102 s.do_variable = stree; 5103 5104 top->block = new_level (top); 5105 top->block->op = EXEC_DO; 5106 5107loop: 5108 st = parse_executable (ST_NONE); 5109 5110 switch (st) 5111 { 5112 case ST_NONE: 5113 unexpected_eof (); 5114 5115 case ST_ENDDO: 5116 if (s.ext.end_do_label != NULL 5117 && s.ext.end_do_label != gfc_statement_label) 5118 gfc_error_now ("Statement label in ENDDO at %C doesn't match " 5119 "DO label"); 5120 5121 if (gfc_statement_label != NULL) 5122 { 5123 new_st.op = EXEC_NOP; 5124 add_statement (); 5125 } 5126 break; 5127 5128 case ST_IMPLIED_ENDDO: 5129 /* If the do-stmt of this DO construct has a do-construct-name, 5130 the corresponding end-do must be an end-do-stmt (with a matching 5131 name, but in that case we must have seen ST_ENDDO first). 5132 We only complain about this in pedantic mode. */ 5133 if (gfc_current_block () != NULL) 5134 gfc_error_now ("Named block DO at %L requires matching ENDDO name", 5135 &gfc_current_block()->declared_at); 5136 5137 break; 5138 5139 default: 5140 unexpected_statement (st); 5141 goto loop; 5142 } 5143 5144 pop_state (); 5145 accept_statement (st); 5146} 5147 5148 5149/* Parse the statements of OpenMP do/parallel do. */ 5150 5151static gfc_statement 5152parse_omp_do (gfc_statement omp_st) 5153{ 5154 gfc_statement st; 5155 gfc_code *cp, *np; 5156 gfc_state_data s; 5157 5158 accept_statement (omp_st); 5159 5160 cp = gfc_state_stack->tail; 5161 push_state (&s, COMP_OMP_STRUCTURED_BLOCK, NULL); 5162 np = new_level (cp); 5163 np->op = cp->op; 5164 np->block = NULL; 5165 5166 for (;;) 5167 { 5168 st = next_statement (); 5169 if (st == ST_NONE) 5170 unexpected_eof (); 5171 else if (st == ST_DO) 5172 break; 5173 else 5174 unexpected_statement (st); 5175 } 5176 5177 parse_do_block (); 5178 if (gfc_statement_label != NULL 5179 && gfc_state_stack->previous != NULL 5180 && gfc_state_stack->previous->state == COMP_DO 5181 && gfc_state_stack->previous->ext.end_do_label == gfc_statement_label) 5182 { 5183 /* In 5184 DO 100 I=1,10 5185 !$OMP DO 5186 DO J=1,10 5187 ... 5188 100 CONTINUE 5189 there should be no !$OMP END DO. */ 5190 pop_state (); 5191 return ST_IMPLIED_ENDDO; 5192 } 5193 5194 check_do_closure (); 5195 pop_state (); 5196 5197 st = next_statement (); 5198 gfc_statement omp_end_st = ST_OMP_END_DO; 5199 switch (omp_st) 5200 { 5201 case ST_OMP_DISTRIBUTE: omp_end_st = ST_OMP_END_DISTRIBUTE; break; 5202 case ST_OMP_DISTRIBUTE_PARALLEL_DO: 5203 omp_end_st = ST_OMP_END_DISTRIBUTE_PARALLEL_DO; 5204 break; 5205 case ST_OMP_DISTRIBUTE_PARALLEL_DO_SIMD: 5206 omp_end_st = ST_OMP_END_DISTRIBUTE_PARALLEL_DO_SIMD; 5207 break; 5208 case ST_OMP_DISTRIBUTE_SIMD: 5209 omp_end_st = ST_OMP_END_DISTRIBUTE_SIMD; 5210 break; 5211 case ST_OMP_DO: omp_end_st = ST_OMP_END_DO; break; 5212 case ST_OMP_DO_SIMD: omp_end_st = ST_OMP_END_DO_SIMD; break; 5213 case ST_OMP_LOOP: omp_end_st = ST_OMP_END_LOOP; break; 5214 case ST_OMP_PARALLEL_DO: omp_end_st = ST_OMP_END_PARALLEL_DO; break; 5215 case ST_OMP_PARALLEL_DO_SIMD: 5216 omp_end_st = ST_OMP_END_PARALLEL_DO_SIMD; 5217 break; 5218 case ST_OMP_PARALLEL_LOOP: 5219 omp_end_st = ST_OMP_END_PARALLEL_LOOP; 5220 break; 5221 case ST_OMP_SIMD: omp_end_st = ST_OMP_END_SIMD; break; 5222 case ST_OMP_TARGET_PARALLEL_DO: 5223 omp_end_st = ST_OMP_END_TARGET_PARALLEL_DO; 5224 break; 5225 case ST_OMP_TARGET_PARALLEL_DO_SIMD: 5226 omp_end_st = ST_OMP_END_TARGET_PARALLEL_DO_SIMD; 5227 break; 5228 case ST_OMP_TARGET_PARALLEL_LOOP: 5229 omp_end_st = ST_OMP_END_TARGET_PARALLEL_LOOP; 5230 break; 5231 case ST_OMP_TARGET_SIMD: omp_end_st = ST_OMP_END_TARGET_SIMD; break; 5232 case ST_OMP_TARGET_TEAMS_DISTRIBUTE: 5233 omp_end_st = ST_OMP_END_TARGET_TEAMS_DISTRIBUTE; 5234 break; 5235 case ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO: 5236 omp_end_st = ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO; 5237 break; 5238 case ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: 5239 omp_end_st = ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD; 5240 break; 5241 case ST_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD: 5242 omp_end_st = ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_SIMD; 5243 break; 5244 case ST_OMP_TARGET_TEAMS_LOOP: 5245 omp_end_st = ST_OMP_END_TARGET_TEAMS_LOOP; 5246 break; 5247 case ST_OMP_TASKLOOP: omp_end_st = ST_OMP_END_TASKLOOP; break; 5248 case ST_OMP_TASKLOOP_SIMD: omp_end_st = ST_OMP_END_TASKLOOP_SIMD; break; 5249 case ST_OMP_MASKED_TASKLOOP: omp_end_st = ST_OMP_END_MASKED_TASKLOOP; break; 5250 case ST_OMP_MASKED_TASKLOOP_SIMD: 5251 omp_end_st = ST_OMP_END_MASKED_TASKLOOP_SIMD; 5252 break; 5253 case ST_OMP_MASTER_TASKLOOP: omp_end_st = ST_OMP_END_MASTER_TASKLOOP; break; 5254 case ST_OMP_MASTER_TASKLOOP_SIMD: 5255 omp_end_st = ST_OMP_END_MASTER_TASKLOOP_SIMD; 5256 break; 5257 case ST_OMP_PARALLEL_MASKED_TASKLOOP: 5258 omp_end_st = ST_OMP_END_PARALLEL_MASKED_TASKLOOP; 5259 break; 5260 case ST_OMP_PARALLEL_MASKED_TASKLOOP_SIMD: 5261 omp_end_st = ST_OMP_END_PARALLEL_MASKED_TASKLOOP_SIMD; 5262 break; 5263 case ST_OMP_PARALLEL_MASTER_TASKLOOP: 5264 omp_end_st = ST_OMP_END_PARALLEL_MASTER_TASKLOOP; 5265 break; 5266 case ST_OMP_PARALLEL_MASTER_TASKLOOP_SIMD: 5267 omp_end_st = ST_OMP_END_PARALLEL_MASTER_TASKLOOP_SIMD; 5268 break; 5269 case ST_OMP_TEAMS_DISTRIBUTE: 5270 omp_end_st = ST_OMP_END_TEAMS_DISTRIBUTE; 5271 break; 5272 case ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO: 5273 omp_end_st = ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO; 5274 break; 5275 case ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: 5276 omp_end_st = ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD; 5277 break; 5278 case ST_OMP_TEAMS_DISTRIBUTE_SIMD: 5279 omp_end_st = ST_OMP_END_TEAMS_DISTRIBUTE_SIMD; 5280 break; 5281 case ST_OMP_TEAMS_LOOP: 5282 omp_end_st = ST_OMP_END_TEAMS_LOOP; 5283 break; 5284 default: gcc_unreachable (); 5285 } 5286 if (st == omp_end_st) 5287 { 5288 if (new_st.op == EXEC_OMP_END_NOWAIT) 5289 cp->ext.omp_clauses->nowait |= new_st.ext.omp_bool; 5290 else 5291 gcc_assert (new_st.op == EXEC_NOP); 5292 gfc_clear_new_st (); 5293 gfc_commit_symbols (); 5294 gfc_warning_check (); 5295 st = next_statement (); 5296 } 5297 return st; 5298} 5299 5300 5301/* Parse the statements of OpenMP atomic directive. */ 5302 5303static gfc_statement 5304parse_omp_oacc_atomic (bool omp_p) 5305{ 5306 gfc_statement st, st_atomic, st_end_atomic; 5307 gfc_code *cp, *np; 5308 gfc_state_data s; 5309 int count; 5310 5311 if (omp_p) 5312 { 5313 st_atomic = ST_OMP_ATOMIC; 5314 st_end_atomic = ST_OMP_END_ATOMIC; 5315 } 5316 else 5317 { 5318 st_atomic = ST_OACC_ATOMIC; 5319 st_end_atomic = ST_OACC_END_ATOMIC; 5320 } 5321 accept_statement (st_atomic); 5322 5323 cp = gfc_state_stack->tail; 5324 push_state (&s, COMP_OMP_STRUCTURED_BLOCK, NULL); 5325 np = new_level (cp); 5326 np->op = cp->op; 5327 np->block = NULL; 5328 np->ext.omp_clauses = cp->ext.omp_clauses; 5329 cp->ext.omp_clauses = NULL; 5330 count = 1 + np->ext.omp_clauses->capture; 5331 5332 while (count) 5333 { 5334 st = next_statement (); 5335 if (st == ST_NONE) 5336 unexpected_eof (); 5337 else if (np->ext.omp_clauses->compare 5338 && (st == ST_SIMPLE_IF || st == ST_IF_BLOCK)) 5339 { 5340 count--; 5341 if (st == ST_IF_BLOCK) 5342 { 5343 parse_if_block (); 5344 /* With else (or elseif). */ 5345 if (gfc_state_stack->tail->block->block) 5346 count--; 5347 } 5348 accept_statement (st); 5349 } 5350 else if (st == ST_ASSIGNMENT 5351 && (!np->ext.omp_clauses->compare 5352 || np->ext.omp_clauses->capture)) 5353 { 5354 accept_statement (st); 5355 count--; 5356 } 5357 else 5358 unexpected_statement (st); 5359 } 5360 5361 pop_state (); 5362 5363 st = next_statement (); 5364 if (st == st_end_atomic) 5365 { 5366 gfc_clear_new_st (); 5367 gfc_commit_symbols (); 5368 gfc_warning_check (); 5369 st = next_statement (); 5370 } 5371 return st; 5372} 5373 5374 5375/* Parse the statements of an OpenACC structured block. */ 5376 5377static void 5378parse_oacc_structured_block (gfc_statement acc_st) 5379{ 5380 gfc_statement st, acc_end_st; 5381 gfc_code *cp, *np; 5382 gfc_state_data s, *sd; 5383 5384 for (sd = gfc_state_stack; sd; sd = sd->previous) 5385 if (sd->state == COMP_CRITICAL) 5386 gfc_error_now ("OpenACC directive inside of CRITICAL block at %C"); 5387 5388 accept_statement (acc_st); 5389 5390 cp = gfc_state_stack->tail; 5391 push_state (&s, COMP_OMP_STRUCTURED_BLOCK, NULL); 5392 np = new_level (cp); 5393 np->op = cp->op; 5394 np->block = NULL; 5395 switch (acc_st) 5396 { 5397 case ST_OACC_PARALLEL: 5398 acc_end_st = ST_OACC_END_PARALLEL; 5399 break; 5400 case ST_OACC_KERNELS: 5401 acc_end_st = ST_OACC_END_KERNELS; 5402 break; 5403 case ST_OACC_SERIAL: 5404 acc_end_st = ST_OACC_END_SERIAL; 5405 break; 5406 case ST_OACC_DATA: 5407 acc_end_st = ST_OACC_END_DATA; 5408 break; 5409 case ST_OACC_HOST_DATA: 5410 acc_end_st = ST_OACC_END_HOST_DATA; 5411 break; 5412 default: 5413 gcc_unreachable (); 5414 } 5415 5416 do 5417 { 5418 st = parse_executable (ST_NONE); 5419 if (st == ST_NONE) 5420 unexpected_eof (); 5421 else if (st != acc_end_st) 5422 { 5423 gfc_error ("Expecting %s at %C", gfc_ascii_statement (acc_end_st)); 5424 reject_statement (); 5425 } 5426 } 5427 while (st != acc_end_st); 5428 5429 gcc_assert (new_st.op == EXEC_NOP); 5430 5431 gfc_clear_new_st (); 5432 gfc_commit_symbols (); 5433 gfc_warning_check (); 5434 pop_state (); 5435} 5436 5437/* Parse the statements of OpenACC 'loop', or combined compute 'loop'. */ 5438 5439static gfc_statement 5440parse_oacc_loop (gfc_statement acc_st) 5441{ 5442 gfc_statement st; 5443 gfc_code *cp, *np; 5444 gfc_state_data s, *sd; 5445 5446 for (sd = gfc_state_stack; sd; sd = sd->previous) 5447 if (sd->state == COMP_CRITICAL) 5448 gfc_error_now ("OpenACC directive inside of CRITICAL block at %C"); 5449 5450 accept_statement (acc_st); 5451 5452 cp = gfc_state_stack->tail; 5453 push_state (&s, COMP_OMP_STRUCTURED_BLOCK, NULL); 5454 np = new_level (cp); 5455 np->op = cp->op; 5456 np->block = NULL; 5457 5458 for (;;) 5459 { 5460 st = next_statement (); 5461 if (st == ST_NONE) 5462 unexpected_eof (); 5463 else if (st == ST_DO) 5464 break; 5465 else 5466 { 5467 gfc_error ("Expected DO loop at %C"); 5468 reject_statement (); 5469 } 5470 } 5471 5472 parse_do_block (); 5473 if (gfc_statement_label != NULL 5474 && gfc_state_stack->previous != NULL 5475 && gfc_state_stack->previous->state == COMP_DO 5476 && gfc_state_stack->previous->ext.end_do_label == gfc_statement_label) 5477 { 5478 pop_state (); 5479 return ST_IMPLIED_ENDDO; 5480 } 5481 5482 check_do_closure (); 5483 pop_state (); 5484 5485 st = next_statement (); 5486 if (st == ST_OACC_END_LOOP) 5487 gfc_warning (0, "Redundant !$ACC END LOOP at %C"); 5488 if ((acc_st == ST_OACC_PARALLEL_LOOP && st == ST_OACC_END_PARALLEL_LOOP) || 5489 (acc_st == ST_OACC_KERNELS_LOOP && st == ST_OACC_END_KERNELS_LOOP) || 5490 (acc_st == ST_OACC_SERIAL_LOOP && st == ST_OACC_END_SERIAL_LOOP) || 5491 (acc_st == ST_OACC_LOOP && st == ST_OACC_END_LOOP)) 5492 { 5493 gcc_assert (new_st.op == EXEC_NOP); 5494 gfc_clear_new_st (); 5495 gfc_commit_symbols (); 5496 gfc_warning_check (); 5497 st = next_statement (); 5498 } 5499 return st; 5500} 5501 5502 5503/* Parse the statements of an OpenMP structured block. */ 5504 5505static gfc_statement 5506parse_omp_structured_block (gfc_statement omp_st, bool workshare_stmts_only) 5507{ 5508 gfc_statement st, omp_end_st; 5509 gfc_code *cp, *np; 5510 gfc_state_data s; 5511 5512 accept_statement (omp_st); 5513 5514 cp = gfc_state_stack->tail; 5515 push_state (&s, COMP_OMP_STRUCTURED_BLOCK, NULL); 5516 np = new_level (cp); 5517 np->op = cp->op; 5518 np->block = NULL; 5519 5520 switch (omp_st) 5521 { 5522 case ST_OMP_PARALLEL: 5523 omp_end_st = ST_OMP_END_PARALLEL; 5524 break; 5525 case ST_OMP_PARALLEL_MASKED: 5526 omp_end_st = ST_OMP_END_PARALLEL_MASKED; 5527 break; 5528 case ST_OMP_PARALLEL_MASTER: 5529 omp_end_st = ST_OMP_END_PARALLEL_MASTER; 5530 break; 5531 case ST_OMP_PARALLEL_SECTIONS: 5532 omp_end_st = ST_OMP_END_PARALLEL_SECTIONS; 5533 break; 5534 case ST_OMP_SCOPE: 5535 omp_end_st = ST_OMP_END_SCOPE; 5536 break; 5537 case ST_OMP_SECTIONS: 5538 omp_end_st = ST_OMP_END_SECTIONS; 5539 break; 5540 case ST_OMP_ORDERED: 5541 omp_end_st = ST_OMP_END_ORDERED; 5542 break; 5543 case ST_OMP_CRITICAL: 5544 omp_end_st = ST_OMP_END_CRITICAL; 5545 break; 5546 case ST_OMP_MASKED: 5547 omp_end_st = ST_OMP_END_MASKED; 5548 break; 5549 case ST_OMP_MASTER: 5550 omp_end_st = ST_OMP_END_MASTER; 5551 break; 5552 case ST_OMP_SINGLE: 5553 omp_end_st = ST_OMP_END_SINGLE; 5554 break; 5555 case ST_OMP_TARGET: 5556 omp_end_st = ST_OMP_END_TARGET; 5557 break; 5558 case ST_OMP_TARGET_DATA: 5559 omp_end_st = ST_OMP_END_TARGET_DATA; 5560 break; 5561 case ST_OMP_TARGET_PARALLEL: 5562 omp_end_st = ST_OMP_END_TARGET_PARALLEL; 5563 break; 5564 case ST_OMP_TARGET_TEAMS: 5565 omp_end_st = ST_OMP_END_TARGET_TEAMS; 5566 break; 5567 case ST_OMP_TASK: 5568 omp_end_st = ST_OMP_END_TASK; 5569 break; 5570 case ST_OMP_TASKGROUP: 5571 omp_end_st = ST_OMP_END_TASKGROUP; 5572 break; 5573 case ST_OMP_TEAMS: 5574 omp_end_st = ST_OMP_END_TEAMS; 5575 break; 5576 case ST_OMP_TEAMS_DISTRIBUTE: 5577 omp_end_st = ST_OMP_END_TEAMS_DISTRIBUTE; 5578 break; 5579 case ST_OMP_DISTRIBUTE: 5580 omp_end_st = ST_OMP_END_DISTRIBUTE; 5581 break; 5582 case ST_OMP_WORKSHARE: 5583 omp_end_st = ST_OMP_END_WORKSHARE; 5584 break; 5585 case ST_OMP_PARALLEL_WORKSHARE: 5586 omp_end_st = ST_OMP_END_PARALLEL_WORKSHARE; 5587 break; 5588 default: 5589 gcc_unreachable (); 5590 } 5591 5592 bool block_construct = false; 5593 gfc_namespace *my_ns = NULL; 5594 gfc_namespace *my_parent = NULL; 5595 5596 st = next_statement (); 5597 5598 if (st == ST_BLOCK) 5599 { 5600 /* Adjust state to a strictly-structured block, now that we found that 5601 the body starts with a BLOCK construct. */ 5602 s.state = COMP_OMP_STRICTLY_STRUCTURED_BLOCK; 5603 5604 block_construct = true; 5605 gfc_notify_std (GFC_STD_F2008, "BLOCK construct at %C"); 5606 5607 my_ns = gfc_build_block_ns (gfc_current_ns); 5608 gfc_current_ns = my_ns; 5609 my_parent = my_ns->parent; 5610 5611 new_st.op = EXEC_BLOCK; 5612 new_st.ext.block.ns = my_ns; 5613 new_st.ext.block.assoc = NULL; 5614 accept_statement (ST_BLOCK); 5615 st = parse_spec (ST_NONE); 5616 } 5617 5618 do 5619 { 5620 if (workshare_stmts_only) 5621 { 5622 /* Inside of !$omp workshare, only 5623 scalar assignments 5624 array assignments 5625 where statements and constructs 5626 forall statements and constructs 5627 !$omp atomic 5628 !$omp critical 5629 !$omp parallel 5630 are allowed. For !$omp critical these 5631 restrictions apply recursively. */ 5632 bool cycle = true; 5633 5634 for (;;) 5635 { 5636 switch (st) 5637 { 5638 case ST_NONE: 5639 unexpected_eof (); 5640 5641 case ST_ASSIGNMENT: 5642 case ST_WHERE: 5643 case ST_FORALL: 5644 accept_statement (st); 5645 break; 5646 5647 case ST_WHERE_BLOCK: 5648 parse_where_block (); 5649 break; 5650 5651 case ST_FORALL_BLOCK: 5652 parse_forall_block (); 5653 break; 5654 5655 case ST_OMP_PARALLEL: 5656 case ST_OMP_PARALLEL_MASKED: 5657 case ST_OMP_PARALLEL_MASTER: 5658 case ST_OMP_PARALLEL_SECTIONS: 5659 st = parse_omp_structured_block (st, false); 5660 continue; 5661 5662 case ST_OMP_PARALLEL_WORKSHARE: 5663 case ST_OMP_CRITICAL: 5664 st = parse_omp_structured_block (st, true); 5665 continue; 5666 5667 case ST_OMP_PARALLEL_DO: 5668 case ST_OMP_PARALLEL_DO_SIMD: 5669 st = parse_omp_do (st); 5670 continue; 5671 5672 case ST_OMP_ATOMIC: 5673 st = parse_omp_oacc_atomic (true); 5674 continue; 5675 5676 default: 5677 cycle = false; 5678 break; 5679 } 5680 5681 if (!cycle) 5682 break; 5683 5684 st = next_statement (); 5685 } 5686 } 5687 else 5688 st = parse_executable (st); 5689 if (st == ST_NONE) 5690 unexpected_eof (); 5691 else if (st == ST_OMP_SECTION 5692 && (omp_st == ST_OMP_SECTIONS 5693 || omp_st == ST_OMP_PARALLEL_SECTIONS)) 5694 { 5695 np = new_level (np); 5696 np->op = cp->op; 5697 np->block = NULL; 5698 st = next_statement (); 5699 } 5700 else if (block_construct && st == ST_END_BLOCK) 5701 { 5702 accept_statement (st); 5703 gfc_current_ns = my_parent; 5704 pop_state (); 5705 5706 st = next_statement (); 5707 if (st == omp_end_st) 5708 { 5709 accept_statement (st); 5710 st = next_statement (); 5711 } 5712 return st; 5713 } 5714 else if (st != omp_end_st || block_construct) 5715 { 5716 unexpected_statement (st); 5717 st = next_statement (); 5718 } 5719 } 5720 while (st != omp_end_st); 5721 5722 switch (new_st.op) 5723 { 5724 case EXEC_OMP_END_NOWAIT: 5725 cp->ext.omp_clauses->nowait |= new_st.ext.omp_bool; 5726 break; 5727 case EXEC_OMP_END_CRITICAL: 5728 if (((cp->ext.omp_clauses->critical_name == NULL) 5729 ^ (new_st.ext.omp_name == NULL)) 5730 || (new_st.ext.omp_name != NULL 5731 && strcmp (cp->ext.omp_clauses->critical_name, 5732 new_st.ext.omp_name) != 0)) 5733 gfc_error ("Name after !$omp critical and !$omp end critical does " 5734 "not match at %C"); 5735 free (CONST_CAST (char *, new_st.ext.omp_name)); 5736 new_st.ext.omp_name = NULL; 5737 break; 5738 case EXEC_OMP_END_SINGLE: 5739 cp->ext.omp_clauses->lists[OMP_LIST_COPYPRIVATE] 5740 = new_st.ext.omp_clauses->lists[OMP_LIST_COPYPRIVATE]; 5741 new_st.ext.omp_clauses->lists[OMP_LIST_COPYPRIVATE] = NULL; 5742 gfc_free_omp_clauses (new_st.ext.omp_clauses); 5743 break; 5744 case EXEC_NOP: 5745 break; 5746 default: 5747 gcc_unreachable (); 5748 } 5749 5750 gfc_clear_new_st (); 5751 gfc_commit_symbols (); 5752 gfc_warning_check (); 5753 pop_state (); 5754 st = next_statement (); 5755 return st; 5756} 5757 5758 5759/* Accept a series of executable statements. We return the first 5760 statement that doesn't fit to the caller. Any block statements are 5761 passed on to the correct handler, which usually passes the buck 5762 right back here. */ 5763 5764static gfc_statement 5765parse_executable (gfc_statement st) 5766{ 5767 int close_flag; 5768 5769 if (st == ST_NONE) 5770 st = next_statement (); 5771 5772 for (;;) 5773 { 5774 close_flag = check_do_closure (); 5775 if (close_flag) 5776 switch (st) 5777 { 5778 case ST_GOTO: 5779 case ST_END_PROGRAM: 5780 case ST_RETURN: 5781 case ST_EXIT: 5782 case ST_END_FUNCTION: 5783 case ST_CYCLE: 5784 case ST_PAUSE: 5785 case ST_STOP: 5786 case ST_ERROR_STOP: 5787 case ST_END_SUBROUTINE: 5788 5789 case ST_DO: 5790 case ST_FORALL: 5791 case ST_WHERE: 5792 case ST_SELECT_CASE: 5793 gfc_error ("%s statement at %C cannot terminate a non-block " 5794 "DO loop", gfc_ascii_statement (st)); 5795 break; 5796 5797 default: 5798 break; 5799 } 5800 5801 switch (st) 5802 { 5803 case ST_NONE: 5804 unexpected_eof (); 5805 5806 case ST_DATA: 5807 gfc_notify_std (GFC_STD_F95_OBS, "DATA statement at %C after the " 5808 "first executable statement"); 5809 /* Fall through. */ 5810 5811 case ST_FORMAT: 5812 case ST_ENTRY: 5813 case_executable: 5814 accept_statement (st); 5815 if (close_flag == 1) 5816 return ST_IMPLIED_ENDDO; 5817 break; 5818 5819 case ST_BLOCK: 5820 parse_block_construct (); 5821 break; 5822 5823 case ST_ASSOCIATE: 5824 parse_associate (); 5825 break; 5826 5827 case ST_IF_BLOCK: 5828 parse_if_block (); 5829 break; 5830 5831 case ST_SELECT_CASE: 5832 parse_select_block (); 5833 break; 5834 5835 case ST_SELECT_TYPE: 5836 parse_select_type_block (); 5837 break; 5838 5839 case ST_SELECT_RANK: 5840 parse_select_rank_block (); 5841 break; 5842 5843 case ST_DO: 5844 parse_do_block (); 5845 if (check_do_closure () == 1) 5846 return ST_IMPLIED_ENDDO; 5847 break; 5848 5849 case ST_CRITICAL: 5850 parse_critical_block (); 5851 break; 5852 5853 case ST_WHERE_BLOCK: 5854 parse_where_block (); 5855 break; 5856 5857 case ST_FORALL_BLOCK: 5858 parse_forall_block (); 5859 break; 5860 5861 case ST_OACC_PARALLEL_LOOP: 5862 case ST_OACC_KERNELS_LOOP: 5863 case ST_OACC_SERIAL_LOOP: 5864 case ST_OACC_LOOP: 5865 st = parse_oacc_loop (st); 5866 if (st == ST_IMPLIED_ENDDO) 5867 return st; 5868 continue; 5869 5870 case ST_OACC_PARALLEL: 5871 case ST_OACC_KERNELS: 5872 case ST_OACC_SERIAL: 5873 case ST_OACC_DATA: 5874 case ST_OACC_HOST_DATA: 5875 parse_oacc_structured_block (st); 5876 break; 5877 5878 case ST_OMP_PARALLEL: 5879 case ST_OMP_PARALLEL_MASKED: 5880 case ST_OMP_PARALLEL_MASTER: 5881 case ST_OMP_PARALLEL_SECTIONS: 5882 case ST_OMP_ORDERED: 5883 case ST_OMP_CRITICAL: 5884 case ST_OMP_MASKED: 5885 case ST_OMP_MASTER: 5886 case ST_OMP_SCOPE: 5887 case ST_OMP_SECTIONS: 5888 case ST_OMP_SINGLE: 5889 case ST_OMP_TARGET: 5890 case ST_OMP_TARGET_DATA: 5891 case ST_OMP_TARGET_PARALLEL: 5892 case ST_OMP_TARGET_TEAMS: 5893 case ST_OMP_TEAMS: 5894 case ST_OMP_TASK: 5895 case ST_OMP_TASKGROUP: 5896 st = parse_omp_structured_block (st, false); 5897 continue; 5898 5899 case ST_OMP_WORKSHARE: 5900 case ST_OMP_PARALLEL_WORKSHARE: 5901 st = parse_omp_structured_block (st, true); 5902 continue; 5903 5904 case ST_OMP_DISTRIBUTE: 5905 case ST_OMP_DISTRIBUTE_PARALLEL_DO: 5906 case ST_OMP_DISTRIBUTE_PARALLEL_DO_SIMD: 5907 case ST_OMP_DISTRIBUTE_SIMD: 5908 case ST_OMP_DO: 5909 case ST_OMP_DO_SIMD: 5910 case ST_OMP_LOOP: 5911 case ST_OMP_PARALLEL_DO: 5912 case ST_OMP_PARALLEL_DO_SIMD: 5913 case ST_OMP_PARALLEL_LOOP: 5914 case ST_OMP_PARALLEL_MASKED_TASKLOOP: 5915 case ST_OMP_PARALLEL_MASKED_TASKLOOP_SIMD: 5916 case ST_OMP_PARALLEL_MASTER_TASKLOOP: 5917 case ST_OMP_PARALLEL_MASTER_TASKLOOP_SIMD: 5918 case ST_OMP_MASKED_TASKLOOP: 5919 case ST_OMP_MASKED_TASKLOOP_SIMD: 5920 case ST_OMP_MASTER_TASKLOOP: 5921 case ST_OMP_MASTER_TASKLOOP_SIMD: 5922 case ST_OMP_SIMD: 5923 case ST_OMP_TARGET_PARALLEL_DO: 5924 case ST_OMP_TARGET_PARALLEL_DO_SIMD: 5925 case ST_OMP_TARGET_PARALLEL_LOOP: 5926 case ST_OMP_TARGET_SIMD: 5927 case ST_OMP_TARGET_TEAMS_DISTRIBUTE: 5928 case ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO: 5929 case ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: 5930 case ST_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD: 5931 case ST_OMP_TARGET_TEAMS_LOOP: 5932 case ST_OMP_TASKLOOP: 5933 case ST_OMP_TASKLOOP_SIMD: 5934 case ST_OMP_TEAMS_DISTRIBUTE: 5935 case ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO: 5936 case ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: 5937 case ST_OMP_TEAMS_DISTRIBUTE_SIMD: 5938 case ST_OMP_TEAMS_LOOP: 5939 st = parse_omp_do (st); 5940 if (st == ST_IMPLIED_ENDDO) 5941 return st; 5942 continue; 5943 5944 case ST_OACC_ATOMIC: 5945 st = parse_omp_oacc_atomic (false); 5946 continue; 5947 5948 case ST_OMP_ATOMIC: 5949 st = parse_omp_oacc_atomic (true); 5950 continue; 5951 5952 default: 5953 return st; 5954 } 5955 5956 if (directive_unroll != -1) 5957 gfc_error ("%<GCC unroll%> directive not at the start of a loop at %C"); 5958 5959 if (directive_ivdep) 5960 gfc_error ("%<GCC ivdep%> directive not at the start of a loop at %C"); 5961 5962 if (directive_vector) 5963 gfc_error ("%<GCC vector%> directive not at the start of a loop at %C"); 5964 5965 if (directive_novector) 5966 gfc_error ("%<GCC novector%> " 5967 "directive not at the start of a loop at %C"); 5968 5969 st = next_statement (); 5970 } 5971} 5972 5973 5974/* Fix the symbols for sibling functions. These are incorrectly added to 5975 the child namespace as the parser didn't know about this procedure. */ 5976 5977static void 5978gfc_fixup_sibling_symbols (gfc_symbol *sym, gfc_namespace *siblings) 5979{ 5980 gfc_namespace *ns; 5981 gfc_symtree *st; 5982 gfc_symbol *old_sym; 5983 5984 for (ns = siblings; ns; ns = ns->sibling) 5985 { 5986 st = gfc_find_symtree (ns->sym_root, sym->name); 5987 5988 if (!st || (st->n.sym->attr.dummy && ns == st->n.sym->ns)) 5989 goto fixup_contained; 5990 5991 if ((st->n.sym->attr.flavor == FL_DERIVED 5992 && sym->attr.generic && sym->attr.function) 5993 ||(sym->attr.flavor == FL_DERIVED 5994 && st->n.sym->attr.generic && st->n.sym->attr.function)) 5995 goto fixup_contained; 5996 5997 old_sym = st->n.sym; 5998 if (old_sym->ns == ns 5999 && !old_sym->attr.contained 6000 6001 /* By 14.6.1.3, host association should be excluded 6002 for the following. */ 6003 && !(old_sym->attr.external 6004 || (old_sym->ts.type != BT_UNKNOWN 6005 && !old_sym->attr.implicit_type) 6006 || old_sym->attr.flavor == FL_PARAMETER 6007 || old_sym->attr.use_assoc 6008 || old_sym->attr.in_common 6009 || old_sym->attr.in_equivalence 6010 || old_sym->attr.data 6011 || old_sym->attr.dummy 6012 || old_sym->attr.result 6013 || old_sym->attr.dimension 6014 || old_sym->attr.allocatable 6015 || old_sym->attr.intrinsic 6016 || old_sym->attr.generic 6017 || old_sym->attr.flavor == FL_NAMELIST 6018 || old_sym->attr.flavor == FL_LABEL 6019 || old_sym->attr.proc == PROC_ST_FUNCTION)) 6020 { 6021 /* Replace it with the symbol from the parent namespace. */ 6022 st->n.sym = sym; 6023 sym->refs++; 6024 6025 gfc_release_symbol (old_sym); 6026 } 6027 6028fixup_contained: 6029 /* Do the same for any contained procedures. */ 6030 gfc_fixup_sibling_symbols (sym, ns->contained); 6031 } 6032} 6033 6034static void 6035parse_contained (int module) 6036{ 6037 gfc_namespace *ns, *parent_ns, *tmp; 6038 gfc_state_data s1, s2; 6039 gfc_statement st; 6040 gfc_symbol *sym; 6041 gfc_entry_list *el; 6042 locus old_loc; 6043 int contains_statements = 0; 6044 int seen_error = 0; 6045 6046 push_state (&s1, COMP_CONTAINS, NULL); 6047 parent_ns = gfc_current_ns; 6048 6049 do 6050 { 6051 gfc_current_ns = gfc_get_namespace (parent_ns, 1); 6052 6053 gfc_current_ns->sibling = parent_ns->contained; 6054 parent_ns->contained = gfc_current_ns; 6055 6056 next: 6057 /* Process the next available statement. We come here if we got an error 6058 and rejected the last statement. */ 6059 old_loc = gfc_current_locus; 6060 st = next_statement (); 6061 6062 switch (st) 6063 { 6064 case ST_NONE: 6065 unexpected_eof (); 6066 6067 case ST_FUNCTION: 6068 case ST_SUBROUTINE: 6069 contains_statements = 1; 6070 accept_statement (st); 6071 6072 push_state (&s2, 6073 (st == ST_FUNCTION) ? COMP_FUNCTION : COMP_SUBROUTINE, 6074 gfc_new_block); 6075 6076 /* For internal procedures, create/update the symbol in the 6077 parent namespace. */ 6078 6079 if (!module) 6080 { 6081 if (gfc_get_symbol (gfc_new_block->name, parent_ns, &sym)) 6082 gfc_error ("Contained procedure %qs at %C is already " 6083 "ambiguous", gfc_new_block->name); 6084 else 6085 { 6086 if (gfc_add_procedure (&sym->attr, PROC_INTERNAL, 6087 sym->name, 6088 &gfc_new_block->declared_at)) 6089 { 6090 if (st == ST_FUNCTION) 6091 gfc_add_function (&sym->attr, sym->name, 6092 &gfc_new_block->declared_at); 6093 else 6094 gfc_add_subroutine (&sym->attr, sym->name, 6095 &gfc_new_block->declared_at); 6096 } 6097 } 6098 6099 gfc_commit_symbols (); 6100 } 6101 else 6102 sym = gfc_new_block; 6103 6104 /* Mark this as a contained function, so it isn't replaced 6105 by other module functions. */ 6106 sym->attr.contained = 1; 6107 6108 /* Set implicit_pure so that it can be reset if any of the 6109 tests for purity fail. This is used for some optimisation 6110 during translation. */ 6111 if (!sym->attr.pure) 6112 sym->attr.implicit_pure = 1; 6113 6114 parse_progunit (ST_NONE); 6115 6116 /* Fix up any sibling functions that refer to this one. */ 6117 gfc_fixup_sibling_symbols (sym, gfc_current_ns); 6118 /* Or refer to any of its alternate entry points. */ 6119 for (el = gfc_current_ns->entries; el; el = el->next) 6120 gfc_fixup_sibling_symbols (el->sym, gfc_current_ns); 6121 6122 gfc_current_ns->code = s2.head; 6123 gfc_current_ns = parent_ns; 6124 6125 pop_state (); 6126 break; 6127 6128 /* These statements are associated with the end of the host unit. */ 6129 case ST_END_FUNCTION: 6130 case ST_END_MODULE: 6131 case ST_END_SUBMODULE: 6132 case ST_END_PROGRAM: 6133 case ST_END_SUBROUTINE: 6134 accept_statement (st); 6135 gfc_current_ns->code = s1.head; 6136 break; 6137 6138 default: 6139 gfc_error ("Unexpected %s statement in CONTAINS section at %C", 6140 gfc_ascii_statement (st)); 6141 reject_statement (); 6142 seen_error = 1; 6143 goto next; 6144 break; 6145 } 6146 } 6147 while (st != ST_END_FUNCTION && st != ST_END_SUBROUTINE 6148 && st != ST_END_MODULE && st != ST_END_SUBMODULE 6149 && st != ST_END_PROGRAM); 6150 6151 /* The first namespace in the list is guaranteed to not have 6152 anything (worthwhile) in it. */ 6153 tmp = gfc_current_ns; 6154 gfc_current_ns = parent_ns; 6155 if (seen_error && tmp->refs > 1) 6156 gfc_free_namespace (tmp); 6157 6158 ns = gfc_current_ns->contained; 6159 gfc_current_ns->contained = ns->sibling; 6160 gfc_free_namespace (ns); 6161 6162 pop_state (); 6163 if (!contains_statements) 6164 gfc_notify_std (GFC_STD_F2008, "CONTAINS statement without " 6165 "FUNCTION or SUBROUTINE statement at %L", &old_loc); 6166} 6167 6168 6169/* The result variable in a MODULE PROCEDURE needs to be created and 6170 its characteristics copied from the interface since it is neither 6171 declared in the procedure declaration nor in the specification 6172 part. */ 6173 6174static void 6175get_modproc_result (void) 6176{ 6177 gfc_symbol *proc; 6178 if (gfc_state_stack->previous 6179 && gfc_state_stack->previous->state == COMP_CONTAINS 6180 && gfc_state_stack->previous->previous->state == COMP_SUBMODULE) 6181 { 6182 proc = gfc_current_ns->proc_name ? gfc_current_ns->proc_name : NULL; 6183 if (proc != NULL 6184 && proc->attr.function 6185 && proc->tlink 6186 && proc->tlink->result 6187 && proc->tlink->result != proc->tlink) 6188 { 6189 gfc_copy_dummy_sym (&proc->result, proc->tlink->result, 1); 6190 gfc_set_sym_referenced (proc->result); 6191 proc->result->attr.if_source = IFSRC_DECL; 6192 gfc_commit_symbol (proc->result); 6193 } 6194 } 6195} 6196 6197 6198/* Parse a PROGRAM, SUBROUTINE, FUNCTION unit or BLOCK construct. */ 6199 6200static void 6201parse_progunit (gfc_statement st) 6202{ 6203 gfc_state_data *p; 6204 int n; 6205 6206 gfc_adjust_builtins (); 6207 6208 if (gfc_new_block 6209 && gfc_new_block->abr_modproc_decl 6210 && gfc_new_block->attr.function) 6211 get_modproc_result (); 6212 6213 st = parse_spec (st); 6214 switch (st) 6215 { 6216 case ST_NONE: 6217 unexpected_eof (); 6218 6219 case ST_CONTAINS: 6220 /* This is not allowed within BLOCK! */ 6221 if (gfc_current_state () != COMP_BLOCK) 6222 goto contains; 6223 break; 6224 6225 case_end: 6226 accept_statement (st); 6227 goto done; 6228 6229 default: 6230 break; 6231 } 6232 6233 if (gfc_current_state () == COMP_FUNCTION) 6234 gfc_check_function_type (gfc_current_ns); 6235 6236loop: 6237 for (;;) 6238 { 6239 st = parse_executable (st); 6240 6241 switch (st) 6242 { 6243 case ST_NONE: 6244 unexpected_eof (); 6245 6246 case ST_CONTAINS: 6247 /* This is not allowed within BLOCK! */ 6248 if (gfc_current_state () != COMP_BLOCK) 6249 goto contains; 6250 break; 6251 6252 case_end: 6253 accept_statement (st); 6254 goto done; 6255 6256 default: 6257 break; 6258 } 6259 6260 unexpected_statement (st); 6261 reject_statement (); 6262 st = next_statement (); 6263 } 6264 6265contains: 6266 n = 0; 6267 6268 for (p = gfc_state_stack; p; p = p->previous) 6269 if (p->state == COMP_CONTAINS) 6270 n++; 6271 6272 if (gfc_find_state (COMP_MODULE) == true 6273 || gfc_find_state (COMP_SUBMODULE) == true) 6274 n--; 6275 6276 if (n > 0) 6277 { 6278 gfc_error ("CONTAINS statement at %C is already in a contained " 6279 "program unit"); 6280 reject_statement (); 6281 st = next_statement (); 6282 goto loop; 6283 } 6284 6285 parse_contained (0); 6286 6287done: 6288 gfc_current_ns->code = gfc_state_stack->head; 6289} 6290 6291 6292/* Come here to complain about a global symbol already in use as 6293 something else. */ 6294 6295void 6296gfc_global_used (gfc_gsymbol *sym, locus *where) 6297{ 6298 const char *name; 6299 6300 if (where == NULL) 6301 where = &gfc_current_locus; 6302 6303 switch(sym->type) 6304 { 6305 case GSYM_PROGRAM: 6306 name = "PROGRAM"; 6307 break; 6308 case GSYM_FUNCTION: 6309 name = "FUNCTION"; 6310 break; 6311 case GSYM_SUBROUTINE: 6312 name = "SUBROUTINE"; 6313 break; 6314 case GSYM_COMMON: 6315 name = "COMMON"; 6316 break; 6317 case GSYM_BLOCK_DATA: 6318 name = "BLOCK DATA"; 6319 break; 6320 case GSYM_MODULE: 6321 name = "MODULE"; 6322 break; 6323 default: 6324 name = NULL; 6325 } 6326 6327 if (name) 6328 { 6329 if (sym->binding_label) 6330 gfc_error ("Global binding name %qs at %L is already being used " 6331 "as a %s at %L", sym->binding_label, where, name, 6332 &sym->where); 6333 else 6334 gfc_error ("Global name %qs at %L is already being used as " 6335 "a %s at %L", sym->name, where, name, &sym->where); 6336 } 6337 else 6338 { 6339 if (sym->binding_label) 6340 gfc_error ("Global binding name %qs at %L is already being used " 6341 "at %L", sym->binding_label, where, &sym->where); 6342 else 6343 gfc_error ("Global name %qs at %L is already being used at %L", 6344 sym->name, where, &sym->where); 6345 } 6346} 6347 6348 6349/* Parse a block data program unit. */ 6350 6351static void 6352parse_block_data (void) 6353{ 6354 gfc_statement st; 6355 static locus blank_locus; 6356 static int blank_block=0; 6357 gfc_gsymbol *s; 6358 6359 gfc_current_ns->proc_name = gfc_new_block; 6360 gfc_current_ns->is_block_data = 1; 6361 6362 if (gfc_new_block == NULL) 6363 { 6364 if (blank_block) 6365 gfc_error ("Blank BLOCK DATA at %C conflicts with " 6366 "prior BLOCK DATA at %L", &blank_locus); 6367 else 6368 { 6369 blank_block = 1; 6370 blank_locus = gfc_current_locus; 6371 } 6372 } 6373 else 6374 { 6375 s = gfc_get_gsymbol (gfc_new_block->name, false); 6376 if (s->defined 6377 || (s->type != GSYM_UNKNOWN && s->type != GSYM_BLOCK_DATA)) 6378 gfc_global_used (s, &gfc_new_block->declared_at); 6379 else 6380 { 6381 s->type = GSYM_BLOCK_DATA; 6382 s->where = gfc_new_block->declared_at; 6383 s->defined = 1; 6384 } 6385 } 6386 6387 st = parse_spec (ST_NONE); 6388 6389 while (st != ST_END_BLOCK_DATA) 6390 { 6391 gfc_error ("Unexpected %s statement in BLOCK DATA at %C", 6392 gfc_ascii_statement (st)); 6393 reject_statement (); 6394 st = next_statement (); 6395 } 6396} 6397 6398 6399/* Following the association of the ancestor (sub)module symbols, they 6400 must be set host rather than use associated and all must be public. 6401 They are flagged up by 'used_in_submodule' so that they can be set 6402 DECL_EXTERNAL in trans_decl.c(gfc_finish_var_decl). Otherwise the 6403 linker chokes on multiple symbol definitions. */ 6404 6405static void 6406set_syms_host_assoc (gfc_symbol *sym) 6407{ 6408 gfc_component *c; 6409 const char dot[2] = "."; 6410 /* Symbols take the form module.submodule_ or module.name_. */ 6411 char parent1[2 * GFC_MAX_SYMBOL_LEN + 2]; 6412 char parent2[2 * GFC_MAX_SYMBOL_LEN + 2]; 6413 6414 if (sym == NULL) 6415 return; 6416 6417 if (sym->attr.module_procedure) 6418 sym->attr.external = 0; 6419 6420 sym->attr.use_assoc = 0; 6421 sym->attr.host_assoc = 1; 6422 sym->attr.used_in_submodule =1; 6423 6424 if (sym->attr.flavor == FL_DERIVED) 6425 { 6426 /* Derived types with PRIVATE components that are declared in 6427 modules other than the parent module must not be changed to be 6428 PUBLIC. The 'use-assoc' attribute must be reset so that the 6429 test in symbol.cc(gfc_find_component) works correctly. This is 6430 not necessary for PRIVATE symbols since they are not read from 6431 the module. */ 6432 memset(parent1, '\0', sizeof(parent1)); 6433 memset(parent2, '\0', sizeof(parent2)); 6434 strcpy (parent1, gfc_new_block->name); 6435 strcpy (parent2, sym->module); 6436 if (strcmp (strtok (parent1, dot), strtok (parent2, dot)) == 0) 6437 { 6438 for (c = sym->components; c; c = c->next) 6439 c->attr.access = ACCESS_PUBLIC; 6440 } 6441 else 6442 { 6443 sym->attr.use_assoc = 1; 6444 sym->attr.host_assoc = 0; 6445 } 6446 } 6447} 6448 6449/* Parse a module subprogram. */ 6450 6451static void 6452parse_module (void) 6453{ 6454 gfc_statement st; 6455 gfc_gsymbol *s; 6456 6457 s = gfc_get_gsymbol (gfc_new_block->name, false); 6458 if (s->defined || (s->type != GSYM_UNKNOWN && s->type != GSYM_MODULE)) 6459 gfc_global_used (s, &gfc_new_block->declared_at); 6460 else 6461 { 6462 s->type = GSYM_MODULE; 6463 s->where = gfc_new_block->declared_at; 6464 s->defined = 1; 6465 } 6466 6467 /* Something is nulling the module_list after this point. This is good 6468 since it allows us to 'USE' the parent modules that the submodule 6469 inherits and to set (most) of the symbols as host associated. */ 6470 if (gfc_current_state () == COMP_SUBMODULE) 6471 { 6472 use_modules (); 6473 gfc_traverse_ns (gfc_current_ns, set_syms_host_assoc); 6474 } 6475 6476 st = parse_spec (ST_NONE); 6477 6478loop: 6479 switch (st) 6480 { 6481 case ST_NONE: 6482 unexpected_eof (); 6483 6484 case ST_CONTAINS: 6485 parse_contained (1); 6486 break; 6487 6488 case ST_END_MODULE: 6489 case ST_END_SUBMODULE: 6490 accept_statement (st); 6491 break; 6492 6493 default: 6494 gfc_error ("Unexpected %s statement in MODULE at %C", 6495 gfc_ascii_statement (st)); 6496 reject_statement (); 6497 st = next_statement (); 6498 goto loop; 6499 } 6500 s->ns = gfc_current_ns; 6501} 6502 6503 6504/* Add a procedure name to the global symbol table. */ 6505 6506static void 6507add_global_procedure (bool sub) 6508{ 6509 gfc_gsymbol *s; 6510 6511 /* Only in Fortran 2003: For procedures with a binding label also the Fortran 6512 name is a global identifier. */ 6513 if (!gfc_new_block->binding_label || gfc_notification_std (GFC_STD_F2008)) 6514 { 6515 s = gfc_get_gsymbol (gfc_new_block->name, false); 6516 6517 if (s->defined 6518 || (s->type != GSYM_UNKNOWN 6519 && s->type != (sub ? GSYM_SUBROUTINE : GSYM_FUNCTION))) 6520 { 6521 gfc_global_used (s, &gfc_new_block->declared_at); 6522 /* Silence follow-up errors. */ 6523 gfc_new_block->binding_label = NULL; 6524 } 6525 else 6526 { 6527 s->type = sub ? GSYM_SUBROUTINE : GSYM_FUNCTION; 6528 s->sym_name = gfc_new_block->name; 6529 s->where = gfc_new_block->declared_at; 6530 s->defined = 1; 6531 s->ns = gfc_current_ns; 6532 } 6533 } 6534 6535 /* Don't add the symbol multiple times. */ 6536 if (gfc_new_block->binding_label 6537 && (!gfc_notification_std (GFC_STD_F2008) 6538 || strcmp (gfc_new_block->name, gfc_new_block->binding_label) != 0)) 6539 { 6540 s = gfc_get_gsymbol (gfc_new_block->binding_label, true); 6541 6542 if (s->defined 6543 || (s->type != GSYM_UNKNOWN 6544 && s->type != (sub ? GSYM_SUBROUTINE : GSYM_FUNCTION))) 6545 { 6546 gfc_global_used (s, &gfc_new_block->declared_at); 6547 /* Silence follow-up errors. */ 6548 gfc_new_block->binding_label = NULL; 6549 } 6550 else 6551 { 6552 s->type = sub ? GSYM_SUBROUTINE : GSYM_FUNCTION; 6553 s->sym_name = gfc_new_block->name; 6554 s->binding_label = gfc_new_block->binding_label; 6555 s->where = gfc_new_block->declared_at; 6556 s->defined = 1; 6557 s->ns = gfc_current_ns; 6558 } 6559 } 6560} 6561 6562 6563/* Add a program to the global symbol table. */ 6564 6565static void 6566add_global_program (void) 6567{ 6568 gfc_gsymbol *s; 6569 6570 if (gfc_new_block == NULL) 6571 return; 6572 s = gfc_get_gsymbol (gfc_new_block->name, false); 6573 6574 if (s->defined || (s->type != GSYM_UNKNOWN && s->type != GSYM_PROGRAM)) 6575 gfc_global_used (s, &gfc_new_block->declared_at); 6576 else 6577 { 6578 s->type = GSYM_PROGRAM; 6579 s->where = gfc_new_block->declared_at; 6580 s->defined = 1; 6581 s->ns = gfc_current_ns; 6582 } 6583} 6584 6585 6586/* Resolve all the program units. */ 6587static void 6588resolve_all_program_units (gfc_namespace *gfc_global_ns_list) 6589{ 6590 gfc_derived_types = NULL; 6591 gfc_current_ns = gfc_global_ns_list; 6592 for (; gfc_current_ns; gfc_current_ns = gfc_current_ns->sibling) 6593 { 6594 if (gfc_current_ns->proc_name 6595 && gfc_current_ns->proc_name->attr.flavor == FL_MODULE) 6596 continue; /* Already resolved. */ 6597 6598 if (gfc_current_ns->proc_name) 6599 gfc_current_locus = gfc_current_ns->proc_name->declared_at; 6600 gfc_resolve (gfc_current_ns); 6601 gfc_current_ns->derived_types = gfc_derived_types; 6602 gfc_derived_types = NULL; 6603 } 6604} 6605 6606 6607static void 6608clean_up_modules (gfc_gsymbol *&gsym) 6609{ 6610 if (gsym == NULL) 6611 return; 6612 6613 clean_up_modules (gsym->left); 6614 clean_up_modules (gsym->right); 6615 6616 if (gsym->type != GSYM_MODULE) 6617 return; 6618 6619 if (gsym->ns) 6620 { 6621 gfc_current_ns = gsym->ns; 6622 gfc_derived_types = gfc_current_ns->derived_types; 6623 gfc_done_2 (); 6624 gsym->ns = NULL; 6625 } 6626 free (gsym); 6627 gsym = NULL; 6628} 6629 6630 6631/* Translate all the program units. This could be in a different order 6632 to resolution if there are forward references in the file. */ 6633static void 6634translate_all_program_units (gfc_namespace *gfc_global_ns_list) 6635{ 6636 int errors; 6637 6638 gfc_current_ns = gfc_global_ns_list; 6639 gfc_get_errors (NULL, &errors); 6640 6641 /* We first translate all modules to make sure that later parts 6642 of the program can use the decl. Then we translate the nonmodules. */ 6643 6644 for (; !errors && gfc_current_ns; gfc_current_ns = gfc_current_ns->sibling) 6645 { 6646 if (!gfc_current_ns->proc_name 6647 || gfc_current_ns->proc_name->attr.flavor != FL_MODULE) 6648 continue; 6649 6650 gfc_current_locus = gfc_current_ns->proc_name->declared_at; 6651 gfc_derived_types = gfc_current_ns->derived_types; 6652 gfc_generate_module_code (gfc_current_ns); 6653 gfc_current_ns->translated = 1; 6654 } 6655 6656 gfc_current_ns = gfc_global_ns_list; 6657 for (; !errors && gfc_current_ns; gfc_current_ns = gfc_current_ns->sibling) 6658 { 6659 if (gfc_current_ns->proc_name 6660 && gfc_current_ns->proc_name->attr.flavor == FL_MODULE) 6661 continue; 6662 6663 gfc_current_locus = gfc_current_ns->proc_name->declared_at; 6664 gfc_derived_types = gfc_current_ns->derived_types; 6665 gfc_generate_code (gfc_current_ns); 6666 gfc_current_ns->translated = 1; 6667 } 6668 6669 /* Clean up all the namespaces after translation. */ 6670 gfc_current_ns = gfc_global_ns_list; 6671 for (;gfc_current_ns;) 6672 { 6673 gfc_namespace *ns; 6674 6675 if (gfc_current_ns->proc_name 6676 && gfc_current_ns->proc_name->attr.flavor == FL_MODULE) 6677 { 6678 gfc_current_ns = gfc_current_ns->sibling; 6679 continue; 6680 } 6681 6682 ns = gfc_current_ns->sibling; 6683 gfc_derived_types = gfc_current_ns->derived_types; 6684 gfc_done_2 (); 6685 gfc_current_ns = ns; 6686 } 6687 6688 clean_up_modules (gfc_gsym_root); 6689} 6690 6691 6692/* Top level parser. */ 6693 6694bool 6695gfc_parse_file (void) 6696{ 6697 int seen_program, errors_before, errors; 6698 gfc_state_data top, s; 6699 gfc_statement st; 6700 locus prog_locus; 6701 gfc_namespace *next; 6702 6703 gfc_start_source_files (); 6704 6705 top.state = COMP_NONE; 6706 top.sym = NULL; 6707 top.previous = NULL; 6708 top.head = top.tail = NULL; 6709 top.do_variable = NULL; 6710 6711 gfc_state_stack = ⊤ 6712 6713 gfc_clear_new_st (); 6714 6715 gfc_statement_label = NULL; 6716 6717 if (setjmp (eof_buf)) 6718 return false; /* Come here on unexpected EOF */ 6719 6720 /* Prepare the global namespace that will contain the 6721 program units. */ 6722 gfc_global_ns_list = next = NULL; 6723 6724 seen_program = 0; 6725 errors_before = 0; 6726 6727 /* Exit early for empty files. */ 6728 if (gfc_at_eof ()) 6729 goto done; 6730 6731 in_specification_block = true; 6732loop: 6733 gfc_init_2 (); 6734 st = next_statement (); 6735 switch (st) 6736 { 6737 case ST_NONE: 6738 gfc_done_2 (); 6739 goto done; 6740 6741 case ST_PROGRAM: 6742 if (seen_program) 6743 goto duplicate_main; 6744 seen_program = 1; 6745 prog_locus = gfc_current_locus; 6746 6747 push_state (&s, COMP_PROGRAM, gfc_new_block); 6748 main_program_symbol (gfc_current_ns, gfc_new_block->name); 6749 accept_statement (st); 6750 add_global_program (); 6751 parse_progunit (ST_NONE); 6752 goto prog_units; 6753 6754 case ST_SUBROUTINE: 6755 add_global_procedure (true); 6756 push_state (&s, COMP_SUBROUTINE, gfc_new_block); 6757 accept_statement (st); 6758 parse_progunit (ST_NONE); 6759 goto prog_units; 6760 6761 case ST_FUNCTION: 6762 add_global_procedure (false); 6763 push_state (&s, COMP_FUNCTION, gfc_new_block); 6764 accept_statement (st); 6765 parse_progunit (ST_NONE); 6766 goto prog_units; 6767 6768 case ST_BLOCK_DATA: 6769 push_state (&s, COMP_BLOCK_DATA, gfc_new_block); 6770 accept_statement (st); 6771 parse_block_data (); 6772 break; 6773 6774 case ST_MODULE: 6775 push_state (&s, COMP_MODULE, gfc_new_block); 6776 accept_statement (st); 6777 6778 gfc_get_errors (NULL, &errors_before); 6779 parse_module (); 6780 break; 6781 6782 case ST_SUBMODULE: 6783 push_state (&s, COMP_SUBMODULE, gfc_new_block); 6784 accept_statement (st); 6785 6786 gfc_get_errors (NULL, &errors_before); 6787 parse_module (); 6788 break; 6789 6790 /* Anything else starts a nameless main program block. */ 6791 default: 6792 if (seen_program) 6793 goto duplicate_main; 6794 seen_program = 1; 6795 prog_locus = gfc_current_locus; 6796 6797 push_state (&s, COMP_PROGRAM, gfc_new_block); 6798 main_program_symbol (gfc_current_ns, "MAIN__"); 6799 parse_progunit (st); 6800 goto prog_units; 6801 } 6802 6803 /* Handle the non-program units. */ 6804 gfc_current_ns->code = s.head; 6805 6806 gfc_resolve (gfc_current_ns); 6807 6808 /* Fix the implicit_pure attribute for those procedures who should 6809 not have it. */ 6810 while (gfc_fix_implicit_pure (gfc_current_ns)) 6811 ; 6812 6813 /* Dump the parse tree if requested. */ 6814 if (flag_dump_fortran_original) 6815 gfc_dump_parse_tree (gfc_current_ns, stdout); 6816 6817 gfc_get_errors (NULL, &errors); 6818 if (s.state == COMP_MODULE || s.state == COMP_SUBMODULE) 6819 { 6820 gfc_dump_module (s.sym->name, errors_before == errors); 6821 gfc_current_ns->derived_types = gfc_derived_types; 6822 gfc_derived_types = NULL; 6823 goto prog_units; 6824 } 6825 else 6826 { 6827 if (errors == 0) 6828 gfc_generate_code (gfc_current_ns); 6829 pop_state (); 6830 gfc_done_2 (); 6831 } 6832 6833 goto loop; 6834 6835prog_units: 6836 /* The main program and non-contained procedures are put 6837 in the global namespace list, so that they can be processed 6838 later and all their interfaces resolved. */ 6839 gfc_current_ns->code = s.head; 6840 if (next) 6841 { 6842 for (; next->sibling; next = next->sibling) 6843 ; 6844 next->sibling = gfc_current_ns; 6845 } 6846 else 6847 gfc_global_ns_list = gfc_current_ns; 6848 6849 next = gfc_current_ns; 6850 6851 pop_state (); 6852 goto loop; 6853 6854done: 6855 /* Do the resolution. */ 6856 resolve_all_program_units (gfc_global_ns_list); 6857 6858 /* Go through all top-level namespaces and unset the implicit_pure 6859 attribute for any procedures that call something not pure or 6860 implicit_pure. Because the a procedure marked as not implicit_pure 6861 in one sweep may be called by another routine, we repeat this 6862 process until there are no more changes. */ 6863 bool changed; 6864 do 6865 { 6866 changed = false; 6867 for (gfc_current_ns = gfc_global_ns_list; gfc_current_ns; 6868 gfc_current_ns = gfc_current_ns->sibling) 6869 { 6870 if (gfc_fix_implicit_pure (gfc_current_ns)) 6871 changed = true; 6872 } 6873 } 6874 while (changed); 6875 6876 /* Fixup for external procedures and resolve 'omp requires'. */ 6877 int omp_requires; 6878 omp_requires = 0; 6879 for (gfc_current_ns = gfc_global_ns_list; gfc_current_ns; 6880 gfc_current_ns = gfc_current_ns->sibling) 6881 { 6882 omp_requires |= gfc_current_ns->omp_requires; 6883 gfc_check_externals (gfc_current_ns); 6884 } 6885 for (gfc_current_ns = gfc_global_ns_list; gfc_current_ns; 6886 gfc_current_ns = gfc_current_ns->sibling) 6887 gfc_check_omp_requires (gfc_current_ns, omp_requires); 6888 6889 /* Populate omp_requires_mask (needed for resolving OpenMP 6890 metadirectives and declare variant). */ 6891 switch (omp_requires & OMP_REQ_ATOMIC_MEM_ORDER_MASK) 6892 { 6893 case OMP_REQ_ATOMIC_MEM_ORDER_SEQ_CST: 6894 omp_requires_mask 6895 = (enum omp_requires) (omp_requires_mask | OMP_MEMORY_ORDER_SEQ_CST); 6896 break; 6897 case OMP_REQ_ATOMIC_MEM_ORDER_ACQ_REL: 6898 omp_requires_mask 6899 = (enum omp_requires) (omp_requires_mask | OMP_MEMORY_ORDER_ACQ_REL); 6900 break; 6901 case OMP_REQ_ATOMIC_MEM_ORDER_RELAXED: 6902 omp_requires_mask 6903 = (enum omp_requires) (omp_requires_mask | OMP_MEMORY_ORDER_RELAXED); 6904 break; 6905 } 6906 6907 /* Do the parse tree dump. */ 6908 gfc_current_ns = flag_dump_fortran_original ? gfc_global_ns_list : NULL; 6909 6910 for (; gfc_current_ns; gfc_current_ns = gfc_current_ns->sibling) 6911 if (!gfc_current_ns->proc_name 6912 || gfc_current_ns->proc_name->attr.flavor != FL_MODULE) 6913 { 6914 gfc_dump_parse_tree (gfc_current_ns, stdout); 6915 fputs ("------------------------------------------\n\n", stdout); 6916 } 6917 6918 /* Dump C prototypes. */ 6919 if (flag_c_prototypes || flag_c_prototypes_external) 6920 { 6921 fprintf (stdout, 6922 "#include <stddef.h>\n" 6923 "#ifdef __cplusplus\n" 6924 "#include <complex>\n" 6925 "#define __GFORTRAN_FLOAT_COMPLEX std::complex<float>\n" 6926 "#define __GFORTRAN_DOUBLE_COMPLEX std::complex<double>\n" 6927 "#define __GFORTRAN_LONG_DOUBLE_COMPLEX std::complex<long double>\n" 6928 "extern \"C\" {\n" 6929 "#else\n" 6930 "#define __GFORTRAN_FLOAT_COMPLEX float _Complex\n" 6931 "#define __GFORTRAN_DOUBLE_COMPLEX double _Complex\n" 6932 "#define __GFORTRAN_LONG_DOUBLE_COMPLEX long double _Complex\n" 6933 "#endif\n\n"); 6934 } 6935 6936 /* First dump BIND(C) prototypes. */ 6937 if (flag_c_prototypes) 6938 { 6939 for (gfc_current_ns = gfc_global_ns_list; gfc_current_ns; 6940 gfc_current_ns = gfc_current_ns->sibling) 6941 gfc_dump_c_prototypes (gfc_current_ns, stdout); 6942 } 6943 6944 /* Dump external prototypes. */ 6945 if (flag_c_prototypes_external) 6946 gfc_dump_external_c_prototypes (stdout); 6947 6948 if (flag_c_prototypes || flag_c_prototypes_external) 6949 fprintf (stdout, "\n#ifdef __cplusplus\n}\n#endif\n"); 6950 6951 /* Do the translation. */ 6952 translate_all_program_units (gfc_global_ns_list); 6953 6954 /* Dump the global symbol ist. We only do this here because part 6955 of it is generated after mangling the identifiers in 6956 trans-decl.cc. */ 6957 6958 if (flag_dump_fortran_global) 6959 gfc_dump_global_symbols (stdout); 6960 6961 gfc_end_source_files (); 6962 return true; 6963 6964duplicate_main: 6965 /* If we see a duplicate main program, shut down. If the second 6966 instance is an implied main program, i.e. data decls or executable 6967 statements, we're in for lots of errors. */ 6968 gfc_error ("Two main PROGRAMs at %L and %C", &prog_locus); 6969 reject_statement (); 6970 gfc_done_2 (); 6971 return true; 6972} 6973 6974/* Return true if this state data represents an OpenACC region. */ 6975bool 6976is_oacc (gfc_state_data *sd) 6977{ 6978 switch (sd->construct->op) 6979 { 6980 case EXEC_OACC_PARALLEL_LOOP: 6981 case EXEC_OACC_PARALLEL: 6982 case EXEC_OACC_KERNELS_LOOP: 6983 case EXEC_OACC_KERNELS: 6984 case EXEC_OACC_SERIAL_LOOP: 6985 case EXEC_OACC_SERIAL: 6986 case EXEC_OACC_DATA: 6987 case EXEC_OACC_HOST_DATA: 6988 case EXEC_OACC_LOOP: 6989 case EXEC_OACC_UPDATE: 6990 case EXEC_OACC_WAIT: 6991 case EXEC_OACC_CACHE: 6992 case EXEC_OACC_ENTER_DATA: 6993 case EXEC_OACC_EXIT_DATA: 6994 case EXEC_OACC_ATOMIC: 6995 case EXEC_OACC_ROUTINE: 6996 return true; 6997 6998 default: 6999 return false; 7000 } 7001} 7002