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; + }