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
