diff options
| -rw-r--r-- | clang/lib/CodeGen/CGExpr.cpp | 10 | ||||
| -rw-r--r-- | clang/test/CodeGenObjCXX/property-dot-reference.mm | 20 | 
2 files changed, 29 insertions, 1 deletions
| diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index 924ca3ec4bb..9b69297bbed 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/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/clang/test/CodeGenObjCXX/property-dot-reference.mm b/clang/test/CodeGenObjCXX/property-dot-reference.mm index 82e89f26acf..0d455c6ca81 100644 --- a/clang/test/CodeGenObjCXX/property-dot-reference.mm +++ b/clang/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]); +} + | 

