diff --git a/flang/lib/Semantics/check-cuda.cpp b/flang/lib/Semantics/check-cuda.cpp index 79b7a26ef222f..9c044a47c7983 100644 --- a/flang/lib/Semantics/check-cuda.cpp +++ b/flang/lib/Semantics/check-cuda.cpp @@ -340,7 +340,7 @@ template class DeviceContextChecker { void ErrorIfHostSymbol(const A &expr, parser::CharBlock source) { if (const Symbol * hostArray{FindHostArray{}(expr)}) { context_.Say(source, - "Host array '%s' cannot be present in CUF kernel"_err_en_US, + "Host array '%s' cannot be present in device context"_err_en_US, hostArray->name()); } } @@ -387,13 +387,10 @@ template class DeviceContextChecker { Check(x.value()); }, [&](const common::Indirection &x) { - if (IsCUFKernelDo) { - const evaluate::Assignment *assign{ - semantics::GetAssignment(x.value())}; - if (assign) { - ErrorIfHostSymbol(assign->lhs, source); - ErrorIfHostSymbol(assign->rhs, source); - } + if (const evaluate::Assignment * + assign{semantics::GetAssignment(x.value())}) { + ErrorIfHostSymbol(assign->lhs, source); + ErrorIfHostSymbol(assign->rhs, source); } if (auto msg{ActionStmtChecker::WhyNotOk(x)}) { context_.Say(source, std::move(*msg)); diff --git a/flang/test/Semantics/cuf09.cuf b/flang/test/Semantics/cuf09.cuf index 195ddac11d575..c551ecbff2cc0 100644 --- a/flang/test/Semantics/cuf09.cuf +++ b/flang/test/Semantics/cuf09.cuf @@ -1,5 +1,6 @@ ! RUN: %python %S/test_errors.py %s %flang_fc1 module m + integer :: m(100) contains attributes(device) subroutine devsub !ERROR: Statement may not appear in device code @@ -15,6 +16,12 @@ module m !WARNING: I/O statement might not be supported on device write(12,'(10F4.1)'), x end + attributes(global) subroutine hostglobal(a) + integer :: a(*) + i = threadIdx%x + !ERROR: Host array 'm' cannot be present in device context + if (i .le. N) a(i) = m(i) + end subroutine end program main @@ -96,7 +103,7 @@ program main !$cuf kernel do (2) <<<*, *>>> do j = 1, 10 do i = 1, 10 - !ERROR: Host array 'b' cannot be present in CUF kernel + !ERROR: Host array 'b' cannot be present in device context a_d(i,j) = b(i,j) enddo enddo