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?= <tbae...@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(), _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits