+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.
/* 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
--- /dev/null
+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
! { 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 }