diff options
-rw-r--r-- | clang/lib/Sema/SemaExprMember.cpp | 13 | ||||
-rw-r--r-- | 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 26f52bcd773..1cc76babe08 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<Decl>(IV->getDeclContext()); - if (ObjCCategoryDecl *CAT = dyn_cast<ObjCCategoryDecl>(D)) - D = CAT->getClassInterface(); - ClassDeclared = cast<ObjCInterfaceDecl>(D); + if (auto *Category = dyn_cast<ObjCCategoryDecl>(D)) + D = Category->getClassInterface(); + + if (auto *Implementation = dyn_cast<ObjCImplementationDecl>(D)) + ClassDeclared = Implementation->getClassInterface(); + else if (auto *Interface = dyn_cast<ObjCInterfaceDecl>(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 58824e2edbf..f19ec1a1fa3 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 + |