From 765a2194314279fb4941a46c893c162033b0932d Mon Sep 17 00:00:00 2001 From: Saleem Abdulrasool Date: Thu, 17 Nov 2016 17:10:54 +0000 Subject: [PATCH] Sema: correct typo correction for ivars in @implementation The previous typo correction handling assumed that ivars are only declared in the interface declaration rather than as a private ivar in the implementation. Adjust the handling to permit both interfaces. Assert earlier that the interface has been acquired to ensure that we can identify when both possible casts have failed. Addresses PR31040! llvm-svn: 287238 --- clang/lib/Sema/SemaExprMember.cpp | 13 ++++++++++--- clang/test/SemaObjC/typo-correction.m | 25 ++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/clang/lib/Sema/SemaExprMember.cpp b/clang/lib/Sema/SemaExprMember.cpp index 26f52bc..1cc76ba 100644 --- a/clang/lib/Sema/SemaExprMember.cpp +++ b/clang/lib/Sema/SemaExprMember.cpp @@ -1394,10 +1394,17 @@ static ExprResult LookupMemberExpr(Sema &S, LookupResult &R, // Figure out the class that declares the ivar. assert(!ClassDeclared); + Decl *D = cast(IV->getDeclContext()); - if (ObjCCategoryDecl *CAT = dyn_cast(D)) - D = CAT->getClassInterface(); - ClassDeclared = cast(D); + if (auto *Category = dyn_cast(D)) + D = Category->getClassInterface(); + + if (auto *Implementation = dyn_cast(D)) + ClassDeclared = Implementation->getClassInterface(); + else if (auto *Interface = dyn_cast(D)) + ClassDeclared = Interface; + + assert(ClassDeclared && "cannot query interface"); } else { if (IsArrow && IDecl->FindPropertyDeclaration( diff --git a/clang/test/SemaObjC/typo-correction.m b/clang/test/SemaObjC/typo-correction.m index 58824e2..f19ec1a 100644 --- a/clang/test/SemaObjC/typo-correction.m +++ b/clang/test/SemaObjC/typo-correction.m @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 %s -verify -fsyntax-only +// RUN: %clang_cc1 %s -verify -fsyntax-only -fobjc-runtime=ios @protocol P -(id)description; @@ -28,3 +28,26 @@ typedef int super1; [self foo:[super description] other:someivar]; // expected-error {{use of undeclared identifier 'someivar'; did you mean '_someivar'?}} } @end + +__attribute__ (( __objc_root_class__ )) +@interface I { + id _interface; // expected-note {{'_interface' declared here}} +} +-(void)method; +@end + +@interface I () { + id _extension; // expected-note {{'_extension' declared here}} +} +@end + +@implementation I { + id _implementation; // expected-note {{'_implementation' declared here}} +} +-(void)method { + (void)self->implementation; // expected-error {{'I' does not have a member named 'implementation'; did you mean '_implementation'?}} + (void)self->interface; // expected-error {{'I' does not have a member named 'interface'; did you mean '_interface'?}} + (void)self->extension; // expected-error {{'I' does not have a member named 'extension'; did you mean '_extension'?}} +} +@end + -- 2.7.4