PR18685: Ignore class template specializations as potential

nested-name-specifiers for typos unless the typo already has
a nested-name-specifier that is a template specialization.

llvm-svn: 201056
This commit is contained in:
Kaelyn Uhrain 2014-02-09 21:47:04 +00:00
parent d31aaf109e
commit 0e35355c04
2 changed files with 23 additions and 0 deletions

View File

@ -4210,6 +4210,12 @@ TypoCorrection Sema::CorrectTypo(const DeclarationNameInfo &TypoName,
KNI != KNIEnd; ++KNI)
Namespaces.AddNameSpecifier(KNI->first);
bool SSIsTemplate = false;
if (NestedNameSpecifier *NNS =
(SS && SS->isValid()) ? SS->getScopeRep() : 0) {
if (const Type *T = NNS->getAsType())
SSIsTemplate = T->getTypeClass() == Type::TemplateSpecialization;
}
for (ASTContext::type_iterator TI = Context.types_begin(),
TIEnd = Context.types_end();
TI != TIEnd; ++TI) {
@ -4217,6 +4223,7 @@ TypoCorrection Sema::CorrectTypo(const DeclarationNameInfo &TypoName,
CD = CD->getCanonicalDecl();
if (!CD->isDependentType() && !CD->isAnonymousStructOrUnion() &&
!CD->isUnion() && CD->getIdentifier() &&
(SSIsTemplate || !isa<ClassTemplateSpecializationDecl>(CD)) &&
(CD->isBeingDefined() || CD->isCompleteDefinition()))
Namespaces.AddNameSpecifier(CD);
}

View File

@ -207,3 +207,19 @@ struct {
int y = x; // expected-error-re {{use of undeclared identifier 'x'{{$}}}}
}
namespace PR18685 {
template <class C, int I, int J>
class SetVector {
public:
SetVector() {}
};
template <class C, int I>
class SmallSetVector : public SetVector<C, I, 8> {};
class foo {};
SmallSetVector<foo*, 2> fooSet;
}
PR18685::BitVector Map; // expected-error-re {{no type named 'BitVector' in namespace 'PR18685'{{$}}}}