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()