aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2010-09-10 18:56:35 +0000
committerFariborz Jahanian <fjahanian@apple.com>2010-09-10 18:56:35 +0000
commit0339d72d7f853d90088a4d8639fb50810533e791 (patch)
tree33a70fca9b9a1ac74c474261f5e9033624d1bba7
parent3c0a78d2d028cdec935a7902728b0e2cf2b78eb5 (diff)
IRGen fix for using property-dot syntax to pass
reference object to a c++ member function. fixes radar 8409336. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@113602 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/CodeGen/CGExprCXX.cpp10
-rw-r--r--lib/CodeGen/CGObjC.cpp3
-rw-r--r--test/CodeGenObjCXX/property-dot-reference.mm18
3 files changed, 29 insertions, 2 deletions
diff --git a/lib/CodeGen/CGExprCXX.cpp b/lib/CodeGen/CGExprCXX.cpp
index 9a98281771..acdbe06556 100644
--- a/lib/CodeGen/CGExprCXX.cpp
+++ b/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/lib/CodeGen/CGObjC.cpp b/lib/CodeGen/CGObjC.cpp
index 6a6d63df8f..5b0c2630a0 100644
--- a/lib/CodeGen/CGObjC.cpp
+++ b/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/test/CodeGenObjCXX/property-dot-reference.mm b/test/CodeGenObjCXX/property-dot-reference.mm
new file mode 100644
index 0000000000..82e89f26ac
--- /dev/null
+++ b/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