IRGen fix for using property-dot syntax to pass

reference object to a c++ member function.
fixes radar 8409336.

llvm-svn: 113602
This commit is contained in:
Fariborz Jahanian 2010-09-10 18:56:35 +00:00
parent e26fffc597
commit f93ac89414
3 changed files with 29 additions and 2 deletions

View 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()) {

View 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());
}

View File

@ -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