Commit f0e99403 by Mikael Morin

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
parent 3fc4f5cd
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.
......
......@@ -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);
}
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.
......
! { 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" } }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment