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 <[email protected]>
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;
+}

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to