diff options
author | Mikael Morin <mikael@gcc.gnu.org> | 2015-06-19 12:50:00 +0000 |
---|---|---|
committer | Mikael Morin <mikael@gcc.gnu.org> | 2015-06-19 12:50:00 +0000 |
commit | f0e99403aff4b146aea1771a0f5ae41de7092afc (patch) | |
tree | c2b9734d7e03d872604656f71cb305cb1698f759 /gcc/fortran/resolve.c | |
parent | 3fc4f5cd9345bf1fcf348fa46afccde67dbd398d (diff) | |
download | gcc-f0e99403aff4b146aea1771a0f5ae41de7092afc.zip gcc-f0e99403aff4b146aea1771a0f5ae41de7092afc.tar.gz gcc-f0e99403aff4b146aea1771a0f5ae41de7092afc.tar.bz2 |
Fix openmp global state fortran regression
PR fortran/66549
gcc/fortran/
* resolve.c (resolve_global_procedure): Don't save and restore
OpenMP state around the call to gfc_resolve.
(gfc_resolve): Save OpenMP state on entry and restore it on return.
gcc/testsuite/
* gfortran.dg/gomp/omp_parallel_1.f90: New file.
From-SVN: r224648
Diffstat (limited to 'gcc/fortran/resolve.c')
-rw-r--r-- | gcc/fortran/resolve.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index f365e8ff..e332095 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -2384,14 +2384,11 @@ resolve_global_procedure (gfc_symbol *sym, locus *where, if (!gsym->ns->resolved) { gfc_dt_list *old_dt_list; - struct gfc_omp_saved_state old_omp_state; /* Stash away derived types so that the backend_decls do not get mixed up. */ old_dt_list = gfc_derived_types; gfc_derived_types = NULL; - /* And stash away openmp state. */ - gfc_omp_save_and_clear_state (&old_omp_state); gfc_resolve (gsym->ns); @@ -2401,8 +2398,6 @@ resolve_global_procedure (gfc_symbol *sym, locus *where, /* Restore the derived types of this namespace. */ gfc_derived_types = old_dt_list; - /* And openmp state. */ - gfc_omp_restore_state (&old_omp_state); } /* Make sure that translation for the gsymbol occurs before @@ -15091,6 +15086,7 @@ gfc_resolve (gfc_namespace *ns) { gfc_namespace *old_ns; code_stack *old_cs_base; + struct gfc_omp_saved_state old_omp_state; if (ns->resolved) return; @@ -15099,6 +15095,11 @@ gfc_resolve (gfc_namespace *ns) old_ns = gfc_current_ns; old_cs_base = cs_base; + /* As gfc_resolve can be called during resolution of an OpenMP construct + body, we should clear any state associated to it, so that say NS's + DO loops are not interpreted as OpenMP loops. */ + gfc_omp_save_and_clear_state (&old_omp_state); + resolve_types (ns); component_assignment_level = 0; resolve_codes (ns); @@ -15108,4 +15109,6 @@ gfc_resolve (gfc_namespace *ns) ns->resolved = 1; gfc_run_passes (ns); + + gfc_omp_restore_state (&old_omp_state); } |