[flang-commits] [flang] [llvm] [flang][OpenMP] Emit warning that REVERSE_OFFLOAD is not supported (PR #204647)

Krzysztof Parzyszek via flang-commits flang-commits at lists.llvm.org
Thu Jun 18 10:29:39 PDT 2026


https://github.com/kparzysz created https://github.com/llvm/llvm-project/pull/204647

Right now we quietly ignore it, whereas the OpenMP spec mandates a compilation error for requirements that the implmentation does not support.
The REVERSE_OFFLOAD was not causing a compilation error to allow testing of incremental implementation improvements, but we should at least warn about not supporting it.

>From 65a40817167deca5b78a42c46d26233370fd8c5f Mon Sep 17 00:00:00 2001
From: Krzysztof Parzyszek <Krzysztof.Parzyszek at amd.com>
Date: Thu, 18 Jun 2026 12:22:29 -0500
Subject: [PATCH] [flang][OpenMP] Emit warning that REVERSE_OFFLOAD is not
 supported

Right now we quietly ignore it, whereas the OpenMP spec mandates a
compilation error for requirements that the implmentation does not
support.
The REVERSE_OFFLOAD was not causing a compilation error to allow
testing of incremental implementation improvements, but we should
at least warn about not supporting it.
---
 flang/lib/Semantics/check-omp-structure.cpp            |  6 ++++++
 .../test/Semantics/OpenMP/declarative-directive01.f90  |  1 +
 flang/test/Semantics/OpenMP/requires01.f90             |  1 +
 flang/test/Semantics/OpenMP/requires03.f90             |  1 +
 flang/test/Semantics/OpenMP/requires04.f90             |  1 +
 flang/test/Semantics/OpenMP/requires05.f90             |  1 +
 flang/test/Semantics/OpenMP/requires06.f90             |  1 +
 flang/test/Semantics/OpenMP/requires07.f90             |  1 +
 flang/test/Semantics/OpenMP/requires08.f90             |  1 +
 flang/test/Semantics/OpenMP/requires10.f90             |  2 ++
 llvm/include/llvm/Frontend/OpenMP/OMP.td               | 10 +---------
 11 files changed, 17 insertions(+), 9 deletions(-)

diff --git a/flang/lib/Semantics/check-omp-structure.cpp b/flang/lib/Semantics/check-omp-structure.cpp
index 7c531ae0046ae..e2220156d13cd 100644
--- a/flang/lib/Semantics/check-omp-structure.cpp
+++ b/flang/lib/Semantics/check-omp-structure.cpp
@@ -5694,6 +5694,12 @@ void OmpStructureChecker::Enter(const parser::OmpClause::DynamicAllocators &x) {
 
 void OmpStructureChecker::Enter(const parser::OmpClause::ReverseOffload &x) {
   CheckAllowedRequiresClause(llvm::omp::Clause::OMPC_reverse_offload);
+  if (IsAllowedClause(llvm::omp::Clause::OMPC_reverse_offload)) {
+    unsigned version{context_.langOptions().OpenMPVersion};
+    context_.Say(GetContext().clauseSource,
+        "%s clause is not supported and will be ignored"_warn_en_US,
+        GetUpperName(llvm::omp::Clause::OMPC_reverse_offload, version));
+  }
 }
 
 void OmpStructureChecker::Enter(const parser::OmpClause::UnifiedAddress &x) {
diff --git a/flang/test/Semantics/OpenMP/declarative-directive01.f90 b/flang/test/Semantics/OpenMP/declarative-directive01.f90
index c213d0ae7a6f2..70c5618cc8760 100644
--- a/flang/test/Semantics/OpenMP/declarative-directive01.f90
+++ b/flang/test/Semantics/OpenMP/declarative-directive01.f90
@@ -6,6 +6,7 @@
 
 subroutine requires_1(a)
   real(8), intent(inout) :: a
+  !WARNING: REVERSE_OFFLOAD clause is not supported and will be ignored
   !$omp requires reverse_offload, unified_shared_memory, atomic_default_mem_order(relaxed)
   a = a + 0.01
 end subroutine requires_1
diff --git a/flang/test/Semantics/OpenMP/requires01.f90 b/flang/test/Semantics/OpenMP/requires01.f90
index 007135749cc82..cd39f06841f25 100644
--- a/flang/test/Semantics/OpenMP/requires01.f90
+++ b/flang/test/Semantics/OpenMP/requires01.f90
@@ -1,5 +1,6 @@
 ! RUN: %python %S/../test_errors.py %s %flang -fopenmp
 
+!WARNING: REVERSE_OFFLOAD clause is not supported and will be ignored
 !$omp requires reverse_offload unified_shared_memory
 
 !ERROR: NOWAIT clause is not allowed on the REQUIRES directive
diff --git a/flang/test/Semantics/OpenMP/requires03.f90 b/flang/test/Semantics/OpenMP/requires03.f90
index 4a23a6a4105fe..699967d108040 100644
--- a/flang/test/Semantics/OpenMP/requires03.f90
+++ b/flang/test/Semantics/OpenMP/requires03.f90
@@ -12,6 +12,7 @@ end subroutine f
 subroutine g
   !ERROR: REQUIRES directive with 'DYNAMIC_ALLOCATORS' clause found lexically after device construct
   !$omp requires dynamic_allocators
+  !WARNING: REVERSE_OFFLOAD clause is not supported and will be ignored
   !ERROR: REQUIRES directive with 'REVERSE_OFFLOAD' clause found lexically after device construct
   !$omp requires reverse_offload
   !ERROR: REQUIRES directive with 'UNIFIED_ADDRESS' clause found lexically after device construct
diff --git a/flang/test/Semantics/OpenMP/requires04.f90 b/flang/test/Semantics/OpenMP/requires04.f90
index a1647bc5db7a7..18790054e733d 100644
--- a/flang/test/Semantics/OpenMP/requires04.f90
+++ b/flang/test/Semantics/OpenMP/requires04.f90
@@ -14,6 +14,7 @@ end subroutine f
 subroutine g
   !ERROR: REQUIRES directive with 'DYNAMIC_ALLOCATORS' clause found lexically after device construct
   !$omp requires dynamic_allocators
+  !WARNING: REVERSE_OFFLOAD clause is not supported and will be ignored
   !ERROR: REQUIRES directive with 'REVERSE_OFFLOAD' clause found lexically after device construct
   !$omp requires reverse_offload
   !ERROR: REQUIRES directive with 'UNIFIED_ADDRESS' clause found lexically after device construct
diff --git a/flang/test/Semantics/OpenMP/requires05.f90 b/flang/test/Semantics/OpenMP/requires05.f90
index ce9138ae94f7f..871d0c433685b 100644
--- a/flang/test/Semantics/OpenMP/requires05.f90
+++ b/flang/test/Semantics/OpenMP/requires05.f90
@@ -13,6 +13,7 @@ end subroutine f
 subroutine g
   !ERROR: REQUIRES directive with 'DYNAMIC_ALLOCATORS' clause found lexically after device construct
   !$omp requires dynamic_allocators
+  !WARNING: REVERSE_OFFLOAD clause is not supported and will be ignored
   !ERROR: REQUIRES directive with 'REVERSE_OFFLOAD' clause found lexically after device construct
   !$omp requires reverse_offload
   !ERROR: REQUIRES directive with 'UNIFIED_ADDRESS' clause found lexically after device construct
diff --git a/flang/test/Semantics/OpenMP/requires06.f90 b/flang/test/Semantics/OpenMP/requires06.f90
index ba9bbf31b6e07..c41de68fc0f6a 100644
--- a/flang/test/Semantics/OpenMP/requires06.f90
+++ b/flang/test/Semantics/OpenMP/requires06.f90
@@ -11,6 +11,7 @@ end subroutine f
 subroutine g
   !ERROR: REQUIRES directive with 'DYNAMIC_ALLOCATORS' clause found lexically after device construct
   !$omp requires dynamic_allocators
+  !WARNING: REVERSE_OFFLOAD clause is not supported and will be ignored
   !ERROR: REQUIRES directive with 'REVERSE_OFFLOAD' clause found lexically after device construct
   !$omp requires reverse_offload
   !ERROR: REQUIRES directive with 'UNIFIED_ADDRESS' clause found lexically after device construct
diff --git a/flang/test/Semantics/OpenMP/requires07.f90 b/flang/test/Semantics/OpenMP/requires07.f90
index 2a36b4def9199..a47def1518a99 100644
--- a/flang/test/Semantics/OpenMP/requires07.f90
+++ b/flang/test/Semantics/OpenMP/requires07.f90
@@ -12,6 +12,7 @@ end subroutine f
 subroutine g
   !ERROR: REQUIRES directive with 'DYNAMIC_ALLOCATORS' clause found lexically after device construct
   !$omp requires dynamic_allocators
+  !WARNING: REVERSE_OFFLOAD clause is not supported and will be ignored
   !ERROR: REQUIRES directive with 'REVERSE_OFFLOAD' clause found lexically after device construct
   !$omp requires reverse_offload
   !ERROR: REQUIRES directive with 'UNIFIED_ADDRESS' clause found lexically after device construct
diff --git a/flang/test/Semantics/OpenMP/requires08.f90 b/flang/test/Semantics/OpenMP/requires08.f90
index 5f3b084078ccf..593e5e31c76ce 100644
--- a/flang/test/Semantics/OpenMP/requires08.f90
+++ b/flang/test/Semantics/OpenMP/requires08.f90
@@ -14,6 +14,7 @@ end subroutine f
 subroutine g
   !ERROR: REQUIRES directive with 'DYNAMIC_ALLOCATORS' clause found lexically after device construct
   !$omp requires dynamic_allocators
+  !WARNING: REVERSE_OFFLOAD clause is not supported and will be ignored
   !ERROR: REQUIRES directive with 'REVERSE_OFFLOAD' clause found lexically after device construct
   !$omp requires reverse_offload
   !ERROR: REQUIRES directive with 'UNIFIED_ADDRESS' clause found lexically after device construct
diff --git a/flang/test/Semantics/OpenMP/requires10.f90 b/flang/test/Semantics/OpenMP/requires10.f90
index 9f9832da3726e..7c2bc10e60284 100644
--- a/flang/test/Semantics/OpenMP/requires10.f90
+++ b/flang/test/Semantics/OpenMP/requires10.f90
@@ -2,12 +2,14 @@
 
 subroutine f00(x)
   logical :: x
+  !WARNING: REVERSE_OFFLOAD clause is not supported and will be ignored
   !ERROR: An argument to REVERSE_OFFLOAD is an OpenMP v6.0 feature, try -fopenmp-version=60
   !ERROR: Must be a constant value
   !$omp requires reverse_offload(x)
 end
 
 subroutine f01
+  !WARNING: REVERSE_OFFLOAD clause is not supported and will be ignored
   !WARNING: An argument to REVERSE_OFFLOAD is an OpenMP v6.0 feature, try -fopenmp-version=60
   !$omp requires reverse_offload(.true.)
 end
diff --git a/llvm/include/llvm/Frontend/OpenMP/OMP.td b/llvm/include/llvm/Frontend/OpenMP/OMP.td
index e1e66df72dfc5..e622d856f7cf9 100644
--- a/llvm/include/llvm/Frontend/OpenMP/OMP.td
+++ b/llvm/include/llvm/Frontend/OpenMP/OMP.td
@@ -1084,17 +1084,9 @@ def OMP_Requires : Directive<[Spelling<"requires">]> {
     VersionedClause<OMPC_UnifiedAddress>,
     VersionedClause<OMPC_UnifiedSharedMemory>,
     VersionedClause<OMPC_DeviceSafesync, 60>,
-    // OpenMP 5.2 Spec: If an implementation is not supporting a requirement
-    // (reverse offload in this case) then it should give compile-time error
-    // termination.
-    // Seeting supported version for reverse_offload to a distant future version
-    // 9.9 so that its partial support can be tested in the meantime.
-    //
-    // TODO: Correct this supprted version number whenever complete
-    // implementation of reverse_offload is available.
     VersionedClause<OMPC_AtomicDefaultMemOrder>,
     VersionedClause<OMPC_DynamicAllocators>, VersionedClause<OMPC_SelfMaps>,
-    VersionedClause<OMPC_ReverseOffload, 99>,
+    VersionedClause<OMPC_ReverseOffload>,
   ];
   let association = AS_None;
   let category = CA_Informational;



More information about the flang-commits mailing list