forked from OSchip/llvm-project
Plug an abstraction leak and fix a crasher in DiagnoseInvalidRedeclaration
llvm-svn: 139718
This commit is contained in:
parent
e9d80bbc1d
commit
7fbe2f78d7
|
@ -118,7 +118,9 @@ public:
|
|||
}
|
||||
|
||||
typedef llvm::SmallVector<NamedDecl*, 1>::iterator decl_iterator;
|
||||
decl_iterator begin() { return CorrectionDecls.begin(); }
|
||||
decl_iterator begin() {
|
||||
return isKeyword() ? CorrectionDecls.end() : CorrectionDecls.begin();
|
||||
}
|
||||
decl_iterator end() { return CorrectionDecls.end(); }
|
||||
|
||||
private:
|
||||
|
|
|
@ -4284,8 +4284,6 @@ static void DiagnoseInvalidRedeclaration(Sema &S, FunctionDecl *NewFD,
|
|||
} else if ((Correction = S.CorrectTypo(Prev.getLookupNameInfo(),
|
||||
Prev.getLookupKind(), 0, 0, DC)) &&
|
||||
Correction.getCorrection() != Name) {
|
||||
DiagMsg = isFriendDecl ? diag::err_no_matching_local_friend_suggest
|
||||
: diag::err_member_def_does_not_match_suggest;
|
||||
for (TypoCorrection::decl_iterator CDecl = Correction.begin(),
|
||||
CDeclEnd = Correction.end();
|
||||
CDecl != CDeclEnd; ++CDecl) {
|
||||
|
@ -4299,8 +4297,15 @@ static void DiagnoseInvalidRedeclaration(Sema &S, FunctionDecl *NewFD,
|
|||
NearMatches.push_back(std::make_pair(FD, ParamNum));
|
||||
}
|
||||
}
|
||||
if (!NearMatches.empty())
|
||||
DiagMsg = isFriendDecl ? diag::err_no_matching_local_friend_suggest
|
||||
: diag::err_member_def_does_not_match_suggest;
|
||||
}
|
||||
|
||||
// Ignore the correction if it didn't yield any close FunctionDecl matches
|
||||
if (Correction && NearMatches.empty())
|
||||
Correction = TypoCorrection();
|
||||
|
||||
if (Correction)
|
||||
S.Diag(NewFD->getLocation(), DiagMsg)
|
||||
<< Name << DC << Correction.getQuoted(S.getLangOptions())
|
||||
|
|
|
@ -70,3 +70,12 @@ using test1::Foo;
|
|||
void Bar::f(Foo::Inner foo) { // expected-error {{out-of-line definition of 'f' does not match any declaration in 'Bar'}}
|
||||
(void)foo;
|
||||
}
|
||||
|
||||
class Crash {
|
||||
public:
|
||||
void GetCart(int count) const;
|
||||
};
|
||||
// This out-of-line definition was fine...
|
||||
void Crash::cart(int count) const {} // expected-error {{out-of-line definition of 'cart' does not match any declaration in 'Crash'}}
|
||||
// ...while this one crashed clang
|
||||
void Crash::chart(int count) const {} // expected-error {{out-of-line definition of 'chart' does not match any declaration in 'Crash'}}
|
||||
|
|
Loading…
Reference in New Issue