1*67e74705SXin Li// RUN: %clang_cc1 -fobjc-gc -emit-llvm -triple x86_64-apple-darwin10.0.0 -fobjc-runtime=macosx-fragile-10.5 -o - %s | FileCheck %s -check-prefix=CHECK-OBJ 2*67e74705SXin Li// RUN: %clang_cc1 -x c++ -emit-llvm -triple x86_64-apple-darwin10.0.0 -o - %s | FileCheck %s -check-prefix=CHECK-CPP 3*67e74705SXin Li#ifdef __OBJC__ 4*67e74705SXin Listruct A { 5*67e74705SXin Li A &operator=(const A&); 6*67e74705SXin Li A &operator=(A&); 7*67e74705SXin Li}; 8*67e74705SXin Li 9*67e74705SXin Listruct B { 10*67e74705SXin Li B &operator=(B&); 11*67e74705SXin Li}; 12*67e74705SXin Li 13*67e74705SXin Listruct C { 14*67e74705SXin Li virtual C& operator=(const C&); 15*67e74705SXin Li}; 16*67e74705SXin Li 17*67e74705SXin Listruct POD { 18*67e74705SXin Li id myobjc; 19*67e74705SXin Li int array[3][4]; 20*67e74705SXin Li}; 21*67e74705SXin Li 22*67e74705SXin Listruct CopyByValue { 23*67e74705SXin Li CopyByValue(const CopyByValue&); 24*67e74705SXin Li CopyByValue &operator=(CopyByValue); 25*67e74705SXin Li}; 26*67e74705SXin Li 27*67e74705SXin Listruct D : A, B, virtual C { 28*67e74705SXin Li int scalar; 29*67e74705SXin Li int scalar_array[2][3]; 30*67e74705SXin Li B class_member; 31*67e74705SXin Li C class_member_array[2][3]; 32*67e74705SXin Li POD pod_array[2][3]; 33*67e74705SXin Li 34*67e74705SXin Li union { 35*67e74705SXin Li int x; 36*67e74705SXin Li float f[3]; 37*67e74705SXin Li }; 38*67e74705SXin Li 39*67e74705SXin Li CopyByValue by_value; 40*67e74705SXin Li}; 41*67e74705SXin Li 42*67e74705SXin Livoid test_D(D d1, D d2) { 43*67e74705SXin Li d1 = d2; 44*67e74705SXin Li} 45*67e74705SXin Li 46*67e74705SXin Li// CHECK-OBJ-LABEL: define linkonce_odr dereferenceable({{[0-9]+}}) %struct.D* @_ZN1DaSERS_ 47*67e74705SXin Li// CHECK-OBJ: {{call.*_ZN1AaSERS_}} 48*67e74705SXin Li// CHECK-OBJ: {{call.*_ZN1BaSERS_}} 49*67e74705SXin Li// CHECK-OBJ: {{call.*_ZN1CaSERKS_}} 50*67e74705SXin Li// CHECK-OBJ: {{call void @llvm.memcpy.p0i8.p0i8.i64.*i64 24}} 51*67e74705SXin Li// CHECK-OBJ: {{call.*_ZN1BaSERS_}} 52*67e74705SXin Li// CHECK-OBJ: br 53*67e74705SXin Li// CHECK-OBJ: {{call.*_ZN1CaSERKS_}} 54*67e74705SXin Li// CHECK-OBJ: {{call.*@objc_memmove_collectable}} 55*67e74705SXin Li// CHECK-OBJ: {{call void @llvm.memcpy.p0i8.p0i8.i64.*i64 12}} 56*67e74705SXin Li// CHECK-OBJ: call void @_ZN11CopyByValueC1ERKS_ 57*67e74705SXin Li// CHECK-OBJ: {{call.*_ZN11CopyByValueaSES_}} 58*67e74705SXin Li// CHECK-OBJ: ret 59*67e74705SXin Li#endif 60*67e74705SXin Li 61*67e74705SXin Linamespace PR13329 { 62*67e74705SXin Li#ifndef __OBJC__ 63*67e74705SXin Li typedef void* id; 64*67e74705SXin Li#endif 65*67e74705SXin Li struct POD { 66*67e74705SXin Li id i; 67*67e74705SXin Li short s; 68*67e74705SXin Li }; 69*67e74705SXin Li 70*67e74705SXin Li struct NonPOD { 71*67e74705SXin Li id i; 72*67e74705SXin Li short s; 73*67e74705SXin Li 74*67e74705SXin Li NonPOD(); 75*67e74705SXin Li }; 76*67e74705SXin Li 77*67e74705SXin Li struct DerivedNonPOD: NonPOD { 78*67e74705SXin Li char c; 79*67e74705SXin Li }; 80*67e74705SXin Li 81*67e74705SXin Li struct DerivedPOD: POD { 82*67e74705SXin Li char c; 83*67e74705SXin Li }; 84*67e74705SXin Li 85*67e74705SXin Li void testPOD() { 86*67e74705SXin Li POD a; 87*67e74705SXin Li POD b; 88*67e74705SXin Li // CHECK-OBJ: @objc_memmove_collectable{{.*}}i64 16 89*67e74705SXin Li // CHECK-CPP: @llvm.memcpy{{.*}}i64 16 90*67e74705SXin Li b = a; 91*67e74705SXin Li } 92*67e74705SXin Li 93*67e74705SXin Li void testNonPOD() { 94*67e74705SXin Li NonPOD a; 95*67e74705SXin Li NonPOD b; 96*67e74705SXin Li // CHECK-OBJ: @objc_memmove_collectable{{.*}}i64 10 97*67e74705SXin Li // CHECK-CPP: @llvm.memcpy{{.*}}i64 10 98*67e74705SXin Li b = a; 99*67e74705SXin Li } 100*67e74705SXin Li 101*67e74705SXin Li void testDerivedNonPOD() { 102*67e74705SXin Li DerivedNonPOD a; 103*67e74705SXin Li NonPOD b; 104*67e74705SXin Li DerivedNonPOD c; 105*67e74705SXin Li // CHECK-OBJ: @objc_memmove_collectable{{.*}}i64 10 106*67e74705SXin Li // CHECK-CPP: @llvm.memcpy{{.*}}i64 10 107*67e74705SXin Li (NonPOD&) a = b; 108*67e74705SXin Li // CHECK-OBJ: @objc_memmove_collectable{{.*}}i64 11 109*67e74705SXin Li // CHECK-CPP: @llvm.memcpy{{.*}}i64 11 110*67e74705SXin Li a = c; 111*67e74705SXin Li }; 112*67e74705SXin Li 113*67e74705SXin Li void testDerivedPOD() { 114*67e74705SXin Li DerivedPOD a; 115*67e74705SXin Li POD b; 116*67e74705SXin Li DerivedPOD c; 117*67e74705SXin Li // CHECK-OBJ: @objc_memmove_collectable{{.*}}i64 16 118*67e74705SXin Li // CHECK-CPP: @llvm.memcpy{{.*}}i64 16 119*67e74705SXin Li (POD&) a = b; 120*67e74705SXin Li // CHECK-OBJ: @objc_memmove_collectable{{.*}}i64 17 121*67e74705SXin Li // CHECK-CPP: @llvm.memcpy{{.*}}i64 17 122*67e74705SXin Li a = c; 123*67e74705SXin Li }; 124*67e74705SXin Li} 125