aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Brown <julian@codesourcery.com>2020-01-03 10:06:15 -0800
committerJulian Brown <julian@codesourcery.com>2020-01-28 06:00:29 -0800
commit278c3214b344ac7c5daf974196fbebc531bff058 (patch)
tree5fb64b46ceb10ceee9647519ec7b68320c82abc8
parent99b9f5b4067a8c5c5a706694b9a23516126984de (diff)
downloadgcc-278c3214b344ac7c5daf974196fbebc531bff058.zip
gcc-278c3214b344ac7c5daf974196fbebc531bff058.tar.gz
gcc-278c3214b344ac7c5daf974196fbebc531bff058.tar.bz2
Don't allow mixed component and non-component accesses for OpenACC/Fortran
gcc/fortran/ * 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 directive. libgomp/ * testsuite/libgomp.oacc-fortran/deep-copy-2.f90: Remove test from here. * testsuite/libgomp.oacc-fortran/deep-copy-3.f90: Don't use mixed component/non-component variable refs in a single directive. * testsuite/libgomp.oacc-fortran/classtypes-1.f95: Likewise. gcc/testsuite/ * gfortran.dg/goacc/deep-copy-2.f90: Move test here (from libgomp testsuite). Make a compilation test, and expect rejection of mixed component/non-component accesses. * gfortran.dg/goacc/mapping-tests-1.f90: New test.
-rw-r--r--gcc/fortran/ChangeLog7
-rw-r--r--gcc/fortran/gfortran.h6
-rw-r--r--gcc/fortran/openmp.c33
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gfortran.dg/goacc/deep-copy-2.f90 (renamed from libgomp/testsuite/libgomp.oacc-fortran/deep-copy-2.f90)8
-rw-r--r--gcc/testsuite/gfortran.dg/goacc/mapping-tests-1.f9015
-rw-r--r--libgomp/ChangeLog7
-rw-r--r--libgomp/testsuite/libgomp.oacc-fortran/classtypes-1.f956
-rw-r--r--libgomp/testsuite/libgomp.oacc-fortran/deep-copy-3.f904
9 files changed, 71 insertions, 22 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index eb8842b..c51dab2 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,10 @@
+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
+ directive.
+
2020-01-28 Tobias Burnus <tobias@codesourcery.com>
PR fortran/93464
diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h
index df07eee..dbf03fb 100644
--- a/gcc/fortran/gfortran.h
+++ b/gcc/fortran/gfortran.h
@@ -1592,9 +1592,11 @@ typedef struct gfc_symbol
current statement have the mark member nonzero. Of these symbols,
symbols with old_symbol equal to NULL are symbols created within
the current statement. Otherwise, old_symbol points to a copy of
- the old symbol. gfc_new is used in symbol.c to flag new symbols. */
+ the old symbol. gfc_new is used in symbol.c to flag new symbols.
+ comp_mark is used to indicate variables which have component accesses
+ in OpenMP/OpenACC directive clauses. */
struct gfc_symbol *old_symbol;
- unsigned mark:1, gfc_new:1;
+ unsigned mark:1, comp_mark:1, gfc_new:1;
/* The tlink field is used in the front end to carry the module
declaration of separate module procedures so that the characteristics
diff --git a/gcc/fortran/openmp.c b/gcc/fortran/openmp.c
index 3c61385..444fdcc 100644
--- a/gcc/fortran/openmp.c
+++ b/gcc/fortran/openmp.c
@@ -4248,6 +4248,7 @@ resolve_omp_clauses (gfc_code *code, gfc_omp_clauses *omp_clauses,
for (n = omp_clauses->lists[list]; n; n = n->next)
{
n->sym->mark = 0;
+ n->sym->comp_mark = 0;
if (n->sym->attr.flavor == FL_VARIABLE
|| n->sym->attr.proc_pointer
|| (!code && (!n->sym->attr.dummy || n->sym->ns != ns)))
@@ -4313,23 +4314,25 @@ resolve_omp_clauses (gfc_code *code, gfc_omp_clauses *omp_clauses,
&& (list != OMP_LIST_REDUCTION || !openacc))
for (n = omp_clauses->lists[list]; n; n = n->next)
{
- bool array_only_p = true;
- /* Disallow duplicate bare variable references and multiple
- subarrays of the same array here, but allow multiple components of
- the same (e.g. derived-type) variable. For the latter, duplicate
- components are detected elsewhere. */
- if (openacc && n->expr && n->expr->expr_type == EXPR_VARIABLE)
+ bool component_ref_p = false;
+
+ /* Allow multiple components of the same (e.g. derived-type)
+ variable here. Duplicate components are detected elsewhere. */
+ if (n->expr && n->expr->expr_type == EXPR_VARIABLE)
for (gfc_ref *ref = n->expr->ref; ref; ref = ref->next)
- if (ref->type != REF_ARRAY)
- {
- array_only_p = false;
- break;
- }
- if (array_only_p)
+ if (ref->type == REF_COMPONENT)
+ component_ref_p = true;
+ if ((!component_ref_p && n->sym->comp_mark)
+ || (component_ref_p && n->sym->mark))
+ gfc_error ("Symbol %qs has mixed component and non-component "
+ "accesses at %L", n->sym->name, &n->where);
+ else if (n->sym->mark)
+ gfc_error ("Symbol %qs present on multiple clauses at %L",
+ n->sym->name, &n->where);
+ else
{
- if (n->sym->mark)
- gfc_error ("Symbol %qs present on multiple clauses at %L",
- n->sym->name, &n->where);
+ if (component_ref_p)
+ n->sym->comp_mark = 1;
else
n->sym->mark = 1;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 1b9436f..a362367 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2020-01-28 Julian Brown <julian@codesourcery.com>
+
+ * gfortran.dg/goacc/deep-copy-2.f90: Move test here (from libgomp
+ testsuite). Make a compilation test, and expect rejection of mixed
+ component/non-component accesses.
+ * gfortran.dg/goacc/mapping-tests-1.f90: New test.
+
2020-01-28 Tobias Burnus <tobias@codesourcery.com>
Julian Brown <julian@codesourcery.com>
diff --git a/libgomp/testsuite/libgomp.oacc-fortran/deep-copy-2.f90 b/gcc/testsuite/gfortran.dg/goacc/deep-copy-2.f90
index 3593661..1e556b1 100644
--- a/libgomp/testsuite/libgomp.oacc-fortran/deep-copy-2.f90
+++ b/gcc/testsuite/gfortran.dg/goacc/deep-copy-2.f90
@@ -1,4 +1,4 @@
-! { dg-do run }
+! { dg-do compile }
! Test of attach/detach with "acc data", two clauses at once.
@@ -14,7 +14,9 @@ program dtype
allocate(var%a(1:n))
-!$acc data copy(var) copy(var%a)
+!$acc data copy(var) copy(var%a) ! { dg-error "Symbol .var. has mixed component and non-component accesses" }
+
+!$acc data copy(var%a) copy(var) ! { dg-error "Symbol .var. has mixed component and non-component accesses" }
!$acc parallel loop
do i = 1,n
@@ -24,6 +26,8 @@ program dtype
!$acc end data
+!$acc end data
+
do i = 1,n
if (i .ne. var%a(i)) stop 1
end do
diff --git a/gcc/testsuite/gfortran.dg/goacc/mapping-tests-1.f90 b/gcc/testsuite/gfortran.dg/goacc/mapping-tests-1.f90
new file mode 100644
index 0000000..c1bfe58
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/goacc/mapping-tests-1.f90
@@ -0,0 +1,15 @@
+! { dg-do compile }
+
+subroutine foo
+ type t
+ integer :: i, j
+ end type t
+
+ type(t) x
+
+ ! We should reject the duplicate reference here.
+!$acc enter data copyin(x%i, x%i)
+! { dg-error ".x.i. appears more than once in map clauses" "" { target "*-*-*" } 11 }
+
+
+end
diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog
index b8fa7d4..9fa6bd1 100644
--- a/libgomp/ChangeLog
+++ b/libgomp/ChangeLog
@@ -1,3 +1,10 @@
+2020-01-28 Julian Brown <julian@codesourcery.com>
+
+ * testsuite/libgomp.oacc-fortran/deep-copy-2.f90: Remove test from here.
+ * testsuite/libgomp.oacc-fortran/deep-copy-3.f90: Don't use mixed
+ component/non-component variable refs in a single directive.
+ * testsuite/libgomp.oacc-fortran/classtypes-1.f95: Likewise.
+
2020-01-24 Maciej W. Rozycki <macro@wdc.com>
* configure.ac: Handle `--with-toolexeclibdir='.
diff --git a/libgomp/testsuite/libgomp.oacc-fortran/classtypes-1.f95 b/libgomp/testsuite/libgomp.oacc-fortran/classtypes-1.f95
index f16f42f..c5f0fff 100644
--- a/libgomp/testsuite/libgomp.oacc-fortran/classtypes-1.f95
+++ b/libgomp/testsuite/libgomp.oacc-fortran/classtypes-1.f95
@@ -31,7 +31,8 @@ program main
myvar%p%p(i) = -1.0
end do
-!$acc enter data copyin(myvar, myvar%p) create(myvar%p%p)
+!$acc enter data copyin(myvar)
+!$acc enter data copyin(myvar%p) create(myvar%p%p)
!$acc parallel loop present(myvar%p%p)
do i=1,100
@@ -39,7 +40,8 @@ program main
end do
!$acc end parallel loop
-!$acc exit data copyout(myvar%p%p) delete(myvar, myvar%p)
+!$acc exit data copyout(myvar%p%p) delete(myvar%p)
+!$acc exit data delete(myvar)
do i=1,100
if (myvar%p%p(i) .ne. i * 2) stop 1
diff --git a/libgomp/testsuite/libgomp.oacc-fortran/deep-copy-3.f90 b/libgomp/testsuite/libgomp.oacc-fortran/deep-copy-3.f90
index 667d944..edb6b8d 100644
--- a/libgomp/testsuite/libgomp.oacc-fortran/deep-copy-3.f90
+++ b/libgomp/testsuite/libgomp.oacc-fortran/deep-copy-3.f90
@@ -16,12 +16,14 @@ program dtype
allocate(var%a(1:n))
allocate(var%b(1:n))
-!$acc parallel loop copy(var) copy(var%a(1:n)) copy(var%b(1:n))
+!$acc data copy(var)
+!$acc parallel loop copy(var%a(1:n)) copy(var%b(1:n))
do i = 1,n
var%a(i) = i
var%b(i) = i
end do
!$acc end parallel loop
+!$acc end data
do i = 1,n
if (i .ne. var%a(i)) stop 1