diff --git a/lib/Sema/TreeTransform.h b/lib/Sema/TreeTransform.h index 8ea0b015e5fbf057d51179ae6187c35e24742512..c53505d10ab13da171c19e9e429e62fc04617dad 100644 --- a/lib/Sema/TreeTransform.h +++ b/lib/Sema/TreeTransform.h @@ -11174,6 +11174,9 @@ TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { } else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass || E->getReceiverKind() == ObjCMessageExpr::SuperInstance) { + if (!E->getMethodDecl()) + return ExprError(); + // Build a new class message send to 'super'. SmallVector<SourceLocation, 16> SelLocs; E->getSelectorLocs(SelLocs); diff --git a/test/SemaObjC/call-super-2.m b/test/SemaObjC/call-super-2.m index 8927f3b528648fa794edcae55e2b038dc27d675f..01acff70c2301257acc13ff2bbc9ef671d997ad6 100644 --- a/test/SemaObjC/call-super-2.m +++ b/test/SemaObjC/call-super-2.m @@ -106,3 +106,18 @@ id objc_getClass(const char *s); } @end +@class C; +@interface A // expected-note {{receiver is instance of class declared here}} +- (instancetype)initWithCoder:(A *)coder; +@end + +@interface B : A +@end + +@implementation B +- (instancetype)initWithCoder:(C *)coder { + if (0 != (self = [super initWithCode:code])) // expected-error {{use of undeclared identifier 'code'}} expected-warning {{instance method '-initWithCode:' not found}} + return (void *)0; + return (void *)0; +} +@end