From f93ac894147ea2752897ed58317fcd822f46ff6e Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Fri, 10 Sep 2010 18:56:35 +0000 Subject: [PATCH] IRGen fix for using property-dot syntax to pass reference object to a c++ member function. fixes radar 8409336. llvm-svn: 113602 --- clang/lib/CodeGen/CGExprCXX.cpp | 10 +++++++++- clang/lib/CodeGen/CGObjC.cpp | 3 ++- .../CodeGenObjCXX/property-dot-reference.mm | 18 ++++++++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 clang/test/CodeGenObjCXX/property-dot-reference.mm diff --git a/clang/lib/CodeGen/CGExprCXX.cpp b/clang/lib/CodeGen/CGExprCXX.cpp index 9a98281771fa..acdbe0655614 100644 --- a/clang/lib/CodeGen/CGExprCXX.cpp +++ b/clang/lib/CodeGen/CGExprCXX.cpp @@ -100,7 +100,15 @@ RValue CodeGenFunction::EmitCXXMemberCallExpr(const CXXMemberCallExpr *CE, This = EmitScalarExpr(ME->getBase()); else { LValue BaseLV = EmitLValue(ME->getBase()); - This = BaseLV.getAddress(); + if (BaseLV.isPropertyRef() || BaseLV.isKVCRef()) { + QualType QT = ME->getBase()->getType(); + RValue RV = + BaseLV.isPropertyRef() ? EmitLoadOfPropertyRefLValue(BaseLV, QT) + : EmitLoadOfKVCRefLValue(BaseLV, QT); + This = RV.isScalar() ? RV.getScalarVal() : RV.getAggregateAddr(); + } + else + This = BaseLV.getAddress(); } if (MD->isTrivial()) { diff --git a/clang/lib/CodeGen/CGObjC.cpp b/clang/lib/CodeGen/CGObjC.cpp index 6a6d63df8f52..5b0c2630a081 100644 --- a/clang/lib/CodeGen/CGObjC.cpp +++ b/clang/lib/CodeGen/CGObjC.cpp @@ -555,7 +555,8 @@ RValue CodeGenFunction::EmitObjCPropertyGet(const Expr *Exp, else Receiver = EmitScalarExpr(KE->getBase()); return CGM.getObjCRuntime(). - GenerateMessageSend(*this, Return, Exp->getType(), S, + GenerateMessageSend(*this, Return, + KE->getGetterMethod()->getResultType(), S, Receiver, CallArgList(), KE->getInterfaceDecl()); } diff --git a/clang/test/CodeGenObjCXX/property-dot-reference.mm b/clang/test/CodeGenObjCXX/property-dot-reference.mm new file mode 100644 index 000000000000..82e89f26acf4 --- /dev/null +++ b/clang/test/CodeGenObjCXX/property-dot-reference.mm @@ -0,0 +1,18 @@ +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -fobjc-nonfragile-abi -fexceptions -o - %s | FileCheck %s +// rdar://8409336 + +struct TFENode { +void GetURL() const; +}; + +@interface TNodeIconAndNameCell +- (const TFENode&) node; +@end + +@implementation TNodeIconAndNameCell +- (const TFENode&) node { +// CHECK: call %struct.TFENode* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend +// CHECK-NEXT: call void @_ZNK7TFENode6GetURLEv(%struct.TFENode* %{{.*}}) + self.node.GetURL(); +} // expected-warning {{control reaches end of non-void function}} +@end