forked from qt-creator/qt-creator
C++: template base class and default argument for template class
Fix code completion for case:
struct Foo
{
int bar;
};
template <typename T>
struct Base
{
T t;
};
template <typename T1 = Foo>
struct Derived : Base<T1>
{};
int main()
{
Derived<> foo;
foo.t.// no code completion
return 0;
}
Task-number: QTCREATORBUG-12606
Change-Id: Iadf2fae172739d0a5844c6b437fd2686616e64e7
Reviewed-by: Erik Verbruggen <erik.verbruggen@digia.com>
This commit is contained in:
committed by
Erik Verbruggen
parent
ce4dc86d58
commit
059cfde677
@@ -1158,11 +1158,13 @@ ClassOrNamespace *ClassOrNamespace::nestedType(const Name *name, ClassOrNamespac
|
||||
}
|
||||
} else {
|
||||
SubstitutionMap map;
|
||||
for (unsigned i = 0;
|
||||
i < argumentCountOfSpecialization && i < argumentCountOfInitialization;
|
||||
++i) {
|
||||
map.bind(templateSpecialization->templateParameterAt(i)->name(),
|
||||
templId->templateArgumentAt(i));
|
||||
for (unsigned i = 0; i < argumentCountOfSpecialization; ++i) {
|
||||
const Name *name = templateSpecialization->templateParameterAt(i)->name();
|
||||
FullySpecifiedType ty = (i < argumentCountOfInitialization) ?
|
||||
templId->templateArgumentAt(i):
|
||||
templateSpecialization->templateParameterAt(i)->type();
|
||||
|
||||
map.bind(name, ty);
|
||||
}
|
||||
SubstitutionEnvironment env;
|
||||
env.enter(&map);
|
||||
|
||||
@@ -2281,6 +2281,20 @@ void CppToolsPlugin::test_completion_data()
|
||||
<< QLatin1String("Derived")
|
||||
<< QLatin1String("foo")
|
||||
<< QLatin1String("Foo"));
|
||||
|
||||
QTest::newRow("default_arguments_for_class_templates_and_template_base_class_QTCREATORBUG-12606") << _(
|
||||
"struct Foo { int foo; };\n"
|
||||
"template <typename T>\n"
|
||||
"struct Base { T t; };\n"
|
||||
"template <typename T = Foo>\n"
|
||||
"struct Derived : Base<T> {};\n"
|
||||
"void fun() {\n"
|
||||
" Derived<> derived;\n"
|
||||
" @\n"
|
||||
"}\n"
|
||||
) << _("derived.t.") << (QStringList()
|
||||
<< QLatin1String("foo")
|
||||
<< QLatin1String("Foo"));
|
||||
}
|
||||
|
||||
void CppToolsPlugin::test_completion_member_access_operator()
|
||||
|
||||
Reference in New Issue
Block a user