leaked node fix

This commit is contained in:
Yilou Wang 2025-10-12 15:53:28 +02:00
parent 36a94a4fc5
commit 2679c8a235
1 changed files with 1 additions and 27 deletions

View File

@ -1136,32 +1136,6 @@ class ConstraintExprVisitor final : public VNVisitor {
}
void visit(AstMemberSel* nodep) override {
if (nodep->varp()->rand().isRandomizable() && nodep->fromp()) {
// Determine dtype based on node type (VarRef or MemberSel)
AstNodeDType* dtype = nullptr;
if (VN_IS(nodep->fromp(), VarRef)) {
dtype = VN_AS(nodep->fromp(), VarRef)->dtypep();
} else if (VN_IS(nodep->fromp(), MemberSel)) {
dtype = VN_AS(nodep->fromp(), MemberSel)->dtypep();
}
const AstClassRefDType* const classRefDType = VN_CAST(dtype, ClassRefDType);
if (!classRefDType || !classRefDType->classp()) {
// Not a class reference type, skip processing
editFormat(nodep);
return;
}
AstClass* const refClass = classRefDType->classp();
// Check if constraint is from inside the class (internal) or outside (global)
if (nodep->user2p() == refClass) {
// Constraint is internal to the class - unwrap the MemberSel
// Process fromp first to ensure proper SMT generation
iterate(nodep->fromp());
nodep->replaceWith(nodep->fromp()->unlinkFrBack());
VL_DO_DANGLING(nodep->deleteTree(), nodep);
return;
}
// Traverse MemberSel chain to find the root variable reference
AstNode* rootNode = nodep->fromp();
@ -1177,7 +1151,7 @@ class ConstraintExprVisitor final : public VNVisitor {
: nullptr);
if (constrainedVar && constrainedVar->isGlobalConstrained()) {
// Global constraint - unwrap the MemberSel
iterate(nodep->fromp());
iterateChildren(nodep);
nodep->replaceWith(nodep->fromp()->unlinkFrBack());
VL_DO_DANGLING(nodep->deleteTree(), nodep);
return;