forked from OSchip/llvm-project
Fix API gen for objc_msgSend property of aggregate types
in Objective-c++ mode. Fixes radar 7986354. llvm-svn: 103887
This commit is contained in:
parent
932ce81fe9
commit
e1b45a5e6b
|
@ -264,9 +264,11 @@ CodeGenFunction::EmitCXXOperatorMemberCallExpr(const CXXOperatorCallExpr *E,
|
|||
LValue LV = EmitLValue(E->getArg(0));
|
||||
llvm::Value *This;
|
||||
if (LV.isPropertyRef()) {
|
||||
RValue RV = EmitLoadOfPropertyRefLValue(LV, E->getArg(0)->getType());
|
||||
assert (!RV.isScalar() && "EmitCXXOperatorMemberCallExpr");
|
||||
This = RV.getAggregateAddr();
|
||||
llvm::Value *AggLoc = CreateMemTemp(E->getArg(0)->getType());
|
||||
EmitAggExpr(E->getArg(1), AggLoc, false /*VolatileDest*/);
|
||||
EmitObjCPropertySet(LV.getPropertyRefExpr(),
|
||||
RValue::getAggregate(AggLoc, false /*VolatileDest*/));
|
||||
return RValue::getAggregate(0, false);
|
||||
}
|
||||
else
|
||||
This = LV.getAddress();
|
||||
|
@ -285,9 +287,11 @@ CodeGenFunction::EmitCXXOperatorMemberCallExpr(const CXXOperatorCallExpr *E,
|
|||
LValue LV = EmitLValue(E->getArg(0));
|
||||
llvm::Value *This;
|
||||
if (LV.isPropertyRef()) {
|
||||
RValue RV = EmitLoadOfPropertyRefLValue(LV, E->getArg(0)->getType());
|
||||
assert (!RV.isScalar() && "EmitCXXOperatorMemberCallExpr");
|
||||
This = RV.getAggregateAddr();
|
||||
llvm::Value *AggLoc = CreateMemTemp(E->getArg(0)->getType());
|
||||
EmitAggExpr(E->getArg(1), AggLoc, false /*VolatileDest*/);
|
||||
EmitObjCPropertySet(LV.getPropertyRefExpr(),
|
||||
RValue::getAggregate(AggLoc, false /*VolatileDest*/));
|
||||
return RValue::getAggregate(0, false);
|
||||
}
|
||||
else
|
||||
This = LV.getAddress();
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s
|
||||
// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -fobjc-nonfragile-abi -emit-llvm -o - | FileCheck %s
|
||||
// CHECK-NOT: callq _objc_msgSend_stret
|
||||
// CHECK: call void @_ZN1SC1ERKS_
|
||||
// CHECK: call %class.S* @_ZN1SaSERKS_
|
||||
// CHECK: call %class.S* @_ZN6CGRectaSERKS_
|
||||
|
@ -20,15 +21,24 @@ struct CGRect {
|
|||
}
|
||||
@property(assign, nonatomic) S position;
|
||||
@property CGRect bounds;
|
||||
@property CGRect frame;
|
||||
- (void)setFrame:(CGRect)frameRect;
|
||||
- (CGRect)frame;
|
||||
- (void) initWithOwner;
|
||||
@end
|
||||
|
||||
@implementation I
|
||||
@synthesize position;
|
||||
@synthesize bounds;
|
||||
@synthesize frame;
|
||||
- (void)setFrame:(CGRect)frameRect {}
|
||||
- (CGRect)frame {return bounds;}
|
||||
|
||||
- (void)initWithOwner {
|
||||
I* _labelLayer;
|
||||
CGRect labelLayerFrame = self.bounds;
|
||||
labelLayerFrame = self.bounds;
|
||||
_labelLayer.frame = labelLayerFrame;
|
||||
}
|
||||
@end
|
||||
|
||||
|
|
Loading…
Reference in New Issue