From: Fariborz Jahanian Date: Sat, 18 Sep 2010 20:47:25 +0000 (+0000) Subject: Fixes IRgen bug in objc++ reference binding of a X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=dc5ea09c4d0a23b1cd28f763869ef2bcb5dc119a;p=clang Fixes IRgen bug in objc++ reference binding of a getter expression. Fixes // rdar://8437240 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@114299 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGExpr.cpp b/lib/CodeGen/CGExpr.cpp index 924ca3ec4b..9b69297bbe 100644 --- a/lib/CodeGen/CGExpr.cpp +++ b/lib/CodeGen/CGExpr.cpp @@ -196,7 +196,15 @@ EmitExprForReferenceBinding(CodeGenFunction &CGF, const Expr *E, if (E->isLvalue(CGF.getContext()) == Expr::LV_Valid) { // Emit the expression as an lvalue. LValue LV = CGF.EmitLValue(E); - + if (LV.isPropertyRef() || LV.isKVCRef()) { + QualType QT = E->getType(); + RValue RV = + LV.isPropertyRef() ? CGF.EmitLoadOfPropertyRefLValue(LV, QT) + : CGF.EmitLoadOfKVCRefLValue(LV, QT); + assert(RV.isScalar() && "EmitExprForReferenceBinding"); + return RV.getScalarVal(); + } + if (LV.isSimple()) return LV.getAddress(); diff --git a/test/CodeGenObjCXX/property-dot-reference.mm b/test/CodeGenObjCXX/property-dot-reference.mm index 82e89f26ac..0d455c6ca8 100644 --- a/test/CodeGenObjCXX/property-dot-reference.mm +++ b/test/CodeGenObjCXX/property-dot-reference.mm @@ -16,3 +16,23 @@ void GetURL() const; self.node.GetURL(); } // expected-warning {{control reaches end of non-void function}} @end + +// rdar://8437240 +struct X { + int x; +}; + +void f0(const X &parent); +@interface A +- (const X&) target; +@end +void f1(A *a) { +// CHECK: [[PRP:%.*]] = call %struct.X* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend +// CHECK-NEXT:call void @_Z2f0RK1X(%struct.X* [[PRP]]) + f0(a.target); + +// CHECK: [[MSG:%.*]] = call %struct.X* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend +// CHECK-NEXT:call void @_Z2f0RK1X(%struct.X* [[MSG]]) + f0([a target]); +} +