diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp index 5fb0e2e3eca01f12c3c6ebb808171378b9698415..743e9a0fca1b711ace0e57a7be5495ce6d646228 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));