Skip to content

Conversation

@clementval
Copy link
Contributor

Now that variables have implicit attribute, we can check for illegal use of module host variable in device context.

@llvmbot llvmbot added flang Flang issues not falling into any other category flang:semantics labels Dec 12, 2024
@llvmbot
Copy link
Member

llvmbot commented Dec 12, 2024

@llvm/pr-subscribers-flang-semantics

Author: Valentin Clement (バレンタイン クレメン) (clementval)

Changes

Now that variables have implicit attribute, we can check for illegal use of module host variable in device context.


Full diff: https://github.com/llvm/llvm-project/pull/119756.diff

2 Files Affected:

  • (modified) flang/lib/Semantics/check-cuda.cpp (+6-8)
  • (modified) flang/test/Semantics/cuf09.cuf (+8-1)
diff --git a/flang/lib/Semantics/check-cuda.cpp b/flang/lib/Semantics/check-cuda.cpp
index 79b7a26ef222f8..dd3472aad40bcb 100644
--- a/flang/lib/Semantics/check-cuda.cpp
+++ b/flang/lib/Semantics/check-cuda.cpp
@@ -340,7 +340,7 @@ template <bool IsCUFKernelDo> 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,11 @@ template <bool IsCUFKernelDo> class DeviceContextChecker {
               Check(x.value());
             },
             [&](const common::Indirection<parser::AssignmentStmt> &x) {
-              if (IsCUFKernelDo) {
-                const evaluate::Assignment *assign{
-                    semantics::GetAssignment(x.value())};
-                if (assign) {
-                  ErrorIfHostSymbol(assign->lhs, source);
-                  ErrorIfHostSymbol(assign->rhs, source);
-                }
+              const evaluate::Assignment *assign{
+                  semantics::GetAssignment(x.value())};
+              if (assign) {
+                ErrorIfHostSymbol(assign->lhs, source);
+                ErrorIfHostSymbol(assign->rhs, source);
               }
               if (auto msg{ActionStmtChecker<IsCUFKernelDo>::WhyNotOk(x)}) {
                 context_.Say(source, std::move(*msg));
diff --git a/flang/test/Semantics/cuf09.cuf b/flang/test/Semantics/cuf09.cuf
index 195ddac11d575f..c551ecbff2cc06 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

@clementval
Copy link
Contributor Author

Ping

@clementval clementval merged commit 67ae944 into llvm:main Dec 16, 2024
8 checks passed
@clementval clementval deleted the cuf_host_array_in_module branch December 16, 2024 21:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

flang:semantics flang Flang issues not falling into any other category

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants