r354826 - [CodeGenObjC] Fix a nullptr dyn_cast

Erik Pilkington via cfe-commits cfe-commits at lists.llvm.org
Mon Feb 25 13:35:14 PST 2019


Author: epilk
Date: Mon Feb 25 13:35:14 2019
New Revision: 354826

URL: http://llvm.org/viewvc/llvm-project?rev=354826&view=rev
Log:
[CodeGenObjC] Fix a nullptr dyn_cast

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

Modified:
    cfe/trunk/lib/CodeGen/CGObjC.cpp
    cfe/trunk/test/CodeGenObjC/objc-alloc-init.m

Modified: cfe/trunk/lib/CodeGen/CGObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjC.cpp?rev=354826&r1=354825&r2=354826&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGObjC.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGObjC.cpp Mon Feb 25 13:35:14 2019
@@ -433,8 +433,9 @@ tryEmitSpecializedAllocInit(CodeGenFunct
 
   // 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]'.

Modified: cfe/trunk/test/CodeGenObjC/objc-alloc-init.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjC/objc-alloc-init.m?rev=354826&r1=354825&r2=354826&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenObjC/objc-alloc-init.m (original)
+++ cfe/trunk/test/CodeGenObjC/objc-alloc-init.m Mon Feb 25 13:35:14 2019
@@ -26,3 +26,16 @@ void f() {
   // EITHER: call {{.*}} @objc_msgSend
 }
 @end
+
+// rdar://48247290
+ at interface Base
+-(instancetype)init;
+ at end
+
+ at interface Derived : Base
+ at end
+ at implementation Derived
+-(void)meth {
+  [super init];
+}
+ at end




More information about the cfe-commits mailing list