]> granicus.if.org Git - clang/commitdiff
IRGen fix for using property-dot syntax to pass
authorFariborz Jahanian <fjahanian@apple.com>
Fri, 10 Sep 2010 18:56:35 +0000 (18:56 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Fri, 10 Sep 2010 18:56:35 +0000 (18:56 +0000)
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

lib/CodeGen/CGExprCXX.cpp
lib/CodeGen/CGObjC.cpp
test/CodeGenObjCXX/property-dot-reference.mm [new file with mode: 0644]

index 9a98281771fa15b5e9da4fb7b9f01c656c6e23c3..acdbe06556140d6fa0294b7ef2d5310842fa50e7 100644 (file)
@@ -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()) {
index 6a6d63df8f52aecc2d5a22975f8968a8b90248f1..5b0c2630a081b71ed33f3e994e9b9855094edb3a 100644 (file)
@@ -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 (file)
index 0000000..82e89f2
--- /dev/null
@@ -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