forked from OSchip/llvm-project
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:
parent
d31aaf109e
commit
0e35355c04
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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'{{$}}}}
|
||||
|
|
Loading…
Reference in New Issue