From e018eb7bacbc8095cd33fa0ef0dd1a7494453a9d Mon Sep 17 00:00:00 2001 From: Krzysztof Bieganski Date: Tue, 17 May 2022 15:22:43 +0200 Subject: [PATCH] Support AstClass::repairCache() after V3Class (#3431) This is a pre-PR to #3363. Signed-off-by: Krzysztof Bieganski --- src/V3AstNodes.cpp | 12 ++++++++++-- src/V3Class.cpp | 1 + 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/V3AstNodes.cpp b/src/V3AstNodes.cpp index fc6999853..33d275e4e 100644 --- a/src/V3AstNodes.cpp +++ b/src/V3AstNodes.cpp @@ -1309,7 +1309,8 @@ void AstClassPackage::cloneRelink() { } void AstClass::insertCache(AstNode* nodep) { const bool doit = (VN_IS(nodep, Var) || VN_IS(nodep, EnumItemRef) - || (VN_IS(nodep, NodeFTask) && !VN_AS(nodep, NodeFTask)->isExternProto())); + || (VN_IS(nodep, NodeFTask) && !VN_AS(nodep, NodeFTask)->isExternProto()) + || VN_IS(nodep, CFunc)); if (doit) { if (m_members.find(nodep->name()) != m_members.end()) { nodep->v3error("Duplicate declaration of member name: " << nodep->prettyNameQ()); @@ -1320,7 +1321,14 @@ void AstClass::insertCache(AstNode* nodep) { } void AstClass::repairCache() { clearCache(); - for (AstNode* itemp = membersp(); itemp; itemp = itemp->nextp()) { insertCache(itemp); } + for (auto* itemp = membersp(); itemp; itemp = itemp->nextp()) { + if (const auto* const scopep = VN_CAST(itemp, Scope)) { + for (auto* itemp = scopep->blocksp(); itemp; itemp = itemp->nextp()) + insertCache(itemp); + } else { + insertCache(itemp); + } + } } bool AstClass::isClassExtendedFrom(const AstClass* refClassp, const AstClass* baseClassp) { // TAIL RECURSIVE diff --git a/src/V3Class.cpp b/src/V3Class.cpp index 6a7a3ce4f..5b29eccd6 100644 --- a/src/V3Class.cpp +++ b/src/V3Class.cpp @@ -97,6 +97,7 @@ private: m_prefix = nodep->name() + "__02e"; // . iterateChildren(nodep); } + nodep->repairCache(); } virtual void visit(AstNodeModule* nodep) override { // Visit for NodeModules that are not AstClass (AstClass is-a AstNodeModule)