aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/fortran/ChangeLog5
-rw-r--r--gcc/fortran/openmp.c29
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gfortran.dg/goacc/mapping-tests-2.f9032
-rw-r--r--gcc/testsuite/gfortran.dg/goacc/subarrays.f952
5 files changed, 67 insertions, 8 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index c51dab2..c7e2b31 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,5 +1,10 @@
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
diff --git a/gcc/fortran/openmp.c b/gcc/fortran/openmp.c
index 444fdcc..0accb18 100644
--- a/gcc/fortran/openmp.c
+++ b/gcc/fortran/openmp.c
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a362367..9e1af091 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+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
diff --git a/gcc/testsuite/gfortran.dg/goacc/mapping-tests-2.f90 b/gcc/testsuite/gfortran.dg/goacc/mapping-tests-2.f90
new file mode 100644
index 0000000..1372f6a
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/goacc/mapping-tests-2.f90
@@ -0,0 +1,32 @@
+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
diff --git a/gcc/testsuite/gfortran.dg/goacc/subarrays.f95 b/gcc/testsuite/gfortran.dg/goacc/subarrays.f95
index f6adde4..fa03785 100644
--- a/gcc/testsuite/gfortran.dg/goacc/subarrays.f95
+++ b/gcc/testsuite/gfortran.dg/goacc/subarrays.f95
@@ -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 }