+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.
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);
/* 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
{
gfc_namespace *old_ns;
code_stack *old_cs_base;
+ struct gfc_omp_saved_state old_omp_state;
if (ns->resolved)
return;
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);
ns->resolved = 1;
gfc_run_passes (ns);
+
+ gfc_omp_restore_state (&old_omp_state);
}
+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.
--- /dev/null
+! { 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" } }