forked from OSchip/llvm-project
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:
parent
e26fffc597
commit
f93ac89414
|
@ -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()) {
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue