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