[Patch, Fortran] PR63861 - fix OpenMP/ACC's gfc_has_alloc_comps
Jakub Jelinek
jakub@redhat.com
Mon Jan 26 07:59:00 GMT 2015
On Sat, Jan 24, 2015 at 07:21:27PM +0100, Tobias Burnus wrote:
> gfortran's scalar coarray are special: The descriptorless variant is a
> normal variable with some language-specific additional information (corank,
> bounds). The descriptor variant has a descriptor but the _data component is
> just a pointer to the scalar variable.
>
> As the element type of a descriptorless coarray is the type itself, we need
> to break the while loop.
>
> Build and regtested on x86-64-gnu-linux.
> OK for the trunk?
Won't that break e.g.
subroutine foo
type x
integer, allocatable :: y
end type
type(x) :: z(2, 2)
!$omp parallel private (z)
allocate (z(2, 2)%y)
!$omp end parallel
end subroutine
In that case I believe we have GFC_ARRAY_TYPE_P and !GFC_DESCRIPTOR_TYPE_P,
and GFC_TYPE_ARRAY_RANK (type) is 2, and the struct has allocatable
components, but we would return that we don't have them?
> --- a/gcc/fortran/trans-openmp.c
> +++ b/gcc/fortran/trans-openmp.c
> @@ -189,7 +189,8 @@ gfc_has_alloc_comps (tree type, tree decl)
> return false;
> }
>
> - while (GFC_DESCRIPTOR_TYPE_P (type) || GFC_ARRAY_TYPE_P (type))
> + if (GFC_DESCRIPTOR_TYPE_P (type)
> + || (GFC_ARRAY_TYPE_P (type) && GFC_TYPE_ARRAY_RANK (type) == 0))
> type = gfc_get_element_type (type);
>
> if (TREE_CODE (type) != RECORD_TYPE)
Jakub
More information about the Fortran
mailing list