Do not use typo correction that is unaccessible.

This patch fixes PR17019. When doing typo correction, Sema::CorrectTypo uses
correction already seen for the same typo. This causes problems if that
correction is from another scope and cannot be accessed in the current.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@192594 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Serge Pavlov 2013-10-14 14:05:48 +00:00
parent 74ecbd5bab
commit 81e34b1c13
4 changed files with 28 additions and 4 deletions

View File

@ -4167,8 +4167,15 @@ TypoCorrection Sema::CorrectTypo(const DeclarationNameInfo &TypoName,
// keyword case, we'll end up adding the keyword below.
if (Cached->second) {
if (!Cached->second.isKeyword() &&
isCandidateViable(CCC, Cached->second))
Consumer.addCorrection(Cached->second);
isCandidateViable(CCC, Cached->second)) {
// Do not use correction that is unaccessible in the given scope.
NamedDecl* CorrectionDecl = Cached->second.getCorrectionDecl();
DeclarationNameInfo NameInfo(CorrectionDecl->getDeclName(),
CorrectionDecl->getLocation());
LookupResult R(*this, NameInfo, LookupOrdinaryName);
if (LookupName(R, S))
Consumer.addCorrection(Cached->second);
}
} else {
// Only honor no-correction cache hits when a callback that will validate
// correction candidates is not being used.

View File

@ -151,3 +151,20 @@ struct S {
void f() { my_menber = 1; } // expected-error {{use of undeclared identifier 'my_menber'; did you mean 'my_member'?}}
};
}
namespace PR17019 {
template<class F>
struct evil {
evil(F de) { // expected-note {{'de' declared here}}
de_; // expected-error {{use of undeclared identifier 'de_'; did you mean 'de'?}} \
// expected-warning {{expression result unused}}
}
~evil() {
de_->bar() // expected-error {{use of undeclared identifier 'de_'}}
}
};
void meow() {
evil<int> Q(0); // expected-note {{in instantiation of member function}}
}
}

View File

@ -13,7 +13,7 @@
__what; // expected-error {{use of undeclared identifier}} \
// expected-warning {{expression result unused}}
}
@synthesize what; // expected-note 2 {{'what' declared here}}
@synthesize what; // expected-note {{'what' declared here}}
@end
@implementation Bar // expected-warning {{cannot find interface declaration for}}

View File

@ -6,7 +6,7 @@
@interface LaunchdJobs
@property (nonatomic,retain) NSMutableDictionary *uuids_jobs; // expected-note 2 {{'_uuids_jobs' declared here}}
@property (nonatomic,retain) NSMutableDictionary *uuids_jobs; // expected-note {{'_uuids_jobs' declared here}}
@end