From 2e7891bedd768f9fde65fb4584167ee1dadf44ed Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Wed, 28 Jul 2021 17:15:24 +0200 Subject: [PATCH] CppEditor: Fix possible crash when following typdefs It's probably also a bug that we don't resolve the identically-named struct correctly, but at least we don't crash anymore. Fixes: QTCREATORBUG-26047 Change-Id: I272e76460c87906c9df23aaf7f37953b451bf1a8 Reviewed-by: Christian Stenger --- src/plugins/cpptools/typehierarchybuilder.cpp | 9 +++++++-- src/plugins/cpptools/typehierarchybuilder.h | 5 ++++- 2 files changed, 11 insertions(+), 3 deletions(-) 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,