mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-01-08 09:03:18 +00:00
Fixes a code gen bug for setter code for a property of
c++ object reference type with trivial copy constructor. This causes an assert crash and bad code gen. when assert is off. // rdar://6137845 llvm-svn: 147573
This commit is contained in:
parent
d2a8fe187d
commit
088f1bc295
@ -752,7 +752,8 @@ static void emitStructSetterCall(CodeGenFunction &CGF, ObjCMethodDecl *OMD,
|
||||
|
||||
// The second argument is the address of the parameter variable.
|
||||
ParmVarDecl *argVar = *OMD->param_begin();
|
||||
DeclRefExpr argRef(argVar, argVar->getType(), VK_LValue, SourceLocation());
|
||||
DeclRefExpr argRef(argVar, argVar->getType().getNonReferenceType(),
|
||||
VK_LValue, SourceLocation());
|
||||
llvm::Value *argAddr = CGF.EmitLValue(&argRef).getAddress();
|
||||
argAddr = CGF.Builder.CreateBitCast(argAddr, CGF.Int8PtrTy);
|
||||
args.add(RValue::get(argAddr), CGF.getContext().VoidPtrTy);
|
||||
|
31
clang/test/CodeGenObjCXX/property-object-reference-1.mm
Normal file
31
clang/test/CodeGenObjCXX/property-object-reference-1.mm
Normal file
@ -0,0 +1,31 @@
|
||||
// RUN: %clang_cc1 -x objective-c++ %s -triple x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s
|
||||
// rdar://6137845
|
||||
|
||||
struct TCPPObject
|
||||
{
|
||||
TCPPObject(const TCPPObject& inObj);
|
||||
TCPPObject();
|
||||
~TCPPObject();
|
||||
int filler[64];
|
||||
};
|
||||
|
||||
|
||||
@interface MyDocument
|
||||
{
|
||||
@private
|
||||
TCPPObject _cppObject;
|
||||
}
|
||||
@property (atomic, assign, readwrite) const TCPPObject& cppObject;
|
||||
@end
|
||||
|
||||
@implementation MyDocument
|
||||
|
||||
@synthesize cppObject = _cppObject;
|
||||
|
||||
@end
|
||||
|
||||
// CHECK: [[cppObjectaddr:%.*]] = alloca %struct.TCPPObject*, align 8
|
||||
// CHECK: store %struct.TCPPObject* [[cppObject:%.*]], %struct.TCPPObject** [[cppObjectaddr]], align 8
|
||||
// CHECK: [[THREE:%.*]] = load %struct.TCPPObject** [[cppObjectaddr]], align 8
|
||||
// CHECK: [[FOUR:%.*]] = bitcast %struct.TCPPObject* [[THREE]] to i8*
|
||||
// CHECK: call void @objc_copyStruct(i8* [[TWO:%.*]], i8* [[FOUR]], i64 256, i1 zeroext true, i1 zeroext false)
|
Loading…
Reference in New Issue
Block a user