[flang][cuda] Take associate into account for host array diagnostic (#190673)

This commit is contained in:
Valentin Clement (バレンタイン クレメン) 2026-04-06 13:43:52 -07:00 committed by GitHub
parent fbe6d79465
commit 92b595b9b4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 26 additions and 3 deletions

View File

@ -116,8 +116,9 @@ struct DeviceExprChecker
};
static bool IsHostArray(const Symbol &symbol) {
const Symbol &resolved{GetAssociationRoot(symbol)};
if (const auto *details{
symbol.GetUltimate().detailsIf<semantics::ObjectEntityDetails>()}) {
resolved.detailsIf<semantics::ObjectEntityDetails>()}) {
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;
}

View File

@ -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