1*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -o - %s -std=c++11 | FileCheck %s 2*67e74705SXin Li 3*67e74705SXin Li struct A { 4*67e74705SXin Li A(); 5*67e74705SXin Li A(const A&); 6*67e74705SXin Li A(A&); 7*67e74705SXin Li ~A(); 8*67e74705SXin Li }; 9*67e74705SXin Li 10*67e74705SXin Li struct B { 11*67e74705SXin Li B(); 12*67e74705SXin Li B(B&); 13*67e74705SXin Li }; 14*67e74705SXin Li 15*67e74705SXin Li struct C { CC16*67e74705SXin Li C() {} 17*67e74705SXin Li C(C& other, A a = A()); 18*67e74705SXin Li int i, j; 19*67e74705SXin Li }; 20*67e74705SXin Li 21*67e74705SXin Li struct POD { 22*67e74705SXin Li int array[3][4]; 23*67e74705SXin Li }; 24*67e74705SXin Li 25*67e74705SXin Li struct D : A, B, virtual C { 26*67e74705SXin Li D(); 27*67e74705SXin Li int scalar; 28*67e74705SXin Li int scalar_array[2][3]; 29*67e74705SXin Li B class_member; 30*67e74705SXin Li C class_member_array[2][3]; 31*67e74705SXin Li POD pod_array[2][3]; 32*67e74705SXin Li 33*67e74705SXin Li union { 34*67e74705SXin Li int x; 35*67e74705SXin Li float f[3]; 36*67e74705SXin Li }; 37*67e74705SXin Li }; 38*67e74705SXin Li f(D d)39*67e74705SXin Livoid f(D d) { 40*67e74705SXin Li D d2(d); 41*67e74705SXin Li } 42*67e74705SXin Li 43*67e74705SXin Li // CHECK-LABEL: define linkonce_odr void @_ZN1DC1ERS_(%struct.D* %this, %struct.D* dereferenceable({{[0-9]+}})) unnamed_addr 44*67e74705SXin Li // CHECK: call void @_ZN1AC1Ev 45*67e74705SXin Li // CHECK: call void @_ZN1CC2ERS_1A 46*67e74705SXin Li // CHECK: call void @_ZN1AD1Ev 47*67e74705SXin Li // CHECK: call void @_ZN1AC2ERS_ 48*67e74705SXin Li // CHECK: call void @_ZN1BC2ERS_ 49*67e74705SXin Li // CHECK: {{call void @llvm.memcpy.p0i8.p0i8.i64.*i64 28}} 50*67e74705SXin Li // CHECK: call void @_ZN1BC1ERS_ 51*67e74705SXin Li // CHECK: br 52*67e74705SXin Li // CHECK: {{icmp ult.*, 2}} 53*67e74705SXin Li // CHECK: {{icmp ult.*, 3}} 54*67e74705SXin Li // CHECK: call void @_ZN1AC1Ev 55*67e74705SXin Li // CHECK: call void @_ZN1CC1ERS_1A 56*67e74705SXin Li // CHECK: call void @_ZN1AD1Ev 57*67e74705SXin Li // CHECK: {{call void @llvm.memcpy.p0i8.p0i8.i64.*i64 300}} 58*67e74705SXin Li // CHECK: ret void 59*67e74705SXin Li 60*67e74705SXin Li f0X061*67e74705SXin Litemplate<class T> struct X0 { void f0(T * ) { } }; X1X162*67e74705SXin Litemplate <class > struct X1 { X1( X1& , int = 0 ) { } }; 63*67e74705SXin Li struct X2 { X1<int> result; }; test_X2()64*67e74705SXin Livoid test_X2() 65*67e74705SXin Li { 66*67e74705SXin Li typedef X2 impl; 67*67e74705SXin Li typedef X0<impl> pimpl; 68*67e74705SXin Li impl* i; 69*67e74705SXin Li pimpl pdata; 70*67e74705SXin Li pdata.f0( new impl(*i)); 71*67e74705SXin Li } 72*67e74705SXin Li 73*67e74705SXin Li // rdar://problem/9598341 74*67e74705SXin Li namespace test3 { 75*67e74705SXin Li struct A { A(const A&); A&operator=(const A&); }; 76*67e74705SXin Li struct B { A a; unsigned : 0; }; test(const B & x)77*67e74705SXin Li void test(const B &x) { 78*67e74705SXin Li B y = x; 79*67e74705SXin Li y = x; 80*67e74705SXin Li } 81*67e74705SXin Li } 82*67e74705SXin Li 83*67e74705SXin Li namespace test4 { 84*67e74705SXin Li // When determining whether to implement an array copy as a memcpy, look at 85*67e74705SXin Li // whether the *selected* constructor is trivial. 86*67e74705SXin Li struct S { 87*67e74705SXin Li int arr[5][5]; 88*67e74705SXin Li S(S &); 89*67e74705SXin Li S(const S &) = default; 90*67e74705SXin Li }; 91*67e74705SXin Li // CHECK: @_ZN5test42f1 f1(S a)92*67e74705SXin Li void f1(S a) { 93*67e74705SXin Li // CHECK-NOT: memcpy 94*67e74705SXin Li // CHECK: call void @_ZN5test41SC1ERS0_ 95*67e74705SXin Li // CHECK-NOT: memcpy 96*67e74705SXin Li S b(a); 97*67e74705SXin Li // CHECK: } 98*67e74705SXin Li } 99*67e74705SXin Li // CHECK: @_ZN5test42f2 f2(const S a)100*67e74705SXin Li void f2(const S a) { 101*67e74705SXin Li // CHECK-NOT: call void @_ZN5test41SC1ERS0_ 102*67e74705SXin Li // CHECK: memcpy 103*67e74705SXin Li // CHECK-NOT: call void @_ZN5test41SC1ERS0_ 104*67e74705SXin Li S b(a); 105*67e74705SXin Li // CHECK: } 106*67e74705SXin Li } 107*67e74705SXin Li } 108