svn merge -r 216846:217483 svn+ssh://gcc.gnu.org/svn/gcc/trunk
[official-gcc.git] / gcc / fortran / parse.c
blob1c04da2e2de121a04fec0ca47086ed62e59c276a
1 /* Main parser.
2 Copyright (C) 2000-2014 Free Software Foundation, Inc.
3 Contributed by Andy Vaught
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
21 #include "config.h"
22 #include "system.h"
23 #include <setjmp.h>
24 #include "coretypes.h"
25 #include "gfortran.h"
26 #include "match.h"
27 #include "parse.h"
28 #include "debug.h"
30 /* Current statement label. Zero means no statement label. Because new_st
31 can get wiped during statement matching, we have to keep it separate. */
33 gfc_st_label *gfc_statement_label;
35 static locus label_locus;
36 static jmp_buf eof_buf;
38 gfc_state_data *gfc_state_stack;
39 static bool last_was_use_stmt = false;
41 /* TODO: Re-order functions to kill these forward decls. */
42 static void check_statement_label (gfc_statement);
43 static void undo_new_statement (void);
44 static void reject_statement (void);
47 /* A sort of half-matching function. We try to match the word on the
48 input with the passed string. If this succeeds, we call the
49 keyword-dependent matching function that will match the rest of the
50 statement. For single keywords, the matching subroutine is
51 gfc_match_eos(). */
53 static match
54 match_word (const char *str, match (*subr) (void), locus *old_locus)
56 match m;
58 if (str != NULL)
60 m = gfc_match (str);
61 if (m != MATCH_YES)
62 return m;
65 m = (*subr) ();
67 if (m != MATCH_YES)
69 gfc_current_locus = *old_locus;
70 reject_statement ();
73 return m;
77 /* Like match_word, but if str is matched, set a flag that it
78 was matched. */
79 static match
80 match_word_omp_simd (const char *str, match (*subr) (void), locus *old_locus,
81 bool *simd_matched)
83 match m;
85 if (str != NULL)
87 m = gfc_match (str);
88 if (m != MATCH_YES)
89 return m;
90 *simd_matched = true;
93 m = (*subr) ();
95 if (m != MATCH_YES)
97 gfc_current_locus = *old_locus;
98 reject_statement ();
101 return m;
105 /* Load symbols from all USE statements encountered in this scoping unit. */
107 static void
108 use_modules (void)
110 gfc_error_buf old_error;
112 gfc_push_error (&old_error);
113 gfc_buffer_error (0);
114 gfc_use_modules ();
115 gfc_buffer_error (1);
116 gfc_pop_error (&old_error);
117 gfc_commit_symbols ();
118 gfc_warning_check ();
119 gfc_current_ns->old_cl_list = gfc_current_ns->cl_list;
120 gfc_current_ns->old_equiv = gfc_current_ns->equiv;
121 last_was_use_stmt = false;
125 /* Figure out what the next statement is, (mostly) regardless of
126 proper ordering. The do...while(0) is there to prevent if/else
127 ambiguity. */
129 #define match(keyword, subr, st) \
130 do { \
131 if (match_word (keyword, subr, &old_locus) == MATCH_YES) \
132 return st; \
133 else \
134 undo_new_statement (); \
135 } while (0);
138 /* This is a specialist version of decode_statement that is used
139 for the specification statements in a function, whose
140 characteristics are deferred into the specification statements.
141 eg.: INTEGER (king = mykind) foo ()
142 USE mymodule, ONLY mykind.....
143 The KIND parameter needs a return after USE or IMPORT, whereas
144 derived type declarations can occur anywhere, up the executable
145 block. ST_GET_FCN_CHARACTERISTICS is returned when we have run
146 out of the correct kind of specification statements. */
147 static gfc_statement
148 decode_specification_statement (void)
150 gfc_statement st;
151 locus old_locus;
152 char c;
154 if (gfc_match_eos () == MATCH_YES)
155 return ST_NONE;
157 old_locus = gfc_current_locus;
159 if (match_word ("use", gfc_match_use, &old_locus) == MATCH_YES)
161 last_was_use_stmt = true;
162 return ST_USE;
164 else
166 undo_new_statement ();
167 if (last_was_use_stmt)
168 use_modules ();
171 match ("import", gfc_match_import, ST_IMPORT);
173 if (gfc_current_block ()->result->ts.type != BT_DERIVED)
174 goto end_of_block;
176 match (NULL, gfc_match_st_function, ST_STATEMENT_FUNCTION);
177 match (NULL, gfc_match_data_decl, ST_DATA_DECL);
178 match (NULL, gfc_match_enumerator_def, ST_ENUMERATOR);
180 /* General statement matching: Instead of testing every possible
181 statement, we eliminate most possibilities by peeking at the
182 first character. */
184 c = gfc_peek_ascii_char ();
186 switch (c)
188 case 'a':
189 match ("abstract% interface", gfc_match_abstract_interface,
190 ST_INTERFACE);
191 match ("allocatable", gfc_match_allocatable, ST_ATTR_DECL);
192 match ("asynchronous", gfc_match_asynchronous, ST_ATTR_DECL);
193 break;
195 case 'b':
196 match (NULL, gfc_match_bind_c_stmt, ST_ATTR_DECL);
197 break;
199 case 'c':
200 match ("codimension", gfc_match_codimension, ST_ATTR_DECL);
201 match ("contiguous", gfc_match_contiguous, ST_ATTR_DECL);
202 break;
204 case 'd':
205 match ("data", gfc_match_data, ST_DATA);
206 match ("dimension", gfc_match_dimension, ST_ATTR_DECL);
207 break;
209 case 'e':
210 match ("enum , bind ( c )", gfc_match_enum, ST_ENUM);
211 match ("entry% ", gfc_match_entry, ST_ENTRY);
212 match ("equivalence", gfc_match_equivalence, ST_EQUIVALENCE);
213 match ("external", gfc_match_external, ST_ATTR_DECL);
214 break;
216 case 'f':
217 match ("format", gfc_match_format, ST_FORMAT);
218 break;
220 case 'g':
221 break;
223 case 'i':
224 match ("implicit", gfc_match_implicit, ST_IMPLICIT);
225 match ("implicit% none", gfc_match_implicit_none, ST_IMPLICIT_NONE);
226 match ("interface", gfc_match_interface, ST_INTERFACE);
227 match ("intent", gfc_match_intent, ST_ATTR_DECL);
228 match ("intrinsic", gfc_match_intrinsic, ST_ATTR_DECL);
229 break;
231 case 'm':
232 break;
234 case 'n':
235 match ("namelist", gfc_match_namelist, ST_NAMELIST);
236 break;
238 case 'o':
239 match ("optional", gfc_match_optional, ST_ATTR_DECL);
240 break;
242 case 'p':
243 match ("parameter", gfc_match_parameter, ST_PARAMETER);
244 match ("pointer", gfc_match_pointer, ST_ATTR_DECL);
245 if (gfc_match_private (&st) == MATCH_YES)
246 return st;
247 match ("procedure", gfc_match_procedure, ST_PROCEDURE);
248 if (gfc_match_public (&st) == MATCH_YES)
249 return st;
250 match ("protected", gfc_match_protected, ST_ATTR_DECL);
251 break;
253 case 'r':
254 break;
256 case 's':
257 match ("save", gfc_match_save, ST_ATTR_DECL);
258 break;
260 case 't':
261 match ("target", gfc_match_target, ST_ATTR_DECL);
262 match ("type", gfc_match_derived_decl, ST_DERIVED_DECL);
263 break;
265 case 'u':
266 break;
268 case 'v':
269 match ("value", gfc_match_value, ST_ATTR_DECL);
270 match ("volatile", gfc_match_volatile, ST_ATTR_DECL);
271 break;
273 case 'w':
274 break;
277 /* This is not a specification statement. See if any of the matchers
278 has stored an error message of some sort. */
280 end_of_block:
281 gfc_clear_error ();
282 gfc_buffer_error (0);
283 gfc_current_locus = old_locus;
285 return ST_GET_FCN_CHARACTERISTICS;
289 /* This is the primary 'decode_statement'. */
290 static gfc_statement
291 decode_statement (void)
293 gfc_namespace *ns;
294 gfc_statement st;
295 locus old_locus;
296 match m;
297 char c;
299 gfc_enforce_clean_symbol_state ();
301 gfc_clear_error (); /* Clear any pending errors. */
302 gfc_clear_warning (); /* Clear any pending warnings. */
304 gfc_matching_function = false;
306 if (gfc_match_eos () == MATCH_YES)
307 return ST_NONE;
309 if (gfc_current_state () == COMP_FUNCTION
310 && gfc_current_block ()->result->ts.kind == -1)
311 return decode_specification_statement ();
313 old_locus = gfc_current_locus;
315 c = gfc_peek_ascii_char ();
317 if (c == 'u')
319 if (match_word ("use", gfc_match_use, &old_locus) == MATCH_YES)
321 last_was_use_stmt = true;
322 return ST_USE;
324 else
325 undo_new_statement ();
328 if (last_was_use_stmt)
329 use_modules ();
331 /* Try matching a data declaration or function declaration. The
332 input "REALFUNCTIONA(N)" can mean several things in different
333 contexts, so it (and its relatives) get special treatment. */
335 if (gfc_current_state () == COMP_NONE
336 || gfc_current_state () == COMP_INTERFACE
337 || gfc_current_state () == COMP_CONTAINS)
339 gfc_matching_function = true;
340 m = gfc_match_function_decl ();
341 if (m == MATCH_YES)
342 return ST_FUNCTION;
343 else if (m == MATCH_ERROR)
344 reject_statement ();
345 else
346 gfc_undo_symbols ();
347 gfc_current_locus = old_locus;
349 gfc_matching_function = false;
352 /* Match statements whose error messages are meant to be overwritten
353 by something better. */
355 match (NULL, gfc_match_assignment, ST_ASSIGNMENT);
356 match (NULL, gfc_match_pointer_assignment, ST_POINTER_ASSIGNMENT);
357 match (NULL, gfc_match_st_function, ST_STATEMENT_FUNCTION);
359 match (NULL, gfc_match_data_decl, ST_DATA_DECL);
360 match (NULL, gfc_match_enumerator_def, ST_ENUMERATOR);
362 /* Try to match a subroutine statement, which has the same optional
363 prefixes that functions can have. */
365 if (gfc_match_subroutine () == MATCH_YES)
366 return ST_SUBROUTINE;
367 gfc_undo_symbols ();
368 gfc_current_locus = old_locus;
370 /* Check for the IF, DO, SELECT, WHERE, FORALL, CRITICAL, BLOCK and ASSOCIATE
371 statements, which might begin with a block label. The match functions for
372 these statements are unusual in that their keyword is not seen before
373 the matcher is called. */
375 if (gfc_match_if (&st) == MATCH_YES)
376 return st;
377 gfc_undo_symbols ();
378 gfc_current_locus = old_locus;
380 if (gfc_match_where (&st) == MATCH_YES)
381 return st;
382 gfc_undo_symbols ();
383 gfc_current_locus = old_locus;
385 if (gfc_match_forall (&st) == MATCH_YES)
386 return st;
387 gfc_undo_symbols ();
388 gfc_current_locus = old_locus;
390 match (NULL, gfc_match_do, ST_DO);
391 match (NULL, gfc_match_block, ST_BLOCK);
392 match (NULL, gfc_match_associate, ST_ASSOCIATE);
393 match (NULL, gfc_match_critical, ST_CRITICAL);
394 match (NULL, gfc_match_select, ST_SELECT_CASE);
396 gfc_current_ns = gfc_build_block_ns (gfc_current_ns);
397 match (NULL, gfc_match_select_type, ST_SELECT_TYPE);
398 ns = gfc_current_ns;
399 gfc_current_ns = gfc_current_ns->parent;
400 gfc_free_namespace (ns);
402 /* General statement matching: Instead of testing every possible
403 statement, we eliminate most possibilities by peeking at the
404 first character. */
406 switch (c)
408 case 'a':
409 match ("abstract% interface", gfc_match_abstract_interface,
410 ST_INTERFACE);
411 match ("allocate", gfc_match_allocate, ST_ALLOCATE);
412 match ("allocatable", gfc_match_allocatable, ST_ATTR_DECL);
413 match ("assign", gfc_match_assign, ST_LABEL_ASSIGNMENT);
414 match ("asynchronous", gfc_match_asynchronous, ST_ATTR_DECL);
415 break;
417 case 'b':
418 match ("backspace", gfc_match_backspace, ST_BACKSPACE);
419 match ("block data", gfc_match_block_data, ST_BLOCK_DATA);
420 match (NULL, gfc_match_bind_c_stmt, ST_ATTR_DECL);
421 break;
423 case 'c':
424 match ("call", gfc_match_call, ST_CALL);
425 match ("close", gfc_match_close, ST_CLOSE);
426 match ("continue", gfc_match_continue, ST_CONTINUE);
427 match ("contiguous", gfc_match_contiguous, ST_ATTR_DECL);
428 match ("cycle", gfc_match_cycle, ST_CYCLE);
429 match ("case", gfc_match_case, ST_CASE);
430 match ("common", gfc_match_common, ST_COMMON);
431 match ("contains", gfc_match_eos, ST_CONTAINS);
432 match ("class", gfc_match_class_is, ST_CLASS_IS);
433 match ("codimension", gfc_match_codimension, ST_ATTR_DECL);
434 break;
436 case 'd':
437 match ("deallocate", gfc_match_deallocate, ST_DEALLOCATE);
438 match ("data", gfc_match_data, ST_DATA);
439 match ("dimension", gfc_match_dimension, ST_ATTR_DECL);
440 break;
442 case 'e':
443 match ("end file", gfc_match_endfile, ST_END_FILE);
444 match ("exit", gfc_match_exit, ST_EXIT);
445 match ("else", gfc_match_else, ST_ELSE);
446 match ("else where", gfc_match_elsewhere, ST_ELSEWHERE);
447 match ("else if", gfc_match_elseif, ST_ELSEIF);
448 match ("error stop", gfc_match_error_stop, ST_ERROR_STOP);
449 match ("enum , bind ( c )", gfc_match_enum, ST_ENUM);
451 if (gfc_match_end (&st) == MATCH_YES)
452 return st;
454 match ("entry% ", gfc_match_entry, ST_ENTRY);
455 match ("equivalence", gfc_match_equivalence, ST_EQUIVALENCE);
456 match ("external", gfc_match_external, ST_ATTR_DECL);
457 break;
459 case 'f':
460 match ("final", gfc_match_final_decl, ST_FINAL);
461 match ("flush", gfc_match_flush, ST_FLUSH);
462 match ("format", gfc_match_format, ST_FORMAT);
463 break;
465 case 'g':
466 match ("generic", gfc_match_generic, ST_GENERIC);
467 match ("go to", gfc_match_goto, ST_GOTO);
468 break;
470 case 'i':
471 match ("inquire", gfc_match_inquire, ST_INQUIRE);
472 match ("implicit", gfc_match_implicit, ST_IMPLICIT);
473 match ("implicit% none", gfc_match_implicit_none, ST_IMPLICIT_NONE);
474 match ("import", gfc_match_import, ST_IMPORT);
475 match ("interface", gfc_match_interface, ST_INTERFACE);
476 match ("intent", gfc_match_intent, ST_ATTR_DECL);
477 match ("intrinsic", gfc_match_intrinsic, ST_ATTR_DECL);
478 break;
480 case 'l':
481 match ("lock", gfc_match_lock, ST_LOCK);
482 break;
484 case 'm':
485 match ("module% procedure", gfc_match_modproc, ST_MODULE_PROC);
486 match ("module", gfc_match_module, ST_MODULE);
487 break;
489 case 'n':
490 match ("nullify", gfc_match_nullify, ST_NULLIFY);
491 match ("namelist", gfc_match_namelist, ST_NAMELIST);
492 break;
494 case 'o':
495 match ("open", gfc_match_open, ST_OPEN);
496 match ("optional", gfc_match_optional, ST_ATTR_DECL);
497 break;
499 case 'p':
500 match ("print", gfc_match_print, ST_WRITE);
501 match ("parameter", gfc_match_parameter, ST_PARAMETER);
502 match ("pause", gfc_match_pause, ST_PAUSE);
503 match ("pointer", gfc_match_pointer, ST_ATTR_DECL);
504 if (gfc_match_private (&st) == MATCH_YES)
505 return st;
506 match ("procedure", gfc_match_procedure, ST_PROCEDURE);
507 match ("program", gfc_match_program, ST_PROGRAM);
508 if (gfc_match_public (&st) == MATCH_YES)
509 return st;
510 match ("protected", gfc_match_protected, ST_ATTR_DECL);
511 break;
513 case 'r':
514 match ("read", gfc_match_read, ST_READ);
515 match ("return", gfc_match_return, ST_RETURN);
516 match ("rewind", gfc_match_rewind, ST_REWIND);
517 break;
519 case 's':
520 match ("sequence", gfc_match_eos, ST_SEQUENCE);
521 match ("stop", gfc_match_stop, ST_STOP);
522 match ("save", gfc_match_save, ST_ATTR_DECL);
523 match ("sync all", gfc_match_sync_all, ST_SYNC_ALL);
524 match ("sync images", gfc_match_sync_images, ST_SYNC_IMAGES);
525 match ("sync memory", gfc_match_sync_memory, ST_SYNC_MEMORY);
526 break;
528 case 't':
529 match ("target", gfc_match_target, ST_ATTR_DECL);
530 match ("type", gfc_match_derived_decl, ST_DERIVED_DECL);
531 match ("type is", gfc_match_type_is, ST_TYPE_IS);
532 break;
534 case 'u':
535 match ("unlock", gfc_match_unlock, ST_UNLOCK);
536 break;
538 case 'v':
539 match ("value", gfc_match_value, ST_ATTR_DECL);
540 match ("volatile", gfc_match_volatile, ST_ATTR_DECL);
541 break;
543 case 'w':
544 match ("wait", gfc_match_wait, ST_WAIT);
545 match ("write", gfc_match_write, ST_WRITE);
546 break;
549 /* All else has failed, so give up. See if any of the matchers has
550 stored an error message of some sort. */
552 if (gfc_error_check () == 0)
553 gfc_error_now_2 ("Unclassifiable statement at %C");
555 reject_statement ();
557 gfc_error_recovery ();
559 return ST_NONE;
562 /* Like match, but set a flag simd_matched if keyword matched. */
563 #define matchs(keyword, subr, st) \
564 do { \
565 if (match_word_omp_simd (keyword, subr, &old_locus, \
566 &simd_matched) == MATCH_YES) \
567 return st; \
568 else \
569 undo_new_statement (); \
570 } while (0);
572 /* Like match, but don't match anything if not -fopenmp. */
573 #define matcho(keyword, subr, st) \
574 do { \
575 if (!gfc_option.gfc_flag_openmp) \
577 else if (match_word (keyword, subr, &old_locus) \
578 == MATCH_YES) \
579 return st; \
580 else \
581 undo_new_statement (); \
582 } while (0);
584 static gfc_statement
585 decode_oacc_directive (void)
587 locus old_locus;
588 char c;
590 gfc_enforce_clean_symbol_state ();
592 gfc_clear_error (); /* Clear any pending errors. */
593 gfc_clear_warning (); /* Clear any pending warnings. */
595 if (gfc_pure (NULL))
597 gfc_error_now ("OpenACC directives at %C may not appear in PURE "
598 "procedures");
599 gfc_error_recovery ();
600 return ST_NONE;
603 gfc_unset_implicit_pure (NULL);
605 old_locus = gfc_current_locus;
607 /* General OpenACC directive matching: Instead of testing every possible
608 statement, we eliminate most possibilities by peeking at the
609 first character. */
611 c = gfc_peek_ascii_char ();
613 switch (c)
615 case 'c':
616 match ("cache", gfc_match_oacc_cache, ST_OACC_CACHE);
617 break;
618 case 'd':
619 match ("data", gfc_match_oacc_data, ST_OACC_DATA);
620 match ("declare", gfc_match_oacc_declare, ST_OACC_DECLARE);
621 break;
622 case 'e':
623 match ("end data", gfc_match_omp_eos, ST_OACC_END_DATA);
624 match ("end host_data", gfc_match_omp_eos, ST_OACC_END_HOST_DATA);
625 match ("end kernels loop", gfc_match_omp_eos, ST_OACC_END_KERNELS_LOOP);
626 match ("end kernels", gfc_match_omp_eos, ST_OACC_END_KERNELS);
627 match ("end loop", gfc_match_omp_eos, ST_OACC_END_LOOP);
628 match ("end parallel loop", gfc_match_omp_eos, ST_OACC_END_PARALLEL_LOOP);
629 match ("end parallel", gfc_match_omp_eos, ST_OACC_END_PARALLEL);
630 match ("enter data", gfc_match_oacc_enter_data, ST_OACC_ENTER_DATA);
631 match ("exit data", gfc_match_oacc_exit_data, ST_OACC_EXIT_DATA);
632 break;
633 case 'h':
634 match ("host_data", gfc_match_oacc_host_data, ST_OACC_HOST_DATA);
635 break;
636 case 'p':
637 match ("parallel loop", gfc_match_oacc_parallel_loop, ST_OACC_PARALLEL_LOOP);
638 match ("parallel", gfc_match_oacc_parallel, ST_OACC_PARALLEL);
639 break;
640 case 'k':
641 match ("kernels loop", gfc_match_oacc_kernels_loop, ST_OACC_KERNELS_LOOP);
642 match ("kernels", gfc_match_oacc_kernels, ST_OACC_KERNELS);
643 break;
644 case 'l':
645 match ("loop", gfc_match_oacc_loop, ST_OACC_LOOP);
646 break;
647 case 'r':
648 match ("routine", gfc_match_oacc_routine, ST_OACC_ROUTINE);
649 break;
650 case 'u':
651 match ("update", gfc_match_oacc_update, ST_OACC_UPDATE);
652 break;
653 case 'w':
654 match ("wait", gfc_match_oacc_wait, ST_OACC_WAIT);
655 break;
658 /* Directive not found or stored an error message.
659 Check and give up. */
661 if (gfc_error_check () == 0)
662 gfc_error_now ("Unclassifiable OpenACC directive at %C");
664 reject_statement ();
666 gfc_error_recovery ();
668 return ST_NONE;
671 static gfc_statement
672 decode_omp_directive (void)
674 locus old_locus;
675 char c;
676 bool simd_matched = false;
678 gfc_enforce_clean_symbol_state ();
680 gfc_clear_error (); /* Clear any pending errors. */
681 gfc_clear_warning (); /* Clear any pending warnings. */
683 if (gfc_pure (NULL))
685 gfc_error_now ("OpenMP directives at %C may not appear in PURE "
686 "or ELEMENTAL procedures");
687 gfc_error_recovery ();
688 return ST_NONE;
691 gfc_unset_implicit_pure (NULL);
693 old_locus = gfc_current_locus;
695 /* General OpenMP directive matching: Instead of testing every possible
696 statement, we eliminate most possibilities by peeking at the
697 first character. */
699 c = gfc_peek_ascii_char ();
701 /* match is for directives that should be recognized only if
702 -fopenmp, matchs for directives that should be recognized
703 if either -fopenmp or -fopenmp-simd. */
704 switch (c)
706 case 'a':
707 matcho ("atomic", gfc_match_omp_atomic, ST_OMP_ATOMIC);
708 break;
709 case 'b':
710 matcho ("barrier", gfc_match_omp_barrier, ST_OMP_BARRIER);
711 break;
712 case 'c':
713 matcho ("cancellation% point", gfc_match_omp_cancellation_point,
714 ST_OMP_CANCELLATION_POINT);
715 matcho ("cancel", gfc_match_omp_cancel, ST_OMP_CANCEL);
716 matcho ("critical", gfc_match_omp_critical, ST_OMP_CRITICAL);
717 break;
718 case 'd':
719 matchs ("declare reduction", gfc_match_omp_declare_reduction,
720 ST_OMP_DECLARE_REDUCTION);
721 matchs ("declare simd", gfc_match_omp_declare_simd,
722 ST_OMP_DECLARE_SIMD);
723 matcho ("declare target", gfc_match_omp_declare_target,
724 ST_OMP_DECLARE_TARGET);
725 matchs ("distribute parallel do simd",
726 gfc_match_omp_distribute_parallel_do_simd,
727 ST_OMP_DISTRIBUTE_PARALLEL_DO_SIMD);
728 matcho ("distribute parallel do", gfc_match_omp_distribute_parallel_do,
729 ST_OMP_DISTRIBUTE_PARALLEL_DO);
730 matchs ("distribute simd", gfc_match_omp_distribute_simd,
731 ST_OMP_DISTRIBUTE_SIMD);
732 matcho ("distribute", gfc_match_omp_distribute, ST_OMP_DISTRIBUTE);
733 matchs ("do simd", gfc_match_omp_do_simd, ST_OMP_DO_SIMD);
734 matcho ("do", gfc_match_omp_do, ST_OMP_DO);
735 break;
736 case 'e':
737 matcho ("end atomic", gfc_match_omp_eos, ST_OMP_END_ATOMIC);
738 matcho ("end critical", gfc_match_omp_critical, ST_OMP_END_CRITICAL);
739 matchs ("end distribute parallel do simd", gfc_match_omp_eos,
740 ST_OMP_END_DISTRIBUTE_PARALLEL_DO_SIMD);
741 matcho ("end distribute parallel do", gfc_match_omp_eos,
742 ST_OMP_END_DISTRIBUTE_PARALLEL_DO);
743 matchs ("end distribute simd", gfc_match_omp_eos,
744 ST_OMP_END_DISTRIBUTE_SIMD);
745 matcho ("end distribute", gfc_match_omp_eos, ST_OMP_END_DISTRIBUTE);
746 matchs ("end do simd", gfc_match_omp_end_nowait, ST_OMP_END_DO_SIMD);
747 matcho ("end do", gfc_match_omp_end_nowait, ST_OMP_END_DO);
748 matchs ("end simd", gfc_match_omp_eos, ST_OMP_END_SIMD);
749 matcho ("end master", gfc_match_omp_eos, ST_OMP_END_MASTER);
750 matcho ("end ordered", gfc_match_omp_eos, ST_OMP_END_ORDERED);
751 matchs ("end parallel do simd", gfc_match_omp_eos,
752 ST_OMP_END_PARALLEL_DO_SIMD);
753 matcho ("end parallel do", gfc_match_omp_eos, ST_OMP_END_PARALLEL_DO);
754 matcho ("end parallel sections", gfc_match_omp_eos,
755 ST_OMP_END_PARALLEL_SECTIONS);
756 matcho ("end parallel workshare", gfc_match_omp_eos,
757 ST_OMP_END_PARALLEL_WORKSHARE);
758 matcho ("end parallel", gfc_match_omp_eos, ST_OMP_END_PARALLEL);
759 matcho ("end sections", gfc_match_omp_end_nowait, ST_OMP_END_SECTIONS);
760 matcho ("end single", gfc_match_omp_end_single, ST_OMP_END_SINGLE);
761 matcho ("end target data", gfc_match_omp_eos, ST_OMP_END_TARGET_DATA);
762 matchs ("end target teams distribute parallel do simd",
763 gfc_match_omp_eos,
764 ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD);
765 matcho ("end target teams distribute parallel do", gfc_match_omp_eos,
766 ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO);
767 matchs ("end target teams distribute simd", gfc_match_omp_eos,
768 ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_SIMD);
769 matcho ("end target teams distribute", gfc_match_omp_eos,
770 ST_OMP_END_TARGET_TEAMS_DISTRIBUTE);
771 matcho ("end target teams", gfc_match_omp_eos, ST_OMP_END_TARGET_TEAMS);
772 matcho ("end target", gfc_match_omp_eos, ST_OMP_END_TARGET);
773 matcho ("end taskgroup", gfc_match_omp_eos, ST_OMP_END_TASKGROUP);
774 matcho ("end task", gfc_match_omp_eos, ST_OMP_END_TASK);
775 matchs ("end teams distribute parallel do simd", gfc_match_omp_eos,
776 ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD);
777 matcho ("end teams distribute parallel do", gfc_match_omp_eos,
778 ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO);
779 matchs ("end teams distribute simd", gfc_match_omp_eos,
780 ST_OMP_END_TEAMS_DISTRIBUTE_SIMD);
781 matcho ("end teams distribute", gfc_match_omp_eos,
782 ST_OMP_END_TEAMS_DISTRIBUTE);
783 matcho ("end teams", gfc_match_omp_eos, ST_OMP_END_TEAMS);
784 matcho ("end workshare", gfc_match_omp_end_nowait,
785 ST_OMP_END_WORKSHARE);
786 break;
787 case 'f':
788 matcho ("flush", gfc_match_omp_flush, ST_OMP_FLUSH);
789 break;
790 case 'm':
791 matcho ("master", gfc_match_omp_master, ST_OMP_MASTER);
792 break;
793 case 'o':
794 matcho ("ordered", gfc_match_omp_ordered, ST_OMP_ORDERED);
795 break;
796 case 'p':
797 matchs ("parallel do simd", gfc_match_omp_parallel_do_simd,
798 ST_OMP_PARALLEL_DO_SIMD);
799 matcho ("parallel do", gfc_match_omp_parallel_do, ST_OMP_PARALLEL_DO);
800 matcho ("parallel sections", gfc_match_omp_parallel_sections,
801 ST_OMP_PARALLEL_SECTIONS);
802 matcho ("parallel workshare", gfc_match_omp_parallel_workshare,
803 ST_OMP_PARALLEL_WORKSHARE);
804 matcho ("parallel", gfc_match_omp_parallel, ST_OMP_PARALLEL);
805 break;
806 case 's':
807 matcho ("sections", gfc_match_omp_sections, ST_OMP_SECTIONS);
808 matcho ("section", gfc_match_omp_eos, ST_OMP_SECTION);
809 matchs ("simd", gfc_match_omp_simd, ST_OMP_SIMD);
810 matcho ("single", gfc_match_omp_single, ST_OMP_SINGLE);
811 break;
812 case 't':
813 matcho ("target data", gfc_match_omp_target_data, ST_OMP_TARGET_DATA);
814 matchs ("target teams distribute parallel do simd",
815 gfc_match_omp_target_teams_distribute_parallel_do_simd,
816 ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD);
817 matcho ("target teams distribute parallel do",
818 gfc_match_omp_target_teams_distribute_parallel_do,
819 ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO);
820 matchs ("target teams distribute simd",
821 gfc_match_omp_target_teams_distribute_simd,
822 ST_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD);
823 matcho ("target teams distribute", gfc_match_omp_target_teams_distribute,
824 ST_OMP_TARGET_TEAMS_DISTRIBUTE);
825 matcho ("target teams", gfc_match_omp_target_teams, ST_OMP_TARGET_TEAMS);
826 matcho ("target update", gfc_match_omp_target_update,
827 ST_OMP_TARGET_UPDATE);
828 matcho ("target", gfc_match_omp_target, ST_OMP_TARGET);
829 matcho ("taskgroup", gfc_match_omp_taskgroup, ST_OMP_TASKGROUP);
830 matcho ("taskwait", gfc_match_omp_taskwait, ST_OMP_TASKWAIT);
831 matcho ("taskyield", gfc_match_omp_taskyield, ST_OMP_TASKYIELD);
832 matcho ("task", gfc_match_omp_task, ST_OMP_TASK);
833 matchs ("teams distribute parallel do simd",
834 gfc_match_omp_teams_distribute_parallel_do_simd,
835 ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD);
836 matcho ("teams distribute parallel do",
837 gfc_match_omp_teams_distribute_parallel_do,
838 ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO);
839 matchs ("teams distribute simd", gfc_match_omp_teams_distribute_simd,
840 ST_OMP_TEAMS_DISTRIBUTE_SIMD);
841 matcho ("teams distribute", gfc_match_omp_teams_distribute,
842 ST_OMP_TEAMS_DISTRIBUTE);
843 matcho ("teams", gfc_match_omp_teams, ST_OMP_TEAMS);
844 matcho ("threadprivate", gfc_match_omp_threadprivate,
845 ST_OMP_THREADPRIVATE);
846 break;
847 case 'w':
848 matcho ("workshare", gfc_match_omp_workshare, ST_OMP_WORKSHARE);
849 break;
852 /* All else has failed, so give up. See if any of the matchers has
853 stored an error message of some sort. Don't error out if
854 not -fopenmp and simd_matched is false, i.e. if a directive other
855 than one marked with match has been seen. */
857 if (gfc_option.gfc_flag_openmp || simd_matched)
859 if (gfc_error_check () == 0)
860 gfc_error_now ("Unclassifiable OpenMP directive at %C");
863 reject_statement ();
865 gfc_error_recovery ();
867 return ST_NONE;
870 static gfc_statement
871 decode_gcc_attribute (void)
873 locus old_locus;
875 gfc_enforce_clean_symbol_state ();
877 gfc_clear_error (); /* Clear any pending errors. */
878 gfc_clear_warning (); /* Clear any pending warnings. */
879 old_locus = gfc_current_locus;
881 match ("attributes", gfc_match_gcc_attributes, ST_ATTR_DECL);
883 /* All else has failed, so give up. See if any of the matchers has
884 stored an error message of some sort. */
886 if (gfc_error_check () == 0)
887 gfc_error_now_2 ("Unclassifiable GCC directive at %C");
889 reject_statement ();
891 gfc_error_recovery ();
893 return ST_NONE;
896 #undef match
898 /* Assert next length characters to be equal to token in free form. */
900 static void
901 verify_token_free (const char* token, int length, bool last_was_use_stmt)
903 int i;
904 char c;
906 c = gfc_next_ascii_char ();
907 for (i = 0; i < length; i++, c = gfc_next_ascii_char ())
908 gcc_assert (c == token[i]);
910 gcc_assert (gfc_is_whitespace(c));
911 gfc_gobble_whitespace ();
912 if (last_was_use_stmt)
913 use_modules ();
916 /* Get the next statement in free form source. */
918 static gfc_statement
919 next_free (void)
921 match m;
922 int i, cnt, at_bol;
923 char c;
925 at_bol = gfc_at_bol ();
926 gfc_gobble_whitespace ();
928 c = gfc_peek_ascii_char ();
930 if (ISDIGIT (c))
932 char d;
934 /* Found a statement label? */
935 m = gfc_match_st_label (&gfc_statement_label);
937 d = gfc_peek_ascii_char ();
938 if (m != MATCH_YES || !gfc_is_whitespace (d))
940 gfc_match_small_literal_int (&i, &cnt);
942 if (cnt > 5)
943 gfc_error_now_2 ("Too many digits in statement label at %C");
945 if (i == 0)
946 gfc_error_now_2 ("Zero is not a valid statement label at %C");
949 c = gfc_next_ascii_char ();
950 while (ISDIGIT(c));
952 if (!gfc_is_whitespace (c))
953 gfc_error_now_2 ("Non-numeric character in statement label at %C");
955 return ST_NONE;
957 else
959 label_locus = gfc_current_locus;
961 gfc_gobble_whitespace ();
963 if (at_bol && gfc_peek_ascii_char () == ';')
965 gfc_error_now_2 ("Semicolon at %C needs to be preceded by "
966 "statement");
967 gfc_next_ascii_char (); /* Eat up the semicolon. */
968 return ST_NONE;
971 if (gfc_match_eos () == MATCH_YES)
973 gfc_warning_now ("Ignoring statement label in empty statement "
974 "at %L", &label_locus);
975 gfc_free_st_label (gfc_statement_label);
976 gfc_statement_label = NULL;
977 return ST_NONE;
981 else if (c == '!')
983 /* Comments have already been skipped by the time we get here,
984 except for GCC attributes and OpenMP/OpenACC directives. */
986 gfc_next_ascii_char (); /* Eat up the exclamation sign. */
987 c = gfc_peek_ascii_char ();
989 if (c == 'g')
991 int i;
993 c = gfc_next_ascii_char ();
994 for (i = 0; i < 4; i++, c = gfc_next_ascii_char ())
995 gcc_assert (c == "gcc$"[i]);
997 gfc_gobble_whitespace ();
998 return decode_gcc_attribute ();
1001 else if (c == '$')
1003 /* Since both OpenMP and OpenACC directives starts with
1004 !$ character sequence, we must check all flags combinations */
1005 if ((gfc_option.gfc_flag_openmp
1006 || gfc_option.gfc_flag_openmp_simd)
1007 && !gfc_option.gfc_flag_openacc)
1009 verify_token_free ("$omp", 4, last_was_use_stmt);
1010 return decode_omp_directive ();
1012 else if ((gfc_option.gfc_flag_openmp
1013 || gfc_option.gfc_flag_openmp_simd)
1014 && gfc_option.gfc_flag_openacc)
1016 gfc_next_ascii_char (); /* Eat up dollar character */
1017 c = gfc_peek_ascii_char ();
1019 if (c == 'o')
1021 verify_token_free ("omp", 3, last_was_use_stmt);
1022 return decode_omp_directive ();
1024 else if (c == 'a')
1026 verify_token_free ("acc", 3, last_was_use_stmt);
1027 return decode_oacc_directive ();
1030 else if (gfc_option.gfc_flag_openacc)
1032 verify_token_free ("$acc", 4, last_was_use_stmt);
1033 return decode_oacc_directive ();
1036 gcc_unreachable ();
1039 if (at_bol && c == ';')
1041 if (!(gfc_option.allow_std & GFC_STD_F2008))
1042 gfc_error_now_2 ("Fortran 2008: Semicolon at %C without preceding "
1043 "statement");
1044 gfc_next_ascii_char (); /* Eat up the semicolon. */
1045 return ST_NONE;
1048 return decode_statement ();
1051 /* Assert next length characters to be equal to token in fixed form. */
1053 static bool
1054 verify_token_fixed (const char *token, int length, bool last_was_use_stmt)
1056 int i;
1057 char c = gfc_next_char_literal (NONSTRING);
1059 for (i = 0; i < length; i++, c = gfc_next_char_literal (NONSTRING))
1060 gcc_assert ((char) gfc_wide_tolower (c) == token[i]);
1062 if (c != ' ' && c != '0')
1064 gfc_buffer_error (0);
1065 gfc_error ("Bad continuation line at %C");
1066 return false;
1068 if (last_was_use_stmt)
1069 use_modules ();
1071 return true;
1074 /* Get the next statement in fixed-form source. */
1076 static gfc_statement
1077 next_fixed (void)
1079 int label, digit_flag, i;
1080 locus loc;
1081 gfc_char_t c;
1083 if (!gfc_at_bol ())
1084 return decode_statement ();
1086 /* Skip past the current label field, parsing a statement label if
1087 one is there. This is a weird number parser, since the number is
1088 contained within five columns and can have any kind of embedded
1089 spaces. We also check for characters that make the rest of the
1090 line a comment. */
1092 label = 0;
1093 digit_flag = 0;
1095 for (i = 0; i < 5; i++)
1097 c = gfc_next_char_literal (NONSTRING);
1099 switch (c)
1101 case ' ':
1102 break;
1104 case '0':
1105 case '1':
1106 case '2':
1107 case '3':
1108 case '4':
1109 case '5':
1110 case '6':
1111 case '7':
1112 case '8':
1113 case '9':
1114 label = label * 10 + ((unsigned char) c - '0');
1115 label_locus = gfc_current_locus;
1116 digit_flag = 1;
1117 break;
1119 /* Comments have already been skipped by the time we get
1120 here, except for GCC attributes and OpenMP directives. */
1122 case '*':
1123 c = gfc_next_char_literal (NONSTRING);
1125 if (TOLOWER (c) == 'g')
1127 for (i = 0; i < 4; i++, c = gfc_next_char_literal (NONSTRING))
1128 gcc_assert (TOLOWER (c) == "gcc$"[i]);
1130 return decode_gcc_attribute ();
1132 else if (c == '$')
1134 if ((gfc_option.gfc_flag_openmp
1135 || gfc_option.gfc_flag_openmp_simd)
1136 && !gfc_option.gfc_flag_openacc)
1138 if (!verify_token_fixed ("omp", 3, last_was_use_stmt))
1139 return ST_NONE;
1140 return decode_omp_directive ();
1142 else if ((gfc_option.gfc_flag_openmp
1143 || gfc_option.gfc_flag_openmp_simd)
1144 && gfc_option.gfc_flag_openacc)
1146 c = gfc_next_char_literal(NONSTRING);
1147 if (c == 'o' || c == 'O')
1149 if (!verify_token_fixed ("mp", 2, last_was_use_stmt))
1150 return ST_NONE;
1151 return decode_omp_directive ();
1153 else if (c == 'a' || c == 'A')
1155 if (!verify_token_fixed ("cc", 2, last_was_use_stmt))
1156 return ST_NONE;
1157 return decode_oacc_directive ();
1160 else if (gfc_option.gfc_flag_openacc)
1162 if (!verify_token_fixed ("acc", 3, last_was_use_stmt))
1163 return ST_NONE;
1164 return decode_oacc_directive ();
1167 /* FALLTHROUGH */
1169 /* Comments have already been skipped by the time we get
1170 here so don't bother checking for them. */
1172 default:
1173 gfc_buffer_error (0);
1174 gfc_error ("Non-numeric character in statement label at %C");
1175 return ST_NONE;
1179 if (digit_flag)
1181 if (label == 0)
1182 gfc_warning_now_2 ("Zero is not a valid statement label at %C");
1183 else
1185 /* We've found a valid statement label. */
1186 gfc_statement_label = gfc_get_st_label (label);
1190 /* Since this line starts a statement, it cannot be a continuation
1191 of a previous statement. If we see something here besides a
1192 space or zero, it must be a bad continuation line. */
1194 c = gfc_next_char_literal (NONSTRING);
1195 if (c == '\n')
1196 goto blank_line;
1198 if (c != ' ' && c != '0')
1200 gfc_buffer_error (0);
1201 gfc_error ("Bad continuation line at %C");
1202 return ST_NONE;
1205 /* Now that we've taken care of the statement label columns, we have
1206 to make sure that the first nonblank character is not a '!'. If
1207 it is, the rest of the line is a comment. */
1211 loc = gfc_current_locus;
1212 c = gfc_next_char_literal (NONSTRING);
1214 while (gfc_is_whitespace (c));
1216 if (c == '!')
1217 goto blank_line;
1218 gfc_current_locus = loc;
1220 if (c == ';')
1222 if (digit_flag)
1223 gfc_error_now ("Semicolon at %C needs to be preceded by statement");
1224 else if (!(gfc_option.allow_std & GFC_STD_F2008))
1225 gfc_error_now ("Fortran 2008: Semicolon at %C without preceding "
1226 "statement");
1227 return ST_NONE;
1230 if (gfc_match_eos () == MATCH_YES)
1231 goto blank_line;
1233 /* At this point, we've got a nonblank statement to parse. */
1234 return decode_statement ();
1236 blank_line:
1237 if (digit_flag)
1238 gfc_warning_now ("Ignoring statement label in empty statement at %L",
1239 &label_locus);
1241 gfc_current_locus.lb->truncated = 0;
1242 gfc_advance_line ();
1243 return ST_NONE;
1247 /* Return the next non-ST_NONE statement to the caller. We also worry
1248 about including files and the ends of include files at this stage. */
1250 static gfc_statement
1251 next_statement (void)
1253 gfc_statement st;
1254 locus old_locus;
1256 gfc_enforce_clean_symbol_state ();
1258 gfc_new_block = NULL;
1260 gfc_current_ns->old_cl_list = gfc_current_ns->cl_list;
1261 gfc_current_ns->old_equiv = gfc_current_ns->equiv;
1262 for (;;)
1264 gfc_statement_label = NULL;
1265 gfc_buffer_error (1);
1267 if (gfc_at_eol ())
1268 gfc_advance_line ();
1270 gfc_skip_comments ();
1272 if (gfc_at_end ())
1274 st = ST_NONE;
1275 break;
1278 if (gfc_define_undef_line ())
1279 continue;
1281 old_locus = gfc_current_locus;
1283 st = (gfc_current_form == FORM_FIXED) ? next_fixed () : next_free ();
1285 if (st != ST_NONE)
1286 break;
1289 gfc_buffer_error (0);
1291 if (st == ST_GET_FCN_CHARACTERISTICS && gfc_statement_label != NULL)
1293 gfc_free_st_label (gfc_statement_label);
1294 gfc_statement_label = NULL;
1295 gfc_current_locus = old_locus;
1298 if (st != ST_NONE)
1299 check_statement_label (st);
1301 return st;
1305 /****************************** Parser ***********************************/
1307 /* The parser subroutines are of type 'try' that fail if the file ends
1308 unexpectedly. */
1310 /* Macros that expand to case-labels for various classes of
1311 statements. Start with executable statements that directly do
1312 things. */
1314 #define case_executable case ST_ALLOCATE: case ST_BACKSPACE: case ST_CALL: \
1315 case ST_CLOSE: case ST_CONTINUE: case ST_DEALLOCATE: case ST_END_FILE: \
1316 case ST_GOTO: case ST_INQUIRE: case ST_NULLIFY: case ST_OPEN: \
1317 case ST_READ: case ST_RETURN: case ST_REWIND: case ST_SIMPLE_IF: \
1318 case ST_PAUSE: case ST_STOP: case ST_WAIT: case ST_WRITE: \
1319 case ST_POINTER_ASSIGNMENT: case ST_EXIT: case ST_CYCLE: \
1320 case ST_ASSIGNMENT: case ST_ARITHMETIC_IF: case ST_WHERE: case ST_FORALL: \
1321 case ST_LABEL_ASSIGNMENT: case ST_FLUSH: case ST_OMP_FLUSH: \
1322 case ST_OMP_BARRIER: case ST_OMP_TASKWAIT: case ST_OMP_TASKYIELD: \
1323 case ST_OMP_CANCEL: case ST_OMP_CANCELLATION_POINT: \
1324 case ST_OMP_TARGET_UPDATE: case ST_ERROR_STOP: case ST_SYNC_ALL: \
1325 case ST_SYNC_IMAGES: case ST_SYNC_MEMORY: case ST_LOCK: case ST_UNLOCK: \
1326 case ST_OACC_UPDATE: case ST_OACC_WAIT: case ST_OACC_CACHE: \
1327 case ST_OACC_ENTER_DATA: case ST_OACC_EXIT_DATA
1329 /* Statements that mark other executable statements. */
1331 #define case_exec_markers case ST_DO: case ST_FORALL_BLOCK: \
1332 case ST_IF_BLOCK: case ST_BLOCK: case ST_ASSOCIATE: \
1333 case ST_WHERE_BLOCK: case ST_SELECT_CASE: case ST_SELECT_TYPE: \
1334 case ST_OMP_PARALLEL: \
1335 case ST_OMP_PARALLEL_SECTIONS: case ST_OMP_SECTIONS: case ST_OMP_ORDERED: \
1336 case ST_OMP_CRITICAL: case ST_OMP_MASTER: case ST_OMP_SINGLE: \
1337 case ST_OMP_DO: case ST_OMP_PARALLEL_DO: case ST_OMP_ATOMIC: \
1338 case ST_OMP_WORKSHARE: case ST_OMP_PARALLEL_WORKSHARE: \
1339 case ST_OMP_TASK: case ST_OMP_TASKGROUP: case ST_OMP_SIMD: \
1340 case ST_OMP_DO_SIMD: case ST_OMP_PARALLEL_DO_SIMD: case ST_OMP_TARGET: \
1341 case ST_OMP_TARGET_DATA: case ST_OMP_TARGET_TEAMS: \
1342 case ST_OMP_TARGET_TEAMS_DISTRIBUTE: \
1343 case ST_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD: \
1344 case ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO: \
1345 case ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: \
1346 case ST_OMP_TEAMS: case ST_OMP_TEAMS_DISTRIBUTE: \
1347 case ST_OMP_TEAMS_DISTRIBUTE_SIMD: \
1348 case ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO: \
1349 case ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: case ST_OMP_DISTRIBUTE: \
1350 case ST_OMP_DISTRIBUTE_SIMD: case ST_OMP_DISTRIBUTE_PARALLEL_DO: \
1351 case ST_OMP_DISTRIBUTE_PARALLEL_DO_SIMD: \
1352 case ST_CRITICAL: \
1353 case ST_OACC_PARALLEL_LOOP: case ST_OACC_PARALLEL: case ST_OACC_KERNELS: \
1354 case ST_OACC_DATA: case ST_OACC_HOST_DATA: case ST_OACC_LOOP: case ST_OACC_KERNELS_LOOP
1356 /* Declaration statements */
1358 #define case_decl case ST_ATTR_DECL: case ST_COMMON: case ST_DATA_DECL: \
1359 case ST_EQUIVALENCE: case ST_NAMELIST: case ST_STATEMENT_FUNCTION: \
1360 case ST_TYPE: case ST_INTERFACE: case ST_OMP_THREADPRIVATE: \
1361 case ST_PROCEDURE: case ST_OMP_DECLARE_SIMD: case ST_OMP_DECLARE_REDUCTION: \
1362 case ST_OMP_DECLARE_TARGET: case ST_OACC_ROUTINE
1364 /* Block end statements. Errors associated with interchanging these
1365 are detected in gfc_match_end(). */
1367 #define case_end case ST_END_BLOCK_DATA: case ST_END_FUNCTION: \
1368 case ST_END_PROGRAM: case ST_END_SUBROUTINE: \
1369 case ST_END_BLOCK: case ST_END_ASSOCIATE
1372 /* Push a new state onto the stack. */
1374 static void
1375 push_state (gfc_state_data *p, gfc_compile_state new_state, gfc_symbol *sym)
1377 p->state = new_state;
1378 p->previous = gfc_state_stack;
1379 p->sym = sym;
1380 p->head = p->tail = NULL;
1381 p->do_variable = NULL;
1382 if (p->state != COMP_DO && p->state != COMP_DO_CONCURRENT)
1383 p->ext.oacc_declare_clauses = NULL;
1385 /* If this the state of a construct like BLOCK, DO or IF, the corresponding
1386 construct statement was accepted right before pushing the state. Thus,
1387 the construct's gfc_code is available as tail of the parent state. */
1388 gcc_assert (gfc_state_stack);
1389 p->construct = gfc_state_stack->tail;
1391 gfc_state_stack = p;
1395 /* Pop the current state. */
1396 static void
1397 pop_state (void)
1399 gfc_state_stack = gfc_state_stack->previous;
1403 /* Try to find the given state in the state stack. */
1405 bool
1406 gfc_find_state (gfc_compile_state state)
1408 gfc_state_data *p;
1410 for (p = gfc_state_stack; p; p = p->previous)
1411 if (p->state == state)
1412 break;
1414 return (p == NULL) ? false : true;
1418 /* Starts a new level in the statement list. */
1420 static gfc_code *
1421 new_level (gfc_code *q)
1423 gfc_code *p;
1425 p = q->block = gfc_get_code (EXEC_NOP);
1427 gfc_state_stack->head = gfc_state_stack->tail = p;
1429 return p;
1433 /* Add the current new_st code structure and adds it to the current
1434 program unit. As a side-effect, it zeroes the new_st. */
1436 static gfc_code *
1437 add_statement (void)
1439 gfc_code *p;
1441 p = XCNEW (gfc_code);
1442 *p = new_st;
1444 p->loc = gfc_current_locus;
1446 if (gfc_state_stack->head == NULL)
1447 gfc_state_stack->head = p;
1448 else
1449 gfc_state_stack->tail->next = p;
1451 while (p->next != NULL)
1452 p = p->next;
1454 gfc_state_stack->tail = p;
1456 gfc_clear_new_st ();
1458 return p;
1462 /* Frees everything associated with the current statement. */
1464 static void
1465 undo_new_statement (void)
1467 gfc_free_statements (new_st.block);
1468 gfc_free_statements (new_st.next);
1469 gfc_free_statement (&new_st);
1470 gfc_clear_new_st ();
1474 /* If the current statement has a statement label, make sure that it
1475 is allowed to, or should have one. */
1477 static void
1478 check_statement_label (gfc_statement st)
1480 gfc_sl_type type;
1482 if (gfc_statement_label == NULL)
1484 if (st == ST_FORMAT)
1485 gfc_error ("FORMAT statement at %L does not have a statement label",
1486 &new_st.loc);
1487 return;
1490 switch (st)
1492 case ST_END_PROGRAM:
1493 case ST_END_FUNCTION:
1494 case ST_END_SUBROUTINE:
1495 case ST_ENDDO:
1496 case ST_ENDIF:
1497 case ST_END_SELECT:
1498 case ST_END_CRITICAL:
1499 case ST_END_BLOCK:
1500 case ST_END_ASSOCIATE:
1501 case_executable:
1502 case_exec_markers:
1503 if (st == ST_ENDDO || st == ST_CONTINUE)
1504 type = ST_LABEL_DO_TARGET;
1505 else
1506 type = ST_LABEL_TARGET;
1507 break;
1509 case ST_FORMAT:
1510 type = ST_LABEL_FORMAT;
1511 break;
1513 /* Statement labels are not restricted from appearing on a
1514 particular line. However, there are plenty of situations
1515 where the resulting label can't be referenced. */
1517 default:
1518 type = ST_LABEL_BAD_TARGET;
1519 break;
1522 gfc_define_st_label (gfc_statement_label, type, &label_locus);
1524 new_st.here = gfc_statement_label;
1528 /* Figures out what the enclosing program unit is. This will be a
1529 function, subroutine, program, block data or module. */
1531 gfc_state_data *
1532 gfc_enclosing_unit (gfc_compile_state * result)
1534 gfc_state_data *p;
1536 for (p = gfc_state_stack; p; p = p->previous)
1537 if (p->state == COMP_FUNCTION || p->state == COMP_SUBROUTINE
1538 || p->state == COMP_MODULE || p->state == COMP_BLOCK_DATA
1539 || p->state == COMP_PROGRAM)
1542 if (result != NULL)
1543 *result = p->state;
1544 return p;
1547 if (result != NULL)
1548 *result = COMP_PROGRAM;
1549 return NULL;
1553 /* Translate a statement enum to a string. */
1555 const char *
1556 gfc_ascii_statement (gfc_statement st)
1558 const char *p;
1560 switch (st)
1562 case ST_ARITHMETIC_IF:
1563 p = _("arithmetic IF");
1564 break;
1565 case ST_ALLOCATE:
1566 p = "ALLOCATE";
1567 break;
1568 case ST_ASSOCIATE:
1569 p = "ASSOCIATE";
1570 break;
1571 case ST_ATTR_DECL:
1572 p = _("attribute declaration");
1573 break;
1574 case ST_BACKSPACE:
1575 p = "BACKSPACE";
1576 break;
1577 case ST_BLOCK:
1578 p = "BLOCK";
1579 break;
1580 case ST_BLOCK_DATA:
1581 p = "BLOCK DATA";
1582 break;
1583 case ST_CALL:
1584 p = "CALL";
1585 break;
1586 case ST_CASE:
1587 p = "CASE";
1588 break;
1589 case ST_CLOSE:
1590 p = "CLOSE";
1591 break;
1592 case ST_COMMON:
1593 p = "COMMON";
1594 break;
1595 case ST_CONTINUE:
1596 p = "CONTINUE";
1597 break;
1598 case ST_CONTAINS:
1599 p = "CONTAINS";
1600 break;
1601 case ST_CRITICAL:
1602 p = "CRITICAL";
1603 break;
1604 case ST_CYCLE:
1605 p = "CYCLE";
1606 break;
1607 case ST_DATA_DECL:
1608 p = _("data declaration");
1609 break;
1610 case ST_DATA:
1611 p = "DATA";
1612 break;
1613 case ST_DEALLOCATE:
1614 p = "DEALLOCATE";
1615 break;
1616 case ST_DERIVED_DECL:
1617 p = _("derived type declaration");
1618 break;
1619 case ST_DO:
1620 p = "DO";
1621 break;
1622 case ST_ELSE:
1623 p = "ELSE";
1624 break;
1625 case ST_ELSEIF:
1626 p = "ELSE IF";
1627 break;
1628 case ST_ELSEWHERE:
1629 p = "ELSEWHERE";
1630 break;
1631 case ST_END_ASSOCIATE:
1632 p = "END ASSOCIATE";
1633 break;
1634 case ST_END_BLOCK:
1635 p = "END BLOCK";
1636 break;
1637 case ST_END_BLOCK_DATA:
1638 p = "END BLOCK DATA";
1639 break;
1640 case ST_END_CRITICAL:
1641 p = "END CRITICAL";
1642 break;
1643 case ST_ENDDO:
1644 p = "END DO";
1645 break;
1646 case ST_END_FILE:
1647 p = "END FILE";
1648 break;
1649 case ST_END_FORALL:
1650 p = "END FORALL";
1651 break;
1652 case ST_END_FUNCTION:
1653 p = "END FUNCTION";
1654 break;
1655 case ST_ENDIF:
1656 p = "END IF";
1657 break;
1658 case ST_END_INTERFACE:
1659 p = "END INTERFACE";
1660 break;
1661 case ST_END_MODULE:
1662 p = "END MODULE";
1663 break;
1664 case ST_END_PROGRAM:
1665 p = "END PROGRAM";
1666 break;
1667 case ST_END_SELECT:
1668 p = "END SELECT";
1669 break;
1670 case ST_END_SUBROUTINE:
1671 p = "END SUBROUTINE";
1672 break;
1673 case ST_END_WHERE:
1674 p = "END WHERE";
1675 break;
1676 case ST_END_TYPE:
1677 p = "END TYPE";
1678 break;
1679 case ST_ENTRY:
1680 p = "ENTRY";
1681 break;
1682 case ST_EQUIVALENCE:
1683 p = "EQUIVALENCE";
1684 break;
1685 case ST_ERROR_STOP:
1686 p = "ERROR STOP";
1687 break;
1688 case ST_EXIT:
1689 p = "EXIT";
1690 break;
1691 case ST_FLUSH:
1692 p = "FLUSH";
1693 break;
1694 case ST_FORALL_BLOCK: /* Fall through */
1695 case ST_FORALL:
1696 p = "FORALL";
1697 break;
1698 case ST_FORMAT:
1699 p = "FORMAT";
1700 break;
1701 case ST_FUNCTION:
1702 p = "FUNCTION";
1703 break;
1704 case ST_GENERIC:
1705 p = "GENERIC";
1706 break;
1707 case ST_GOTO:
1708 p = "GOTO";
1709 break;
1710 case ST_IF_BLOCK:
1711 p = _("block IF");
1712 break;
1713 case ST_IMPLICIT:
1714 p = "IMPLICIT";
1715 break;
1716 case ST_IMPLICIT_NONE:
1717 p = "IMPLICIT NONE";
1718 break;
1719 case ST_IMPLIED_ENDDO:
1720 p = _("implied END DO");
1721 break;
1722 case ST_IMPORT:
1723 p = "IMPORT";
1724 break;
1725 case ST_INQUIRE:
1726 p = "INQUIRE";
1727 break;
1728 case ST_INTERFACE:
1729 p = "INTERFACE";
1730 break;
1731 case ST_LOCK:
1732 p = "LOCK";
1733 break;
1734 case ST_PARAMETER:
1735 p = "PARAMETER";
1736 break;
1737 case ST_PRIVATE:
1738 p = "PRIVATE";
1739 break;
1740 case ST_PUBLIC:
1741 p = "PUBLIC";
1742 break;
1743 case ST_MODULE:
1744 p = "MODULE";
1745 break;
1746 case ST_PAUSE:
1747 p = "PAUSE";
1748 break;
1749 case ST_MODULE_PROC:
1750 p = "MODULE PROCEDURE";
1751 break;
1752 case ST_NAMELIST:
1753 p = "NAMELIST";
1754 break;
1755 case ST_NULLIFY:
1756 p = "NULLIFY";
1757 break;
1758 case ST_OPEN:
1759 p = "OPEN";
1760 break;
1761 case ST_PROGRAM:
1762 p = "PROGRAM";
1763 break;
1764 case ST_PROCEDURE:
1765 p = "PROCEDURE";
1766 break;
1767 case ST_READ:
1768 p = "READ";
1769 break;
1770 case ST_RETURN:
1771 p = "RETURN";
1772 break;
1773 case ST_REWIND:
1774 p = "REWIND";
1775 break;
1776 case ST_STOP:
1777 p = "STOP";
1778 break;
1779 case ST_SYNC_ALL:
1780 p = "SYNC ALL";
1781 break;
1782 case ST_SYNC_IMAGES:
1783 p = "SYNC IMAGES";
1784 break;
1785 case ST_SYNC_MEMORY:
1786 p = "SYNC MEMORY";
1787 break;
1788 case ST_SUBROUTINE:
1789 p = "SUBROUTINE";
1790 break;
1791 case ST_TYPE:
1792 p = "TYPE";
1793 break;
1794 case ST_UNLOCK:
1795 p = "UNLOCK";
1796 break;
1797 case ST_USE:
1798 p = "USE";
1799 break;
1800 case ST_WHERE_BLOCK: /* Fall through */
1801 case ST_WHERE:
1802 p = "WHERE";
1803 break;
1804 case ST_WAIT:
1805 p = "WAIT";
1806 break;
1807 case ST_WRITE:
1808 p = "WRITE";
1809 break;
1810 case ST_ASSIGNMENT:
1811 p = _("assignment");
1812 break;
1813 case ST_POINTER_ASSIGNMENT:
1814 p = _("pointer assignment");
1815 break;
1816 case ST_SELECT_CASE:
1817 p = "SELECT CASE";
1818 break;
1819 case ST_SELECT_TYPE:
1820 p = "SELECT TYPE";
1821 break;
1822 case ST_TYPE_IS:
1823 p = "TYPE IS";
1824 break;
1825 case ST_CLASS_IS:
1826 p = "CLASS IS";
1827 break;
1828 case ST_SEQUENCE:
1829 p = "SEQUENCE";
1830 break;
1831 case ST_SIMPLE_IF:
1832 p = _("simple IF");
1833 break;
1834 case ST_STATEMENT_FUNCTION:
1835 p = "STATEMENT FUNCTION";
1836 break;
1837 case ST_LABEL_ASSIGNMENT:
1838 p = "LABEL ASSIGNMENT";
1839 break;
1840 case ST_ENUM:
1841 p = "ENUM DEFINITION";
1842 break;
1843 case ST_ENUMERATOR:
1844 p = "ENUMERATOR DEFINITION";
1845 break;
1846 case ST_END_ENUM:
1847 p = "END ENUM";
1848 break;
1849 case ST_OACC_PARALLEL_LOOP:
1850 p = "!$ACC PARALLEL LOOP";
1851 break;
1852 case ST_OACC_END_PARALLEL_LOOP:
1853 p = "!$ACC END PARALLEL LOOP";
1854 break;
1855 case ST_OACC_PARALLEL:
1856 p = "!$ACC PARALLEL";
1857 break;
1858 case ST_OACC_END_PARALLEL:
1859 p = "!$ACC END PARALLEL";
1860 break;
1861 case ST_OACC_KERNELS:
1862 p = "!$ACC KERNELS";
1863 break;
1864 case ST_OACC_END_KERNELS:
1865 p = "!$ACC END KERNELS";
1866 break;
1867 case ST_OACC_KERNELS_LOOP:
1868 p = "!$ACC KERNELS LOOP";
1869 break;
1870 case ST_OACC_END_KERNELS_LOOP:
1871 p = "!$ACC END KERNELS LOOP";
1872 break;
1873 case ST_OACC_DATA:
1874 p = "!$ACC DATA";
1875 break;
1876 case ST_OACC_END_DATA:
1877 p = "!$ACC END DATA";
1878 break;
1879 case ST_OACC_HOST_DATA:
1880 p = "!$ACC HOST_DATA";
1881 break;
1882 case ST_OACC_END_HOST_DATA:
1883 p = "!$ACC END HOST_DATA";
1884 break;
1885 case ST_OACC_LOOP:
1886 p = "!$ACC LOOP";
1887 break;
1888 case ST_OACC_END_LOOP:
1889 p = "!$ACC END LOOP";
1890 break;
1891 case ST_OACC_DECLARE:
1892 p = "!$ACC DECLARE";
1893 break;
1894 case ST_OACC_UPDATE:
1895 p = "!$ACC UPDATE";
1896 break;
1897 case ST_OACC_WAIT:
1898 p = "!$ACC WAIT";
1899 break;
1900 case ST_OACC_CACHE:
1901 p = "!$ACC CACHE";
1902 break;
1903 case ST_OACC_ENTER_DATA:
1904 p = "!$ACC ENTER DATA";
1905 break;
1906 case ST_OACC_EXIT_DATA:
1907 p = "!$ACC EXIT DATA";
1908 break;
1909 case ST_OACC_ROUTINE:
1910 p = "!$ACC ROUTINE";
1911 break;
1912 case ST_OMP_ATOMIC:
1913 p = "!$OMP ATOMIC";
1914 break;
1915 case ST_OMP_BARRIER:
1916 p = "!$OMP BARRIER";
1917 break;
1918 case ST_OMP_CANCEL:
1919 p = "!$OMP CANCEL";
1920 break;
1921 case ST_OMP_CANCELLATION_POINT:
1922 p = "!$OMP CANCELLATION POINT";
1923 break;
1924 case ST_OMP_CRITICAL:
1925 p = "!$OMP CRITICAL";
1926 break;
1927 case ST_OMP_DECLARE_REDUCTION:
1928 p = "!$OMP DECLARE REDUCTION";
1929 break;
1930 case ST_OMP_DECLARE_SIMD:
1931 p = "!$OMP DECLARE SIMD";
1932 break;
1933 case ST_OMP_DECLARE_TARGET:
1934 p = "!$OMP DECLARE TARGET";
1935 break;
1936 case ST_OMP_DISTRIBUTE:
1937 p = "!$OMP DISTRIBUTE";
1938 break;
1939 case ST_OMP_DISTRIBUTE_PARALLEL_DO:
1940 p = "!$OMP DISTRIBUTE PARALLEL DO";
1941 break;
1942 case ST_OMP_DISTRIBUTE_PARALLEL_DO_SIMD:
1943 p = "!$OMP DISTRIBUTE PARALLEL DO SIMD";
1944 break;
1945 case ST_OMP_DISTRIBUTE_SIMD:
1946 p = "!$OMP DISTRIBUTE SIMD";
1947 break;
1948 case ST_OMP_DO:
1949 p = "!$OMP DO";
1950 break;
1951 case ST_OMP_DO_SIMD:
1952 p = "!$OMP DO SIMD";
1953 break;
1954 case ST_OMP_END_ATOMIC:
1955 p = "!$OMP END ATOMIC";
1956 break;
1957 case ST_OMP_END_CRITICAL:
1958 p = "!$OMP END CRITICAL";
1959 break;
1960 case ST_OMP_END_DISTRIBUTE:
1961 p = "!$OMP END DISTRIBUTE";
1962 break;
1963 case ST_OMP_END_DISTRIBUTE_PARALLEL_DO:
1964 p = "!$OMP END DISTRIBUTE PARALLEL DO";
1965 break;
1966 case ST_OMP_END_DISTRIBUTE_PARALLEL_DO_SIMD:
1967 p = "!$OMP END DISTRIBUTE PARALLEL DO SIMD";
1968 break;
1969 case ST_OMP_END_DISTRIBUTE_SIMD:
1970 p = "!$OMP END DISTRIBUTE SIMD";
1971 break;
1972 case ST_OMP_END_DO:
1973 p = "!$OMP END DO";
1974 break;
1975 case ST_OMP_END_DO_SIMD:
1976 p = "!$OMP END DO SIMD";
1977 break;
1978 case ST_OMP_END_SIMD:
1979 p = "!$OMP END SIMD";
1980 break;
1981 case ST_OMP_END_MASTER:
1982 p = "!$OMP END MASTER";
1983 break;
1984 case ST_OMP_END_ORDERED:
1985 p = "!$OMP END ORDERED";
1986 break;
1987 case ST_OMP_END_PARALLEL:
1988 p = "!$OMP END PARALLEL";
1989 break;
1990 case ST_OMP_END_PARALLEL_DO:
1991 p = "!$OMP END PARALLEL DO";
1992 break;
1993 case ST_OMP_END_PARALLEL_DO_SIMD:
1994 p = "!$OMP END PARALLEL DO SIMD";
1995 break;
1996 case ST_OMP_END_PARALLEL_SECTIONS:
1997 p = "!$OMP END PARALLEL SECTIONS";
1998 break;
1999 case ST_OMP_END_PARALLEL_WORKSHARE:
2000 p = "!$OMP END PARALLEL WORKSHARE";
2001 break;
2002 case ST_OMP_END_SECTIONS:
2003 p = "!$OMP END SECTIONS";
2004 break;
2005 case ST_OMP_END_SINGLE:
2006 p = "!$OMP END SINGLE";
2007 break;
2008 case ST_OMP_END_TASK:
2009 p = "!$OMP END TASK";
2010 break;
2011 case ST_OMP_END_TARGET:
2012 p = "!$OMP END TARGET";
2013 break;
2014 case ST_OMP_END_TARGET_DATA:
2015 p = "!$OMP END TARGET DATA";
2016 break;
2017 case ST_OMP_END_TARGET_TEAMS:
2018 p = "!$OMP END TARGET TEAMS";
2019 break;
2020 case ST_OMP_END_TARGET_TEAMS_DISTRIBUTE:
2021 p = "!$OMP END TARGET TEAMS DISTRIBUTE";
2022 break;
2023 case ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO:
2024 p = "!$OMP END TARGET TEAMS DISTRIBUTE PARALLEL DO";
2025 break;
2026 case ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
2027 p = "!$OMP END TARGET TEAMS DISTRIBUTE PARALLEL DO SIMD";
2028 break;
2029 case ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_SIMD:
2030 p = "!$OMP END TARGET TEAMS DISTRIBUTE SIMD";
2031 break;
2032 case ST_OMP_END_TASKGROUP:
2033 p = "!$OMP END TASKGROUP";
2034 break;
2035 case ST_OMP_END_TEAMS:
2036 p = "!$OMP END TEAMS";
2037 break;
2038 case ST_OMP_END_TEAMS_DISTRIBUTE:
2039 p = "!$OMP END TEAMS DISTRIBUTE";
2040 break;
2041 case ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO:
2042 p = "!$OMP END TEAMS DISTRIBUTE PARALLEL DO";
2043 break;
2044 case ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
2045 p = "!$OMP END TEAMS DISTRIBUTE PARALLEL DO SIMD";
2046 break;
2047 case ST_OMP_END_TEAMS_DISTRIBUTE_SIMD:
2048 p = "!$OMP END TEAMS DISTRIBUTE SIMD";
2049 break;
2050 case ST_OMP_END_WORKSHARE:
2051 p = "!$OMP END WORKSHARE";
2052 break;
2053 case ST_OMP_FLUSH:
2054 p = "!$OMP FLUSH";
2055 break;
2056 case ST_OMP_MASTER:
2057 p = "!$OMP MASTER";
2058 break;
2059 case ST_OMP_ORDERED:
2060 p = "!$OMP ORDERED";
2061 break;
2062 case ST_OMP_PARALLEL:
2063 p = "!$OMP PARALLEL";
2064 break;
2065 case ST_OMP_PARALLEL_DO:
2066 p = "!$OMP PARALLEL DO";
2067 break;
2068 case ST_OMP_PARALLEL_DO_SIMD:
2069 p = "!$OMP PARALLEL DO SIMD";
2070 break;
2071 case ST_OMP_PARALLEL_SECTIONS:
2072 p = "!$OMP PARALLEL SECTIONS";
2073 break;
2074 case ST_OMP_PARALLEL_WORKSHARE:
2075 p = "!$OMP PARALLEL WORKSHARE";
2076 break;
2077 case ST_OMP_SECTIONS:
2078 p = "!$OMP SECTIONS";
2079 break;
2080 case ST_OMP_SECTION:
2081 p = "!$OMP SECTION";
2082 break;
2083 case ST_OMP_SIMD:
2084 p = "!$OMP SIMD";
2085 break;
2086 case ST_OMP_SINGLE:
2087 p = "!$OMP SINGLE";
2088 break;
2089 case ST_OMP_TARGET:
2090 p = "!$OMP TARGET";
2091 break;
2092 case ST_OMP_TARGET_DATA:
2093 p = "!$OMP TARGET DATA";
2094 break;
2095 case ST_OMP_TARGET_TEAMS:
2096 p = "!$OMP TARGET TEAMS";
2097 break;
2098 case ST_OMP_TARGET_TEAMS_DISTRIBUTE:
2099 p = "!$OMP TARGET TEAMS DISTRIBUTE";
2100 break;
2101 case ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO:
2102 p = "!$OMP TARGET TEAMS DISTRIBUTE PARALLEL DO";
2103 break;
2104 case ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
2105 p = "!$OMP TARGET TEAMS DISTRIBUTE PARALLEL DO SIMD";
2106 break;
2107 case ST_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD:
2108 p = "!$OMP TARGET TEAMS DISTRIBUTE SIMD";
2109 break;
2110 case ST_OMP_TARGET_UPDATE:
2111 p = "!$OMP TARGET UPDATE";
2112 break;
2113 case ST_OMP_TASK:
2114 p = "!$OMP TASK";
2115 break;
2116 case ST_OMP_TASKGROUP:
2117 p = "!$OMP TASKGROUP";
2118 break;
2119 case ST_OMP_TASKWAIT:
2120 p = "!$OMP TASKWAIT";
2121 break;
2122 case ST_OMP_TASKYIELD:
2123 p = "!$OMP TASKYIELD";
2124 break;
2125 case ST_OMP_TEAMS:
2126 p = "!$OMP TEAMS";
2127 break;
2128 case ST_OMP_TEAMS_DISTRIBUTE:
2129 p = "!$OMP TEAMS DISTRIBUTE";
2130 break;
2131 case ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO:
2132 p = "!$OMP TEAMS DISTRIBUTE PARALLEL DO";
2133 break;
2134 case ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
2135 p = "!$OMP TEAMS DISTRIBUTE PARALLEL DO SIMD";
2136 break;
2137 case ST_OMP_TEAMS_DISTRIBUTE_SIMD:
2138 p = "!$OMP TEAMS DISTRIBUTE SIMD";
2139 break;
2140 case ST_OMP_THREADPRIVATE:
2141 p = "!$OMP THREADPRIVATE";
2142 break;
2143 case ST_OMP_WORKSHARE:
2144 p = "!$OMP WORKSHARE";
2145 break;
2146 default:
2147 gfc_internal_error ("gfc_ascii_statement(): Bad statement code");
2150 return p;
2154 /* Create a symbol for the main program and assign it to ns->proc_name. */
2156 static void
2157 main_program_symbol (gfc_namespace *ns, const char *name)
2159 gfc_symbol *main_program;
2160 symbol_attribute attr;
2162 gfc_get_symbol (name, ns, &main_program);
2163 gfc_clear_attr (&attr);
2164 attr.flavor = FL_PROGRAM;
2165 attr.proc = PROC_UNKNOWN;
2166 attr.subroutine = 1;
2167 attr.access = ACCESS_PUBLIC;
2168 attr.is_main_program = 1;
2169 main_program->attr = attr;
2170 main_program->declared_at = gfc_current_locus;
2171 ns->proc_name = main_program;
2172 gfc_commit_symbols ();
2176 /* Do whatever is necessary to accept the last statement. */
2178 static void
2179 accept_statement (gfc_statement st)
2181 switch (st)
2183 case ST_IMPLICIT_NONE:
2184 case ST_IMPLICIT:
2185 break;
2187 case ST_FUNCTION:
2188 case ST_SUBROUTINE:
2189 case ST_MODULE:
2190 gfc_current_ns->proc_name = gfc_new_block;
2191 break;
2193 /* If the statement is the end of a block, lay down a special code
2194 that allows a branch to the end of the block from within the
2195 construct. IF and SELECT are treated differently from DO
2196 (where EXEC_NOP is added inside the loop) for two
2197 reasons:
2198 1. END DO has a meaning in the sense that after a GOTO to
2199 it, the loop counter must be increased.
2200 2. IF blocks and SELECT blocks can consist of multiple
2201 parallel blocks (IF ... ELSE IF ... ELSE ... END IF).
2202 Putting the label before the END IF would make the jump
2203 from, say, the ELSE IF block to the END IF illegal. */
2205 case ST_ENDIF:
2206 case ST_END_SELECT:
2207 case ST_END_CRITICAL:
2208 if (gfc_statement_label != NULL)
2210 new_st.op = EXEC_END_NESTED_BLOCK;
2211 add_statement ();
2213 break;
2215 /* In the case of BLOCK and ASSOCIATE blocks, there cannot be more than
2216 one parallel block. Thus, we add the special code to the nested block
2217 itself, instead of the parent one. */
2218 case ST_END_BLOCK:
2219 case ST_END_ASSOCIATE:
2220 if (gfc_statement_label != NULL)
2222 new_st.op = EXEC_END_BLOCK;
2223 add_statement ();
2225 break;
2227 /* The end-of-program unit statements do not get the special
2228 marker and require a statement of some sort if they are a
2229 branch target. */
2231 case ST_END_PROGRAM:
2232 case ST_END_FUNCTION:
2233 case ST_END_SUBROUTINE:
2234 if (gfc_statement_label != NULL)
2236 new_st.op = EXEC_RETURN;
2237 add_statement ();
2239 else
2241 new_st.op = EXEC_END_PROCEDURE;
2242 add_statement ();
2245 break;
2247 case ST_ENTRY:
2248 case_executable:
2249 case_exec_markers:
2250 add_statement ();
2251 break;
2253 default:
2254 break;
2257 gfc_commit_symbols ();
2258 gfc_warning_check ();
2259 gfc_clear_new_st ();
2263 /* Undo anything tentative that has been built for the current
2264 statement. */
2266 static void
2267 reject_statement (void)
2269 /* Revert to the previous charlen chain. */
2270 gfc_free_charlen (gfc_current_ns->cl_list, gfc_current_ns->old_cl_list);
2271 gfc_current_ns->cl_list = gfc_current_ns->old_cl_list;
2273 gfc_free_equiv_until (gfc_current_ns->equiv, gfc_current_ns->old_equiv);
2274 gfc_current_ns->equiv = gfc_current_ns->old_equiv;
2276 gfc_new_block = NULL;
2277 gfc_undo_symbols ();
2278 gfc_clear_warning ();
2279 undo_new_statement ();
2283 /* Generic complaint about an out of order statement. We also do
2284 whatever is necessary to clean up. */
2286 static void
2287 unexpected_statement (gfc_statement st)
2289 gfc_error ("Unexpected %s statement at %C", gfc_ascii_statement (st));
2291 reject_statement ();
2295 /* Given the next statement seen by the matcher, make sure that it is
2296 in proper order with the last. This subroutine is initialized by
2297 calling it with an argument of ST_NONE. If there is a problem, we
2298 issue an error and return false. Otherwise we return true.
2300 Individual parsers need to verify that the statements seen are
2301 valid before calling here, i.e., ENTRY statements are not allowed in
2302 INTERFACE blocks. The following diagram is taken from the standard:
2304 +---------------------------------------+
2305 | program subroutine function module |
2306 +---------------------------------------+
2307 | use |
2308 +---------------------------------------+
2309 | import |
2310 +---------------------------------------+
2311 | | implicit none |
2312 | +-----------+------------------+
2313 | | parameter | implicit |
2314 | +-----------+------------------+
2315 | format | | derived type |
2316 | entry | parameter | interface |
2317 | | data | specification |
2318 | | | statement func |
2319 | +-----------+------------------+
2320 | | data | executable |
2321 +--------+-----------+------------------+
2322 | contains |
2323 +---------------------------------------+
2324 | internal module/subprogram |
2325 +---------------------------------------+
2326 | end |
2327 +---------------------------------------+
2331 enum state_order
2333 ORDER_START,
2334 ORDER_USE,
2335 ORDER_IMPORT,
2336 ORDER_IMPLICIT_NONE,
2337 ORDER_IMPLICIT,
2338 ORDER_SPEC,
2339 ORDER_EXEC
2342 typedef struct
2344 enum state_order state;
2345 gfc_statement last_statement;
2346 locus where;
2348 st_state;
2350 static bool
2351 verify_st_order (st_state *p, gfc_statement st, bool silent)
2354 switch (st)
2356 case ST_NONE:
2357 p->state = ORDER_START;
2358 break;
2360 case ST_USE:
2361 if (p->state > ORDER_USE)
2362 goto order;
2363 p->state = ORDER_USE;
2364 break;
2366 case ST_IMPORT:
2367 if (p->state > ORDER_IMPORT)
2368 goto order;
2369 p->state = ORDER_IMPORT;
2370 break;
2372 case ST_IMPLICIT_NONE:
2373 if (p->state > ORDER_IMPLICIT)
2374 goto order;
2376 /* The '>' sign cannot be a '>=', because a FORMAT or ENTRY
2377 statement disqualifies a USE but not an IMPLICIT NONE.
2378 Duplicate IMPLICIT NONEs are caught when the implicit types
2379 are set. */
2381 p->state = ORDER_IMPLICIT_NONE;
2382 break;
2384 case ST_IMPLICIT:
2385 if (p->state > ORDER_IMPLICIT)
2386 goto order;
2387 p->state = ORDER_IMPLICIT;
2388 break;
2390 case ST_FORMAT:
2391 case ST_ENTRY:
2392 if (p->state < ORDER_IMPLICIT_NONE)
2393 p->state = ORDER_IMPLICIT_NONE;
2394 break;
2396 case ST_PARAMETER:
2397 if (p->state >= ORDER_EXEC)
2398 goto order;
2399 if (p->state < ORDER_IMPLICIT)
2400 p->state = ORDER_IMPLICIT;
2401 break;
2403 case ST_DATA:
2404 if (p->state < ORDER_SPEC)
2405 p->state = ORDER_SPEC;
2406 break;
2408 case ST_PUBLIC:
2409 case ST_PRIVATE:
2410 case ST_DERIVED_DECL:
2411 case ST_OACC_DECLARE:
2412 case_decl:
2413 if (p->state >= ORDER_EXEC)
2414 goto order;
2415 if (p->state < ORDER_SPEC)
2416 p->state = ORDER_SPEC;
2417 break;
2419 case_executable:
2420 case_exec_markers:
2421 if (p->state < ORDER_EXEC)
2422 p->state = ORDER_EXEC;
2423 break;
2425 default:
2426 gfc_internal_error ("Unexpected %s statement in verify_st_order() at %C",
2427 gfc_ascii_statement (st));
2430 /* All is well, record the statement in case we need it next time. */
2431 p->where = gfc_current_locus;
2432 p->last_statement = st;
2433 return true;
2435 order:
2436 if (!silent)
2437 gfc_error ("%s statement at %C cannot follow %s statement at %L",
2438 gfc_ascii_statement (st),
2439 gfc_ascii_statement (p->last_statement), &p->where);
2441 return false;
2445 /* Handle an unexpected end of file. This is a show-stopper... */
2447 static void unexpected_eof (void) ATTRIBUTE_NORETURN;
2449 static void
2450 unexpected_eof (void)
2452 gfc_state_data *p;
2454 gfc_error ("Unexpected end of file in '%s'", gfc_source_file);
2456 /* Memory cleanup. Move to "second to last". */
2457 for (p = gfc_state_stack; p && p->previous && p->previous->previous;
2458 p = p->previous);
2460 gfc_current_ns->code = (p && p->previous) ? p->head : NULL;
2461 gfc_done_2 ();
2463 longjmp (eof_buf, 1);
2467 /* Parse the CONTAINS section of a derived type definition. */
2469 gfc_access gfc_typebound_default_access;
2471 static bool
2472 parse_derived_contains (void)
2474 gfc_state_data s;
2475 bool seen_private = false;
2476 bool seen_comps = false;
2477 bool error_flag = false;
2478 bool to_finish;
2480 gcc_assert (gfc_current_state () == COMP_DERIVED);
2481 gcc_assert (gfc_current_block ());
2483 /* Derived-types with SEQUENCE and/or BIND(C) must not have a CONTAINS
2484 section. */
2485 if (gfc_current_block ()->attr.sequence)
2486 gfc_error ("Derived-type '%s' with SEQUENCE must not have a CONTAINS"
2487 " section at %C", gfc_current_block ()->name);
2488 if (gfc_current_block ()->attr.is_bind_c)
2489 gfc_error ("Derived-type '%s' with BIND(C) must not have a CONTAINS"
2490 " section at %C", gfc_current_block ()->name);
2492 accept_statement (ST_CONTAINS);
2493 push_state (&s, COMP_DERIVED_CONTAINS, NULL);
2495 gfc_typebound_default_access = ACCESS_PUBLIC;
2497 to_finish = false;
2498 while (!to_finish)
2500 gfc_statement st;
2501 st = next_statement ();
2502 switch (st)
2504 case ST_NONE:
2505 unexpected_eof ();
2506 break;
2508 case ST_DATA_DECL:
2509 gfc_error ("Components in TYPE at %C must precede CONTAINS");
2510 goto error;
2512 case ST_PROCEDURE:
2513 if (!gfc_notify_std (GFC_STD_F2003, "Type-bound procedure at %C"))
2514 goto error;
2516 accept_statement (ST_PROCEDURE);
2517 seen_comps = true;
2518 break;
2520 case ST_GENERIC:
2521 if (!gfc_notify_std (GFC_STD_F2003, "GENERIC binding at %C"))
2522 goto error;
2524 accept_statement (ST_GENERIC);
2525 seen_comps = true;
2526 break;
2528 case ST_FINAL:
2529 if (!gfc_notify_std (GFC_STD_F2003, "FINAL procedure declaration"
2530 " at %C"))
2531 goto error;
2533 accept_statement (ST_FINAL);
2534 seen_comps = true;
2535 break;
2537 case ST_END_TYPE:
2538 to_finish = true;
2540 if (!seen_comps
2541 && (!gfc_notify_std(GFC_STD_F2008, "Derived type definition "
2542 "at %C with empty CONTAINS section")))
2543 goto error;
2545 /* ST_END_TYPE is accepted by parse_derived after return. */
2546 break;
2548 case ST_PRIVATE:
2549 if (!gfc_find_state (COMP_MODULE))
2551 gfc_error ("PRIVATE statement in TYPE at %C must be inside "
2552 "a MODULE");
2553 goto error;
2556 if (seen_comps)
2558 gfc_error ("PRIVATE statement at %C must precede procedure"
2559 " bindings");
2560 goto error;
2563 if (seen_private)
2565 gfc_error ("Duplicate PRIVATE statement at %C");
2566 goto error;
2569 accept_statement (ST_PRIVATE);
2570 gfc_typebound_default_access = ACCESS_PRIVATE;
2571 seen_private = true;
2572 break;
2574 case ST_SEQUENCE:
2575 gfc_error ("SEQUENCE statement at %C must precede CONTAINS");
2576 goto error;
2578 case ST_CONTAINS:
2579 gfc_error ("Already inside a CONTAINS block at %C");
2580 goto error;
2582 default:
2583 unexpected_statement (st);
2584 break;
2587 continue;
2589 error:
2590 error_flag = true;
2591 reject_statement ();
2594 pop_state ();
2595 gcc_assert (gfc_current_state () == COMP_DERIVED);
2597 return error_flag;
2601 /* Parse a derived type. */
2603 static void
2604 parse_derived (void)
2606 int compiling_type, seen_private, seen_sequence, seen_component;
2607 gfc_statement st;
2608 gfc_state_data s;
2609 gfc_symbol *sym;
2610 gfc_component *c, *lock_comp = NULL;
2612 accept_statement (ST_DERIVED_DECL);
2613 push_state (&s, COMP_DERIVED, gfc_new_block);
2615 gfc_new_block->component_access = ACCESS_PUBLIC;
2616 seen_private = 0;
2617 seen_sequence = 0;
2618 seen_component = 0;
2620 compiling_type = 1;
2622 while (compiling_type)
2624 st = next_statement ();
2625 switch (st)
2627 case ST_NONE:
2628 unexpected_eof ();
2630 case ST_DATA_DECL:
2631 case ST_PROCEDURE:
2632 accept_statement (st);
2633 seen_component = 1;
2634 break;
2636 case ST_FINAL:
2637 gfc_error ("FINAL declaration at %C must be inside CONTAINS");
2638 break;
2640 case ST_END_TYPE:
2641 endType:
2642 compiling_type = 0;
2644 if (!seen_component)
2645 gfc_notify_std (GFC_STD_F2003, "Derived type "
2646 "definition at %C without components");
2648 accept_statement (ST_END_TYPE);
2649 break;
2651 case ST_PRIVATE:
2652 if (!gfc_find_state (COMP_MODULE))
2654 gfc_error ("PRIVATE statement in TYPE at %C must be inside "
2655 "a MODULE");
2656 break;
2659 if (seen_component)
2661 gfc_error ("PRIVATE statement at %C must precede "
2662 "structure components");
2663 break;
2666 if (seen_private)
2667 gfc_error ("Duplicate PRIVATE statement at %C");
2669 s.sym->component_access = ACCESS_PRIVATE;
2671 accept_statement (ST_PRIVATE);
2672 seen_private = 1;
2673 break;
2675 case ST_SEQUENCE:
2676 if (seen_component)
2678 gfc_error ("SEQUENCE statement at %C must precede "
2679 "structure components");
2680 break;
2683 if (gfc_current_block ()->attr.sequence)
2684 gfc_warning ("SEQUENCE attribute at %C already specified in "
2685 "TYPE statement");
2687 if (seen_sequence)
2689 gfc_error ("Duplicate SEQUENCE statement at %C");
2692 seen_sequence = 1;
2693 gfc_add_sequence (&gfc_current_block ()->attr,
2694 gfc_current_block ()->name, NULL);
2695 break;
2697 case ST_CONTAINS:
2698 gfc_notify_std (GFC_STD_F2003,
2699 "CONTAINS block in derived type"
2700 " definition at %C");
2702 accept_statement (ST_CONTAINS);
2703 parse_derived_contains ();
2704 goto endType;
2706 default:
2707 unexpected_statement (st);
2708 break;
2712 /* need to verify that all fields of the derived type are
2713 * interoperable with C if the type is declared to be bind(c)
2715 sym = gfc_current_block ();
2716 for (c = sym->components; c; c = c->next)
2718 bool coarray, lock_type, allocatable, pointer;
2719 coarray = lock_type = allocatable = pointer = false;
2721 /* Look for allocatable components. */
2722 if (c->attr.allocatable
2723 || (c->ts.type == BT_CLASS && c->attr.class_ok
2724 && CLASS_DATA (c)->attr.allocatable)
2725 || (c->ts.type == BT_DERIVED && !c->attr.pointer
2726 && c->ts.u.derived->attr.alloc_comp))
2728 allocatable = true;
2729 sym->attr.alloc_comp = 1;
2732 /* Look for pointer components. */
2733 if (c->attr.pointer
2734 || (c->ts.type == BT_CLASS && c->attr.class_ok
2735 && CLASS_DATA (c)->attr.class_pointer)
2736 || (c->ts.type == BT_DERIVED && c->ts.u.derived->attr.pointer_comp))
2738 pointer = true;
2739 sym->attr.pointer_comp = 1;
2742 /* Look for procedure pointer components. */
2743 if (c->attr.proc_pointer
2744 || (c->ts.type == BT_DERIVED
2745 && c->ts.u.derived->attr.proc_pointer_comp))
2746 sym->attr.proc_pointer_comp = 1;
2748 /* Looking for coarray components. */
2749 if (c->attr.codimension
2750 || (c->ts.type == BT_CLASS && c->attr.class_ok
2751 && CLASS_DATA (c)->attr.codimension))
2753 coarray = true;
2754 sym->attr.coarray_comp = 1;
2757 if (c->ts.type == BT_DERIVED && c->ts.u.derived->attr.coarray_comp
2758 && !c->attr.pointer)
2760 coarray = true;
2761 sym->attr.coarray_comp = 1;
2764 /* Looking for lock_type components. */
2765 if ((c->ts.type == BT_DERIVED
2766 && c->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
2767 && c->ts.u.derived->intmod_sym_id == ISOFORTRAN_LOCK_TYPE)
2768 || (c->ts.type == BT_CLASS && c->attr.class_ok
2769 && CLASS_DATA (c)->ts.u.derived->from_intmod
2770 == INTMOD_ISO_FORTRAN_ENV
2771 && CLASS_DATA (c)->ts.u.derived->intmod_sym_id
2772 == ISOFORTRAN_LOCK_TYPE)
2773 || (c->ts.type == BT_DERIVED && c->ts.u.derived->attr.lock_comp
2774 && !allocatable && !pointer))
2776 lock_type = 1;
2777 lock_comp = c;
2778 sym->attr.lock_comp = 1;
2781 /* Check for F2008, C1302 - and recall that pointers may not be coarrays
2782 (5.3.14) and that subobjects of coarray are coarray themselves (2.4.7),
2783 unless there are nondirect [allocatable or pointer] components
2784 involved (cf. 1.3.33.1 and 1.3.33.3). */
2786 if (pointer && !coarray && lock_type)
2787 gfc_error ("Component %s at %L of type LOCK_TYPE must have a "
2788 "codimension or be a subcomponent of a coarray, "
2789 "which is not possible as the component has the "
2790 "pointer attribute", c->name, &c->loc);
2791 else if (pointer && !coarray && c->ts.type == BT_DERIVED
2792 && c->ts.u.derived->attr.lock_comp)
2793 gfc_error ("Pointer component %s at %L has a noncoarray subcomponent "
2794 "of type LOCK_TYPE, which must have a codimension or be a "
2795 "subcomponent of a coarray", c->name, &c->loc);
2797 if (lock_type && allocatable && !coarray)
2798 gfc_error ("Allocatable component %s at %L of type LOCK_TYPE must have "
2799 "a codimension", c->name, &c->loc);
2800 else if (lock_type && allocatable && c->ts.type == BT_DERIVED
2801 && c->ts.u.derived->attr.lock_comp)
2802 gfc_error ("Allocatable component %s at %L must have a codimension as "
2803 "it has a noncoarray subcomponent of type LOCK_TYPE",
2804 c->name, &c->loc);
2806 if (sym->attr.coarray_comp && !coarray && lock_type)
2807 gfc_error ("Noncoarray component %s at %L of type LOCK_TYPE or with "
2808 "subcomponent of type LOCK_TYPE must have a codimension or "
2809 "be a subcomponent of a coarray. (Variables of type %s may "
2810 "not have a codimension as already a coarray "
2811 "subcomponent exists)", c->name, &c->loc, sym->name);
2813 if (sym->attr.lock_comp && coarray && !lock_type)
2814 gfc_error ("Noncoarray component %s at %L of type LOCK_TYPE or with "
2815 "subcomponent of type LOCK_TYPE must have a codimension or "
2816 "be a subcomponent of a coarray. (Variables of type %s may "
2817 "not have a codimension as %s at %L has a codimension or a "
2818 "coarray subcomponent)", lock_comp->name, &lock_comp->loc,
2819 sym->name, c->name, &c->loc);
2821 /* Look for private components. */
2822 if (sym->component_access == ACCESS_PRIVATE
2823 || c->attr.access == ACCESS_PRIVATE
2824 || (c->ts.type == BT_DERIVED && c->ts.u.derived->attr.private_comp))
2825 sym->attr.private_comp = 1;
2828 if (!seen_component)
2829 sym->attr.zero_comp = 1;
2831 pop_state ();
2835 /* Parse an ENUM. */
2837 static void
2838 parse_enum (void)
2840 gfc_statement st;
2841 int compiling_enum;
2842 gfc_state_data s;
2843 int seen_enumerator = 0;
2845 push_state (&s, COMP_ENUM, gfc_new_block);
2847 compiling_enum = 1;
2849 while (compiling_enum)
2851 st = next_statement ();
2852 switch (st)
2854 case ST_NONE:
2855 unexpected_eof ();
2856 break;
2858 case ST_ENUMERATOR:
2859 seen_enumerator = 1;
2860 accept_statement (st);
2861 break;
2863 case ST_END_ENUM:
2864 compiling_enum = 0;
2865 if (!seen_enumerator)
2866 gfc_error ("ENUM declaration at %C has no ENUMERATORS");
2867 accept_statement (st);
2868 break;
2870 default:
2871 gfc_free_enum_history ();
2872 unexpected_statement (st);
2873 break;
2876 pop_state ();
2880 /* Parse an interface. We must be able to deal with the possibility
2881 of recursive interfaces. The parse_spec() subroutine is mutually
2882 recursive with parse_interface(). */
2884 static gfc_statement parse_spec (gfc_statement);
2886 static void
2887 parse_interface (void)
2889 gfc_compile_state new_state = COMP_NONE, current_state;
2890 gfc_symbol *prog_unit, *sym;
2891 gfc_interface_info save;
2892 gfc_state_data s1, s2;
2893 gfc_statement st;
2895 accept_statement (ST_INTERFACE);
2897 current_interface.ns = gfc_current_ns;
2898 save = current_interface;
2900 sym = (current_interface.type == INTERFACE_GENERIC
2901 || current_interface.type == INTERFACE_USER_OP)
2902 ? gfc_new_block : NULL;
2904 push_state (&s1, COMP_INTERFACE, sym);
2905 current_state = COMP_NONE;
2907 loop:
2908 gfc_current_ns = gfc_get_namespace (current_interface.ns, 0);
2910 st = next_statement ();
2911 switch (st)
2913 case ST_NONE:
2914 unexpected_eof ();
2916 case ST_SUBROUTINE:
2917 case ST_FUNCTION:
2918 if (st == ST_SUBROUTINE)
2919 new_state = COMP_SUBROUTINE;
2920 else if (st == ST_FUNCTION)
2921 new_state = COMP_FUNCTION;
2922 if (gfc_new_block->attr.pointer)
2924 gfc_new_block->attr.pointer = 0;
2925 gfc_new_block->attr.proc_pointer = 1;
2927 if (!gfc_add_explicit_interface (gfc_new_block, IFSRC_IFBODY,
2928 gfc_new_block->formal, NULL))
2930 reject_statement ();
2931 gfc_free_namespace (gfc_current_ns);
2932 goto loop;
2934 break;
2936 case ST_PROCEDURE:
2937 case ST_MODULE_PROC: /* The module procedure matcher makes
2938 sure the context is correct. */
2939 accept_statement (st);
2940 gfc_free_namespace (gfc_current_ns);
2941 goto loop;
2943 case ST_END_INTERFACE:
2944 gfc_free_namespace (gfc_current_ns);
2945 gfc_current_ns = current_interface.ns;
2946 goto done;
2948 default:
2949 gfc_error ("Unexpected %s statement in INTERFACE block at %C",
2950 gfc_ascii_statement (st));
2951 reject_statement ();
2952 gfc_free_namespace (gfc_current_ns);
2953 goto loop;
2957 /* Make sure that the generic name has the right attribute. */
2958 if (current_interface.type == INTERFACE_GENERIC
2959 && current_state == COMP_NONE)
2961 if (new_state == COMP_FUNCTION && sym)
2962 gfc_add_function (&sym->attr, sym->name, NULL);
2963 else if (new_state == COMP_SUBROUTINE && sym)
2964 gfc_add_subroutine (&sym->attr, sym->name, NULL);
2966 current_state = new_state;
2969 if (current_interface.type == INTERFACE_ABSTRACT)
2971 gfc_add_abstract (&gfc_new_block->attr, &gfc_current_locus);
2972 if (gfc_is_intrinsic_typename (gfc_new_block->name))
2973 gfc_error ("Name '%s' of ABSTRACT INTERFACE at %C "
2974 "cannot be the same as an intrinsic type",
2975 gfc_new_block->name);
2978 push_state (&s2, new_state, gfc_new_block);
2979 accept_statement (st);
2980 prog_unit = gfc_new_block;
2981 prog_unit->formal_ns = gfc_current_ns;
2982 if (prog_unit == prog_unit->formal_ns->proc_name
2983 && prog_unit->ns != prog_unit->formal_ns)
2984 prog_unit->refs++;
2986 decl:
2987 /* Read data declaration statements. */
2988 st = parse_spec (ST_NONE);
2990 /* Since the interface block does not permit an IMPLICIT statement,
2991 the default type for the function or the result must be taken
2992 from the formal namespace. */
2993 if (new_state == COMP_FUNCTION)
2995 if (prog_unit->result == prog_unit
2996 && prog_unit->ts.type == BT_UNKNOWN)
2997 gfc_set_default_type (prog_unit, 1, prog_unit->formal_ns);
2998 else if (prog_unit->result != prog_unit
2999 && prog_unit->result->ts.type == BT_UNKNOWN)
3000 gfc_set_default_type (prog_unit->result, 1,
3001 prog_unit->formal_ns);
3004 if (st != ST_END_SUBROUTINE && st != ST_END_FUNCTION)
3006 gfc_error ("Unexpected %s statement at %C in INTERFACE body",
3007 gfc_ascii_statement (st));
3008 reject_statement ();
3009 goto decl;
3012 /* Add EXTERNAL attribute to function or subroutine. */
3013 if (current_interface.type != INTERFACE_ABSTRACT && !prog_unit->attr.dummy)
3014 gfc_add_external (&prog_unit->attr, &gfc_current_locus);
3016 current_interface = save;
3017 gfc_add_interface (prog_unit);
3018 pop_state ();
3020 if (current_interface.ns
3021 && current_interface.ns->proc_name
3022 && strcmp (current_interface.ns->proc_name->name,
3023 prog_unit->name) == 0)
3024 gfc_error ("INTERFACE procedure '%s' at %L has the same name as the "
3025 "enclosing procedure", prog_unit->name,
3026 &current_interface.ns->proc_name->declared_at);
3028 goto loop;
3030 done:
3031 pop_state ();
3035 /* Associate function characteristics by going back to the function
3036 declaration and rematching the prefix. */
3038 static match
3039 match_deferred_characteristics (gfc_typespec * ts)
3041 locus loc;
3042 match m = MATCH_ERROR;
3043 char name[GFC_MAX_SYMBOL_LEN + 1];
3045 loc = gfc_current_locus;
3047 gfc_current_locus = gfc_current_block ()->declared_at;
3049 gfc_clear_error ();
3050 gfc_buffer_error (1);
3051 m = gfc_match_prefix (ts);
3052 gfc_buffer_error (0);
3054 if (ts->type == BT_DERIVED)
3056 ts->kind = 0;
3058 if (!ts->u.derived)
3059 m = MATCH_ERROR;
3062 /* Only permit one go at the characteristic association. */
3063 if (ts->kind == -1)
3064 ts->kind = 0;
3066 /* Set the function locus correctly. If we have not found the
3067 function name, there is an error. */
3068 if (m == MATCH_YES
3069 && gfc_match ("function% %n", name) == MATCH_YES
3070 && strcmp (name, gfc_current_block ()->name) == 0)
3072 gfc_current_block ()->declared_at = gfc_current_locus;
3073 gfc_commit_symbols ();
3075 else
3077 gfc_error_check ();
3078 gfc_undo_symbols ();
3081 gfc_current_locus =loc;
3082 return m;
3086 /* Check specification-expressions in the function result of the currently
3087 parsed block and ensure they are typed (give an IMPLICIT type if necessary).
3088 For return types specified in a FUNCTION prefix, the IMPLICIT rules of the
3089 scope are not yet parsed so this has to be delayed up to parse_spec. */
3091 static void
3092 check_function_result_typed (void)
3094 gfc_typespec* ts = &gfc_current_ns->proc_name->result->ts;
3096 gcc_assert (gfc_current_state () == COMP_FUNCTION);
3097 gcc_assert (ts->type != BT_UNKNOWN);
3099 /* Check type-parameters, at the moment only CHARACTER lengths possible. */
3100 /* TODO: Extend when KIND type parameters are implemented. */
3101 if (ts->type == BT_CHARACTER && ts->u.cl && ts->u.cl->length)
3102 gfc_expr_check_typed (ts->u.cl->length, gfc_current_ns, true);
3106 /* Parse a set of specification statements. Returns the statement
3107 that doesn't fit. */
3109 static gfc_statement
3110 parse_spec (gfc_statement st)
3112 st_state ss;
3113 bool function_result_typed = false;
3114 bool bad_characteristic = false;
3115 gfc_typespec *ts;
3117 verify_st_order (&ss, ST_NONE, false);
3118 if (st == ST_NONE)
3119 st = next_statement ();
3121 /* If we are not inside a function or don't have a result specified so far,
3122 do nothing special about it. */
3123 if (gfc_current_state () != COMP_FUNCTION)
3124 function_result_typed = true;
3125 else
3127 gfc_symbol* proc = gfc_current_ns->proc_name;
3128 gcc_assert (proc);
3130 if (proc->result->ts.type == BT_UNKNOWN)
3131 function_result_typed = true;
3134 loop:
3136 /* If we're inside a BLOCK construct, some statements are disallowed.
3137 Check this here. Attribute declaration statements like INTENT, OPTIONAL
3138 or VALUE are also disallowed, but they don't have a particular ST_*
3139 key so we have to check for them individually in their matcher routine. */
3140 if (gfc_current_state () == COMP_BLOCK)
3141 switch (st)
3143 case ST_IMPLICIT:
3144 case ST_IMPLICIT_NONE:
3145 case ST_NAMELIST:
3146 case ST_COMMON:
3147 case ST_EQUIVALENCE:
3148 case ST_STATEMENT_FUNCTION:
3149 gfc_error ("%s statement is not allowed inside of BLOCK at %C",
3150 gfc_ascii_statement (st));
3151 reject_statement ();
3152 break;
3154 default:
3155 break;
3157 else if (gfc_current_state () == COMP_BLOCK_DATA)
3158 /* Fortran 2008, C1116. */
3159 switch (st)
3161 case ST_DATA_DECL:
3162 case ST_COMMON:
3163 case ST_DATA:
3164 case ST_TYPE:
3165 case ST_END_BLOCK_DATA:
3166 case ST_ATTR_DECL:
3167 case ST_EQUIVALENCE:
3168 case ST_PARAMETER:
3169 case ST_IMPLICIT:
3170 case ST_IMPLICIT_NONE:
3171 case ST_DERIVED_DECL:
3172 case ST_USE:
3173 break;
3175 case ST_NONE:
3176 break;
3178 default:
3179 gfc_error ("%s statement is not allowed inside of BLOCK DATA at %C",
3180 gfc_ascii_statement (st));
3181 reject_statement ();
3182 break;
3185 /* If we find a statement that can not be followed by an IMPLICIT statement
3186 (and thus we can expect to see none any further), type the function result
3187 if it has not yet been typed. Be careful not to give the END statement
3188 to verify_st_order! */
3189 if (!function_result_typed && st != ST_GET_FCN_CHARACTERISTICS)
3191 bool verify_now = false;
3193 if (st == ST_END_FUNCTION || st == ST_CONTAINS)
3194 verify_now = true;
3195 else
3197 st_state dummyss;
3198 verify_st_order (&dummyss, ST_NONE, false);
3199 verify_st_order (&dummyss, st, false);
3201 if (!verify_st_order (&dummyss, ST_IMPLICIT, true))
3202 verify_now = true;
3205 if (verify_now)
3207 check_function_result_typed ();
3208 function_result_typed = true;
3212 switch (st)
3214 case ST_NONE:
3215 unexpected_eof ();
3217 case ST_IMPLICIT_NONE:
3218 case ST_IMPLICIT:
3219 if (!function_result_typed)
3221 check_function_result_typed ();
3222 function_result_typed = true;
3224 goto declSt;
3226 case ST_FORMAT:
3227 case ST_ENTRY:
3228 case ST_DATA: /* Not allowed in interfaces */
3229 if (gfc_current_state () == COMP_INTERFACE)
3230 break;
3232 /* Fall through */
3234 case ST_USE:
3235 case ST_IMPORT:
3236 case ST_PARAMETER:
3237 case ST_PUBLIC:
3238 case ST_PRIVATE:
3239 case ST_DERIVED_DECL:
3240 case_decl:
3241 declSt:
3242 if (!verify_st_order (&ss, st, false))
3244 reject_statement ();
3245 st = next_statement ();
3246 goto loop;
3249 switch (st)
3251 case ST_INTERFACE:
3252 parse_interface ();
3253 break;
3255 case ST_DERIVED_DECL:
3256 parse_derived ();
3257 break;
3259 case ST_PUBLIC:
3260 case ST_PRIVATE:
3261 if (gfc_current_state () != COMP_MODULE)
3263 gfc_error ("%s statement must appear in a MODULE",
3264 gfc_ascii_statement (st));
3265 reject_statement ();
3266 break;
3269 if (gfc_current_ns->default_access != ACCESS_UNKNOWN)
3271 gfc_error ("%s statement at %C follows another accessibility "
3272 "specification", gfc_ascii_statement (st));
3273 reject_statement ();
3274 break;
3277 gfc_current_ns->default_access = (st == ST_PUBLIC)
3278 ? ACCESS_PUBLIC : ACCESS_PRIVATE;
3280 break;
3282 case ST_STATEMENT_FUNCTION:
3283 if (gfc_current_state () == COMP_MODULE)
3285 unexpected_statement (st);
3286 break;
3289 default:
3290 break;
3293 accept_statement (st);
3294 st = next_statement ();
3295 goto loop;
3297 case ST_ENUM:
3298 accept_statement (st);
3299 parse_enum();
3300 st = next_statement ();
3301 goto loop;
3303 case ST_GET_FCN_CHARACTERISTICS:
3304 /* This statement triggers the association of a function's result
3305 characteristics. */
3306 ts = &gfc_current_block ()->result->ts;
3307 if (match_deferred_characteristics (ts) != MATCH_YES)
3308 bad_characteristic = true;
3310 st = next_statement ();
3311 goto loop;
3313 case ST_OACC_DECLARE:
3314 if (!verify_st_order(&ss, st, false))
3316 reject_statement ();
3317 st = next_statement ();
3318 goto loop;
3320 if (gfc_state_stack->ext.oacc_declare_clauses == NULL)
3321 gfc_state_stack->ext.oacc_declare_clauses = new_st.ext.omp_clauses;
3322 accept_statement (st);
3323 st = next_statement ();
3324 goto loop;
3326 default:
3327 break;
3330 /* If match_deferred_characteristics failed, then there is an error. */
3331 if (bad_characteristic)
3333 ts = &gfc_current_block ()->result->ts;
3334 if (ts->type != BT_DERIVED)
3335 gfc_error ("Bad kind expression for function '%s' at %L",
3336 gfc_current_block ()->name,
3337 &gfc_current_block ()->declared_at);
3338 else
3339 gfc_error ("The type for function '%s' at %L is not accessible",
3340 gfc_current_block ()->name,
3341 &gfc_current_block ()->declared_at);
3343 gfc_current_block ()->ts.kind = 0;
3344 /* Keep the derived type; if it's bad, it will be discovered later. */
3345 if (!(ts->type == BT_DERIVED && ts->u.derived))
3346 ts->type = BT_UNKNOWN;
3349 return st;
3353 /* Parse a WHERE block, (not a simple WHERE statement). */
3355 static void
3356 parse_where_block (void)
3358 int seen_empty_else;
3359 gfc_code *top, *d;
3360 gfc_state_data s;
3361 gfc_statement st;
3363 accept_statement (ST_WHERE_BLOCK);
3364 top = gfc_state_stack->tail;
3366 push_state (&s, COMP_WHERE, gfc_new_block);
3368 d = add_statement ();
3369 d->expr1 = top->expr1;
3370 d->op = EXEC_WHERE;
3372 top->expr1 = NULL;
3373 top->block = d;
3375 seen_empty_else = 0;
3379 st = next_statement ();
3380 switch (st)
3382 case ST_NONE:
3383 unexpected_eof ();
3385 case ST_WHERE_BLOCK:
3386 parse_where_block ();
3387 break;
3389 case ST_ASSIGNMENT:
3390 case ST_WHERE:
3391 accept_statement (st);
3392 break;
3394 case ST_ELSEWHERE:
3395 if (seen_empty_else)
3397 gfc_error ("ELSEWHERE statement at %C follows previous "
3398 "unmasked ELSEWHERE");
3399 reject_statement ();
3400 break;
3403 if (new_st.expr1 == NULL)
3404 seen_empty_else = 1;
3406 d = new_level (gfc_state_stack->head);
3407 d->op = EXEC_WHERE;
3408 d->expr1 = new_st.expr1;
3410 accept_statement (st);
3412 break;
3414 case ST_END_WHERE:
3415 accept_statement (st);
3416 break;
3418 default:
3419 gfc_error ("Unexpected %s statement in WHERE block at %C",
3420 gfc_ascii_statement (st));
3421 reject_statement ();
3422 break;
3425 while (st != ST_END_WHERE);
3427 pop_state ();
3431 /* Parse a FORALL block (not a simple FORALL statement). */
3433 static void
3434 parse_forall_block (void)
3436 gfc_code *top, *d;
3437 gfc_state_data s;
3438 gfc_statement st;
3440 accept_statement (ST_FORALL_BLOCK);
3441 top = gfc_state_stack->tail;
3443 push_state (&s, COMP_FORALL, gfc_new_block);
3445 d = add_statement ();
3446 d->op = EXEC_FORALL;
3447 top->block = d;
3451 st = next_statement ();
3452 switch (st)
3455 case ST_ASSIGNMENT:
3456 case ST_POINTER_ASSIGNMENT:
3457 case ST_WHERE:
3458 case ST_FORALL:
3459 accept_statement (st);
3460 break;
3462 case ST_WHERE_BLOCK:
3463 parse_where_block ();
3464 break;
3466 case ST_FORALL_BLOCK:
3467 parse_forall_block ();
3468 break;
3470 case ST_END_FORALL:
3471 accept_statement (st);
3472 break;
3474 case ST_NONE:
3475 unexpected_eof ();
3477 default:
3478 gfc_error ("Unexpected %s statement in FORALL block at %C",
3479 gfc_ascii_statement (st));
3481 reject_statement ();
3482 break;
3485 while (st != ST_END_FORALL);
3487 pop_state ();
3491 static gfc_statement parse_executable (gfc_statement);
3493 /* parse the statements of an IF-THEN-ELSEIF-ELSE-ENDIF block. */
3495 static void
3496 parse_if_block (void)
3498 gfc_code *top, *d;
3499 gfc_statement st;
3500 locus else_locus;
3501 gfc_state_data s;
3502 int seen_else;
3504 seen_else = 0;
3505 accept_statement (ST_IF_BLOCK);
3507 top = gfc_state_stack->tail;
3508 push_state (&s, COMP_IF, gfc_new_block);
3510 new_st.op = EXEC_IF;
3511 d = add_statement ();
3513 d->expr1 = top->expr1;
3514 top->expr1 = NULL;
3515 top->block = d;
3519 st = parse_executable (ST_NONE);
3521 switch (st)
3523 case ST_NONE:
3524 unexpected_eof ();
3526 case ST_ELSEIF:
3527 if (seen_else)
3529 gfc_error ("ELSE IF statement at %C cannot follow ELSE "
3530 "statement at %L", &else_locus);
3532 reject_statement ();
3533 break;
3536 d = new_level (gfc_state_stack->head);
3537 d->op = EXEC_IF;
3538 d->expr1 = new_st.expr1;
3540 accept_statement (st);
3542 break;
3544 case ST_ELSE:
3545 if (seen_else)
3547 gfc_error ("Duplicate ELSE statements at %L and %C",
3548 &else_locus);
3549 reject_statement ();
3550 break;
3553 seen_else = 1;
3554 else_locus = gfc_current_locus;
3556 d = new_level (gfc_state_stack->head);
3557 d->op = EXEC_IF;
3559 accept_statement (st);
3561 break;
3563 case ST_ENDIF:
3564 break;
3566 default:
3567 unexpected_statement (st);
3568 break;
3571 while (st != ST_ENDIF);
3573 pop_state ();
3574 accept_statement (st);
3578 /* Parse a SELECT block. */
3580 static void
3581 parse_select_block (void)
3583 gfc_statement st;
3584 gfc_code *cp;
3585 gfc_state_data s;
3587 accept_statement (ST_SELECT_CASE);
3589 cp = gfc_state_stack->tail;
3590 push_state (&s, COMP_SELECT, gfc_new_block);
3592 /* Make sure that the next statement is a CASE or END SELECT. */
3593 for (;;)
3595 st = next_statement ();
3596 if (st == ST_NONE)
3597 unexpected_eof ();
3598 if (st == ST_END_SELECT)
3600 /* Empty SELECT CASE is OK. */
3601 accept_statement (st);
3602 pop_state ();
3603 return;
3605 if (st == ST_CASE)
3606 break;
3608 gfc_error ("Expected a CASE or END SELECT statement following SELECT "
3609 "CASE at %C");
3611 reject_statement ();
3614 /* At this point, we're got a nonempty select block. */
3615 cp = new_level (cp);
3616 *cp = new_st;
3618 accept_statement (st);
3622 st = parse_executable (ST_NONE);
3623 switch (st)
3625 case ST_NONE:
3626 unexpected_eof ();
3628 case ST_CASE:
3629 cp = new_level (gfc_state_stack->head);
3630 *cp = new_st;
3631 gfc_clear_new_st ();
3633 accept_statement (st);
3634 /* Fall through */
3636 case ST_END_SELECT:
3637 break;
3639 /* Can't have an executable statement because of
3640 parse_executable(). */
3641 default:
3642 unexpected_statement (st);
3643 break;
3646 while (st != ST_END_SELECT);
3648 pop_state ();
3649 accept_statement (st);
3653 /* Pop the current selector from the SELECT TYPE stack. */
3655 static void
3656 select_type_pop (void)
3658 gfc_select_type_stack *old = select_type_stack;
3659 select_type_stack = old->prev;
3660 free (old);
3664 /* Parse a SELECT TYPE construct (F03:R821). */
3666 static void
3667 parse_select_type_block (void)
3669 gfc_statement st;
3670 gfc_code *cp;
3671 gfc_state_data s;
3673 accept_statement (ST_SELECT_TYPE);
3675 cp = gfc_state_stack->tail;
3676 push_state (&s, COMP_SELECT_TYPE, gfc_new_block);
3678 /* Make sure that the next statement is a TYPE IS, CLASS IS, CLASS DEFAULT
3679 or END SELECT. */
3680 for (;;)
3682 st = next_statement ();
3683 if (st == ST_NONE)
3684 unexpected_eof ();
3685 if (st == ST_END_SELECT)
3686 /* Empty SELECT CASE is OK. */
3687 goto done;
3688 if (st == ST_TYPE_IS || st == ST_CLASS_IS)
3689 break;
3691 gfc_error ("Expected TYPE IS, CLASS IS or END SELECT statement "
3692 "following SELECT TYPE at %C");
3694 reject_statement ();
3697 /* At this point, we're got a nonempty select block. */
3698 cp = new_level (cp);
3699 *cp = new_st;
3701 accept_statement (st);
3705 st = parse_executable (ST_NONE);
3706 switch (st)
3708 case ST_NONE:
3709 unexpected_eof ();
3711 case ST_TYPE_IS:
3712 case ST_CLASS_IS:
3713 cp = new_level (gfc_state_stack->head);
3714 *cp = new_st;
3715 gfc_clear_new_st ();
3717 accept_statement (st);
3718 /* Fall through */
3720 case ST_END_SELECT:
3721 break;
3723 /* Can't have an executable statement because of
3724 parse_executable(). */
3725 default:
3726 unexpected_statement (st);
3727 break;
3730 while (st != ST_END_SELECT);
3732 done:
3733 pop_state ();
3734 accept_statement (st);
3735 gfc_current_ns = gfc_current_ns->parent;
3736 select_type_pop ();
3740 /* Given a symbol, make sure it is not an iteration variable for a DO
3741 statement. This subroutine is called when the symbol is seen in a
3742 context that causes it to become redefined. If the symbol is an
3743 iterator, we generate an error message and return nonzero. */
3745 int
3746 gfc_check_do_variable (gfc_symtree *st)
3748 gfc_state_data *s;
3750 for (s=gfc_state_stack; s; s = s->previous)
3751 if (s->do_variable == st)
3753 gfc_error_now("Variable '%s' at %C cannot be redefined inside "
3754 "loop beginning at %L", st->name, &s->head->loc);
3755 return 1;
3758 return 0;
3762 /* Checks to see if the current statement label closes an enddo.
3763 Returns 0 if not, 1 if closes an ENDDO correctly, or 2 (and issues
3764 an error) if it incorrectly closes an ENDDO. */
3766 static int
3767 check_do_closure (void)
3769 gfc_state_data *p;
3771 if (gfc_statement_label == NULL)
3772 return 0;
3774 for (p = gfc_state_stack; p; p = p->previous)
3775 if (p->state == COMP_DO || p->state == COMP_DO_CONCURRENT)
3776 break;
3778 if (p == NULL)
3779 return 0; /* No loops to close */
3781 if (p->ext.end_do_label == gfc_statement_label)
3783 if (p == gfc_state_stack)
3784 return 1;
3786 gfc_error ("End of nonblock DO statement at %C is within another block");
3787 return 2;
3790 /* At this point, the label doesn't terminate the innermost loop.
3791 Make sure it doesn't terminate another one. */
3792 for (; p; p = p->previous)
3793 if ((p->state == COMP_DO || p->state == COMP_DO_CONCURRENT)
3794 && p->ext.end_do_label == gfc_statement_label)
3796 gfc_error ("End of nonblock DO statement at %C is interwoven "
3797 "with another DO loop");
3798 return 2;
3801 return 0;
3805 /* Parse a series of contained program units. */
3807 static void parse_progunit (gfc_statement);
3810 /* Parse a CRITICAL block. */
3812 static void
3813 parse_critical_block (void)
3815 gfc_code *top, *d;
3816 gfc_state_data s, *sd;
3817 gfc_statement st;
3819 for (sd = gfc_state_stack; sd; sd = sd->previous)
3820 if (sd->state == COMP_OMP_STRUCTURED_BLOCK)
3821 gfc_error_now (is_oacc (sd)
3822 ? "CRITICAL block inside of OpenACC region at %C"
3823 : "CRITICAL block inside of OpenMP region at %C");
3825 s.ext.end_do_label = new_st.label1;
3827 accept_statement (ST_CRITICAL);
3828 top = gfc_state_stack->tail;
3830 push_state (&s, COMP_CRITICAL, gfc_new_block);
3832 d = add_statement ();
3833 d->op = EXEC_CRITICAL;
3834 top->block = d;
3838 st = parse_executable (ST_NONE);
3840 switch (st)
3842 case ST_NONE:
3843 unexpected_eof ();
3844 break;
3846 case ST_END_CRITICAL:
3847 if (s.ext.end_do_label != NULL
3848 && s.ext.end_do_label != gfc_statement_label)
3849 gfc_error_now ("Statement label in END CRITICAL at %C does not "
3850 "match CRITICAL label");
3852 if (gfc_statement_label != NULL)
3854 new_st.op = EXEC_NOP;
3855 add_statement ();
3857 break;
3859 default:
3860 unexpected_statement (st);
3861 break;
3864 while (st != ST_END_CRITICAL);
3866 pop_state ();
3867 accept_statement (st);
3871 /* Set up the local namespace for a BLOCK construct. */
3873 gfc_namespace*
3874 gfc_build_block_ns (gfc_namespace *parent_ns)
3876 gfc_namespace* my_ns;
3877 static int numblock = 1;
3879 my_ns = gfc_get_namespace (parent_ns, 1);
3880 my_ns->construct_entities = 1;
3882 /* Give the BLOCK a symbol of flavor LABEL; this is later needed for correct
3883 code generation (so it must not be NULL).
3884 We set its recursive argument if our container procedure is recursive, so
3885 that local variables are accordingly placed on the stack when it
3886 will be necessary. */
3887 if (gfc_new_block)
3888 my_ns->proc_name = gfc_new_block;
3889 else
3891 bool t;
3892 char buffer[20]; /* Enough to hold "block@2147483648\n". */
3894 snprintf(buffer, sizeof(buffer), "block@%d", numblock++);
3895 gfc_get_symbol (buffer, my_ns, &my_ns->proc_name);
3896 t = gfc_add_flavor (&my_ns->proc_name->attr, FL_LABEL,
3897 my_ns->proc_name->name, NULL);
3898 gcc_assert (t);
3899 gfc_commit_symbol (my_ns->proc_name);
3902 if (parent_ns->proc_name)
3903 my_ns->proc_name->attr.recursive = parent_ns->proc_name->attr.recursive;
3905 return my_ns;
3909 /* Parse a BLOCK construct. */
3911 static void
3912 parse_block_construct (void)
3914 gfc_namespace* my_ns;
3915 gfc_state_data s;
3917 gfc_notify_std (GFC_STD_F2008, "BLOCK construct at %C");
3919 my_ns = gfc_build_block_ns (gfc_current_ns);
3921 new_st.op = EXEC_BLOCK;
3922 new_st.ext.block.ns = my_ns;
3923 new_st.ext.block.assoc = NULL;
3924 accept_statement (ST_BLOCK);
3926 push_state (&s, COMP_BLOCK, my_ns->proc_name);
3927 gfc_current_ns = my_ns;
3929 parse_progunit (ST_NONE);
3931 gfc_current_ns = gfc_current_ns->parent;
3932 pop_state ();
3936 /* Parse an ASSOCIATE construct. This is essentially a BLOCK construct
3937 behind the scenes with compiler-generated variables. */
3939 static void
3940 parse_associate (void)
3942 gfc_namespace* my_ns;
3943 gfc_state_data s;
3944 gfc_statement st;
3945 gfc_association_list* a;
3947 gfc_notify_std (GFC_STD_F2003, "ASSOCIATE construct at %C");
3949 my_ns = gfc_build_block_ns (gfc_current_ns);
3951 new_st.op = EXEC_BLOCK;
3952 new_st.ext.block.ns = my_ns;
3953 gcc_assert (new_st.ext.block.assoc);
3955 /* Add all associate-names as BLOCK variables. Creating them is enough
3956 for now, they'll get their values during trans-* phase. */
3957 gfc_current_ns = my_ns;
3958 for (a = new_st.ext.block.assoc; a; a = a->next)
3960 gfc_symbol* sym;
3962 if (gfc_get_sym_tree (a->name, NULL, &a->st, false))
3963 gcc_unreachable ();
3965 sym = a->st->n.sym;
3966 sym->attr.flavor = FL_VARIABLE;
3967 sym->assoc = a;
3968 sym->declared_at = a->where;
3969 gfc_set_sym_referenced (sym);
3971 /* Initialize the typespec. It is not available in all cases,
3972 however, as it may only be set on the target during resolution.
3973 Still, sometimes it helps to have it right now -- especially
3974 for parsing component references on the associate-name
3975 in case of association to a derived-type. */
3976 sym->ts = a->target->ts;
3979 accept_statement (ST_ASSOCIATE);
3980 push_state (&s, COMP_ASSOCIATE, my_ns->proc_name);
3982 loop:
3983 st = parse_executable (ST_NONE);
3984 switch (st)
3986 case ST_NONE:
3987 unexpected_eof ();
3989 case_end:
3990 accept_statement (st);
3991 my_ns->code = gfc_state_stack->head;
3992 break;
3994 default:
3995 unexpected_statement (st);
3996 goto loop;
3999 gfc_current_ns = gfc_current_ns->parent;
4000 pop_state ();
4004 /* Parse a DO loop. Note that the ST_CYCLE and ST_EXIT statements are
4005 handled inside of parse_executable(), because they aren't really
4006 loop statements. */
4008 static void
4009 parse_do_block (void)
4011 gfc_statement st;
4012 gfc_code *top;
4013 gfc_state_data s;
4014 gfc_symtree *stree;
4015 gfc_exec_op do_op;
4017 do_op = new_st.op;
4018 s.ext.end_do_label = new_st.label1;
4020 if (new_st.ext.iterator != NULL)
4021 stree = new_st.ext.iterator->var->symtree;
4022 else
4023 stree = NULL;
4025 accept_statement (ST_DO);
4027 top = gfc_state_stack->tail;
4028 push_state (&s, do_op == EXEC_DO_CONCURRENT ? COMP_DO_CONCURRENT : COMP_DO,
4029 gfc_new_block);
4031 s.do_variable = stree;
4033 top->block = new_level (top);
4034 top->block->op = EXEC_DO;
4036 loop:
4037 st = parse_executable (ST_NONE);
4039 switch (st)
4041 case ST_NONE:
4042 unexpected_eof ();
4044 case ST_ENDDO:
4045 if (s.ext.end_do_label != NULL
4046 && s.ext.end_do_label != gfc_statement_label)
4047 gfc_error_now ("Statement label in ENDDO at %C doesn't match "
4048 "DO label");
4050 if (gfc_statement_label != NULL)
4052 new_st.op = EXEC_NOP;
4053 add_statement ();
4055 break;
4057 case ST_IMPLIED_ENDDO:
4058 /* If the do-stmt of this DO construct has a do-construct-name,
4059 the corresponding end-do must be an end-do-stmt (with a matching
4060 name, but in that case we must have seen ST_ENDDO first).
4061 We only complain about this in pedantic mode. */
4062 if (gfc_current_block () != NULL)
4063 gfc_error_now ("Named block DO at %L requires matching ENDDO name",
4064 &gfc_current_block()->declared_at);
4066 break;
4068 default:
4069 unexpected_statement (st);
4070 goto loop;
4073 pop_state ();
4074 accept_statement (st);
4078 /* Parse the statements of OpenMP do/parallel do. */
4080 static gfc_statement
4081 parse_omp_do (gfc_statement omp_st)
4083 gfc_statement st;
4084 gfc_code *cp, *np;
4085 gfc_state_data s;
4087 accept_statement (omp_st);
4089 cp = gfc_state_stack->tail;
4090 push_state (&s, COMP_OMP_STRUCTURED_BLOCK, NULL);
4091 np = new_level (cp);
4092 np->op = cp->op;
4093 np->block = NULL;
4095 for (;;)
4097 st = next_statement ();
4098 if (st == ST_NONE)
4099 unexpected_eof ();
4100 else if (st == ST_DO)
4101 break;
4102 else
4103 unexpected_statement (st);
4106 parse_do_block ();
4107 if (gfc_statement_label != NULL
4108 && gfc_state_stack->previous != NULL
4109 && gfc_state_stack->previous->state == COMP_DO
4110 && gfc_state_stack->previous->ext.end_do_label == gfc_statement_label)
4112 /* In
4113 DO 100 I=1,10
4114 !$OMP DO
4115 DO J=1,10
4117 100 CONTINUE
4118 there should be no !$OMP END DO. */
4119 pop_state ();
4120 return ST_IMPLIED_ENDDO;
4123 check_do_closure ();
4124 pop_state ();
4126 st = next_statement ();
4127 gfc_statement omp_end_st = ST_OMP_END_DO;
4128 switch (omp_st)
4130 case ST_OMP_DISTRIBUTE: omp_end_st = ST_OMP_END_DISTRIBUTE; break;
4131 case ST_OMP_DISTRIBUTE_PARALLEL_DO:
4132 omp_end_st = ST_OMP_END_DISTRIBUTE_PARALLEL_DO;
4133 break;
4134 case ST_OMP_DISTRIBUTE_PARALLEL_DO_SIMD:
4135 omp_end_st = ST_OMP_END_DISTRIBUTE_PARALLEL_DO_SIMD;
4136 break;
4137 case ST_OMP_DISTRIBUTE_SIMD:
4138 omp_end_st = ST_OMP_END_DISTRIBUTE_SIMD;
4139 break;
4140 case ST_OMP_DO: omp_end_st = ST_OMP_END_DO; break;
4141 case ST_OMP_DO_SIMD: omp_end_st = ST_OMP_END_DO_SIMD; break;
4142 case ST_OMP_PARALLEL_DO: omp_end_st = ST_OMP_END_PARALLEL_DO; break;
4143 case ST_OMP_PARALLEL_DO_SIMD:
4144 omp_end_st = ST_OMP_END_PARALLEL_DO_SIMD;
4145 break;
4146 case ST_OMP_SIMD: omp_end_st = ST_OMP_END_SIMD; break;
4147 case ST_OMP_TARGET_TEAMS_DISTRIBUTE:
4148 omp_end_st = ST_OMP_END_TARGET_TEAMS_DISTRIBUTE;
4149 break;
4150 case ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO:
4151 omp_end_st = ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO;
4152 break;
4153 case ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
4154 omp_end_st = ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD;
4155 break;
4156 case ST_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD:
4157 omp_end_st = ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_SIMD;
4158 break;
4159 case ST_OMP_TEAMS_DISTRIBUTE:
4160 omp_end_st = ST_OMP_END_TEAMS_DISTRIBUTE;
4161 break;
4162 case ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO:
4163 omp_end_st = ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO;
4164 break;
4165 case ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
4166 omp_end_st = ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD;
4167 break;
4168 case ST_OMP_TEAMS_DISTRIBUTE_SIMD:
4169 omp_end_st = ST_OMP_END_TEAMS_DISTRIBUTE_SIMD;
4170 break;
4171 default: gcc_unreachable ();
4173 if (st == omp_end_st)
4175 if (new_st.op == EXEC_OMP_END_NOWAIT)
4176 cp->ext.omp_clauses->nowait |= new_st.ext.omp_bool;
4177 else
4178 gcc_assert (new_st.op == EXEC_NOP);
4179 gfc_clear_new_st ();
4180 gfc_commit_symbols ();
4181 gfc_warning_check ();
4182 st = next_statement ();
4184 return st;
4188 /* Parse the statements of OpenMP atomic directive. */
4190 static gfc_statement
4191 parse_omp_atomic (void)
4193 gfc_statement st;
4194 gfc_code *cp, *np;
4195 gfc_state_data s;
4196 int count;
4198 accept_statement (ST_OMP_ATOMIC);
4200 cp = gfc_state_stack->tail;
4201 push_state (&s, COMP_OMP_STRUCTURED_BLOCK, NULL);
4202 np = new_level (cp);
4203 np->op = cp->op;
4204 np->block = NULL;
4205 count = 1 + ((cp->ext.omp_atomic & GFC_OMP_ATOMIC_MASK)
4206 == GFC_OMP_ATOMIC_CAPTURE);
4208 while (count)
4210 st = next_statement ();
4211 if (st == ST_NONE)
4212 unexpected_eof ();
4213 else if (st == ST_ASSIGNMENT)
4215 accept_statement (st);
4216 count--;
4218 else
4219 unexpected_statement (st);
4222 pop_state ();
4224 st = next_statement ();
4225 if (st == ST_OMP_END_ATOMIC)
4227 gfc_clear_new_st ();
4228 gfc_commit_symbols ();
4229 gfc_warning_check ();
4230 st = next_statement ();
4232 else if ((cp->ext.omp_atomic & GFC_OMP_ATOMIC_MASK)
4233 == GFC_OMP_ATOMIC_CAPTURE)
4234 gfc_error ("Missing !$OMP END ATOMIC after !$OMP ATOMIC CAPTURE at %C");
4235 return st;
4239 /* Parse the statements of an OpenACC structured block. */
4241 static void
4242 parse_oacc_structured_block (gfc_statement acc_st)
4244 gfc_statement st, acc_end_st;
4245 gfc_code *cp, *np;
4246 gfc_state_data s, *sd;
4248 for (sd = gfc_state_stack; sd; sd = sd->previous)
4249 if (sd->state == COMP_CRITICAL)
4250 gfc_error_now ("OpenACC directive inside of CRITICAL block at %C");
4252 accept_statement (acc_st);
4254 cp = gfc_state_stack->tail;
4255 push_state (&s, COMP_OMP_STRUCTURED_BLOCK, NULL);
4256 np = new_level (cp);
4257 np->op = cp->op;
4258 np->block = NULL;
4259 switch (acc_st)
4261 case ST_OACC_PARALLEL:
4262 acc_end_st = ST_OACC_END_PARALLEL;
4263 break;
4264 case ST_OACC_KERNELS:
4265 acc_end_st = ST_OACC_END_KERNELS;
4266 break;
4267 case ST_OACC_DATA:
4268 acc_end_st = ST_OACC_END_DATA;
4269 break;
4270 case ST_OACC_HOST_DATA:
4271 acc_end_st = ST_OACC_END_HOST_DATA;
4272 break;
4273 default:
4274 gcc_unreachable ();
4279 st = parse_executable (ST_NONE);
4280 if (st == ST_NONE)
4281 unexpected_eof ();
4282 else if (st != acc_end_st)
4283 gfc_error ("Expecting %s at %C", gfc_ascii_statement (acc_end_st));
4284 reject_statement ();
4286 while (st != acc_end_st);
4288 gcc_assert (new_st.op == EXEC_NOP);
4290 gfc_clear_new_st ();
4291 gfc_commit_symbols ();
4292 gfc_warning_check ();
4293 pop_state ();
4296 /* Parse the statements of OpenACC loop/parallel loop/kernels loop. */
4298 static gfc_statement
4299 parse_oacc_loop (gfc_statement acc_st)
4301 gfc_statement st;
4302 gfc_code *cp, *np;
4303 gfc_state_data s, *sd;
4305 for (sd = gfc_state_stack; sd; sd = sd->previous)
4306 if (sd->state == COMP_CRITICAL)
4307 gfc_error_now ("OpenACC directive inside of CRITICAL block at %C");
4309 accept_statement (acc_st);
4311 cp = gfc_state_stack->tail;
4312 push_state (&s, COMP_OMP_STRUCTURED_BLOCK, NULL);
4313 np = new_level (cp);
4314 np->op = cp->op;
4315 np->block = NULL;
4317 for (;;)
4319 st = next_statement ();
4320 if (st == ST_NONE)
4321 unexpected_eof ();
4322 else if (st == ST_DO)
4323 break;
4324 else
4326 gfc_error ("Expected DO loop at %C");
4327 reject_statement ();
4331 parse_do_block ();
4332 if (gfc_statement_label != NULL
4333 && gfc_state_stack->previous != NULL
4334 && gfc_state_stack->previous->state == COMP_DO
4335 && gfc_state_stack->previous->ext.end_do_label == gfc_statement_label)
4337 pop_state ();
4338 return ST_IMPLIED_ENDDO;
4341 check_do_closure ();
4342 pop_state ();
4344 st = next_statement ();
4345 if (st == ST_OACC_END_LOOP)
4346 gfc_warning ("Redundant !$ACC END LOOP at %C");
4347 if ((acc_st == ST_OACC_PARALLEL_LOOP && st == ST_OACC_END_PARALLEL_LOOP) ||
4348 (acc_st == ST_OACC_KERNELS_LOOP && st == ST_OACC_END_KERNELS_LOOP) ||
4349 (acc_st == ST_OACC_LOOP && st == ST_OACC_END_LOOP))
4351 gcc_assert (new_st.op == EXEC_NOP);
4352 gfc_clear_new_st ();
4353 gfc_commit_symbols ();
4354 gfc_warning_check ();
4355 st = next_statement ();
4357 return st;
4361 /* Parse the statements of an OpenMP structured block. */
4363 static void
4364 parse_omp_structured_block (gfc_statement omp_st, bool workshare_stmts_only)
4366 gfc_statement st, omp_end_st;
4367 gfc_code *cp, *np;
4368 gfc_state_data s;
4370 accept_statement (omp_st);
4372 cp = gfc_state_stack->tail;
4373 push_state (&s, COMP_OMP_STRUCTURED_BLOCK, NULL);
4374 np = new_level (cp);
4375 np->op = cp->op;
4376 np->block = NULL;
4378 switch (omp_st)
4380 case ST_OMP_PARALLEL:
4381 omp_end_st = ST_OMP_END_PARALLEL;
4382 break;
4383 case ST_OMP_PARALLEL_SECTIONS:
4384 omp_end_st = ST_OMP_END_PARALLEL_SECTIONS;
4385 break;
4386 case ST_OMP_SECTIONS:
4387 omp_end_st = ST_OMP_END_SECTIONS;
4388 break;
4389 case ST_OMP_ORDERED:
4390 omp_end_st = ST_OMP_END_ORDERED;
4391 break;
4392 case ST_OMP_CRITICAL:
4393 omp_end_st = ST_OMP_END_CRITICAL;
4394 break;
4395 case ST_OMP_MASTER:
4396 omp_end_st = ST_OMP_END_MASTER;
4397 break;
4398 case ST_OMP_SINGLE:
4399 omp_end_st = ST_OMP_END_SINGLE;
4400 break;
4401 case ST_OMP_TARGET:
4402 omp_end_st = ST_OMP_END_TARGET;
4403 break;
4404 case ST_OMP_TARGET_DATA:
4405 omp_end_st = ST_OMP_END_TARGET_DATA;
4406 break;
4407 case ST_OMP_TARGET_TEAMS:
4408 omp_end_st = ST_OMP_END_TARGET_TEAMS;
4409 break;
4410 case ST_OMP_TARGET_TEAMS_DISTRIBUTE:
4411 omp_end_st = ST_OMP_END_TARGET_TEAMS_DISTRIBUTE;
4412 break;
4413 case ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO:
4414 omp_end_st = ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO;
4415 break;
4416 case ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
4417 omp_end_st = ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD;
4418 break;
4419 case ST_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD:
4420 omp_end_st = ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_SIMD;
4421 break;
4422 case ST_OMP_TASK:
4423 omp_end_st = ST_OMP_END_TASK;
4424 break;
4425 case ST_OMP_TASKGROUP:
4426 omp_end_st = ST_OMP_END_TASKGROUP;
4427 break;
4428 case ST_OMP_TEAMS:
4429 omp_end_st = ST_OMP_END_TEAMS;
4430 break;
4431 case ST_OMP_TEAMS_DISTRIBUTE:
4432 omp_end_st = ST_OMP_END_TEAMS_DISTRIBUTE;
4433 break;
4434 case ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO:
4435 omp_end_st = ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO;
4436 break;
4437 case ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
4438 omp_end_st = ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD;
4439 break;
4440 case ST_OMP_TEAMS_DISTRIBUTE_SIMD:
4441 omp_end_st = ST_OMP_END_TEAMS_DISTRIBUTE_SIMD;
4442 break;
4443 case ST_OMP_DISTRIBUTE:
4444 omp_end_st = ST_OMP_END_DISTRIBUTE;
4445 break;
4446 case ST_OMP_DISTRIBUTE_PARALLEL_DO:
4447 omp_end_st = ST_OMP_END_DISTRIBUTE_PARALLEL_DO;
4448 break;
4449 case ST_OMP_DISTRIBUTE_PARALLEL_DO_SIMD:
4450 omp_end_st = ST_OMP_END_DISTRIBUTE_PARALLEL_DO_SIMD;
4451 break;
4452 case ST_OMP_DISTRIBUTE_SIMD:
4453 omp_end_st = ST_OMP_END_DISTRIBUTE_SIMD;
4454 break;
4455 case ST_OMP_WORKSHARE:
4456 omp_end_st = ST_OMP_END_WORKSHARE;
4457 break;
4458 case ST_OMP_PARALLEL_WORKSHARE:
4459 omp_end_st = ST_OMP_END_PARALLEL_WORKSHARE;
4460 break;
4461 default:
4462 gcc_unreachable ();
4467 if (workshare_stmts_only)
4469 /* Inside of !$omp workshare, only
4470 scalar assignments
4471 array assignments
4472 where statements and constructs
4473 forall statements and constructs
4474 !$omp atomic
4475 !$omp critical
4476 !$omp parallel
4477 are allowed. For !$omp critical these
4478 restrictions apply recursively. */
4479 bool cycle = true;
4481 st = next_statement ();
4482 for (;;)
4484 switch (st)
4486 case ST_NONE:
4487 unexpected_eof ();
4489 case ST_ASSIGNMENT:
4490 case ST_WHERE:
4491 case ST_FORALL:
4492 accept_statement (st);
4493 break;
4495 case ST_WHERE_BLOCK:
4496 parse_where_block ();
4497 break;
4499 case ST_FORALL_BLOCK:
4500 parse_forall_block ();
4501 break;
4503 case ST_OMP_PARALLEL:
4504 case ST_OMP_PARALLEL_SECTIONS:
4505 parse_omp_structured_block (st, false);
4506 break;
4508 case ST_OMP_PARALLEL_WORKSHARE:
4509 case ST_OMP_CRITICAL:
4510 parse_omp_structured_block (st, true);
4511 break;
4513 case ST_OMP_PARALLEL_DO:
4514 case ST_OMP_PARALLEL_DO_SIMD:
4515 st = parse_omp_do (st);
4516 continue;
4518 case ST_OMP_ATOMIC:
4519 st = parse_omp_atomic ();
4520 continue;
4522 default:
4523 cycle = false;
4524 break;
4527 if (!cycle)
4528 break;
4530 st = next_statement ();
4533 else
4534 st = parse_executable (ST_NONE);
4535 if (st == ST_NONE)
4536 unexpected_eof ();
4537 else if (st == ST_OMP_SECTION
4538 && (omp_st == ST_OMP_SECTIONS
4539 || omp_st == ST_OMP_PARALLEL_SECTIONS))
4541 np = new_level (np);
4542 np->op = cp->op;
4543 np->block = NULL;
4545 else if (st != omp_end_st)
4546 unexpected_statement (st);
4548 while (st != omp_end_st);
4550 switch (new_st.op)
4552 case EXEC_OMP_END_NOWAIT:
4553 cp->ext.omp_clauses->nowait |= new_st.ext.omp_bool;
4554 break;
4555 case EXEC_OMP_CRITICAL:
4556 if (((cp->ext.omp_name == NULL) ^ (new_st.ext.omp_name == NULL))
4557 || (new_st.ext.omp_name != NULL
4558 && strcmp (cp->ext.omp_name, new_st.ext.omp_name) != 0))
4559 gfc_error ("Name after !$omp critical and !$omp end critical does "
4560 "not match at %C");
4561 free (CONST_CAST (char *, new_st.ext.omp_name));
4562 break;
4563 case EXEC_OMP_END_SINGLE:
4564 cp->ext.omp_clauses->lists[OMP_LIST_COPYPRIVATE]
4565 = new_st.ext.omp_clauses->lists[OMP_LIST_COPYPRIVATE];
4566 new_st.ext.omp_clauses->lists[OMP_LIST_COPYPRIVATE] = NULL;
4567 gfc_free_omp_clauses (new_st.ext.omp_clauses);
4568 break;
4569 case EXEC_NOP:
4570 break;
4571 default:
4572 gcc_unreachable ();
4575 gfc_clear_new_st ();
4576 gfc_commit_symbols ();
4577 gfc_warning_check ();
4578 pop_state ();
4582 /* Accept a series of executable statements. We return the first
4583 statement that doesn't fit to the caller. Any block statements are
4584 passed on to the correct handler, which usually passes the buck
4585 right back here. */
4587 static gfc_statement
4588 parse_executable (gfc_statement st)
4590 int close_flag;
4592 if (st == ST_NONE)
4593 st = next_statement ();
4595 for (;;)
4597 close_flag = check_do_closure ();
4598 if (close_flag)
4599 switch (st)
4601 case ST_GOTO:
4602 case ST_END_PROGRAM:
4603 case ST_RETURN:
4604 case ST_EXIT:
4605 case ST_END_FUNCTION:
4606 case ST_CYCLE:
4607 case ST_PAUSE:
4608 case ST_STOP:
4609 case ST_ERROR_STOP:
4610 case ST_END_SUBROUTINE:
4612 case ST_DO:
4613 case ST_FORALL:
4614 case ST_WHERE:
4615 case ST_SELECT_CASE:
4616 gfc_error ("%s statement at %C cannot terminate a non-block "
4617 "DO loop", gfc_ascii_statement (st));
4618 break;
4620 default:
4621 break;
4624 switch (st)
4626 case ST_NONE:
4627 unexpected_eof ();
4629 case ST_DATA:
4630 gfc_notify_std (GFC_STD_F95_OBS, "DATA statement at %C after the "
4631 "first executable statement");
4632 /* Fall through. */
4634 case ST_FORMAT:
4635 case ST_ENTRY:
4636 case_executable:
4637 accept_statement (st);
4638 if (close_flag == 1)
4639 return ST_IMPLIED_ENDDO;
4640 break;
4642 case ST_BLOCK:
4643 parse_block_construct ();
4644 break;
4646 case ST_ASSOCIATE:
4647 parse_associate ();
4648 break;
4650 case ST_IF_BLOCK:
4651 parse_if_block ();
4652 break;
4654 case ST_SELECT_CASE:
4655 parse_select_block ();
4656 break;
4658 case ST_SELECT_TYPE:
4659 parse_select_type_block();
4660 break;
4662 case ST_DO:
4663 parse_do_block ();
4664 if (check_do_closure () == 1)
4665 return ST_IMPLIED_ENDDO;
4666 break;
4668 case ST_CRITICAL:
4669 parse_critical_block ();
4670 break;
4672 case ST_WHERE_BLOCK:
4673 parse_where_block ();
4674 break;
4676 case ST_FORALL_BLOCK:
4677 parse_forall_block ();
4678 break;
4680 case ST_OACC_PARALLEL_LOOP:
4681 case ST_OACC_KERNELS_LOOP:
4682 case ST_OACC_LOOP:
4683 st = parse_oacc_loop (st);
4684 if (st == ST_IMPLIED_ENDDO)
4685 return st;
4686 continue;
4688 case ST_OACC_PARALLEL:
4689 case ST_OACC_KERNELS:
4690 case ST_OACC_DATA:
4691 case ST_OACC_HOST_DATA:
4692 parse_oacc_structured_block (st);
4693 break;
4695 case ST_OMP_PARALLEL:
4696 case ST_OMP_PARALLEL_SECTIONS:
4697 case ST_OMP_SECTIONS:
4698 case ST_OMP_ORDERED:
4699 case ST_OMP_CRITICAL:
4700 case ST_OMP_MASTER:
4701 case ST_OMP_SINGLE:
4702 case ST_OMP_TARGET:
4703 case ST_OMP_TARGET_DATA:
4704 case ST_OMP_TARGET_TEAMS:
4705 case ST_OMP_TEAMS:
4706 case ST_OMP_TASK:
4707 case ST_OMP_TASKGROUP:
4708 parse_omp_structured_block (st, false);
4709 break;
4711 case ST_OMP_WORKSHARE:
4712 case ST_OMP_PARALLEL_WORKSHARE:
4713 parse_omp_structured_block (st, true);
4714 break;
4716 case ST_OMP_DISTRIBUTE:
4717 case ST_OMP_DISTRIBUTE_PARALLEL_DO:
4718 case ST_OMP_DISTRIBUTE_PARALLEL_DO_SIMD:
4719 case ST_OMP_DISTRIBUTE_SIMD:
4720 case ST_OMP_DO:
4721 case ST_OMP_DO_SIMD:
4722 case ST_OMP_PARALLEL_DO:
4723 case ST_OMP_PARALLEL_DO_SIMD:
4724 case ST_OMP_SIMD:
4725 case ST_OMP_TARGET_TEAMS_DISTRIBUTE:
4726 case ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO:
4727 case ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
4728 case ST_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD:
4729 case ST_OMP_TEAMS_DISTRIBUTE:
4730 case ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO:
4731 case ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
4732 case ST_OMP_TEAMS_DISTRIBUTE_SIMD:
4733 st = parse_omp_do (st);
4734 if (st == ST_IMPLIED_ENDDO)
4735 return st;
4736 continue;
4738 case ST_OMP_ATOMIC:
4739 st = parse_omp_atomic ();
4740 continue;
4742 default:
4743 return st;
4746 st = next_statement ();
4751 /* Fix the symbols for sibling functions. These are incorrectly added to
4752 the child namespace as the parser didn't know about this procedure. */
4754 static void
4755 gfc_fixup_sibling_symbols (gfc_symbol *sym, gfc_namespace *siblings)
4757 gfc_namespace *ns;
4758 gfc_symtree *st;
4759 gfc_symbol *old_sym;
4761 for (ns = siblings; ns; ns = ns->sibling)
4763 st = gfc_find_symtree (ns->sym_root, sym->name);
4765 if (!st || (st->n.sym->attr.dummy && ns == st->n.sym->ns))
4766 goto fixup_contained;
4768 if ((st->n.sym->attr.flavor == FL_DERIVED
4769 && sym->attr.generic && sym->attr.function)
4770 ||(sym->attr.flavor == FL_DERIVED
4771 && st->n.sym->attr.generic && st->n.sym->attr.function))
4772 goto fixup_contained;
4774 old_sym = st->n.sym;
4775 if (old_sym->ns == ns
4776 && !old_sym->attr.contained
4778 /* By 14.6.1.3, host association should be excluded
4779 for the following. */
4780 && !(old_sym->attr.external
4781 || (old_sym->ts.type != BT_UNKNOWN
4782 && !old_sym->attr.implicit_type)
4783 || old_sym->attr.flavor == FL_PARAMETER
4784 || old_sym->attr.use_assoc
4785 || old_sym->attr.in_common
4786 || old_sym->attr.in_equivalence
4787 || old_sym->attr.data
4788 || old_sym->attr.dummy
4789 || old_sym->attr.result
4790 || old_sym->attr.dimension
4791 || old_sym->attr.allocatable
4792 || old_sym->attr.intrinsic
4793 || old_sym->attr.generic
4794 || old_sym->attr.flavor == FL_NAMELIST
4795 || old_sym->attr.flavor == FL_LABEL
4796 || old_sym->attr.proc == PROC_ST_FUNCTION))
4798 /* Replace it with the symbol from the parent namespace. */
4799 st->n.sym = sym;
4800 sym->refs++;
4802 gfc_release_symbol (old_sym);
4805 fixup_contained:
4806 /* Do the same for any contained procedures. */
4807 gfc_fixup_sibling_symbols (sym, ns->contained);
4811 static void
4812 parse_contained (int module)
4814 gfc_namespace *ns, *parent_ns, *tmp;
4815 gfc_state_data s1, s2;
4816 gfc_statement st;
4817 gfc_symbol *sym;
4818 gfc_entry_list *el;
4819 int contains_statements = 0;
4820 int seen_error = 0;
4822 push_state (&s1, COMP_CONTAINS, NULL);
4823 parent_ns = gfc_current_ns;
4827 gfc_current_ns = gfc_get_namespace (parent_ns, 1);
4829 gfc_current_ns->sibling = parent_ns->contained;
4830 parent_ns->contained = gfc_current_ns;
4832 next:
4833 /* Process the next available statement. We come here if we got an error
4834 and rejected the last statement. */
4835 st = next_statement ();
4837 switch (st)
4839 case ST_NONE:
4840 unexpected_eof ();
4842 case ST_FUNCTION:
4843 case ST_SUBROUTINE:
4844 contains_statements = 1;
4845 accept_statement (st);
4847 push_state (&s2,
4848 (st == ST_FUNCTION) ? COMP_FUNCTION : COMP_SUBROUTINE,
4849 gfc_new_block);
4851 /* For internal procedures, create/update the symbol in the
4852 parent namespace. */
4854 if (!module)
4856 if (gfc_get_symbol (gfc_new_block->name, parent_ns, &sym))
4857 gfc_error ("Contained procedure '%s' at %C is already "
4858 "ambiguous", gfc_new_block->name);
4859 else
4861 if (gfc_add_procedure (&sym->attr, PROC_INTERNAL,
4862 sym->name,
4863 &gfc_new_block->declared_at))
4865 if (st == ST_FUNCTION)
4866 gfc_add_function (&sym->attr, sym->name,
4867 &gfc_new_block->declared_at);
4868 else
4869 gfc_add_subroutine (&sym->attr, sym->name,
4870 &gfc_new_block->declared_at);
4874 gfc_commit_symbols ();
4876 else
4877 sym = gfc_new_block;
4879 /* Mark this as a contained function, so it isn't replaced
4880 by other module functions. */
4881 sym->attr.contained = 1;
4883 /* Set implicit_pure so that it can be reset if any of the
4884 tests for purity fail. This is used for some optimisation
4885 during translation. */
4886 if (!sym->attr.pure)
4887 sym->attr.implicit_pure = 1;
4889 parse_progunit (ST_NONE);
4891 /* Fix up any sibling functions that refer to this one. */
4892 gfc_fixup_sibling_symbols (sym, gfc_current_ns);
4893 /* Or refer to any of its alternate entry points. */
4894 for (el = gfc_current_ns->entries; el; el = el->next)
4895 gfc_fixup_sibling_symbols (el->sym, gfc_current_ns);
4897 gfc_current_ns->code = s2.head;
4898 gfc_current_ns = parent_ns;
4900 pop_state ();
4901 break;
4903 /* These statements are associated with the end of the host unit. */
4904 case ST_END_FUNCTION:
4905 case ST_END_MODULE:
4906 case ST_END_PROGRAM:
4907 case ST_END_SUBROUTINE:
4908 accept_statement (st);
4909 gfc_current_ns->code = s1.head;
4910 break;
4912 default:
4913 gfc_error ("Unexpected %s statement in CONTAINS section at %C",
4914 gfc_ascii_statement (st));
4915 reject_statement ();
4916 seen_error = 1;
4917 goto next;
4918 break;
4921 while (st != ST_END_FUNCTION && st != ST_END_SUBROUTINE
4922 && st != ST_END_MODULE && st != ST_END_PROGRAM);
4924 /* The first namespace in the list is guaranteed to not have
4925 anything (worthwhile) in it. */
4926 tmp = gfc_current_ns;
4927 gfc_current_ns = parent_ns;
4928 if (seen_error && tmp->refs > 1)
4929 gfc_free_namespace (tmp);
4931 ns = gfc_current_ns->contained;
4932 gfc_current_ns->contained = ns->sibling;
4933 gfc_free_namespace (ns);
4935 pop_state ();
4936 if (!contains_statements)
4937 gfc_notify_std (GFC_STD_F2008, "CONTAINS statement without "
4938 "FUNCTION or SUBROUTINE statement at %C");
4942 /* Parse a PROGRAM, SUBROUTINE, FUNCTION unit or BLOCK construct. */
4944 static void
4945 parse_progunit (gfc_statement st)
4947 gfc_state_data *p;
4948 int n;
4950 st = parse_spec (st);
4951 switch (st)
4953 case ST_NONE:
4954 unexpected_eof ();
4956 case ST_CONTAINS:
4957 /* This is not allowed within BLOCK! */
4958 if (gfc_current_state () != COMP_BLOCK)
4959 goto contains;
4960 break;
4962 case_end:
4963 accept_statement (st);
4964 goto done;
4966 default:
4967 break;
4970 if (gfc_current_state () == COMP_FUNCTION)
4971 gfc_check_function_type (gfc_current_ns);
4973 loop:
4974 for (;;)
4976 st = parse_executable (st);
4978 switch (st)
4980 case ST_NONE:
4981 unexpected_eof ();
4983 case ST_CONTAINS:
4984 /* This is not allowed within BLOCK! */
4985 if (gfc_current_state () != COMP_BLOCK)
4986 goto contains;
4987 break;
4989 case_end:
4990 accept_statement (st);
4991 goto done;
4993 default:
4994 break;
4997 unexpected_statement (st);
4998 reject_statement ();
4999 st = next_statement ();
5002 contains:
5003 n = 0;
5005 for (p = gfc_state_stack; p; p = p->previous)
5006 if (p->state == COMP_CONTAINS)
5007 n++;
5009 if (gfc_find_state (COMP_MODULE) == true)
5010 n--;
5012 if (n > 0)
5014 gfc_error ("CONTAINS statement at %C is already in a contained "
5015 "program unit");
5016 reject_statement ();
5017 st = next_statement ();
5018 goto loop;
5021 parse_contained (0);
5023 done:
5024 gfc_current_ns->code = gfc_state_stack->head;
5025 if (gfc_state_stack->state == COMP_PROGRAM
5026 || gfc_state_stack->state == COMP_MODULE
5027 || gfc_state_stack->state == COMP_SUBROUTINE
5028 || gfc_state_stack->state == COMP_FUNCTION
5029 || gfc_state_stack->state == COMP_BLOCK)
5030 gfc_current_ns->oacc_declare_clauses
5031 = gfc_state_stack->ext.oacc_declare_clauses;
5035 /* Come here to complain about a global symbol already in use as
5036 something else. */
5038 void
5039 gfc_global_used (gfc_gsymbol *sym, locus *where)
5041 const char *name;
5043 if (where == NULL)
5044 where = &gfc_current_locus;
5046 switch(sym->type)
5048 case GSYM_PROGRAM:
5049 name = "PROGRAM";
5050 break;
5051 case GSYM_FUNCTION:
5052 name = "FUNCTION";
5053 break;
5054 case GSYM_SUBROUTINE:
5055 name = "SUBROUTINE";
5056 break;
5057 case GSYM_COMMON:
5058 name = "COMMON";
5059 break;
5060 case GSYM_BLOCK_DATA:
5061 name = "BLOCK DATA";
5062 break;
5063 case GSYM_MODULE:
5064 name = "MODULE";
5065 break;
5066 default:
5067 gfc_internal_error ("gfc_global_used(): Bad type");
5068 name = NULL;
5071 if (sym->binding_label)
5072 gfc_error ("Global binding name '%s' at %L is already being used as a %s "
5073 "at %L", sym->binding_label, where, name, &sym->where);
5074 else
5075 gfc_error ("Global name '%s' at %L is already being used as a %s at %L",
5076 sym->name, where, name, &sym->where);
5080 /* Parse a block data program unit. */
5082 static void
5083 parse_block_data (void)
5085 gfc_statement st;
5086 static locus blank_locus;
5087 static int blank_block=0;
5088 gfc_gsymbol *s;
5090 gfc_current_ns->proc_name = gfc_new_block;
5091 gfc_current_ns->is_block_data = 1;
5093 if (gfc_new_block == NULL)
5095 if (blank_block)
5096 gfc_error ("Blank BLOCK DATA at %C conflicts with "
5097 "prior BLOCK DATA at %L", &blank_locus);
5098 else
5100 blank_block = 1;
5101 blank_locus = gfc_current_locus;
5104 else
5106 s = gfc_get_gsymbol (gfc_new_block->name);
5107 if (s->defined
5108 || (s->type != GSYM_UNKNOWN && s->type != GSYM_BLOCK_DATA))
5109 gfc_global_used (s, &gfc_new_block->declared_at);
5110 else
5112 s->type = GSYM_BLOCK_DATA;
5113 s->where = gfc_new_block->declared_at;
5114 s->defined = 1;
5118 st = parse_spec (ST_NONE);
5120 while (st != ST_END_BLOCK_DATA)
5122 gfc_error ("Unexpected %s statement in BLOCK DATA at %C",
5123 gfc_ascii_statement (st));
5124 reject_statement ();
5125 st = next_statement ();
5130 /* Parse a module subprogram. */
5132 static void
5133 parse_module (void)
5135 gfc_statement st;
5136 gfc_gsymbol *s;
5137 bool error;
5139 s = gfc_get_gsymbol (gfc_new_block->name);
5140 if (s->defined || (s->type != GSYM_UNKNOWN && s->type != GSYM_MODULE))
5141 gfc_global_used (s, &gfc_new_block->declared_at);
5142 else
5144 s->type = GSYM_MODULE;
5145 s->where = gfc_new_block->declared_at;
5146 s->defined = 1;
5149 st = parse_spec (ST_NONE);
5151 error = false;
5152 loop:
5153 switch (st)
5155 case ST_NONE:
5156 unexpected_eof ();
5158 case ST_CONTAINS:
5159 parse_contained (1);
5160 break;
5162 case ST_END_MODULE:
5163 accept_statement (st);
5164 break;
5166 default:
5167 gfc_error ("Unexpected %s statement in MODULE at %C",
5168 gfc_ascii_statement (st));
5170 error = true;
5171 reject_statement ();
5172 st = next_statement ();
5173 goto loop;
5176 /* Make sure not to free the namespace twice on error. */
5177 if (!error)
5178 s->ns = gfc_current_ns;
5182 /* Add a procedure name to the global symbol table. */
5184 static void
5185 add_global_procedure (bool sub)
5187 gfc_gsymbol *s;
5189 /* Only in Fortran 2003: For procedures with a binding label also the Fortran
5190 name is a global identifier. */
5191 if (!gfc_new_block->binding_label || gfc_notification_std (GFC_STD_F2008))
5193 s = gfc_get_gsymbol (gfc_new_block->name);
5195 if (s->defined
5196 || (s->type != GSYM_UNKNOWN
5197 && s->type != (sub ? GSYM_SUBROUTINE : GSYM_FUNCTION)))
5199 gfc_global_used (s, &gfc_new_block->declared_at);
5200 /* Silence follow-up errors. */
5201 gfc_new_block->binding_label = NULL;
5203 else
5205 s->type = sub ? GSYM_SUBROUTINE : GSYM_FUNCTION;
5206 s->sym_name = gfc_new_block->name;
5207 s->where = gfc_new_block->declared_at;
5208 s->defined = 1;
5209 s->ns = gfc_current_ns;
5213 /* Don't add the symbol multiple times. */
5214 if (gfc_new_block->binding_label
5215 && (!gfc_notification_std (GFC_STD_F2008)
5216 || strcmp (gfc_new_block->name, gfc_new_block->binding_label) != 0))
5218 s = gfc_get_gsymbol (gfc_new_block->binding_label);
5220 if (s->defined
5221 || (s->type != GSYM_UNKNOWN
5222 && s->type != (sub ? GSYM_SUBROUTINE : GSYM_FUNCTION)))
5224 gfc_global_used (s, &gfc_new_block->declared_at);
5225 /* Silence follow-up errors. */
5226 gfc_new_block->binding_label = NULL;
5228 else
5230 s->type = sub ? GSYM_SUBROUTINE : GSYM_FUNCTION;
5231 s->sym_name = gfc_new_block->name;
5232 s->binding_label = gfc_new_block->binding_label;
5233 s->where = gfc_new_block->declared_at;
5234 s->defined = 1;
5235 s->ns = gfc_current_ns;
5241 /* Add a program to the global symbol table. */
5243 static void
5244 add_global_program (void)
5246 gfc_gsymbol *s;
5248 if (gfc_new_block == NULL)
5249 return;
5250 s = gfc_get_gsymbol (gfc_new_block->name);
5252 if (s->defined || (s->type != GSYM_UNKNOWN && s->type != GSYM_PROGRAM))
5253 gfc_global_used (s, &gfc_new_block->declared_at);
5254 else
5256 s->type = GSYM_PROGRAM;
5257 s->where = gfc_new_block->declared_at;
5258 s->defined = 1;
5259 s->ns = gfc_current_ns;
5264 /* Resolve all the program units. */
5265 static void
5266 resolve_all_program_units (gfc_namespace *gfc_global_ns_list)
5268 gfc_free_dt_list ();
5269 gfc_current_ns = gfc_global_ns_list;
5270 for (; gfc_current_ns; gfc_current_ns = gfc_current_ns->sibling)
5272 if (gfc_current_ns->proc_name
5273 && gfc_current_ns->proc_name->attr.flavor == FL_MODULE)
5274 continue; /* Already resolved. */
5276 if (gfc_current_ns->proc_name)
5277 gfc_current_locus = gfc_current_ns->proc_name->declared_at;
5278 gfc_resolve (gfc_current_ns);
5279 gfc_current_ns->derived_types = gfc_derived_types;
5280 gfc_derived_types = NULL;
5285 static void
5286 clean_up_modules (gfc_gsymbol *gsym)
5288 if (gsym == NULL)
5289 return;
5291 clean_up_modules (gsym->left);
5292 clean_up_modules (gsym->right);
5294 if (gsym->type != GSYM_MODULE || !gsym->ns)
5295 return;
5297 gfc_current_ns = gsym->ns;
5298 gfc_derived_types = gfc_current_ns->derived_types;
5299 gfc_done_2 ();
5300 gsym->ns = NULL;
5301 return;
5305 /* Translate all the program units. This could be in a different order
5306 to resolution if there are forward references in the file. */
5307 static void
5308 translate_all_program_units (gfc_namespace *gfc_global_ns_list)
5310 int errors;
5312 gfc_current_ns = gfc_global_ns_list;
5313 gfc_get_errors (NULL, &errors);
5315 /* We first translate all modules to make sure that later parts
5316 of the program can use the decl. Then we translate the nonmodules. */
5318 for (; !errors && gfc_current_ns; gfc_current_ns = gfc_current_ns->sibling)
5320 if (!gfc_current_ns->proc_name
5321 || gfc_current_ns->proc_name->attr.flavor != FL_MODULE)
5322 continue;
5324 gfc_current_locus = gfc_current_ns->proc_name->declared_at;
5325 gfc_derived_types = gfc_current_ns->derived_types;
5326 gfc_generate_module_code (gfc_current_ns);
5327 gfc_current_ns->translated = 1;
5330 gfc_current_ns = gfc_global_ns_list;
5331 for (; !errors && gfc_current_ns; gfc_current_ns = gfc_current_ns->sibling)
5333 if (gfc_current_ns->proc_name
5334 && gfc_current_ns->proc_name->attr.flavor == FL_MODULE)
5335 continue;
5337 gfc_current_locus = gfc_current_ns->proc_name->declared_at;
5338 gfc_derived_types = gfc_current_ns->derived_types;
5339 gfc_generate_code (gfc_current_ns);
5340 gfc_current_ns->translated = 1;
5343 /* Clean up all the namespaces after translation. */
5344 gfc_current_ns = gfc_global_ns_list;
5345 for (;gfc_current_ns;)
5347 gfc_namespace *ns;
5349 if (gfc_current_ns->proc_name
5350 && gfc_current_ns->proc_name->attr.flavor == FL_MODULE)
5352 gfc_current_ns = gfc_current_ns->sibling;
5353 continue;
5356 ns = gfc_current_ns->sibling;
5357 gfc_derived_types = gfc_current_ns->derived_types;
5358 gfc_done_2 ();
5359 gfc_current_ns = ns;
5362 clean_up_modules (gfc_gsym_root);
5366 /* Top level parser. */
5368 bool
5369 gfc_parse_file (void)
5371 int seen_program, errors_before, errors;
5372 gfc_state_data top, s;
5373 gfc_statement st;
5374 locus prog_locus;
5375 gfc_namespace *next;
5377 gfc_start_source_files ();
5379 top.state = COMP_NONE;
5380 top.sym = NULL;
5381 top.previous = NULL;
5382 top.head = top.tail = NULL;
5383 top.do_variable = NULL;
5385 gfc_state_stack = &top;
5387 gfc_clear_new_st ();
5389 gfc_statement_label = NULL;
5391 if (setjmp (eof_buf))
5392 return false; /* Come here on unexpected EOF */
5394 /* Prepare the global namespace that will contain the
5395 program units. */
5396 gfc_global_ns_list = next = NULL;
5398 seen_program = 0;
5399 errors_before = 0;
5401 /* Exit early for empty files. */
5402 if (gfc_at_eof ())
5403 goto done;
5405 loop:
5406 gfc_init_2 ();
5407 st = next_statement ();
5408 switch (st)
5410 case ST_NONE:
5411 gfc_done_2 ();
5412 goto done;
5414 case ST_PROGRAM:
5415 if (seen_program)
5416 goto duplicate_main;
5417 seen_program = 1;
5418 prog_locus = gfc_current_locus;
5420 push_state (&s, COMP_PROGRAM, gfc_new_block);
5421 main_program_symbol(gfc_current_ns, gfc_new_block->name);
5422 accept_statement (st);
5423 add_global_program ();
5424 parse_progunit (ST_NONE);
5425 goto prog_units;
5426 break;
5428 case ST_SUBROUTINE:
5429 add_global_procedure (true);
5430 push_state (&s, COMP_SUBROUTINE, gfc_new_block);
5431 accept_statement (st);
5432 parse_progunit (ST_NONE);
5433 goto prog_units;
5434 break;
5436 case ST_FUNCTION:
5437 add_global_procedure (false);
5438 push_state (&s, COMP_FUNCTION, gfc_new_block);
5439 accept_statement (st);
5440 parse_progunit (ST_NONE);
5441 goto prog_units;
5442 break;
5444 case ST_BLOCK_DATA:
5445 push_state (&s, COMP_BLOCK_DATA, gfc_new_block);
5446 accept_statement (st);
5447 parse_block_data ();
5448 break;
5450 case ST_MODULE:
5451 push_state (&s, COMP_MODULE, gfc_new_block);
5452 accept_statement (st);
5454 gfc_get_errors (NULL, &errors_before);
5455 parse_module ();
5456 break;
5458 /* Anything else starts a nameless main program block. */
5459 default:
5460 if (seen_program)
5461 goto duplicate_main;
5462 seen_program = 1;
5463 prog_locus = gfc_current_locus;
5465 push_state (&s, COMP_PROGRAM, gfc_new_block);
5466 main_program_symbol (gfc_current_ns, "MAIN__");
5467 parse_progunit (st);
5468 goto prog_units;
5469 break;
5472 /* Handle the non-program units. */
5473 gfc_current_ns->code = s.head;
5475 gfc_resolve (gfc_current_ns);
5477 /* Dump the parse tree if requested. */
5478 if (gfc_option.dump_fortran_original)
5479 gfc_dump_parse_tree (gfc_current_ns, stdout);
5481 gfc_get_errors (NULL, &errors);
5482 if (s.state == COMP_MODULE)
5484 gfc_dump_module (s.sym->name, errors_before == errors);
5485 gfc_current_ns->derived_types = gfc_derived_types;
5486 gfc_derived_types = NULL;
5487 goto prog_units;
5489 else
5491 if (errors == 0)
5492 gfc_generate_code (gfc_current_ns);
5493 pop_state ();
5494 gfc_done_2 ();
5497 goto loop;
5499 prog_units:
5500 /* The main program and non-contained procedures are put
5501 in the global namespace list, so that they can be processed
5502 later and all their interfaces resolved. */
5503 gfc_current_ns->code = s.head;
5504 if (next)
5506 for (; next->sibling; next = next->sibling)
5508 next->sibling = gfc_current_ns;
5510 else
5511 gfc_global_ns_list = gfc_current_ns;
5513 next = gfc_current_ns;
5515 pop_state ();
5516 goto loop;
5518 done:
5520 /* Do the resolution. */
5521 resolve_all_program_units (gfc_global_ns_list);
5523 /* Do the parse tree dump. */
5524 gfc_current_ns
5525 = gfc_option.dump_fortran_original ? gfc_global_ns_list : NULL;
5527 for (; gfc_current_ns; gfc_current_ns = gfc_current_ns->sibling)
5528 if (!gfc_current_ns->proc_name
5529 || gfc_current_ns->proc_name->attr.flavor != FL_MODULE)
5531 gfc_dump_parse_tree (gfc_current_ns, stdout);
5532 fputs ("------------------------------------------\n\n", stdout);
5535 /* Do the translation. */
5536 translate_all_program_units (gfc_global_ns_list);
5538 gfc_end_source_files ();
5539 return true;
5541 duplicate_main:
5542 /* If we see a duplicate main program, shut down. If the second
5543 instance is an implied main program, i.e. data decls or executable
5544 statements, we're in for lots of errors. */
5545 gfc_error ("Two main PROGRAMs at %L and %C", &prog_locus);
5546 reject_statement ();
5547 gfc_done_2 ();
5548 return true;
5551 /* Return true if this state data represents an OpenACC region. */
5552 bool
5553 is_oacc (gfc_state_data *sd)
5555 switch (sd->construct->op)
5557 case EXEC_OACC_PARALLEL_LOOP:
5558 case EXEC_OACC_PARALLEL:
5559 case EXEC_OACC_KERNELS_LOOP:
5560 case EXEC_OACC_KERNELS:
5561 case EXEC_OACC_DATA:
5562 case EXEC_OACC_HOST_DATA:
5563 case EXEC_OACC_LOOP:
5564 case EXEC_OACC_UPDATE:
5565 case EXEC_OACC_WAIT:
5566 case EXEC_OACC_CACHE:
5567 case EXEC_OACC_ENTER_DATA:
5568 case EXEC_OACC_EXIT_DATA:
5569 return true;
5571 default:
5572 return false;