[clang] [Clang][OpenMP] Fix crash with enum omp_interop_t (PR #213687)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Aug 3 07:43:47 PDT 2026
https://github.com/OHNope created https://github.com/llvm/llvm-project/pull/213687
Fixes #213666.
`isValidInteropVariable` looks up `omp_interop_t` and previously used
`TypeDecl::getTypeForDecl()` to obtain its type. This low-level accessor
cannot be used with `TagDecl`s, so defining `omp_interop_t` as an enum caused
Clang to hit an assertion during template instantiation.
Use `ASTContext::getTypeDeclType()` instead, which correctly handles tag
declarations as well as other `TypeDecl` kinds.
Add a regression test covering an enum `omp_interop_t` used in an OpenMP
`interop` directive through template instantiation.
>From b051fd7616812ca39e2e212d8685323595efb500 Mon Sep 17 00:00:00 2001
From: OHNope <ohnopexboy at gmail.com>
Date: Mon, 3 Aug 2026 23:22:53 +0900
Subject: [PATCH] [Clang] Fix OpenMP interop enum type lookup
---
clang/lib/Sema/SemaOpenMP.cpp | 3 ++-
clang/test/OpenMP/interop_enum.cpp | 15 +++++++++++++++
2 files changed, 17 insertions(+), 1 deletion(-)
create mode 100644 clang/test/OpenMP/interop_enum.cpp
diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp
index 00dfc446de472..25d98678099a1 100644
--- a/clang/lib/Sema/SemaOpenMP.cpp
+++ b/clang/lib/Sema/SemaOpenMP.cpp
@@ -19083,7 +19083,8 @@ static bool isValidInteropVariable(Sema &SemaRef, Expr *InteropVarExpr,
if (SemaRef.LookupName(Result, SemaRef.getCurScope())) {
NamedDecl *ND = Result.getFoundDecl();
if (const auto *TD = dyn_cast<TypeDecl>(ND)) {
- InteropType = QualType(TD->getTypeForDecl(), 0);
+ InteropType = SemaRef.Context.getTypeDeclType(
+ ElaboratedTypeKeyword::None, /*Qualifier=*/std::nullopt, TD);
} else {
HasError = true;
}
diff --git a/clang/test/OpenMP/interop_enum.cpp b/clang/test/OpenMP/interop_enum.cpp
new file mode 100644
index 0000000000000..3ada373decec8
--- /dev/null
+++ b/clang/test/OpenMP/interop_enum.cpp
@@ -0,0 +1,15 @@
+// RUN: %clang_cc1 -verify -fopenmp -std=c++11 -fsyntax-only %s
+
+// expected-no-diagnostics
+
+enum omp_interop_t : unsigned long {};
+
+template <typename T> void foo() {
+ T t;
+#pragma omp interop init(target : t)
+}
+
+void bar(int *y) {
+ foo<omp_interop_t>();
+ --y;
+}
More information about the cfe-commits
mailing list