[clang] [clang][import] Evaluate constexpr variable initialzers (PR #208794)
Timm Baeder via cfe-commits
cfe-commits at lists.llvm.org
Fri Jul 10 10:46:48 PDT 2026
https://github.com/tbaederr created https://github.com/llvm/llvm-project/pull/208794
... if the bytecode interpreter is in use. This is similar to https://github.com/llvm/llvm-project/pull/198062.
With `-ast-import`, every `ASTUnit` has its own `ASTContext`. When that context is destroyed, so is the `interp::Context`.
Evaluate the initializer in the context we're importing to.
>From 457db862e15904176204bc46220023d56ed289f9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbaeder at redhat.com>
Date: Fri, 10 Jul 2026 19:43:39 +0200
Subject: [PATCH] [clang][import] Evaluate constexpr variable initialzers
... if the bytecode interpreter is in use. This is similar to
https://github.com/llvm/llvm-project/pull/198062.
---
clang/lib/AST/ASTImporter.cpp | 9 ++++++++-
clang/test/ASTMerge/class-template-partial-spec/test.cpp | 4 ++++
2 files changed, 12 insertions(+), 1 deletion(-)
diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp
index d1de2dbac2a0e..0ace8e7c6c299 100644
--- a/clang/lib/AST/ASTImporter.cpp
+++ b/clang/lib/AST/ASTImporter.cpp
@@ -4897,8 +4897,15 @@ ExpectedDecl ASTNodeImporter::VisitVarDecl(VarDecl *D) {
if (Error Err = ImportInitializer(D, ToVar))
return std::move(Err);
- if (D->isConstexpr())
+ if (D->isConstexpr()) {
ToVar->setConstexpr(true);
+ // Tell the bytecode interpreter that a new constexpr variable has appeared.
+ if (ToVar->getASTContext().getLangOpts().EnableNewConstInterp) {
+ if (const Expr *Init = ToVar->getInit();
+ Init && !Init->isValueDependent())
+ ToVar->evaluateValue();
+ }
+ }
addDeclToContexts(D, ToVar);
diff --git a/clang/test/ASTMerge/class-template-partial-spec/test.cpp b/clang/test/ASTMerge/class-template-partial-spec/test.cpp
index 6ab5ed5a7d5fb..6f2191d048455 100644
--- a/clang/test/ASTMerge/class-template-partial-spec/test.cpp
+++ b/clang/test/ASTMerge/class-template-partial-spec/test.cpp
@@ -2,6 +2,10 @@
// RUN: %clang_cc1 -emit-pch -std=c++1z -o %t.2.ast %S/Inputs/class-template-partial-spec2.cpp
// RUN: %clang_cc1 -std=c++1z -ast-merge %t.1.ast -ast-merge %t.2.ast -fsyntax-only %s 2>&1 | FileCheck %s
+// RUN: %clang_cc1 -emit-pch -std=c++1z -o %t.1.ast %S/Inputs/class-template-partial-spec1.cpp -fexperimental-new-constant-interpreter
+// RUN: %clang_cc1 -emit-pch -std=c++1z -o %t.2.ast %S/Inputs/class-template-partial-spec2.cpp -fexperimental-new-constant-interpreter
+// RUN: %clang_cc1 -std=c++1z -ast-merge %t.1.ast -ast-merge %t.2.ast -fsyntax-only %s 2>&1 -fexperimental-new-constant-interpreter | FileCheck %s
+
static_assert(sizeof(**SingleSource.member) == sizeof(**SingleDest.member));
static_assert(sizeof(SecondDoubleSource.member) == sizeof(SecondDoubleDest.member));
static_assert(NumberSource.val == 42);
More information about the cfe-commits
mailing list