diff options
| author | Serge Pavlov <sepavloff@gmail.com> | 2013-10-14 14:05:48 +0000 | 
|---|---|---|
| committer | Serge Pavlov <sepavloff@gmail.com> | 2013-10-14 14:05:48 +0000 | 
| commit | c0cd80fb20d87440cf6637095a9aaf69a28b01a9 (patch) | |
| tree | 4b24061fd84215b3ee03a390699af8b687ac1adc | |
| parent | 43d90cbd86dc8565ed119a2941a29369a214ea37 (diff) | |
| download | bcm5719-llvm-c0cd80fb20d87440cf6637095a9aaf69a28b01a9.tar.gz bcm5719-llvm-c0cd80fb20d87440cf6637095a9aaf69a28b01a9.zip  | |
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.
llvm-svn: 192594
| -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  | 

