Don't allow mixed component and non-component accesses for OpenACC/Fortran
authorJulian Brown <julian@codesourcery.com>
Fri, 3 Jan 2020 18:06:15 +0000 (10:06 -0800)
committerJulian Brown <julian@codesourcery.com>
Tue, 28 Jan 2020 14:00:29 +0000 (06:00 -0800)
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.

gcc/fortran/ChangeLog
gcc/fortran/gfortran.h
gcc/fortran/openmp.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/goacc/deep-copy-2.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/goacc/mapping-tests-1.f90 [new file with mode: 0644]
libgomp/ChangeLog
libgomp/testsuite/libgomp.oacc-fortran/classtypes-1.f95
libgomp/testsuite/libgomp.oacc-fortran/deep-copy-2.f90 [deleted file]
libgomp/testsuite/libgomp.oacc-fortran/deep-copy-3.f90

index eb8842b0ab893d2362d8ab336e49bb14e375d366..c51dab2636f6a64c951e7d4d7ee0ecb9b4d59121 100644 (file)
@@ -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
index df07eeed8e3e1fed3b15f270cad617efbdbcaea6..dbf03fbfd4551c86782a7b12ef2079d368013bd7 100644 (file)
@@ -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
index 3c6138556396ec00cac727b2d7dc382ef5fe047d..444fdcc4751e6436ae05f9e8a1a70cc885656d6a 100644 (file)
@@ -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;
            }
index 1b9436ff1fe36e2f1e92934fe6f30ec7463e640a..a3623672cffff33bf848f17e86227989f86b5e97 100644 (file)
@@ -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/gcc/testsuite/gfortran.dg/goacc/deep-copy-2.f90 b/gcc/testsuite/gfortran.dg/goacc/deep-copy-2.f90
new file mode 100644 (file)
index 0000000..1e556b1
--- /dev/null
@@ -0,0 +1,37 @@
+! { dg-do compile }
+
+! Test of attach/detach with "acc data", two clauses at once.
+
+program dtype
+  implicit none
+  integer, parameter :: n = 512
+  type mytype
+    integer, allocatable :: a(:)
+  end type mytype
+  integer i
+
+  type(mytype) :: var
+
+  allocate(var%a(1:n))
+
+!$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
+    var%a(i) = i
+  end do
+!$acc end parallel loop
+
+!$acc end data
+
+!$acc end data
+
+  do i = 1,n
+    if (i .ne. var%a(i)) stop 1
+  end do
+
+  deallocate(var%a)
+
+end program dtype
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 (file)
index 0000000..c1bfe58
--- /dev/null
@@ -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
index b8fa7d457d8395c41ab3e780789f638841c920d0..9fa6bd1a5e469aefd7f90ef6b0a9321e70f3b96d 100644 (file)
@@ -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='.
index f16f42fc3af224494e99b88b3030a7c72594b776..c5f0ffffb02cb53fc89d9fa15f62fbbe0d0224b3 100644 (file)
@@ -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-2.f90 b/libgomp/testsuite/libgomp.oacc-fortran/deep-copy-2.f90
deleted file mode 100644 (file)
index 3593661..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-! { dg-do run }
-
-! Test of attach/detach with "acc data", two clauses at once.
-
-program dtype
-  implicit none
-  integer, parameter :: n = 512
-  type mytype
-    integer, allocatable :: a(:)
-  end type mytype
-  integer i
-
-  type(mytype) :: var
-
-  allocate(var%a(1:n))
-
-!$acc data copy(var) copy(var%a)
-
-!$acc parallel loop
-  do i = 1,n
-    var%a(i) = i
-  end do
-!$acc end parallel loop
-
-!$acc end data
-
-  do i = 1,n
-    if (i .ne. var%a(i)) stop 1
-  end do
-
-  deallocate(var%a)
-
-end program dtype
index 667d944fecb5bb088601b211ff61ec37eb6b7089..edb6b8d61a40ea7b47139f8a32a673191401a412 100644 (file)
@@ -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