aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog7
-rw-r--r--gcc/fortran/resolve.c13
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/gomp/omp_parallel_1.f9037
4 files changed, 57 insertions, 5 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index ee6b190..148bc80 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,10 @@
+2015-06-19 Mikael Morin <mikael@gcc.gnu.org>
+
+ PR fortran/66549
+ * 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.
+
2015-06-17 Andrew MacLeod <amacleod@redhat.com>
* convert.c: Do not include input.h, line-map.h or is-a.h.
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);
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 1ca4b68..3b3962a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2015-06-19 Mikael Morin <mikael@gcc.gnu.org>
+
+ PR fortran/66549
+ * gfortran.dg/gomp/omp_parallel_1.f90: New file.
+
2015-06-19 Ilya Enkovich <enkovich.gnu@gmail.com>
* gcc.target/i386/mpx/pr66581.c: New test.
diff --git a/gcc/testsuite/gfortran.dg/gomp/omp_parallel_1.f90 b/gcc/testsuite/gfortran.dg/gomp/omp_parallel_1.f90
new file mode 100644
index 0000000..4bcb563
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/gomp/omp_parallel_1.f90
@@ -0,0 +1,37 @@
+! { dg-do compile }
+! { dg-additional-options "-fdump-tree-original" }
+!
+! PR fortran/66549
+! The resolution of CVN in the middle CLWF's OpenMP construct was
+! making the DO loop (wrongly) interpreted as an OpenMP-managed loop, leading
+! to an ICE.
+!
+! Contributed by Andrew Benson <abensonca@gmail.com>.
+
+module smfa
+ type :: sgc
+ contains
+ procedure :: sla => sa
+ end type sgc
+ class(sgc), pointer :: sg_
+ double precision, allocatable, dimension(:) :: vni
+contains
+ double precision function sa(self,i)
+ class(sgc), intent(in ) :: self
+ end function sa
+ subroutine cvn(sg_,vn)
+ class(sgc), intent(inout) :: sg_
+ double precision, intent( out), dimension(:) :: vn
+ integer :: i
+ do i=1,2
+ vn(i)= sg_%sla(i)
+ end do
+ end subroutine cvn
+ subroutine clwf()
+ !$omp parallel
+ call cvn(sg_,vni)
+ !$omp end parallel
+ end subroutine clwf
+end module smfa
+
+! { dg-final { scan-tree-dump-times "#pragma\\s+omp\\s+parallel\\n" 1 "original" } }