diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp index f8cdf106a0dfc213939ec76aa7c6387ac8d4445b..aae1b25ff10c3277f265fefa5b81ad68eb78badf 100644 --- a/src/libs/cplusplus/LookupContext.cpp +++ b/src/libs/cplusplus/LookupContext.cpp @@ -1082,9 +1082,9 @@ ClassOrNamespace *ClassOrNamespace::nestedType(const Name *name, ClassOrNamespac const unsigned argumentCountOfSpecialization = templateSpecialization->templateParameterCount(); + Subst subst(_control.data()); if (_factory->expandTemplates()) { Clone cloner(_control.data()); - Subst subst(_control.data()); for (unsigned i = 0; i < argumentCountOfSpecialization; ++i) { const TypenameArgument *tParam = templateSpecialization->templateParameterAt(i)->asTypenameArgument(); @@ -1149,6 +1149,13 @@ ClassOrNamespace *ClassOrNamespace::nestedType(const Name *name, ClassOrNamespac } } } + if (!baseBinding && subst.contains(baseName)) { + const FullySpecifiedType &fullType = subst[baseName]; + if (fullType.isValid()) { + if (NamedType *namedType = fullType.type()->asNamedType()) + baseBinding = lookupType(namedType->name()); + } + } } else { SubstitutionMap map; for (unsigned i = 0; diff --git a/src/plugins/cpptools/cppcompletion_test.cpp b/src/plugins/cpptools/cppcompletion_test.cpp index b2978ea3b86bf7a2504b5a16241e2b36631bb9ef..a55968da4a9ea24a11de38a1085af5e00722b850 100644 --- a/src/plugins/cpptools/cppcompletion_test.cpp +++ b/src/plugins/cpptools/cppcompletion_test.cpp @@ -2268,6 +2268,19 @@ void CppToolsPlugin::test_completion_data() "auto func = [](int arg1) { return @; };\n" ) << _("ar") << (QStringList() << QLatin1String("arg1")); + + QTest::newRow("default_arguments_for_class_templates_and_base_class_QTCREATORBUG-12605") << _( + "struct Foo { int foo; };\n" + "template <typename T = Foo>\n" + "struct Derived : T {};\n" + "void fun() {\n" + " Derived<> derived;\n" + " @\n" + "}\n" + ) << _("derived.") << (QStringList() + << QLatin1String("Derived") + << QLatin1String("foo") + << QLatin1String("Foo")); } void CppToolsPlugin::test_completion_member_access_operator()