aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/resolve.c
diff options
context:
space:
mode:
authorMikael Morin <mikael@gcc.gnu.org>2015-06-19 12:50:00 +0000
committerMikael Morin <mikael@gcc.gnu.org>2015-06-19 12:50:00 +0000
commitf0e99403aff4b146aea1771a0f5ae41de7092afc (patch)
treec2b9734d7e03d872604656f71cb305cb1698f759 /gcc/fortran/resolve.c
parent3fc4f5cd9345bf1fcf348fa46afccde67dbd398d (diff)
downloadgcc-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.c13
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);
}