Commit a5ed4958 by Julian Brown

Check array contiguity for OpenACC/Fortran

	PR fortran/93025

	gcc/fortran/
	* openmp.c (resolve_omp_clauses): Check array references for contiguity.

	gcc/testsuite/
	* gfortran.dg/goacc/mapping-tests-2.f90: New test.
	* gfortran.dg/goacc/subarrays.f95: Expect rejection of non-contiguous
	array.
parent 278c3214
2020-01-28 Julian Brown <julian@codesourcery.com>
PR fortran/93025
* openmp.c (resolve_omp_clauses): Check array references for contiguity.
2020-01-28 Julian Brown <julian@codesourcery.com>
* gfortran.h (gfc_symbol): Add comp_mark bitfield.
* openmp.c (resolve_omp_clauses): Disallow mixed component and
full-derived-type accesses to the same variable within a single
......
......@@ -4536,13 +4536,28 @@ resolve_omp_clauses (gfc_code *code, gfc_omp_clauses *omp_clauses,
/* Look through component refs to find last array
reference. */
if (openacc && resolved)
while (array_ref
&& (array_ref->type == REF_COMPONENT
|| (array_ref->type == REF_ARRAY
&& array_ref->next
&& (array_ref->next->type
== REF_COMPONENT))))
array_ref = array_ref->next;
{
/* The "!$acc cache" directive allows rectangular
subarrays to be specified, with some restrictions
on the form of bounds (not implemented).
Only raise an error here if we're really sure the
array isn't contiguous. An expression such as
arr(-n:n,-n:n) could be contiguous even if it looks
like it may not be. */
if (list != OMP_LIST_CACHE
&& !gfc_is_simply_contiguous (n->expr, false, true)
&& gfc_is_not_contiguous (n->expr))
gfc_error ("Array is not contiguous at %L",
&n->where);
while (array_ref
&& (array_ref->type == REF_COMPONENT
|| (array_ref->type == REF_ARRAY
&& array_ref->next
&& (array_ref->next->type
== REF_COMPONENT))))
array_ref = array_ref->next;
}
}
if (array_ref
|| (n->expr
......
2020-01-28 Tobias Burnus <tobias@codesourcery.com>
Julian Brown <julian@codesourcery.com>
* gfortran.dg/goacc/mapping-tests-2.f90: New test.
* gfortran.dg/goacc/subarrays.f95: Expect rejection of non-contiguous
array.
2020-01-28 Julian Brown <julian@codesourcery.com>
* gfortran.dg/goacc/deep-copy-2.f90: Move test here (from libgomp
......
subroutine foo
type t
integer :: i, j
end type t
type t2
type(t) :: cc(3)
end type t2
type(t) x, y(3)
type(t2) :: z(3)
! OK - map whole aggregated variable
!$acc enter data copyin(x)
! map(to:x [len: 8])
! OK - map two components of the aggregated variable
!$acc enter data copyin(x%j, x%i)
! Bad - we cannot mix full-object and component accesses
!$acc enter data copyin(x, x%i)
! { dg-error "Symbol .x. has mixed component and non-component accesses" "" { target "*-*-*" } 21 }
! Bad - we cannot do a strided access of 'x'
! No C/C++ equivalent
!$acc enter data copyin(y(:)%i)
! { dg-error "Array is not contiguous" "" { target "*-*-*" } 26 }
! Bad - again, a strided access
!$acc enter data copyin(z(1)%cc(:)%i)
! { dg-error "Array is not contiguous" "" { target "*-*-*" } 30 }
end
......@@ -27,7 +27,7 @@ program test
! { dg-error "'a' in MAP clause" "" { target *-*-* } .-2 }
!$acc end parallel
!$acc parallel copy (b(1:3,2:4))
!$acc parallel copy (b(1:3,2:4)) ! { dg-error "Array is not contiguous" }
!$acc end parallel
!$acc parallel copy (b(2:3))
! { dg-error "Rank mismatch" "" { target *-*-* } .-1 }
......
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