From 250b8e4934ae8cfb2bf80617f15c94199fe2624b Mon Sep 17 00:00:00 2001 From: Leandro Melo <leandro.melo@nokia.com> Date: Mon, 27 Aug 2012 09:29:40 +0200 Subject: [PATCH] C++: Fix base template argument/param matching Change-Id: I8c6be9e023a757c43eb4b8669ca8c37239ab579d Reviewed-by: hjk <qthjk@ovi.com> --- src/libs/cplusplus/LookupContext.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp index 5fb0e2e3eca..743e9a0fca1 100644 --- a/src/libs/cplusplus/LookupContext.cpp +++ b/src/libs/cplusplus/LookupContext.cpp @@ -668,6 +668,7 @@ 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(); QHash<const Name*, unsigned> templParams; for (unsigned i = 0; i < templ->templateParameterCount(); ++i) templParams.insert(templ->templateParameterAt(i)->name(), i); @@ -679,15 +680,20 @@ ClassOrNamespace *ClassOrNamespace::nestedType(const Name *name, ClassOrNamespac // This is the simple case in which a template parameter is itself a base. // Ex.: template <class T> class A : public T {}; if (templParams.contains(nameId)) { - const FullySpecifiedType &fullType = - templId->templateArgumentAt(templParams.value(nameId)); - if (NamedType *namedType = fullType.type()->asNamedType()) - baseBinding = lookupType(namedType->name()); + const unsigned parameterIndex = templParams.value(nameId); + if (parameterIndex < argumentCount) { + const FullySpecifiedType &fullType = + templId->templateArgumentAt(parameterIndex); + if (fullType.isValid()) { + if (NamedType *namedType = fullType.type()->asNamedType()) + baseBinding = lookupType(namedType->name()); + } + } } } else { SubstitutionMap map; for (unsigned i = 0; - i < templ->templateParameterCount() && i < templId->templateArgumentCount(); + i < templ->templateParameterCount() && i < argumentCount; ++i) { map.bind(templ->templateParameterAt(i)->name(), templId->templateArgumentAt(i)); -- GitLab