// 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(
-// RUN: %clang_cc1 %s -verify -fsyntax-only
+// RUN: %clang_cc1 %s -verify -fsyntax-only -fobjc-runtime=ios
@protocol P
-(id)description;
[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
+