diff options
-rw-r--r-- | clang/lib/Sema/TreeTransform.h | 3 | ||||
-rw-r--r-- | clang/test/SemaObjC/call-super-2.m | 15 |
2 files changed, 18 insertions, 0 deletions
diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index 8ea0b015e5f..c53505d10ab 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/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/clang/test/SemaObjC/call-super-2.m b/clang/test/SemaObjC/call-super-2.m index 8927f3b5286..01acff70c23 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 |