1*67e74705SXin Li // FIXME: %clang_cc1 -emit-llvm -triple %itanium_abi_triple -o - -std=c++11 %s | FileCheck %s 2*67e74705SXin Li // RUN: %clang_cc1 -emit-llvm -triple %itanium_abi_triple -o - -std=c++11 %s | FileCheck -check-prefix=CHECK-ASSIGN %s 3*67e74705SXin Li // RUN: %clang_cc1 -emit-llvm -triple %itanium_abi_triple -o - -std=c++11 %s | FileCheck -check-prefix=CHECK-CTOR %s 4*67e74705SXin Li 5*67e74705SXin Li // construct 6*67e74705SXin Li 7*67e74705SXin Li struct E { 8*67e74705SXin Li E(); 9*67e74705SXin Li E(E&&); 10*67e74705SXin Li }; 11*67e74705SXin Li 12*67e74705SXin Li struct F { 13*67e74705SXin Li F(); 14*67e74705SXin Li F(F&&); 15*67e74705SXin Li }; 16*67e74705SXin Li 17*67e74705SXin Li struct G { 18*67e74705SXin Li E e; 19*67e74705SXin Li }; 20*67e74705SXin Li 21*67e74705SXin Li struct H : G { 22*67e74705SXin Li F l; 23*67e74705SXin Li E m; 24*67e74705SXin Li F ar[2]; 25*67e74705SXin Li }; 26*67e74705SXin Li f()27*67e74705SXin Livoid f() { 28*67e74705SXin Li H s; 29*67e74705SXin Li // CHECK: call void @_ZN1HC1EOS_ 30*67e74705SXin Li H t(static_cast<H&&>(s)); 31*67e74705SXin Li } 32*67e74705SXin Li 33*67e74705SXin Li 34*67e74705SXin Li // assign 35*67e74705SXin Li 36*67e74705SXin Li struct A { 37*67e74705SXin Li A &operator =(A&&); 38*67e74705SXin Li }; 39*67e74705SXin Li 40*67e74705SXin Li struct B { 41*67e74705SXin Li B &operator =(B&&); 42*67e74705SXin Li }; 43*67e74705SXin Li 44*67e74705SXin Li struct C { 45*67e74705SXin Li A a; 46*67e74705SXin Li }; 47*67e74705SXin Li 48*67e74705SXin Li struct D : C { 49*67e74705SXin Li A a; 50*67e74705SXin Li B b; 51*67e74705SXin Li A ar[2]; 52*67e74705SXin Li }; 53*67e74705SXin Li g()54*67e74705SXin Livoid g() { 55*67e74705SXin Li D d; 56*67e74705SXin Li // CHECK: call {{.*}} @_ZN1DaSEOS_ 57*67e74705SXin Li d = D(); 58*67e74705SXin Li } 59*67e74705SXin Li 60*67e74705SXin Li // PR10822 61*67e74705SXin Li struct I { 62*67e74705SXin Li unsigned var[1]; 63*67e74705SXin Li }; 64*67e74705SXin Li 65*67e74705SXin Li // CHECK: define void @_Z1hv() nounwind { h()66*67e74705SXin Livoid h() { 67*67e74705SXin Li I i; 68*67e74705SXin Li // CHECK: call void @llvm.memcpy. 69*67e74705SXin Li i = I(); 70*67e74705SXin Li // CHECK-NEXT: ret void 71*67e74705SXin Li } 72*67e74705SXin Li 73*67e74705SXin Li // PR10860 74*67e74705SXin Li struct Empty { }; 75*67e74705SXin Li struct VirtualWithEmptyBase : Empty { 76*67e74705SXin Li virtual void f(); 77*67e74705SXin Li }; 78*67e74705SXin Li 79*67e74705SXin Li // CHECK: define void @_Z25move_VirtualWithEmptyBaseR20VirtualWithEmptyBaseS0_ move_VirtualWithEmptyBase(VirtualWithEmptyBase & x,VirtualWithEmptyBase & y)80*67e74705SXin Livoid move_VirtualWithEmptyBase(VirtualWithEmptyBase &x, VirtualWithEmptyBase &y) { 81*67e74705SXin Li // CHECK: call {{.*}} @_ZN20VirtualWithEmptyBaseaSEOS_ 82*67e74705SXin Li x = static_cast<VirtualWithEmptyBase&&>(y); 83*67e74705SXin Li // CHECK-NEXT: ret void 84*67e74705SXin Li } 85*67e74705SXin Li 86*67e74705SXin Li // move assignment ops 87*67e74705SXin Li 88*67e74705SXin Li // CHECK-ASSIGN: define linkonce_odr {{.*}} @_ZN1DaSEOS_ 89*67e74705SXin Li // CHECK-ASSIGN: call {{.*}} @_ZN1CaSEOS_ 90*67e74705SXin Li // CHECK-ASSIGN: call {{.*}} @_ZN1AaSEOS_ 91*67e74705SXin Li // CHECK-ASSIGN: call {{.*}} @_ZN1BaSEOS_ 92*67e74705SXin Li // array loop 93*67e74705SXin Li // CHECK-ASSIGN: br i1 94*67e74705SXin Li // CHECK-ASSIGN: call {{.*}} @_ZN1AaSEOS_ 95*67e74705SXin Li 96*67e74705SXin Li // VirtualWithEmptyBase move assignment operatpr 97*67e74705SXin Li // CHECK-ASSIGN: define linkonce_odr {{.*}} @_ZN20VirtualWithEmptyBaseaSEOS_ 98*67e74705SXin Li // CHECK-ASSIGN: store 99*67e74705SXin Li // CHECK-ASSIGN-NEXT: store 100*67e74705SXin Li // CHECK-ASSIGN-NOT: call 101*67e74705SXin Li // CHECK-ASSIGN: ret 102*67e74705SXin Li 103*67e74705SXin Li // CHECK-ASSIGN: define linkonce_odr {{.*}} @_ZN1CaSEOS_ 104*67e74705SXin Li // CHECK-ASSIGN: call {{.*}} @_ZN1AaSEOS_ 105*67e74705SXin Li 106*67e74705SXin Li // move ctors 107*67e74705SXin Li 108*67e74705SXin Li // CHECK-CTOR: define linkonce_odr {{.*}} @_ZN1HC2EOS_ 109*67e74705SXin Li // CHECK-CTOR: call {{.*}} @_ZN1GC2EOS_ 110*67e74705SXin Li // CHECK-CTOR: call {{.*}} @_ZN1FC1EOS_ 111*67e74705SXin Li // CHECK-CTOR: call {{.*}} @_ZN1EC1EOS_ 112*67e74705SXin Li // array loop 113*67e74705SXin Li // CHECK-CTOR: br i1 114*67e74705SXin Li // CHECK-CTOR: call {{.*}} @_ZN1FC1EOS_ 115*67e74705SXin Li 116*67e74705SXin Li // CHECK-CTOR: define linkonce_odr {{.*}} @_ZN1GC2EOS_ 117*67e74705SXin Li // CHECK-CTOR: call {{.*}} @_ZN1EC1EOS_ 118