diff --git a/src/plugins/cpptools/typehierarchybuilder.cpp b/src/plugins/cpptools/typehierarchybuilder.cpp index 67f4e6a1ab0..c2856011429 100644 --- a/src/plugins/cpptools/typehierarchybuilder.cpp +++ b/src/plugins/cpptools/typehierarchybuilder.cpp @@ -146,7 +146,9 @@ TypeHierarchy TypeHierarchyBuilder::buildDerivedTypeHierarchy(QFutureInterfaceBa return hierarchy; } -LookupItem TypeHierarchyBuilder::followTypedef(const LookupContext &context, const Name *symbolName, Scope *enclosingScope) +LookupItem TypeHierarchyBuilder::followTypedef(const LookupContext &context, const Name *symbolName, + Scope *enclosingScope, + std::set typedefs) { QList items = context.lookup(symbolName, enclosingScope); @@ -159,6 +161,8 @@ LookupItem TypeHierarchyBuilder::followTypedef(const LookupContext &context, con continue; if (!s->isClass() && !s->isTemplate() && !s->isTypedef()) continue; + if (!typedefs.insert(s).second) + continue; actualBaseSymbol = s; matchingItem = item; break; @@ -173,7 +177,8 @@ LookupItem TypeHierarchyBuilder::followTypedef(const LookupContext &context, con // Anonymous aggregate such as: typedef struct {} Empty; return LookupItem(); } - return followTypedef(context, namedType->name(), actualBaseSymbol->enclosingScope()); + return followTypedef(context, namedType->name(), actualBaseSymbol->enclosingScope(), + typedefs); } return matchingItem; diff --git a/src/plugins/cpptools/typehierarchybuilder.h b/src/plugins/cpptools/typehierarchybuilder.h index 38fc45bcf9e..38920b4cead 100644 --- a/src/plugins/cpptools/typehierarchybuilder.h +++ b/src/plugins/cpptools/typehierarchybuilder.h @@ -34,6 +34,8 @@ #include #include +#include + namespace CPlusPlus { class LookupContext; class LookupItem; @@ -72,7 +74,8 @@ public: const CPlusPlus::Snapshot &snapshot); static CPlusPlus::LookupItem followTypedef(const CPlusPlus::LookupContext &context, const CPlusPlus::Name *symbolName, - CPlusPlus::Scope *enclosingScope); + CPlusPlus::Scope *enclosingScope, + std::set typedefs = {}); private: TypeHierarchyBuilder() = default; void buildDerived(QFutureInterfaceBase &futureInterface, TypeHierarchy *typeHierarchy,