]> granicus.if.org Git - clang/commitdiff
[CodeGenObjC] Fix a nullptr dyn_cast
authorErik Pilkington <erik.pilkington@gmail.com>
Mon, 25 Feb 2019 21:35:14 +0000 (21:35 +0000)
committerErik Pilkington <erik.pilkington@gmail.com>
Mon, 25 Feb 2019 21:35:14 +0000 (21:35 +0000)
ObjCMessageExpr::getInstanceReceiver returns nullptr if the receiver
is 'super'. Make this check more strict, since we don't care about
messages to super here.

rdar://48247290

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@354826 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGObjC.cpp
test/CodeGenObjC/objc-alloc-init.m

index 1b3e71b436b151f024ede6462ae1e2c6b6209453..fba1a531a2aac44766d0cd4743a35556d1d35a18 100644 (file)
@@ -433,8 +433,9 @@ tryEmitSpecializedAllocInit(CodeGenFunction &CGF, const ObjCMessageExpr *OME) {
 
   // Match the exact pattern '[[MyClass alloc] init]'.
   Selector Sel = OME->getSelector();
-  if (!OME->isInstanceMessage() || !OME->getType()->isObjCObjectPointerType() ||
-      !Sel.isUnarySelector() || Sel.getNameForSlot(0) != "init")
+  if (OME->getReceiverKind() != ObjCMessageExpr::Instance ||
+      !OME->getType()->isObjCObjectPointerType() || !Sel.isUnarySelector() ||
+      Sel.getNameForSlot(0) != "init")
     return None;
 
   // Okay, this is '[receiver init]', check if 'receiver' is '[cls alloc]'.
index e56303c7fef13246e5e1ffb3cc538ad54351c6a5..a55a9835c8add51a920a8c35709d99b051f17148 100644 (file)
@@ -26,3 +26,16 @@ void f() {
   // EITHER: call {{.*}} @objc_msgSend
 }
 @end
+
+// rdar://48247290
+@interface Base
+-(instancetype)init;
+@end
+
+@interface Derived : Base
+@end
+@implementation Derived
+-(void)meth {
+  [super init];
+}
+@end