re PR fortran/70598 (Fortran OpenACC host_data construct ICE)
authorChung-Lin Tang <cltang@codesourcery.com>
Sun, 14 Aug 2016 18:19:10 +0000 (18:19 +0000)
committerChung-Lin Tang <cltang@gcc.gnu.org>
Sun, 14 Aug 2016 18:19:10 +0000 (18:19 +0000)
2016-08-14  Chung-Lin Tang  <cltang@codesourcery.com>

PR fortran/70598

gcc/fortran/
* openmp.c (resolve_omp_clauses): Adjust use_device clause
handling to only allow pointers and arrays.

gcc/testsuite/
* gfortran.dg/goacc/host_data-tree.f95: Adjust to use pointers
in use_device clause.
* gfortran.dg/goacc/uninit-use-device-clause.f95: Likewise.
* gfortran.dg/goacc/list.f95: Adjust to catch
"neither a POINTER nor an array" error messages.

libgomp/
* testsuite/libgomp.oacc-fortran/host_data-1.f90: New test.

From-SVN: r239457

gcc/fortran/ChangeLog
gcc/fortran/openmp.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/goacc/host_data-tree.f95
gcc/testsuite/gfortran.dg/goacc/list.f95
gcc/testsuite/gfortran.dg/goacc/uninit-use-device-clause.f95
libgomp/ChangeLog
libgomp/testsuite/libgomp.oacc-fortran/host_data-1.f90 [new file with mode: 0644]

index 95cd07539254881b2f1e970d906c7169a3e69ee4..e6336ba52d7a99f32259ef0d37961f67f8c7eaa1 100644 (file)
@@ -1,3 +1,9 @@
+2016-08-14  Chung-Lin Tang  <cltang@codesourcery.com>
+
+       PR fortran/70598
+       * openmp.c (resolve_omp_clauses): Adjust use_device clause
+       handling to only allow pointers and arrays.
+
 2016-08-12  Marek Polacek  <polacek@redhat.com>
 
        PR c/7652
index 2fed491890701ff51305042a4f9dbb5a774d9079..f50e6e83d919e92b09b4f5f9cea5826b2604be6f 100644 (file)
@@ -3758,17 +3758,24 @@ resolve_omp_clauses (gfc_code *code, gfc_omp_clauses *omp_clauses,
                              && CLASS_DATA (n->sym)->attr.allocatable))
                        gfc_error ("ALLOCATABLE object %qs in %s clause at %L",
                                   n->sym->name, name, &n->where);
-                     if (n->sym->attr.pointer
-                         || (n->sym->ts.type == BT_CLASS && CLASS_DATA (n->sym)
-                             && CLASS_DATA (n->sym)->attr.class_pointer))
-                       gfc_error ("POINTER object %qs in %s clause at %L",
-                                  n->sym->name, name, &n->where);
+                     if (n->sym->ts.type == BT_CLASS
+                         && CLASS_DATA (n->sym)
+                         && CLASS_DATA (n->sym)->attr.class_pointer)
+                       gfc_error ("POINTER object %qs of polymorphic type in "
+                                  "%s clause at %L", n->sym->name, name,
+                                  &n->where);
                      if (n->sym->attr.cray_pointer)
                        gfc_error ("Cray pointer object %qs in %s clause at %L",
                                   n->sym->name, name, &n->where);
-                     if (n->sym->attr.cray_pointee)
+                     else if (n->sym->attr.cray_pointee)
                        gfc_error ("Cray pointee object %qs in %s clause at %L",
                                   n->sym->name, name, &n->where);
+                     else if (n->sym->attr.flavor == FL_VARIABLE
+                              && !n->sym->as
+                              && !n->sym->attr.pointer)
+                       gfc_error ("%s clause variable %qs at %L is neither "
+                                  "a POINTER nor an array", name,
+                                  n->sym->name, &n->where);
                      /* FALLTHRU */
                  case OMP_LIST_DEVICE_RESIDENT:
                    check_symbol_not_pointer (n->sym, n->where, name);
index 4665ac7721130e19e91d962d172955f15ae02b39..ee1f86f2ece5347e1701c323dd4e10e6262917a9 100644 (file)
@@ -1,3 +1,12 @@
+2016-08-14  Chung-Lin Tang  <cltang@codesourcery.com>
+
+       PR fortran/70598
+       * gfortran.dg/goacc/host_data-tree.f95: Adjust to use pointers
+       in use_device clause.
+       * gfortran.dg/goacc/uninit-use-device-clause.f95: Likewise.
+       * gfortran.dg/goacc/list.f95: Adjust to catch
+       "neither a POINTER nor an array" error messages.
+
 2016-08-14  Uros Bizjak  <ubizjak@gmail.com>
 
        PR target/76342
index 4a11b9dcbcbd9a08812f4379afa1841eae8f42e2..d44ca5870516fbb070391f543fb22f62af7a1654 100644 (file)
@@ -3,9 +3,9 @@
 
 program test
   implicit none
