Fix class initial-automatic insertion order (#7086 repair)

This commit is contained in:
Wilson Snyder
2026-02-25 19:01:19 -05:00
parent d658517715
commit 22290a74c2
3 changed files with 98 additions and 7 deletions
+12 -7
View File
@@ -291,18 +291,23 @@ private:
iterateChildren(nodep);
}
UASSERT_OBJ(m_ctorp, nodep, "class constructor missing"); // LinkDot always makes it
AstNode* insertp = nullptr;
for (AstInitialAutomatic* initialp : m_initialps) {
if (AstNode* const newp = initialp->stmtsp()) {
newp->unlinkFrBackWithNext();
if (!m_ctorp->stmtsp()) {
m_ctorp->addStmtsp(newp);
} else {
m_ctorp->stmtsp()->addHereThisAsNext(newp);
}
if (AstNode* const movep = initialp->stmtsp()) {
movep->unlinkFrBackWithNext();
// Next InitialAutomatic must go in order after what we inserted
insertp = AstNode::addNextNull(insertp, movep);
}
VL_DO_DANGLING(pushDeletep(initialp->unlinkFrBack()), initialp);
}
m_initialps.clear();
if (insertp) {
if (!m_ctorp->stmtsp()) {
m_ctorp->addStmtsp(insertp);
} else {
m_ctorp->stmtsp()->addHereThisAsNext(insertp);
}
}
}
void visit(AstInitialAutomatic* nodep) override {
m_initialps.push_back(nodep);