From e53f4352194a2307d77cea923c2473812a8647b9 Mon Sep 17 00:00:00 2001 From: Przemyslaw Gorszkowski Date: Tue, 23 Oct 2012 23:08:19 +0200 Subject: [PATCH] Fix crashes when cyclic inheritance More complex situation. Base class is a template and derived class is a template. Task-number: QTCREATORBUG-8072 Task-number: QTCREATORBUG-7962 Change-Id: I7e8aa727fccd2bd4a779e6fe781553cd12196682 Reviewed-by: Erik Verbruggen --- src/libs/cplusplus/LookupContext.h | 10 +++++- src/plugins/cpptools/cppcompletion_test.cpp | 39 +++++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/src/libs/cplusplus/LookupContext.h b/src/libs/cplusplus/LookupContext.h index 9b85f3c11ef..0022d138d7e 100644 --- a/src/libs/cplusplus/LookupContext.h +++ b/src/libs/cplusplus/LookupContext.h @@ -58,7 +58,15 @@ public: } bool contains(const T *item) { - return _container.contains(item); + if (_container.contains(item)) + return true; + + foreach (const T *existingItem, _container) { + if (existingItem->isEqualTo(item)) + return true; + } + + return false; } void clear(const T *item) diff --git a/src/plugins/cpptools/cppcompletion_test.cpp b/src/plugins/cpptools/cppcompletion_test.cpp index 68229c63711..f36ac54a6c4 100644 --- a/src/plugins/cpptools/cppcompletion_test.cpp +++ b/src/plugins/cpptools/cppcompletion_test.cpp @@ -930,4 +930,43 @@ void CppToolsPlugin::test_completion_cyclic_inheritance_data() QTest::newRow("case: indirect cyclic inheritance with templates") << code << completions; + completions.clear(); + code = "\n" + "namespace NS\n" + "{\n" + "template struct SuperClass\n" + "{\n" + " typedef T Type;\n" + " Type super_class_type;\n" + "};\n" + "}\n" + "\n" + "template \n" + "struct Class;\n" + "\n" + "template \n" + "struct ClassRecurse : Class\n" + "{\n" + " T class_recurse_t;\n" + " S class_recurse_s;\n" + "};\n" + "\n" + "template \n" + "struct Class : ClassRecurse< T, typename ::NS::SuperClass::Type >\n" + "{\n" + " T class_t;\n" + "};\n" + "\n" + "Class c;\n" + "c.\n" + "@\n" + ; + completions.append("Class"); + completions.append("ClassRecurse"); + completions.append("class_t"); + completions.append("class_recurse_s"); + completions.append("class_recurse_t"); + QTest::newRow("case: direct cyclic inheritance with templates, more complex situation") + << code << completions; + }