diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index 8ea0b015e5fb..c53505d10ab1 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -11174,6 +11174,9 @@ TreeTransform::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 SelLocs; E->getSelectorLocs(SelLocs); diff --git a/clang/test/SemaObjC/call-super-2.m b/clang/test/SemaObjC/call-super-2.m index 8927f3b52864..01acff70c230 100644 --- a/clang/test/SemaObjC/call-super-2.m +++ b/clang/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