-  integer :: i = 1
+  integer, pointer :: p
 
-  !$acc host_data use_device(i)
+  !$acc host_data use_device(p)
   !$acc end host_data
 end program test
-! { dg-final { scan-tree-dump-times "pragma acc host_data use_device_ptr\\(i\\)" 1 "original" } }
+! { dg-final { scan-tree-dump-times "pragma acc host_data use_device_ptr\\(p\\)" 1 "original" } }
index a8006bcdd84e0d7fd73880407f4a9ea4871353ea..87c84085b1386fd42a9ae2e4b0afa8bac6b75556 100644 (file)
@@ -76,19 +76,19 @@ program test
   !$acc parallel private (i) firstprivate (i) ! { dg-error "present on multiple clauses" }
   !$acc end parallel
 
-  !$acc host_data use_device(i)
+  !$acc host_data use_device(i) ! { dg-error "neither a POINTER nor an array" }
   !$acc end host_data
 
-  !$acc host_data use_device(c, d)
+  !$acc host_data use_device(c, d) ! { dg-error "neither a POINTER nor an array" }
   !$acc end host_data
 
   !$acc host_data use_device(a)
   !$acc end host_data
 
-  !$acc host_data use_device(i, j, k, l, a)
+  !$acc host_data use_device(i, j, k, l, a) ! { dg-error "neither a POINTER nor an array" }
   !$acc end host_data  
 
-  !$acc host_data use_device (i) use_device (j)
+  !$acc host_data use_device (i) use_device (j) ! { dg-error "neither a POINTER nor an array" }
   !$acc end host_data
 
   !$acc host_data use_device ! { dg-error "Unclassifiable OpenACC directive" }
@@ -99,13 +99,17 @@ program test
 
   !$acc host_data use_device(10) ! { dg-error "Syntax error" }
 
-  !$acc host_data use_device(/b/, /b/) ! { dg-error "present on multiple clauses" }
+  !$acc host_data use_device(/b/, /b/)
   !$acc end host_data
+  ! { dg-error "neither a POINTER nor an array" "" { target *-*-* } 102 }
+  ! { dg-error "present on multiple clauses" "" { target *-*-* } 102 }
 
-  !$acc host_data use_device(i, j, i) ! { dg-error "present on multiple clauses" }
+  !$acc host_data use_device(i, j, i)
   !$acc end host_data
+  ! { dg-error "neither a POINTER nor an array" "" { target *-*-* } 107 }
+  ! { dg-error "present on multiple clauses" "" { target *-*-* } 107 }
 
-  !$acc host_data use_device(p1) ! { dg-error "POINTER" }
+  !$acc host_data use_device(p1)
   !$acc end host_data
 
 end program test
index 873eea70a769b5525e85938c2962dccc9046d3e7..48d08a5a55da798d39472ae9377e41b8b534dccb 100644 (file)
@@ -2,9 +2,9 @@
 ! { dg-additional-options "-Wuninitialized" }
 
 subroutine test
-  integer :: i
+  integer, pointer :: p
 
-  !$acc host_data use_device(i) ! { dg-warning "is used uninitialized in this function" }
+  !$acc host_data use_device(p) ! { dg-warning "is used uninitialized in this function" }
   !$acc end host_data
 end subroutine test
 
index ae5f28ffcc68ce0a57eae46ec4d3e63d6b6dcddb..e15bbc0c4ee25b8e5142db27bce1188da09afe0d 100644 (file)
@@ -1,3 +1,8 @@
+2016-08-14  Chung-Lin Tang  <cltang@codesourcery.com>
+
+       PR fortran/70598
+       * testsuite/libgomp.oacc-fortran/host_data-1.f90: New test.
+
 2016-08-08  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/58706
diff --git a/libgomp/testsuite/libgomp.oacc-fortran/host_data-1.f90 b/libgomp/testsuite/libgomp.oacc-fortran/host_data-1.f90
new file mode 100644 (file)
index 0000000..69a491d
--- /dev/null
@@ -0,0 +1,32 @@
+! { dg-do run }
+! { dg-additional-options "-cpp" }
+
+program test
+  implicit none
+
+  integer, target :: i, arr(1000)
+  integer, pointer :: ip, iph
+  integer, contiguous, pointer :: parr(:), parrh(:)
+
+  ! Assign the same targets
+  ip => i
+  parr => arr
+  iph => i
+  parrh => arr
+
+  !$acc data copyin(i, arr)
+  !$acc host_data use_device(ip, parr)
+
+  ! Test how the pointers compare inside a host_data construct
+#if ACC_MEM_SHARED
+  if (.not. associated(ip, iph)) call abort
+  if (.not. associated(parr, parrh)) call abort
+#else
+  if (associated(ip, iph)) call abort
+  if (associated(parr, parrh)) call abort
+#endif
+
+  !$acc end host_data
+  !$acc end data
+
+end program test