diff options
| -rw-r--r-- | clang/lib/Sema/SemaLookup.cpp | 11 | ||||
| -rw-r--r-- | clang/test/SemaCXX/typo-correction-pt2.cpp | 17 | ||||
| -rw-r--r-- | clang/test/SemaObjC/bad-property-synthesis-crash.m | 2 | ||||
| -rw-r--r-- | clang/test/SemaObjC/error-outof-scope-property-use.m | 2 |
4 files changed, 28 insertions, 4 deletions
diff --git a/clang/lib/Sema/SemaLookup.cpp b/clang/lib/Sema/SemaLookup.cpp index 2b80b977281..6ffb7877687 100644 --- a/clang/lib/Sema/SemaLookup.cpp +++ b/clang/lib/Sema/SemaLookup.cpp @@ -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. diff --git a/clang/test/SemaCXX/typo-correction-pt2.cpp b/clang/test/SemaCXX/typo-correction-pt2.cpp index f360649cccd..d22a8e92e0d 100644 --- a/clang/test/SemaCXX/typo-correction-pt2.cpp +++ b/clang/test/SemaCXX/typo-correction-pt2.cpp @@ -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}} + } +} diff --git a/clang/test/SemaObjC/bad-property-synthesis-crash.m b/clang/test/SemaObjC/bad-property-synthesis-crash.m index ea4e0045dc4..94c680489d9 100644 --- a/clang/test/SemaObjC/bad-property-synthesis-crash.m +++ b/clang/test/SemaObjC/bad-property-synthesis-crash.m @@ -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}} diff --git a/clang/test/SemaObjC/error-outof-scope-property-use.m b/clang/test/SemaObjC/error-outof-scope-property-use.m index 8767dc0b856..c480e2df0b7 100644 --- a/clang/test/SemaObjC/error-outof-scope-property-use.m +++ b/clang/test/SemaObjC/error-outof-scope-property-use.m @@ -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 |

