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