blob: 234e4b12589c61fa41dc753def31cadddb53f64a [file] [log] [blame]
Richard Smith122f88d2016-12-06 23:52:28 +00001// RUN: %clang_cc1 -std=c++1z -emit-llvm -triple x86_64-linux-gnu -o - %s | FileCheck %s
2
3struct A {
4 A(int);
5 A(A&&);
6 A(const A&);
7 ~A();
8
9 int arr[10];
10};
11
12A f();
13void h();
14
15// CHECK-LABEL: define {{.*}} @_Z1gv(
16void g() {
17 // CHECK: %[[A:.*]] = alloca
18 // CHECK-NOT: alloca
19 // CHECK-NOT: call
20 // CHECK: call {{.*}} @_Z1fv({{.*}}* sret %[[A]])
21 A a = A( A{ f() } );
22 // CHECK-NOT: call
23
24 // CHECK: call void @_Z1hv(
25 h();
26 // CHECK-NOT: call
27
28 // CHECK: call void @_ZN1AD1Ev({{.*}}* %[[A]])
29 // CHECK-NOT: call
30 // CHECK-LABEL: }
31}
32
33void f(A);
34
35// CHECK-LABEL: define {{.*}} @_Z1hv(
36void h() {
37 // CHECK: %[[A:.*]] = alloca
38 // CHECK-NOT: alloca
39 // CHECK-NOT: call
40
41 // CHECK: call {{.*}} @_Z1fv({{.*}}* sret %[[A]])
42 // CHECK-NOT: call
43 // CHECK: call {{.*}} @_Z1f1A({{.*}}* %[[A]])
44 f(f());
45 // CHECK-NOT: call
46 // CHECK: call void @_ZN1AD1Ev({{.*}}* %[[A]])
47
48 // CHECK: call void @_Z1hv(
49 h();
50
51 // CHECK-NOT: call
52 // CHECK-LABEL: }
53}
54
55// We still pass classes with trivial copy/move constructors and destructors in
56// registers, even if the copy is formally omitted.
57struct B {
58 B(int);
59 int n;
60};
61
62B fB();
63void fB(B);
64
65// CHECK-LABEL: define {{.*}} @_Z1iv(
66void i() {
67 // CHECK: %[[B:.*]] = alloca
68 // CHECK-NOT: alloca
69 // CHECK-NOT: call
70
71 // CHECK: %[[B_N:.*]] = call i32 @_Z2fBv()
72 // CHECK-NOT: call
73 // CHECK: store i32 %[[B_N]],
74 // CHECK-NOT: call
75 // CHECK: %[[B_N:.*]] = load i32
76 // CHECK-NOT: call
77 // CHECK: call void @_Z2fB1B(i32 %[[B_N]])
78 fB(fB());
79
80 // CHECK-LABEL: }
81}