From 92b595b9b4ca71aad9e7cc7d32e4b90a9b051a5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Valentin=20Clement=20=28=E3=83=90=E3=83=AC=E3=83=B3?= =?UTF-8?q?=E3=82=BF=E3=82=A4=E3=83=B3=20=E3=82=AF=E3=83=AC=E3=83=A1?= =?UTF-8?q?=E3=83=B3=29?= Date: Mon, 6 Apr 2026 13:43:52 -0700 Subject: [PATCH] [flang][cuda] Take associate into account for host array diagnostic (#190673) --- flang/lib/Semantics/check-cuda.cpp | 7 ++++--- flang/test/Semantics/cuf25.cuf | 22 ++++++++++++++++++++++ 2 files changed, 26 insertions(+), 3 deletions(-) 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