diff options
author | Tobias Burnus <burnus@net-b.de> | 2011-09-08 08:38:13 +0200 |
---|---|---|
committer | Tobias Burnus <burnus@gcc.gnu.org> | 2011-09-08 08:38:13 +0200 |
commit | 8c6a85e33bc6029579949a76acbb0590463d7c8b (patch) | |
tree | a509c092472a1fe6cc07cae1c9cd4ebbddb64862 /gcc/fortran/parse.c | |
parent | 1542d97a4ed360e4874afc04a6d5e8b31c0ce3e3 (diff) | |
download | gcc-8c6a85e33bc6029579949a76acbb0590463d7c8b.zip gcc-8c6a85e33bc6029579949a76acbb0590463d7c8b.tar.gz gcc-8c6a85e33bc6029579949a76acbb0590463d7c8b.tar.bz2 |
re PR fortran/44646 ([F08] Implement DO CONCURRENT)
gcc/fortran/
2011-09-08 Tobias Burnus <burnus@net-b.de>
PR fortran/44646
* decl.c (gfc_match_entry, gfc_match_end): Handle
* COMP_DO_CONCURRENT.
* dump-parse-tree.c (show_code_node): Handle EXEC_DO_CONCURRENT.
* gfortran.h (gfc_exec_op): Add EXEC_DO_CONCURRENT.
* match.c (gfc_match_critical, match_exit_cycle,
* gfc_match_stopcode,
lock_unlock_statement, sync_statement, gfc_match_allocate,
gfc_match_deallocate, gfc_match_return): Add DO CONCURRENT diagnostic.
(gfc_match_do): Match DO CONCURRENT.
(match_derived_type_spec, match_type_spec, gfc_free_forall_iterator,
match_forall_iterator, match_forall_header, match_simple_forall,
gfc_match_forall): Move up in the file.
* parse.c (check_do_closure, parse_do_block): Handle do
* concurrent.
* parse.h (gfc_compile_state): Add COMP_DO_CONCURRENT.
* resolve.c (do_concurrent_flag): New global variable.
(resolve_function, pure_subroutine, resolve_branch,
gfc_resolve_blocks, resolve_code, resolve_types): Add do concurrent
diagnostic.
* st.c (gfc_free_statement): Handle EXEC_DO_CONCURRENT.
* trans-stmt.c (gfc_trans_do_concurrent): New function.
(gfc_trans_forall_1): Handle do concurrent.
* trans-stmt.h (gfc_trans_do_concurrent): New function
* prototype.
* trans.c (trans_code): Call it.
* frontend-passes.c (gfc_code_walker): Handle
* EXEC_DO_CONCURRENT.
gcc/testsuite/
2011-09-08 Tobias Burnus <burnus@net-b.de>
PR fortran/44646
* gfortran.dg/do_concurrent_1.f90: New.
* gfortran.dg/do_concurrent_2.f90: New.
From-SVN: r178677
Diffstat (limited to 'gcc/fortran/parse.c')
-rw-r--r-- | gcc/fortran/parse.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/gcc/fortran/parse.c b/gcc/fortran/parse.c index 9b11086..24d8960 100644 --- a/gcc/fortran/parse.c +++ b/gcc/fortran/parse.c @@ -3154,7 +3154,7 @@ check_do_closure (void) return 0; for (p = gfc_state_stack; p; p = p->previous) - if (p->state == COMP_DO) + if (p->state == COMP_DO || p->state == COMP_DO_CONCURRENT) break; if (p == NULL) @@ -3172,7 +3172,8 @@ check_do_closure (void) /* At this point, the label doesn't terminate the innermost loop. Make sure it doesn't terminate another one. */ for (; p; p = p->previous) - if (p->state == COMP_DO && p->ext.end_do_label == gfc_statement_label) + if ((p->state == COMP_DO || p->state == COMP_DO_CONCURRENT) + && p->ext.end_do_label == gfc_statement_label) { gfc_error ("End of nonblock DO statement at %C is interwoven " "with another DO loop"); @@ -3387,7 +3388,9 @@ parse_do_block (void) gfc_code *top; gfc_state_data s; gfc_symtree *stree; + gfc_exec_op do_op; + do_op = new_st.op; s.ext.end_do_label = new_st.label1; if (new_st.ext.iterator != NULL) @@ -3398,7 +3401,8 @@ parse_do_block (void) accept_statement (ST_DO); top = gfc_state_stack->tail; - push_state (&s, COMP_DO, gfc_new_block); + push_state (&s, do_op == EXEC_DO_CONCURRENT ? COMP_DO_CONCURRENT : COMP_DO, + gfc_new_block); s.do_variable = stree; |