1*67e74705SXin Li// RUN: %clang_cc1 %s -triple x86_64-apple-darwin10 -fobjc-runtime=macosx-10.7 -emit-llvm -o - | FileCheck %s 2*67e74705SXin Li// RUN: %clang_cc1 %s -triple x86_64-unknown-freebsd -fobjc-runtime=gnustep-1.7 -emit-llvm -o - | FileCheck -check-prefix=CHECK-GNUSTEP %s 3*67e74705SXin Li// rdar://6137845 4*67e74705SXin Li 5*67e74705SXin Liextern int DEFAULT(); 6*67e74705SXin Li 7*67e74705SXin Listruct TCPPObject 8*67e74705SXin Li{ 9*67e74705SXin Li TCPPObject(); 10*67e74705SXin Li ~TCPPObject(); 11*67e74705SXin Li TCPPObject(const TCPPObject& inObj, int i = DEFAULT()); 12*67e74705SXin Li TCPPObject& operator=(const TCPPObject& inObj); 13*67e74705SXin Li int filler[64]; 14*67e74705SXin Li}; 15*67e74705SXin Li 16*67e74705SXin Li 17*67e74705SXin Li@interface MyDocument 18*67e74705SXin Li{ 19*67e74705SXin Li@private 20*67e74705SXin Li TCPPObject _cppObject; 21*67e74705SXin Li TCPPObject _cppObject1; 22*67e74705SXin Li} 23*67e74705SXin Li@property (assign, readwrite, atomic) const TCPPObject MyProperty; 24*67e74705SXin Li@property (assign, readwrite, atomic) const TCPPObject MyProperty1; 25*67e74705SXin Li@end 26*67e74705SXin Li 27*67e74705SXin Li@implementation MyDocument 28*67e74705SXin Li @synthesize MyProperty = _cppObject; 29*67e74705SXin Li @synthesize MyProperty1 = _cppObject1; 30*67e74705SXin Li@end 31*67e74705SXin Li 32*67e74705SXin Li// CHECK-LABEL: define internal void @__copy_helper_atomic_property_(%struct.TCPPObject*, %struct.TCPPObject*) # 33*67e74705SXin Li// CHECK: [[TWO:%.*]] = load %struct.TCPPObject*, %struct.TCPPObject** [[ADDR:%.*]], align 8 34*67e74705SXin Li// CHECK: [[THREE:%.*]] = load %struct.TCPPObject*, %struct.TCPPObject** [[ADDR1:%.*]], align 8 35*67e74705SXin Li// CHECK: [[CALL:%.*]] = call i32 @_Z7DEFAULTv() 36*67e74705SXin Li// CHECK: call void @_ZN10TCPPObjectC1ERKS_i(%struct.TCPPObject* [[TWO]], %struct.TCPPObject* dereferenceable({{[0-9]+}}) [[THREE]], i32 [[CALL]]) 37*67e74705SXin Li// CHECK: ret void 38*67e74705SXin Li 39*67e74705SXin Li// CHECK: define internal void @"\01-[MyDocument MyProperty]"( 40*67e74705SXin Li// CHECK: [[ONE:%.*]] = bitcast i8* [[ADDPTR:%.*]] to %struct.TCPPObject* 41*67e74705SXin Li// CHECK: [[TWO:%.*]] = bitcast %struct.TCPPObject* [[ONE]] to i8* 42*67e74705SXin Li// CHECK: [[THREE:%.*]] = bitcast %struct.TCPPObject* [[AGGRESULT:%.*]] to i8* 43*67e74705SXin Li// CHECK: call void @objc_copyCppObjectAtomic(i8* [[THREE]], i8* [[TWO]], i8* bitcast (void (%struct.TCPPObject*, %struct.TCPPObject*)* @__copy_helper_atomic_property_ to i8*)) 44*67e74705SXin Li// CHECK: ret void 45*67e74705SXin Li 46*67e74705SXin Li// CHECK-LABEL: define internal void @__assign_helper_atomic_property_(%struct.TCPPObject*, %struct.TCPPObject*) # 47*67e74705SXin Li// CHECK: [[TWO:%.*]] = load %struct.TCPPObject*, %struct.TCPPObject** [[ADDR:%.*]], align 8 48*67e74705SXin Li// CHECK: [[THREE:%.*]] = load %struct.TCPPObject*, %struct.TCPPObject** [[ADDR1:%.*]], align 8 49*67e74705SXin Li// CHECK: [[CALL:%.*]] = call dereferenceable({{[0-9]+}}) %struct.TCPPObject* @_ZN10TCPPObjectaSERKS_(%struct.TCPPObject* [[TWO]], %struct.TCPPObject* dereferenceable({{[0-9]+}}) [[THREE]]) 50*67e74705SXin Li// CHECK: ret void 51*67e74705SXin Li 52*67e74705SXin Li// CHECK: define internal void @"\01-[MyDocument setMyProperty:]"( 53*67e74705SXin Li// CHECK: [[ONE:%.*]] = bitcast i8* [[ADDRPTR:%.*]] to %struct.TCPPObject* 54*67e74705SXin Li// CHECK: [[TWO:%.*]] = bitcast %struct.TCPPObject* [[ONE]] to i8* 55*67e74705SXin Li// CHECK: [[THREE:%.*]] = bitcast %struct.TCPPObject* [[MYPROPERTY:%.*]] to i8* 56*67e74705SXin Li// CHECK: call void @objc_copyCppObjectAtomic(i8* [[TWO]], i8* [[THREE]], i8* bitcast (void (%struct.TCPPObject*, %struct.TCPPObject*)* @__assign_helper_atomic_property_ to i8*)) 57*67e74705SXin Li// CHECK: ret void 58*67e74705SXin Li 59*67e74705SXin Li// CHECK-GNUSTEP: objc_getCppObjectAtomic 60*67e74705SXin Li// CHECK-GNUSTEP: objc_setCppObjectAtomic 61