1334de520b0369215b7931fefa424fb92d295f0ebJames Dong// FIXME: %clang_cc1 -emit-llvm -triple %itanium_abi_triple -o - -std=c++11 %s | FileCheck -check-prefix=CHECK %s
2334de520b0369215b7931fefa424fb92d295f0ebJames Dong// RUN: %clang_cc1 -emit-llvm -triple %itanium_abi_triple -o - -std=c++11 %s | FileCheck -check-prefix=CHECK-ASSIGN %s
3334de520b0369215b7931fefa424fb92d295f0ebJames Dong// RUN: %clang_cc1 -emit-llvm -triple %itanium_abi_triple -o - -std=c++11 %s | FileCheck -check-prefix=CHECK-CTOR %s
4334de520b0369215b7931fefa424fb92d295f0ebJames Dong
5334de520b0369215b7931fefa424fb92d295f0ebJames Dong// construct
6334de520b0369215b7931fefa424fb92d295f0ebJames Dong
7334de520b0369215b7931fefa424fb92d295f0ebJames Dongstruct E {
8334de520b0369215b7931fefa424fb92d295f0ebJames Dong  E();
9334de520b0369215b7931fefa424fb92d295f0ebJames Dong  E(E&&);
10334de520b0369215b7931fefa424fb92d295f0ebJames Dong};
11334de520b0369215b7931fefa424fb92d295f0ebJames Dong
12334de520b0369215b7931fefa424fb92d295f0ebJames Dongstruct F {
13334de520b0369215b7931fefa424fb92d295f0ebJames Dong  F();
14334de520b0369215b7931fefa424fb92d295f0ebJames Dong  F(F&&);
15334de520b0369215b7931fefa424fb92d295f0ebJames Dong};
16334de520b0369215b7931fefa424fb92d295f0ebJames Dong
17334de520b0369215b7931fefa424fb92d295f0ebJames Dongstruct G {
18334de520b0369215b7931fefa424fb92d295f0ebJames Dong  E e;
19a1ae5a4fe52192525f510dc14ecf1f7d4fb107f5Lajos Molnar};
20a1ae5a4fe52192525f510dc14ecf1f7d4fb107f5Lajos Molnar
21334de520b0369215b7931fefa424fb92d295f0ebJames Dongstruct H : G {
22334de520b0369215b7931fefa424fb92d295f0ebJames Dong  F l;
23334de520b0369215b7931fefa424fb92d295f0ebJames Dong  E m;
24334de520b0369215b7931fefa424fb92d295f0ebJames Dong  F ar[2];
25334de520b0369215b7931fefa424fb92d295f0ebJames Dong};
26334de520b0369215b7931fefa424fb92d295f0ebJames Dong
27a1ae5a4fe52192525f510dc14ecf1f7d4fb107f5Lajos Molnarvoid f() {
28334de520b0369215b7931fefa424fb92d295f0ebJames Dong  H s;
29a1ae5a4fe52192525f510dc14ecf1f7d4fb107f5Lajos Molnar  // CHECK: call void @_ZN1HC1EOS_
30a1ae5a4fe52192525f510dc14ecf1f7d4fb107f5Lajos Molnar  H t(static_cast<H&&>(s));
31334de520b0369215b7931fefa424fb92d295f0ebJames Dong}
32334de520b0369215b7931fefa424fb92d295f0ebJames Dong
33334de520b0369215b7931fefa424fb92d295f0ebJames Dong
34334de520b0369215b7931fefa424fb92d295f0ebJames Dong// assign
35334de520b0369215b7931fefa424fb92d295f0ebJames Dong
36334de520b0369215b7931fefa424fb92d295f0ebJames Dongstruct A {
37a1ae5a4fe52192525f510dc14ecf1f7d4fb107f5Lajos Molnar  A &operator =(A&&);
38334de520b0369215b7931fefa424fb92d295f0ebJames Dong};
39334de520b0369215b7931fefa424fb92d295f0ebJames Dong
40334de520b0369215b7931fefa424fb92d295f0ebJames Dongstruct B {
41a1ae5a4fe52192525f510dc14ecf1f7d4fb107f5Lajos Molnar  B &operator =(B&&);
42334de520b0369215b7931fefa424fb92d295f0ebJames Dong};
43a1ae5a4fe52192525f510dc14ecf1f7d4fb107f5Lajos Molnar
44334de520b0369215b7931fefa424fb92d295f0ebJames Dongstruct C {
45334de520b0369215b7931fefa424fb92d295f0ebJames Dong  A a;
46334de520b0369215b7931fefa424fb92d295f0ebJames Dong};
47334de520b0369215b7931fefa424fb92d295f0ebJames Dong
48334de520b0369215b7931fefa424fb92d295f0ebJames Dongstruct D : C {
49334de520b0369215b7931fefa424fb92d295f0ebJames Dong  A a;
50334de520b0369215b7931fefa424fb92d295f0ebJames Dong  B b;
51334de520b0369215b7931fefa424fb92d295f0ebJames Dong  A ar[2];
52334de520b0369215b7931fefa424fb92d295f0ebJames Dong};
53334de520b0369215b7931fefa424fb92d295f0ebJames Dong
54334de520b0369215b7931fefa424fb92d295f0ebJames Dongvoid g() {
55334de520b0369215b7931fefa424fb92d295f0ebJames Dong  D d;
56334de520b0369215b7931fefa424fb92d295f0ebJames Dong  // CHECK: call {{.*}} @_ZN1DaSEOS_
57334de520b0369215b7931fefa424fb92d295f0ebJames Dong  d = D();
58334de520b0369215b7931fefa424fb92d295f0ebJames Dong}
59334de520b0369215b7931fefa424fb92d295f0ebJames Dong
60334de520b0369215b7931fefa424fb92d295f0ebJames Dong// PR10822
61334de520b0369215b7931fefa424fb92d295f0ebJames Dongstruct I {
62334de520b0369215b7931fefa424fb92d295f0ebJames Dong  unsigned var[1];
63a1ae5a4fe52192525f510dc14ecf1f7d4fb107f5Lajos Molnar};
64334de520b0369215b7931fefa424fb92d295f0ebJames Dong
65334de520b0369215b7931fefa424fb92d295f0ebJames Dong// CHECK: define void @_Z1hv() nounwind {
66334de520b0369215b7931fefa424fb92d295f0ebJames Dongvoid h() {
67334de520b0369215b7931fefa424fb92d295f0ebJames Dong  I i;
68334de520b0369215b7931fefa424fb92d295f0ebJames Dong  // CHECK: call void @llvm.memcpy.
69334de520b0369215b7931fefa424fb92d295f0ebJames Dong  i = I();
70a1ae5a4fe52192525f510dc14ecf1f7d4fb107f5Lajos Molnar  // CHECK-NEXT: ret void
71a1ae5a4fe52192525f510dc14ecf1f7d4fb107f5Lajos Molnar}
72a1ae5a4fe52192525f510dc14ecf1f7d4fb107f5Lajos Molnar
73a1ae5a4fe52192525f510dc14ecf1f7d4fb107f5Lajos Molnar// PR10860
74a1ae5a4fe52192525f510dc14ecf1f7d4fb107f5Lajos Molnarstruct Empty { };
75a1ae5a4fe52192525f510dc14ecf1f7d4fb107f5Lajos Molnarstruct VirtualWithEmptyBase : Empty {
76334de520b0369215b7931fefa424fb92d295f0ebJames Dong  virtual void f();
77334de520b0369215b7931fefa424fb92d295f0ebJames Dong};
78334de520b0369215b7931fefa424fb92d295f0ebJames Dong
79334de520b0369215b7931fefa424fb92d295f0ebJames Dong// CHECK: define void @_Z25move_VirtualWithEmptyBaseR20VirtualWithEmptyBaseS0_
80334de520b0369215b7931fefa424fb92d295f0ebJames Dongvoid move_VirtualWithEmptyBase(VirtualWithEmptyBase &x, VirtualWithEmptyBase &y) {
81334de520b0369215b7931fefa424fb92d295f0ebJames Dong  // CHECK: call {{.*}} @_ZN20VirtualWithEmptyBaseaSEOS_
82334de520b0369215b7931fefa424fb92d295f0ebJames Dong  x = static_cast<VirtualWithEmptyBase&&>(y);
83334de520b0369215b7931fefa424fb92d295f0ebJames Dong  // CHECK-NEXT: ret void
84334de520b0369215b7931fefa424fb92d295f0ebJames Dong}
85334de520b0369215b7931fefa424fb92d295f0ebJames Dong
86334de520b0369215b7931fefa424fb92d295f0ebJames Dong// move assignment ops
87334de520b0369215b7931fefa424fb92d295f0ebJames Dong
885195e0808bbc0438f076c1ca92d3c257d64b7ca1hkuang// CHECK-ASSIGN: define linkonce_odr {{.*}} @_ZN1DaSEOS_
895195e0808bbc0438f076c1ca92d3c257d64b7ca1hkuang// CHECK-ASSIGN: call {{.*}} @_ZN1CaSEOS_
90184077dee460d235c2f9ed3e6ecf9a6df06ae80cRachad// CHECK-ASSIGN: call {{.*}} @_ZN1AaSEOS_
91a1ae5a4fe52192525f510dc14ecf1f7d4fb107f5Lajos Molnar// CHECK-ASSIGN: call {{.*}} @_ZN1BaSEOS_
92334de520b0369215b7931fefa424fb92d295f0ebJames Dong// array loop
93334de520b0369215b7931fefa424fb92d295f0ebJames Dong// CHECK-ASSIGN: br i1
94334de520b0369215b7931fefa424fb92d295f0ebJames Dong// CHECK-ASSIGN: call {{.*}} @_ZN1AaSEOS_
95334de520b0369215b7931fefa424fb92d295f0ebJames Dong
96334de520b0369215b7931fefa424fb92d295f0ebJames Dong// VirtualWithEmptyBase move assignment operatpr
97334de520b0369215b7931fefa424fb92d295f0ebJames Dong// CHECK-ASSIGN: define linkonce_odr {{.*}} @_ZN20VirtualWithEmptyBaseaSEOS_
98a1ae5a4fe52192525f510dc14ecf1f7d4fb107f5Lajos Molnar// CHECK-ASSIGN: store
99a1ae5a4fe52192525f510dc14ecf1f7d4fb107f5Lajos Molnar// CHECK-ASSIGN-NEXT: store
100a1ae5a4fe52192525f510dc14ecf1f7d4fb107f5Lajos Molnar// CHECK-ASSIGN-NOT: call
101334de520b0369215b7931fefa424fb92d295f0ebJames Dong// CHECK-ASSIGN: ret
102334de520b0369215b7931fefa424fb92d295f0ebJames Dong
103334de520b0369215b7931fefa424fb92d295f0ebJames Dong// CHECK-ASSIGN: define linkonce_odr {{.*}} @_ZN1CaSEOS_
104334de520b0369215b7931fefa424fb92d295f0ebJames Dong// CHECK-ASSIGN: call {{.*}} @_ZN1AaSEOS_
105334de520b0369215b7931fefa424fb92d295f0ebJames Dong
106a1ae5a4fe52192525f510dc14ecf1f7d4fb107f5Lajos Molnar// move ctors
107a1ae5a4fe52192525f510dc14ecf1f7d4fb107f5Lajos Molnar
108a1ae5a4fe52192525f510dc14ecf1f7d4fb107f5Lajos Molnar// CHECK-CTOR: define linkonce_odr {{.*}} @_ZN1HC2EOS_
109a1ae5a4fe52192525f510dc14ecf1f7d4fb107f5Lajos Molnar// CHECK-CTOR: call {{.*}} @_ZN1GC2EOS_
110a1ae5a4fe52192525f510dc14ecf1f7d4fb107f5Lajos Molnar// CHECK-CTOR: call {{.*}} @_ZN1FC1EOS_
111a1ae5a4fe52192525f510dc14ecf1f7d4fb107f5Lajos Molnar// CHECK-CTOR: call {{.*}} @_ZN1EC1EOS_
112334de520b0369215b7931fefa424fb92d295f0ebJames Dong// array loop
113334de520b0369215b7931fefa424fb92d295f0ebJames Dong// CHECK-CTOR: br i1
114334de520b0369215b7931fefa424fb92d295f0ebJames Dong// CHECK-CTOR: call {{.*}} @_ZN1FC1EOS_
115334de520b0369215b7931fefa424fb92d295f0ebJames Dong
116a1ae5a4fe52192525f510dc14ecf1f7d4fb107f5Lajos Molnar// CHECK-CTOR: define linkonce_odr {{.*}} @_ZN1GC2EOS_
117334de520b0369215b7931fefa424fb92d295f0ebJames Dong// CHECK-CTOR: call {{.*}} @_ZN1EC1EOS_
118a1ae5a4fe52192525f510dc14ecf1f7d4fb107f5Lajos Molnar