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