diff options
author | Kaelyn Uhrain <rikka@google.com> | 2014-02-13 20:14:07 +0000 |
---|---|---|
committer | Kaelyn Uhrain <rikka@google.com> | 2014-02-13 20:14:07 +0000 |
commit | 67b44c9871684ed4c78eb12b62b6b86fa2e13fad (patch) | |
tree | bc1cb5c11df843e9bd802553f9a3cf17e80952f6 /clang/lib/Sema/SemaDecl.cpp | |
parent | b1b5007c521bf6591941fd047d16868e4fdea975 (diff) | |
download | bcm5719-llvm-67b44c9871684ed4c78eb12b62b6b86fa2e13fad.tar.gz bcm5719-llvm-67b44c9871684ed4c78eb12b62b6b86fa2e13fad.zip |
Enable correcting a member declaration where the type is class template,
and the class name is shadowed by another member. Recovery still needs
to be figured out, which is non-trivial since the parser has already gone
down a much different path than if it had recognized the class template
as type instead of seeing the member that shadowed the class template.
llvm-svn: 201360
Diffstat (limited to 'clang/lib/Sema/SemaDecl.cpp')
-rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 17e0f38e07d..72210757f34 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -62,24 +62,29 @@ namespace { class TypeNameValidatorCCC : public CorrectionCandidateCallback { public: - TypeNameValidatorCCC(bool AllowInvalid, bool WantClass=false) - : AllowInvalidDecl(AllowInvalid), WantClassName(WantClass) { + TypeNameValidatorCCC(bool AllowInvalid, bool WantClass=false, + bool AllowTemplates=false) + : AllowInvalidDecl(AllowInvalid), WantClassName(WantClass), + AllowClassTemplates(AllowTemplates) { WantExpressionKeywords = false; WantCXXNamedCasts = false; WantRemainingKeywords = false; } virtual bool ValidateCandidate(const TypoCorrection &candidate) { - if (NamedDecl *ND = candidate.getCorrectionDecl()) - return (isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND)) && - (AllowInvalidDecl || !ND->isInvalidDecl()); - else - return !WantClassName && candidate.isKeyword(); + if (NamedDecl *ND = candidate.getCorrectionDecl()) { + bool IsType = isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND); + bool AllowedTemplate = AllowClassTemplates && isa<ClassTemplateDecl>(ND); + return (IsType || AllowedTemplate) && + (AllowInvalidDecl || !ND->isInvalidDecl()); + } + return !WantClassName && candidate.isKeyword(); } private: bool AllowInvalidDecl; bool WantClassName; + bool AllowClassTemplates; }; } @@ -394,13 +399,14 @@ bool Sema::DiagnoseUnknownTypeName(IdentifierInfo *&II, SourceLocation IILoc, Scope *S, CXXScopeSpec *SS, - ParsedType &SuggestedType) { + ParsedType &SuggestedType, + bool AllowClassTemplates) { // We don't have anything to suggest (yet). SuggestedType = ParsedType(); // There may have been a typo in the name of the type. Look up typo // results, in case we have something that we can suggest. - TypeNameValidatorCCC Validator(false); + TypeNameValidatorCCC Validator(false, false, AllowClassTemplates); if (TypoCorrection Corrected = CorrectTypo(DeclarationNameInfo(II, IILoc), LookupOrdinaryName, S, SS, Validator)) { |