diff options
author | Przemyslaw Gorszkowski <pgorszkowski@gmail.com> | 2013-01-30 22:08:21 +0100 |
---|---|---|
committer | Erik Verbruggen <erik.verbruggen@digia.com> | 2013-02-01 13:36:03 +0100 |
commit | 858cb6e3486c93fe3a07175e2feb83fbc96a028a (patch) | |
tree | 77fff284c240e2c55f7455bfae7ff62b6a067abe /src/libs/cplusplus/LookupContext.cpp | |
parent | 2c7347b8ed58265ec20ed036bf31f5ef8d5f7671 (diff) | |
download | qt-creator-858cb6e3486c93fe3a07175e2feb83fbc96a028a.tar.gz |
C++: instantiate template with default argument
Fix code completion for instantiation of template with default argument
Change-Id: I57b0306cc4540400ae83724db6c8b6b1aa67c255
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@digia.com>
Reviewed-by: Erik Verbruggen <erik.verbruggen@digia.com>
Diffstat (limited to 'src/libs/cplusplus/LookupContext.cpp')
-rw-r--r-- | src/libs/cplusplus/LookupContext.cpp | 33 |
1 files changed, 21 insertions, 12 deletions
diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp index 04d5bec153..b23cf73949 100644 --- a/src/libs/cplusplus/LookupContext.cpp +++ b/src/libs/cplusplus/LookupContext.cpp @@ -801,20 +801,27 @@ ClassOrNamespace *ClassOrNamespace::nestedType(const Name *name, ClassOrNamespac // It gets a bit complicated if the reference is actually a class template because we // now must worry about dependent names in base classes. - if (Template *templ = referenceClass->enclosingTemplate()) { - const unsigned argumentCount = templId->templateArgumentCount(); + if (Template *templateSpecialization = referenceClass->enclosingTemplate()) { + const unsigned argumentCountOfInitialization = templId->templateArgumentCount(); + const unsigned argumentCountOfSpecialization + = templateSpecialization->templateParameterCount(); if (_factory->expandTemplates()) { Clone cloner(_control.data()); Subst subst(_control.data()); - for (unsigned i = 0, ei = std::min(argumentCount, templ->templateParameterCount()); i < ei; ++i) { - const TypenameArgument *tParam = templ->templateParameterAt(i)->asTypenameArgument(); + for (unsigned i = 0; i < argumentCountOfSpecialization; ++i) { + const TypenameArgument *tParam + = templateSpecialization->templateParameterAt(i)->asTypenameArgument(); if (!tParam) continue; const Name *name = tParam->name(); if (!name) continue; - const FullySpecifiedType &ty = templId->templateArgumentAt(i); + + FullySpecifiedType ty = (i < argumentCountOfInitialization) ? + templId->templateArgumentAt(i): + cloner.type(tParam->type(), &subst); + subst.bind(cloner.name(name, &subst), ty); } @@ -822,7 +829,9 @@ ClassOrNamespace *ClassOrNamespace::nestedType(const Name *name, ClassOrNamespac Symbol *clone = cloner.symbol(s, &subst); instantiation->_symbols.append(clone); #ifdef DEBUG_LOOKUP - Overview oo;oo.showFunctionSignatures = true;oo.showReturnTypes = true; oo.showTemplateParameters = true; + Overview oo;oo.showFunctionSignatures = true; + oo.showReturnTypes = true; + oo.showTemplateParameters = true; qDebug()<<"cloned"<<oo(clone->type()); #endif // DEBUG_LOOKUP } @@ -832,8 +841,8 @@ ClassOrNamespace *ClassOrNamespace::nestedType(const Name *name, ClassOrNamespac } QHash<const Name*, unsigned> templParams; - for (unsigned i = 0; i < templ->templateParameterCount(); ++i) - templParams.insert(templ->templateParameterAt(i)->name(), i); + for (unsigned i = 0; i < argumentCountOfSpecialization; ++i) + templParams.insert(templateSpecialization->templateParameterAt(i)->name(), i); foreach (const Name *baseName, allBases) { ClassOrNamespace *baseBinding = 0; @@ -843,7 +852,7 @@ ClassOrNamespace *ClassOrNamespace::nestedType(const Name *name, ClassOrNamespac // Ex.: template <class T> class A : public T {}; if (templParams.contains(nameId)) { const unsigned parameterIndex = templParams.value(nameId); - if (parameterIndex < argumentCount) { + if (parameterIndex < argumentCountOfInitialization) { const FullySpecifiedType &fullType = templId->templateArgumentAt(parameterIndex); if (fullType.isValid()) { @@ -855,9 +864,9 @@ ClassOrNamespace *ClassOrNamespace::nestedType(const Name *name, ClassOrNamespac } else { SubstitutionMap map; for (unsigned i = 0; - i < templ->templateParameterCount() && i < argumentCount; + i < argumentCountOfSpecialization && i < argumentCountOfInitialization; ++i) { - map.bind(templ->templateParameterAt(i)->name(), + map.bind(templateSpecialization->templateParameterAt(i)->name(), templId->templateArgumentAt(i)); } SubstitutionEnvironment env; @@ -876,7 +885,7 @@ ClassOrNamespace *ClassOrNamespace::nestedType(const Name *name, ClassOrNamespac ClassOrNamespace *binding = this; if (const Name *qualification = qBaseName->base()) { const TemplateNameId *baseTemplName = qualification->asTemplateNameId(); - if (!baseTemplName || !compareName(baseTemplName, templ->name())) + if (!baseTemplName || !compareName(baseTemplName, templateSpecialization->name())) binding = lookupType(qualification); } baseName = qBaseName->name(); |