diff --git a/src/V3LinkDot.cpp b/src/V3LinkDot.cpp index 0bf9e5af6..b1bb00978 100644 --- a/src/V3LinkDot.cpp +++ b/src/V3LinkDot.cpp @@ -2674,42 +2674,46 @@ private: // Until overridden by a SCOPE m_ds.m_dotSymp = m_curSymp = m_modSymp = m_statep->getNodeSym(nodep); m_modp = nodep; - iterateChildren(nodep); - } - for (AstNode* itemp = nodep->extendsp(); itemp; itemp = itemp->nextp()) { - if (AstClassExtends* cextp = VN_CAST(itemp, ClassExtends)) { - // Replace abstract reference with hard pointer - // Will need later resolution when deal with parameters - if (cextp->childDTypep() || cextp->dtypep()) continue; // Already converted - AstClassOrPackageRef* cpackagerefp - = VN_CAST(cextp->classOrPkgsp(), ClassOrPackageRef); - if (!cpackagerefp) { - cextp->v3error("Attempting to extend using a non-class "); - } else { - VSymEnt* foundp = m_curSymp->findIdFallback(cpackagerefp->name()); - bool ok = false; - if (foundp) { - if (AstClass* classp = VN_CAST(foundp->nodep(), Class)) { - AstClassRefDType* newp - = new AstClassRefDType{nodep->fileline(), classp}; - cextp->childDTypep(newp); - classp->isExtended(true); - nodep->isExtended(true); - VL_DO_DANGLING(cpackagerefp->unlinkFrBack()->deleteTree(), - cpackagerefp); - ok = true; + for (AstNode* itemp = nodep->extendsp(); itemp; itemp = itemp->nextp()) { + if (AstClassExtends* cextp = VN_CAST(itemp, ClassExtends)) { + // Replace abstract reference with hard pointer + // Will need later resolution when deal with parameters + if (cextp->childDTypep() || cextp->dtypep()) continue; // Already converted + AstClassOrPackageRef* cpackagerefp + = VN_CAST(cextp->classOrPkgsp(), ClassOrPackageRef); + if (!cpackagerefp) { + cextp->v3error("Attempting to extend using a non-class "); + } else { + VSymEnt* foundp = m_curSymp->findIdFallback(cpackagerefp->name()); + bool ok = false; + if (foundp) { + if (AstClass* classp = VN_CAST(foundp->nodep(), Class)) { + UINFO(8, "Import to " << nodep << " from export class " << classp + << endl); + AstClassRefDType* newp + = new AstClassRefDType{nodep->fileline(), classp}; + cextp->childDTypep(newp); + classp->isExtended(true); + nodep->isExtended(true); + VSymEnt* srcp = m_statep->getNodeSym(classp); + m_curSymp->importFromClass(m_statep->symsp(), srcp); + VL_DO_DANGLING(cpackagerefp->unlinkFrBack()->deleteTree(), + cpackagerefp); + ok = true; + } + } + if (!ok) { + string suggest = m_statep->suggestSymFallback( + m_curSymp, cpackagerefp->name(), LinkNodeMatcherClass{}); + cpackagerefp->v3error( + "Class to extend not found: " + << cpackagerefp->prettyNameQ() << endl + << (suggest.empty() ? "" : cpackagerefp->warnMore() + suggest)); } - } - if (!ok) { - string suggest = m_statep->suggestSymFallback( - m_curSymp, cpackagerefp->name(), LinkNodeMatcherClass{}); - cpackagerefp->v3error( - "Class to extend not found: " - << cpackagerefp->prettyNameQ() << endl - << (suggest.empty() ? "" : cpackagerefp->warnMore() + suggest)); } } } + iterateChildren(nodep); } // V3Width when determines types needs to find enum values and such // so add members pointing to appropriate enum values diff --git a/test_regress/t/t_class_extends.out b/test_regress/t/t_class_extends.out deleted file mode 100644 index fc51e85d6..000000000 --- a/test_regress/t/t_class_extends.out +++ /dev/null @@ -1,4 +0,0 @@ -%Error: t/t_class_extends.v:25:4: Can't find typedef: 'T' - 25 | T imemberc; - | ^ -%Error: Exiting due to diff --git a/test_regress/t/t_class_extends.pl b/test_regress/t/t_class_extends.pl index b8b56e6f0..aabcde63e 100755 --- a/test_regress/t/t_class_extends.pl +++ b/test_regress/t/t_class_extends.pl @@ -11,13 +11,11 @@ if (!$::Driver) { use FindBin; exec("$FindBin::Bin/bootstrap.pl", @ARGV, $0); di scenarios(simulator => 1); compile( - fails => $Self->{vlt_all}, - expect_filename => $Self->{golden_filename}, ); -#execute( -# check_finished => 1, -# ); +execute( + check_finished => 1, + ); ok(1); 1;