[clang] [clang][bytecode] Use bytecode interpreter in EvaluateAsLValue (PR #158038)
Timm Baeder via cfe-commits
cfe-commits at lists.llvm.org
Thu Sep 11 03:58:57 PDT 2025
https://github.com/tbaederr created https://github.com/llvm/llvm-project/pull/158038
Set the EvalMode on InterpState and abort when initalizing a global temporary, like the current interpreter does. The rest is just plumbing in EvaluateAsLValue.
Fixes #157497
>From 8dc0aef33d5fc76b11368fec0de45ec689ab2852 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbaeder at redhat.com>
Date: Thu, 11 Sep 2025 07:34:43 +0200
Subject: [PATCH] [clang][bytecode] Use bytecode interpreter in
EvaluateAsLValue
Set the EvalMode on InterpState and abort when initalizing a global
temporary, like the current interpreter does. The rest is just plumbing
in EvaluateAsLValue.
Fixes #157497
---
clang/lib/AST/ByteCode/Interp.h | 4 ++++
clang/lib/AST/ByteCode/InterpState.cpp | 2 ++
clang/lib/AST/ExprConstant.cpp | 12 ++++++++++++
3 files changed, 18 insertions(+)
diff --git a/clang/lib/AST/ByteCode/Interp.h b/clang/lib/AST/ByteCode/Interp.h
index 2e9df4108f791..9a7bd03bea077 100644
--- a/clang/lib/AST/ByteCode/Interp.h
+++ b/clang/lib/AST/ByteCode/Interp.h
@@ -1527,6 +1527,8 @@ bool InitGlobal(InterpState &S, CodePtr OpPC, uint32_t I) {
template <PrimType Name, class T = typename PrimConv<Name>::T>
bool InitGlobalTemp(InterpState &S, CodePtr OpPC, uint32_t I,
const LifetimeExtendedTemporaryDecl *Temp) {
+ if (S.EvalMode == EvaluationMode::ConstantFold)
+ return false;
assert(Temp);
const Pointer &Ptr = S.P.getGlobal(I);
@@ -1544,6 +1546,8 @@ bool InitGlobalTemp(InterpState &S, CodePtr OpPC, uint32_t I,
/// 3) Initialized global with index \I with that
inline bool InitGlobalTempComp(InterpState &S, CodePtr OpPC,
const LifetimeExtendedTemporaryDecl *Temp) {
+ if (S.EvalMode == EvaluationMode::ConstantFold)
+ return false;
assert(Temp);
const Pointer &Ptr = S.Stk.peek<Pointer>();
diff --git a/clang/lib/AST/ByteCode/InterpState.cpp b/clang/lib/AST/ByteCode/InterpState.cpp
index 1ec4191d2ba37..a95916cd63981 100644
--- a/clang/lib/AST/ByteCode/InterpState.cpp
+++ b/clang/lib/AST/ByteCode/InterpState.cpp
@@ -25,6 +25,7 @@ InterpState::InterpState(State &Parent, Program &P, InterpStack &Stk,
CheckingPotentialConstantExpression =
Parent.CheckingPotentialConstantExpression;
CheckingForUndefinedBehavior = Parent.CheckingForUndefinedBehavior;
+ EvalMode = Parent.EvalMode;
}
InterpState::InterpState(State &Parent, Program &P, InterpStack &Stk,
@@ -36,6 +37,7 @@ InterpState::InterpState(State &Parent, Program &P, InterpStack &Stk,
CheckingPotentialConstantExpression =
Parent.CheckingPotentialConstantExpression;
CheckingForUndefinedBehavior = Parent.CheckingForUndefinedBehavior;
+ EvalMode = Parent.EvalMode;
}
bool InterpState::inConstantContext() const {
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index e1bacd0795289..5145896930153 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -17611,6 +17611,18 @@ bool Expr::EvaluateAsLValue(EvalResult &Result, const ASTContext &Ctx,
Info.InConstantContext = InConstantContext;
LValue LV;
CheckedTemporaries CheckedTemps;
+
+ if (Info.EnableNewConstInterp) {
+ if (!Info.Ctx.getInterpContext().evaluate(Info, this, Result.Val,
+ ConstantExprKind::Normal))
+ return false;
+
+ LV.setFrom(Ctx, Result.Val);
+ return CheckLValueConstantExpression(
+ Info, getExprLoc(), Ctx.getLValueReferenceType(getType()), LV,
+ ConstantExprKind::Normal, CheckedTemps);
+ }
+
if (!EvaluateLValue(this, LV, Info) || !Info.discardCleanups() ||
Result.HasSideEffects ||
!CheckLValueConstantExpression(Info, getExprLoc(),
More information about the cfe-commits
mailing list