diff --git a/flang/lib/Semantics/check-cuda.cpp b/flang/lib/Semantics/check-cuda.cpp index e45f9fb8265e..fcfbf29972ca 100644 --- a/flang/lib/Semantics/check-cuda.cpp +++ b/flang/lib/Semantics/check-cuda.cpp @@ -116,8 +116,9 @@ struct DeviceExprChecker }; static bool IsHostArray(const Symbol &symbol) { + const Symbol &resolved{GetAssociationRoot(symbol)}; if (const auto *details{ - symbol.GetUltimate().detailsIf()}) { + resolved.detailsIf()}) { if (details->cudaDataAttr() && (*details->cudaDataAttr() == common::CUDADataAttr::Device || *details->cudaDataAttr() == common::CUDADataAttr::Constant || @@ -137,8 +138,8 @@ struct FindHostArray FindHostArray() : Base(*this) {} using Base::operator(); Result operator()(const evaluate::Component &x) const { - const Symbol &symbol{x.GetLastSymbol()}; - const Symbol &baseSymbol{x.base().GetFirstSymbol()}; + const Symbol &symbol{x.GetLastSymbol().GetUltimate()}; + const Symbol &baseSymbol{GetAssociationRoot(x.base().GetFirstSymbol())}; if (symbol.IsFuncResult() || baseSymbol.IsFuncResult()) { return nullptr; } diff --git a/flang/test/Semantics/cuf25.cuf b/flang/test/Semantics/cuf25.cuf index 541a67a0542b..729e9bfa4af6 100644 --- a/flang/test/Semantics/cuf25.cuf +++ b/flang/test/Semantics/cuf25.cuf @@ -20,3 +20,25 @@ contains r%origin = origin end function end module m + +program main + implicit none + integer, parameter :: nx = 400, ny = 200 + integer :: i, j + type r1 + real :: v(3) + end type r1 + type(r1) :: fb(nx, ny) + type(r1), device :: fb_d(nx, ny) + + associate (fb => fb_d) + !$cuf kernel do (2) <<<*,*>>> + do j = 1, ny + do i = 1, nx + fb(i,j)%v(1) = real(i)/nx + fb(i,j)%v(2) = real(j)/ny + fb(i,j)%v(3) = 0.2 + end do + end do + end associate +end program