diff --git a/flang/lib/Evaluate/tools.cpp b/flang/lib/Evaluate/tools.cpp index a040f7ce79dc1..cb6c821433b52 100644 --- a/flang/lib/Evaluate/tools.cpp +++ b/flang/lib/Evaluate/tools.cpp @@ -1719,7 +1719,8 @@ bool IsSaved(const Symbol &original) { return false; } else if (scopeKind == Scope::Kind::Module || (scopeKind == Scope::Kind::MainProgram && - (symbol.attrs().test(Attr::TARGET) || evaluate::IsCoarray(symbol)))) { + (symbol.attrs().test(Attr::TARGET) || evaluate::IsCoarray(symbol)) && + Fortran::evaluate::CanCUDASymbolHaveSaveAttr(symbol))) { // 8.5.16p4 // In main programs, implied SAVE matters only for pointer // initialization targets and coarrays. diff --git a/flang/test/Lower/CUDA/cuda-program-global.cuf b/flang/test/Lower/CUDA/cuda-program-global.cuf index 90b401c9ba6a5..a21fc06537f75 100644 --- a/flang/test/Lower/CUDA/cuda-program-global.cuf +++ b/flang/test/Lower/CUDA/cuda-program-global.cuf @@ -7,6 +7,7 @@ program test integer, device :: a(10) integer, unified :: u(10) integer, allocatable, pinned :: p(:) + real, device, target :: t(10) integer :: b(10) integer :: i print*,i @@ -18,6 +19,7 @@ end ! CHECK: %[[ALLOCA:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFEi"} ! CHECK: hlfir.declare %[[ALLOCA]] {uniq_name = "_QFEi"} : (!fir.ref) -> (!fir.ref, !fir.ref) ! CHECK: cuf.alloc !fir.box>> {bindc_name = "p", data_attr = #cuf.cuda, uniq_name = "_QFEp"} -> !fir.ref>>> +! CHECK: cuf.alloc !fir.array<10xf32> {bindc_name = "t", data_attr = #cuf.cuda, uniq_name = "_QFEt"} -> !fir.ref> ! CHECK-NOT: fir.global internal @_QFEa {data_attr = #cuf.cuda} : !fir.array<10xi32> {{{$}} ! CHECK: fir.global internal @_QFEb : !fir.array<10xi32> {{{$}}