diff --git a/src/V3AstNodeOther.h b/src/V3AstNodeOther.h index 4c72499da..97455091a 100644 --- a/src/V3AstNodeOther.h +++ b/src/V3AstNodeOther.h @@ -2651,7 +2651,8 @@ public: , m_offset{offset} {} ASTGEN_MEMBERS_AstCoverDecl; const char* broken() const override { - if (m_dataDeclp && m_dataDeclp->m_dataDeclp) { // Avoid O(n^2) accessing + if (m_dataDeclp + && (m_dataDeclp == this || m_dataDeclp->m_dataDeclp)) { // Avoid O(n^2) accessing v3fatalSrc("dataDeclp should point to real data, not be a list"); } return nullptr; diff --git a/src/V3AstNodes.cpp b/src/V3AstNodes.cpp index 9e1b9afb1..04b70b663 100644 --- a/src/V3AstNodes.cpp +++ b/src/V3AstNodes.cpp @@ -2146,8 +2146,15 @@ void AstCoverDecl::dump(std::ostream& str) const { if (!page().empty()) str << " page=" << page(); if (!linescov().empty()) str << " lc=" << linescov(); if (this->dataDeclNullp()) { + static bool s_recursing = false; str << " -> "; - this->dataDeclNullp()->dump(str); + if (s_recursing) { + str << "%ErrorRECURSIVE"; + } else { + s_recursing = true; + this->dataDeclNullp()->dump(str); + s_recursing = false; + } } else { if (binNum()) str << " bin" << std::dec << binNum(); }