mirror of https://github.com/microsoft/clang.git
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:
parent
74ecbd5bab
commit
81e34b1c13
|
@ -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.
|
||||
|
|
|
@ -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}}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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}}
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in New Issue