xref: /aosp_15_r20/external/clang/test/CXX/special/class.copy/implicit-move-def.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
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 Li void 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 Li void 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 Li void 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 Li void 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