[clang] d228191 - [clang][Interp] Create global variables for TemplateParamObjectDecls
Timm Bäder via cfe-commits
cfe-commits at lists.llvm.org
Fri Feb 16 07:07:55 PST 2024
Author: Timm Bäder
Date: 2024-02-16T16:07:42+01:00
New Revision: d228191c8bb80ebf337d282374941c465dabc78d
URL: https://github.com/llvm/llvm-project/commit/d228191c8bb80ebf337d282374941c465dabc78d
DIFF: https://github.com/llvm/llvm-project/commit/d228191c8bb80ebf337d282374941c465dabc78d.diff
LOG: [clang][Interp] Create global variables for TemplateParamObjectDecls
Added:
Modified:
clang/lib/AST/Interp/ByteCodeExprGen.cpp
clang/test/AST/Interp/lambda.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/Interp/ByteCodeExprGen.cpp b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
index 975d3b68e9b242..72789d9d348144 100644
--- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp
+++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
@@ -3163,6 +3163,10 @@ bool ByteCodeExprGen<Emitter>::VisitDeclRefExpr(const DeclRefExpr *E) {
} else if (const auto *FuncDecl = dyn_cast<FunctionDecl>(D)) {
const Function *F = getFunction(FuncDecl);
return F && this->emitGetFnPtr(F, E);
+ } else if (isa<TemplateParamObjectDecl>(D)) {
+ if (std::optional<unsigned> Index = P.getOrCreateGlobal(D))
+ return this->emitGetPtrGlobal(*Index, E);
+ return false;
}
// References are implemented via pointers, so when we see a DeclRefExpr
diff --git a/clang/test/AST/Interp/lambda.cpp b/clang/test/AST/Interp/lambda.cpp
index a433e5666e4f4c..75a4a628f11833 100644
--- a/clang/test/AST/Interp/lambda.cpp
+++ b/clang/test/AST/Interp/lambda.cpp
@@ -213,3 +213,15 @@ namespace ThisCapture {
static_assert(F.a == 33, "");
static_assert(F.Aplus2() == (33 + 2), "");
}
+
+namespace GH62611 {
+ template <auto A = [](auto x){}>
+ struct C {
+ static constexpr auto B = A;
+ };
+
+ int test() {
+ C<>::B(42);
+ return 0;
+ }
+}
More information about the cfe-commits
mailing list