@@ -460,38 +460,39 @@ tryEmitSpecializedAllocInit(CodeGenFunction &CGF, const ObjCMessageExpr *OME) {
460
460
Sel.getNameForSlot (0 ) != " init" )
461
461
return None;
462
462
463
- // Okay, this is '[receiver init]', check if 'receiver' is '[cls alloc]' or
464
- // we are in an ObjC class method and 'receiver' is '[self alloc]' .
463
+ // Okay, this is '[receiver init]', check if 'receiver' is '[cls alloc]'
464
+ // with 'cls' a Class .
465
465
auto *SubOME =
466
466
dyn_cast<ObjCMessageExpr>(OME->getInstanceReceiver ()->IgnoreParenCasts ());
467
467
if (!SubOME)
468
468
return None;
469
469
Selector SubSel = SubOME->getSelector ();
470
470
471
- // Check if we are in an ObjC class method and the receiver expression is
472
- // 'self'.
473
- const Expr *SelfInClassMethod = nullptr ;
474
- if (const auto *CurMD = dyn_cast_or_null<ObjCMethodDecl>(CGF.CurFuncDecl ))
475
- if (CurMD->isClassMethod ())
476
- if ((SelfInClassMethod = SubOME->getInstanceReceiver ()))
477
- if (!SelfInClassMethod->isObjCSelfExpr ())
478
- SelfInClassMethod = nullptr ;
479
-
480
- if ((SubOME->getReceiverKind () != ObjCMessageExpr::Class &&
481
- !SelfInClassMethod) || !SubOME->getType ()->isObjCObjectPointerType () ||
471
+ if (!SubOME->getType ()->isObjCObjectPointerType () ||
482
472
!SubSel.isUnarySelector () || SubSel.getNameForSlot (0 ) != " alloc" )
483
473
return None;
484
474
485
- llvm::Value *Receiver;
486
- if (SelfInClassMethod) {
487
- Receiver = CGF.EmitScalarExpr (SelfInClassMethod);
488
- } else {
475
+ llvm::Value *Receiver = nullptr ;
476
+ switch (SubOME->getReceiverKind ()) {
477
+ case ObjCMessageExpr::Instance:
478
+ if (!SubOME->getInstanceReceiver ()->getType ()->isObjCClassType ())
479
+ return None;
480
+ Receiver = CGF.EmitScalarExpr (SubOME->getInstanceReceiver ());
481
+ break ;
482
+
483
+ case ObjCMessageExpr::Class: {
489
484
QualType ReceiverType = SubOME->getClassReceiver ();
490
485
const ObjCObjectType *ObjTy = ReceiverType->getAs <ObjCObjectType>();
491
486
const ObjCInterfaceDecl *ID = ObjTy->getInterface ();
492
487
assert (ID && " null interface should be impossible here" );
493
488
Receiver = CGF.CGM .getObjCRuntime ().GetClass (CGF, ID);
489
+ break ;
490
+ }
491
+ case ObjCMessageExpr::SuperInstance:
492
+ case ObjCMessageExpr::SuperClass:
493
+ return None;
494
494
}
495
+
495
496
return CGF.EmitObjCAllocInit (Receiver, CGF.ConvertType (OME->getType ()));
496
497
}
497
498
@@ -539,10 +540,7 @@ RValue CodeGenFunction::EmitObjCMessageExpr(const ObjCMessageExpr *E,
539
540
switch (E->getReceiverKind ()) {
540
541
case ObjCMessageExpr::Instance:
541
542
ReceiverType = E->getInstanceReceiver ()->getType ();
542
- if (auto *OMD = dyn_cast_or_null<ObjCMethodDecl>(CurFuncDecl))
543
- if (OMD->isClassMethod ())
544
- if (E->getInstanceReceiver ()->isObjCSelfExpr ())
545
- isClassMessage = true ;
543
+ isClassMessage = ReceiverType->isObjCClassType ();
546
544
if (retainSelf) {
547
545
TryEmitResult ter = tryEmitARCRetainScalarExpr (*this ,
548
546
E->getInstanceReceiver ());
0 commit comments