mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-26 06:36:07 +00:00
Fix IRGen when property-dot syntax used to access
a c++ class object 'ivar'. Fixes radar 8366604. llvm-svn: 112729
This commit is contained in:
parent
df6b67bf85
commit
61a312413c
@ -1753,9 +1753,11 @@ LValue CodeGenFunction::EmitCastLValue(const CastExpr *E) {
|
||||
if (E->getSubExpr()->Classify(getContext()).getKind()
|
||||
!= Expr::Classification::CL_PRValue) {
|
||||
LValue LV = EmitLValue(E->getSubExpr());
|
||||
if (LV.isPropertyRef()) {
|
||||
if (LV.isPropertyRef() || LV.isKVCRef()) {
|
||||
QualType QT = E->getSubExpr()->getType();
|
||||
RValue RV = EmitLoadOfPropertyRefLValue(LV, QT);
|
||||
RValue RV =
|
||||
LV.isPropertyRef() ? EmitLoadOfPropertyRefLValue(LV, QT)
|
||||
: EmitLoadOfKVCRefLValue(LV, QT);
|
||||
assert(!RV.isScalar() && "EmitCastLValue-scalar cast of property ref");
|
||||
llvm::Value *V = RV.getAggregateAddr();
|
||||
return MakeAddrLValue(V, QT);
|
||||
@ -1810,8 +1812,11 @@ LValue CodeGenFunction::EmitCastLValue(const CastExpr *E) {
|
||||
|
||||
LValue LV = EmitLValue(E->getSubExpr());
|
||||
llvm::Value *This;
|
||||
if (LV.isPropertyRef()) {
|
||||
RValue RV = EmitLoadOfPropertyRefLValue(LV, E->getSubExpr()->getType());
|
||||
if (LV.isPropertyRef() || LV.isKVCRef()) {
|
||||
QualType QT = E->getSubExpr()->getType();
|
||||
RValue RV =
|
||||
LV.isPropertyRef() ? EmitLoadOfPropertyRefLValue(LV, QT)
|
||||
: EmitLoadOfKVCRefLValue(LV, QT);
|
||||
assert (!RV.isScalar() && "EmitCastLValue");
|
||||
This = RV.getAggregateAddr();
|
||||
}
|
||||
|
@ -203,11 +203,17 @@ CodeGenFunction::EmitCXXOperatorMemberCallExpr(const CXXOperatorCallExpr *E,
|
||||
"EmitCXXOperatorMemberCallExpr - user declared copy assignment");
|
||||
LValue LV = EmitLValue(E->getArg(0));
|
||||
llvm::Value *This;
|
||||
if (LV.isPropertyRef()) {
|
||||
if (LV.isPropertyRef() || LV.isKVCRef()) {
|
||||
llvm::Value *AggLoc = CreateMemTemp(E->getArg(1)->getType());
|
||||
EmitAggExpr(E->getArg(1), AggLoc, false /*VolatileDest*/);
|
||||
EmitObjCPropertySet(LV.getPropertyRefExpr(),
|
||||
RValue::getAggregate(AggLoc, false /*VolatileDest*/));
|
||||
if (LV.isPropertyRef())
|
||||
EmitObjCPropertySet(LV.getPropertyRefExpr(),
|
||||
RValue::getAggregate(AggLoc,
|
||||
false /*VolatileDest*/));
|
||||
else
|
||||
EmitObjCPropertySet(LV.getKVCRefExpr(),
|
||||
RValue::getAggregate(AggLoc,
|
||||
false /*VolatileDest*/));
|
||||
return RValue::getAggregate(0, false);
|
||||
}
|
||||
else
|
||||
@ -226,8 +232,11 @@ CodeGenFunction::EmitCXXOperatorMemberCallExpr(const CXXOperatorCallExpr *E,
|
||||
FPT->isVariadic());
|
||||
LValue LV = EmitLValue(E->getArg(0));
|
||||
llvm::Value *This;
|
||||
if (LV.isPropertyRef()) {
|
||||
RValue RV = EmitLoadOfPropertyRefLValue(LV, E->getArg(0)->getType());
|
||||
if (LV.isPropertyRef() || LV.isKVCRef()) {
|
||||
QualType QT = E->getArg(0)->getType();
|
||||
RValue RV =
|
||||
LV.isPropertyRef() ? EmitLoadOfPropertyRefLValue(LV, QT)
|
||||
: EmitLoadOfKVCRefLValue(LV, QT);
|
||||
assert (!RV.isScalar() && "EmitCXXOperatorMemberCallExpr");
|
||||
This = RV.getAggregateAddr();
|
||||
}
|
||||
|
@ -25,6 +25,8 @@ struct CGRect {
|
||||
- (void)setFrame:(CGRect)frameRect;
|
||||
- (CGRect)frame;
|
||||
- (void) initWithOwner;
|
||||
- (struct CGRect)extent;
|
||||
- (void)dealloc;
|
||||
@end
|
||||
|
||||
@implementation I
|
||||
@ -40,6 +42,12 @@ struct CGRect {
|
||||
labelLayerFrame = self.bounds;
|
||||
_labelLayer.frame = labelLayerFrame;
|
||||
}
|
||||
// rdar://8366604
|
||||
- (void)dealloc
|
||||
{
|
||||
CGRect cgrect = self.extent;
|
||||
}
|
||||
- (struct CGRect)extent {return bounds;}
|
||||
@end
|
||||
|
||||
int main() {
|
||||
|
Loading…
x
Reference in New Issue
Block a user