2016-12-07 Jakub Jelinek Backported from mainline 2016-09-27 Jakub Jelinek PR fortran/77666 * trans-openmp.c (gfc_omp_private_outer_ref): Return true even for references to allocatable arrays. * gfortran.dg/gomp/pr77666.f90: New test. --- gcc/fortran/trans-openmp.c (revision 240521) +++ gcc/fortran/trans-openmp.c (revision 240522) @@ -207,6 +207,9 @@ gfc_omp_private_outer_ref (tree decl) { tree type = TREE_TYPE (decl); + if (gfc_omp_privatize_by_reference (decl)) + type = TREE_TYPE (type); + if (GFC_DESCRIPTOR_TYPE_P (type) && GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_ALLOCATABLE) return true; @@ -214,9 +217,6 @@ gfc_omp_private_outer_ref (tree decl) if (GFC_DECL_GET_SCALAR_ALLOCATABLE (decl)) return true; - if (gfc_omp_privatize_by_reference (decl)) - type = TREE_TYPE (type); - if (gfc_has_alloc_comps (type, decl)) return true; --- gcc/testsuite/gfortran.dg/gomp/pr77666.f90 (revision 0) +++ gcc/testsuite/gfortran.dg/gomp/pr77666.f90 (revision 240522) @@ -0,0 +1,26 @@ +! PR fortran/77666 +! { dg-do compile } + +subroutine foo(x) + interface + subroutine baz(x, y) + integer, allocatable :: x(:), y + end subroutine + end interface + integer, allocatable :: x(:), y +!$omp parallel private(x, y) + call baz (x, y) +!$omp end parallel +end +subroutine bar + interface + subroutine baz(x, y) + integer, allocatable :: x(:), y + end subroutine + end interface + integer, allocatable :: x(:), y + call baz (x, y) +!$omp parallel private(x, y) + call baz (x, y) +!$omp end parallel +end