[clang] [clang][OpenMP] declare_target/local clause variable can't be in map clause (PR #190470)
David Pagan via cfe-commits
cfe-commits at lists.llvm.org
Sat Apr 4 08:56:08 PDT 2026
https://github.com/ddpagan created https://github.com/llvm/llvm-project/pull/190470
In OpenMP 6.0, the 'local' clause was added to the declare_target directive. Variables listed in the 'local' clause are considered to be device-local. In addition, a new map clause restriction was added:
A device-local variable must not appear as a list item in a map clause.
See OpenMP 6.0 specification section 7.9.6, map Clause, Restrictions, p. 386.
Testing:
- New error messages test for device-local variables defined in declare_target local clauses (device-local) used in map clauses.
- ninja check-openmp
>From 71cfbf42673fd7e45dfa086b456864d28a714af1 Mon Sep 17 00:00:00 2001
From: Dave Pagan <dave.pagan at amd.com>
Date: Sat, 4 Apr 2026 10:26:39 -0500
Subject: [PATCH] [clang][OpenMP] declare_target/local clause variable can't be
in map clause
In OpenMP 6.0, the 'local' clause was added to the declare_target
directive. Variables listed in the 'local' clause are considered to be
device-local. In addition, a new map clause restriction was added:
A device-local variable must not appear as a list item in a map clause.
See OpenMP 6.0 specification section 7.9.6, map Clause, Restrictions,
p. 386.
Testing:
- New error messages test for device-local variables defined in
declare_target local clauses (device-local) used in map clauses.
- ninja check-openmp
---
clang/include/clang/Basic/DiagnosticSemaKinds.td | 2 ++
clang/lib/Sema/SemaOpenMP.cpp | 15 +++++++++++++++
2 files changed, 17 insertions(+)
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index eddf9c50033e1..3ff1f3ce00dcc 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -12401,6 +12401,8 @@ def err_omp_no_clause_for_directive : Error<
"expected at least one %0 clause for '#pragma omp %1'">;
def err_omp_threadprivate_in_clause : Error<
"threadprivate variables are not allowed in '%0' clause">;
+def err_omp_device_local_in_clause : Error<
+ "device-local variable %0 is not allowed in '%1' clause">;
def err_omp_wrong_ordered_loop_count : Error<
"the parameter of the 'ordered' clause must be greater than or equal to the parameter of the 'collapse' clause">;
def note_collapse_loop_count : Note<
diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp
index fada37ba45755..73cbc7a428661 100644
--- a/clang/lib/Sema/SemaOpenMP.cpp
+++ b/clang/lib/Sema/SemaOpenMP.cpp
@@ -23301,6 +23301,21 @@ static void checkMappableExpressionList(
continue;
}
+ // OpenMP 6.0 [7.9.6, map Clause, Restrictions, p. 386]
+ // A device-local variable must not appear as a list item in a map clause.
+ if (VD && CKind == OMPC_map) {
+ if (std::optional<OMPDeclareTargetDeclAttr::MapTypeTy> Res =
+ OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD)) {
+ if (*Res == OMPDeclareTargetDeclAttr::MT_Local) {
+ if (NoDiagnose)
+ continue;
+ SemaRef.Diag(ELoc, diag::err_omp_device_local_in_clause)
+ << VD << getOpenMPClauseNameForDiag(CKind);
+ continue;
+ }
+ }
+ }
+
// OpenMP 4.5 [2.15.5.1, map Clause, Restrictions, p.9]
// A list item cannot appear in both a map clause and a data-sharing
// attribute clause on the same construct.
More information about the cfe-commits
mailing list