[clang] [clang][bytecode] Add visitInitializerPop() helper (PR #194802)
Timm Baeder via cfe-commits
cfe-commits at lists.llvm.org
Wed Apr 29 00:42:57 PDT 2026
https://github.com/tbaederr created https://github.com/llvm/llvm-project/pull/194802
To pop the pointer as part of the finishInit op
>From 909872b0ccc5d996728f043cc098ec89d8fbbedd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbaeder at redhat.com>
Date: Wed, 29 Apr 2026 09:41:31 +0200
Subject: [PATCH] [clang][bytecode] Add visitInitializerPop() helper
To pop the pointer as part of the finishInit op
---
clang/lib/AST/ByteCode/Compiler.cpp | 55 +++++++++++------------------
clang/lib/AST/ByteCode/Compiler.h | 2 ++
2 files changed, 22 insertions(+), 35 deletions(-)
diff --git a/clang/lib/AST/ByteCode/Compiler.cpp b/clang/lib/AST/ByteCode/Compiler.cpp
index 98d092554e129..d4bbb8d3a8a3e 100644
--- a/clang/lib/AST/ByteCode/Compiler.cpp
+++ b/clang/lib/AST/ByteCode/Compiler.cpp
@@ -966,9 +966,7 @@ bool Compiler<Emitter>::VisitCastExpr(const CastExpr *E) {
return false;
if (!this->emitActivate(E))
return false;
- if (!this->visitInitializer(SubExpr))
- return false;
- return this->emitPopPtr(E);
+ return this->visitInitializerPop(SubExpr);
}
default:
@@ -2120,9 +2118,7 @@ bool Compiler<Emitter>::visitInitList(ArrayRef<const Expr *> Inits,
if (Activate && !this->emitActivate(E))
return false;
- if (!this->visitInitializer(Init))
- return false;
- return this->emitPopPtr(E);
+ return this->visitInitializerPop(Init);
};
if (R->isUnion()) {
@@ -2168,10 +2164,7 @@ bool Compiler<Emitter>::visitInitList(ArrayRef<const Expr *> Inits,
if (!this->emitGetPtrBase(B->Offset, Init))
return false;
- if (!this->visitInitializer(Init))
- return false;
-
- if (!this->emitPopPtr(E))
+ if (!this->visitInitializerPop(Init))
return false;
// Base initializers don't increase InitIndex, since they don't count
// into the Record's fields.
@@ -2349,9 +2342,7 @@ bool Compiler<Emitter>::visitArrayElemInit(unsigned ElemIndex, const Expr *Init,
return false;
if (!this->emitArrayElemPtrUint32(Init))
return false;
- if (!this->visitInitializer(Init))
- return false;
- return this->emitPopPtr(Init);
+ return this->visitInitializerPop(Init);
}
template <class Emitter>
@@ -3413,10 +3404,7 @@ bool Compiler<Emitter>::VisitLambdaExpr(const LambdaExpr *E) {
if (!this->emitGetPtrField(F.Offset, E))
return false;
- if (!this->visitInitializer(Init))
- return false;
-
- if (!this->emitPopPtr(E))
+ if (!this->visitInitializerPop(Init))
return false;
}
}
@@ -4077,9 +4065,7 @@ bool Compiler<Emitter>::VisitCXXNewExpr(const CXXNewExpr *E) {
if (!this->emitStorePop(*InitT, E))
return false;
} else {
- if (!this->visitInitializer(DynamicInit))
- return false;
- if (!this->emitPopPtr(E))
+ if (!this->visitInitializerPop(DynamicInit))
return false;
}
} else if (ElemT) {
@@ -4638,6 +4624,15 @@ bool Compiler<Emitter>::visitInitializer(const Expr *E) {
return this->Visit(E) && this->emitFinishInit(E);
}
+template <class Emitter>
+bool Compiler<Emitter>::visitInitializerPop(const Expr *E) {
+ assert(!canClassify(E->getType()));
+
+ OptionScope<Emitter> Scope(this, /*NewDiscardResult=*/false,
+ /*NewInitializing=*/true, /*ToLValue=*/false);
+ return this->Visit(E) && this->emitFinishInitPop(E);
+}
+
template <class Emitter> bool Compiler<Emitter>::visitAsLValue(const Expr *E) {
OptionScope<Emitter> Scope(this, /*NewDiscardResult=*/false,
/*NewInitializing=*/false, /*ToLValue=*/true);
@@ -5293,9 +5288,7 @@ VarCreationState Compiler<Emitter>::visitVarDecl(const VarDecl *VD,
if (!this->emitGetPtrLocal(*Offset, Init))
return false;
- if (!visitInitializer(Init))
- return false;
- return this->emitPopPtr(Init);
+ return visitInitializerPop(Init);
}
return false;
}
@@ -6094,9 +6087,7 @@ bool Compiler<Emitter>::visitReturnStmt(const ReturnStmt *RS) {
// RVO - construct the value in the return location.
if (!this->emitRVOPtr(RE))
return false;
- if (!this->visitInitializer(RE))
- return false;
- if (!this->emitPopPtr(RE))
+ if (!this->visitInitializerPop(RE))
return false;
this->emitCleanup();
@@ -6771,9 +6762,7 @@ bool Compiler<Emitter>::compileConstructor(const CXXConstructorDecl *Ctor) {
if (Activate && !this->emitActivate(InitExpr))
return false;
- if (!this->visitInitializer(InitExpr))
- return false;
- return this->emitPopPtr(InitExpr);
+ return this->visitInitializerPop(InitExpr);
};
const RecordDecl *RD = Ctor->getParent();
@@ -6835,9 +6824,7 @@ bool Compiler<Emitter>::compileConstructor(const CXXConstructorDecl *Ctor) {
if (IsUnion && !this->emitActivate(InitExpr))
return false;
- if (!this->visitInitializer(InitExpr))
- return false;
- if (!this->emitPopPtr(InitExpr))
+ if (!this->visitInitializerPop(InitExpr))
return false;
} else if (const IndirectFieldDecl *IFD = Init->getIndirectMember()) {
LocOverrideScope<Emitter> LOS(this, SourceInfo{},
@@ -6890,9 +6877,7 @@ bool Compiler<Emitter>::compileConstructor(const CXXConstructorDecl *Ctor) {
assert(Init->isDelegatingInitializer());
if (!this->emitThis(InitExpr))
return false;
- if (!this->visitInitializer(Init->getInit()))
- return false;
- if (!this->emitPopPtr(InitExpr))
+ if (!this->visitInitializerPop(Init->getInit()))
return false;
}
diff --git a/clang/lib/AST/ByteCode/Compiler.h b/clang/lib/AST/ByteCode/Compiler.h
index ce5db0d544169..de6ea524897a0 100644
--- a/clang/lib/AST/ByteCode/Compiler.h
+++ b/clang/lib/AST/ByteCode/Compiler.h
@@ -301,6 +301,8 @@ class Compiler : public ConstStmtVisitor<Compiler<Emitter>, bool>,
/// been created. visitInitializer() then relies on a pointer to this
/// variable being on top of the stack.
bool visitInitializer(const Expr *E);
+ /// Similar, but will also pop the pointer.
+ bool visitInitializerPop(const Expr *E);
bool visitAsLValue(const Expr *E);
/// Evaluates an expression for side effects and discards the result.
bool discard(const Expr *E);
More information about the cfe-commits
mailing list