Index: fortran/openmp.c =================================================================== --- fortran/openmp.c (revision 238751) +++ fortran/openmp.c (working copy) @@ -3752,17 +3752,24 @@ resolve_omp_clauses (gfc_code *code, gfc_omp_claus && 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: testsuite/gfortran.dg/goacc/uninit-use-device-clause.f95 =================================================================== --- testsuite/gfortran.dg/goacc/uninit-use-device-clause.f95 (revision 238751) +++ testsuite/gfortran.dg/goacc/uninit-use-device-clause.f95 (working copy) @@ -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: testsuite/gfortran.dg/goacc/list.f95 =================================================================== --- testsuite/gfortran.dg/goacc/list.f95 (revision 238751) +++ testsuite/gfortran.dg/goacc/list.f95 (working copy) @@ -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: testsuite/gfortran.dg/goacc/host_data-tree.f95 =================================================================== --- testsuite/gfortran.dg/goacc/host_data-tree.f95 (revision 238751) +++ testsuite/gfortran.dg/goacc/host_data-tree.f95 (working copy) @@ -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" } }