diff --git a/flang/lib/Semantics/check-declarations.cpp b/flang/lib/Semantics/check-declarations.cpp index 5c26469b9fa24..bf4dc16a15b4a 100644 --- a/flang/lib/Semantics/check-declarations.cpp +++ b/flang/lib/Semantics/check-declarations.cpp @@ -989,9 +989,9 @@ void CheckHelper::CheckObjectEntity( } break; case common::CUDADataAttr::Device: - if (isComponent && !IsAllocatable(symbol)) { + if (isComponent && !IsAllocatable(symbol) && !IsPointer(symbol)) { messages_.Say( - "Component '%s' with ATTRIBUTES(DEVICE) must also be allocatable"_err_en_US, + "Component '%s' with ATTRIBUTES(DEVICE) must also be allocatable or pointer"_err_en_US, symbol.name()); } break; diff --git a/flang/test/Semantics/cuf03.cuf b/flang/test/Semantics/cuf03.cuf index 93b136ad7d315..fe9dd5b3ecf05 100644 --- a/flang/test/Semantics/cuf03.cuf +++ b/flang/test/Semantics/cuf03.cuf @@ -54,6 +54,14 @@ module m !ERROR: Object 'um' with ATTRIBUTES(UNIFIED) must be declared in a host subprogram real, unified :: um + type :: t3 + !ERROR: Component 'r' with ATTRIBUTES(DEVICE) must also be allocatable or pointer + real, device :: r + real, device, pointer :: rp ! ok + real, device, allocatable :: ra ! ok + real, device, pointer, contiguous :: rpc ! ok + end type + contains attributes(device) subroutine devsubr(n,da,rs) integer, intent(in) :: n