blob: e55027460f0c37ef6efcf054fc73775ddd0cfe71 [file] [log] [blame]
Anders Carlssonfa4f5502009-10-18 21:11:11 +00001// RUN: clang-cc -emit-llvm %s -o - -triple=x86_64-apple-darwin9 | FileCheck %s
Anders Carlsson7a039eb2009-08-15 22:30:50 +00002struct A {
3 A();
4 ~A();
5 void f();
6};
7
Anders Carlssonec74c592009-08-16 03:06:32 +00008void f1() {
Anders Carlssonfa4f5502009-10-18 21:11:11 +00009 // CHECK: call void @_ZN1AC1Ev
10 // CHECK: call void @_ZN1AD1Ev
Anders Carlssonec74c592009-08-16 03:06:32 +000011 (void)A();
Anders Carlssonfa4f5502009-10-18 21:11:11 +000012
13 // CHECK: call void @_ZN1AC1Ev
14 // CHECK: call void @_ZN1AD1Ev
Anders Carlsson7a039eb2009-08-15 22:30:50 +000015 A().f();
16}
Anders Carlssonec74c592009-08-16 03:06:32 +000017
Anders Carlsson6f680272009-08-16 03:42:12 +000018// Function calls
Anders Carlssonec74c592009-08-16 03:06:32 +000019struct B {
20 B();
21 ~B();
22};
23
24B g();
25
Anders Carlssonec74c592009-08-16 03:06:32 +000026void f2() {
Anders Carlssonfa4f5502009-10-18 21:11:11 +000027 // CHECK-NOT: call void @_ZN1BC1Ev
28 // CHECK: call void @_ZN1BD1Ev
Anders Carlssonec74c592009-08-16 03:06:32 +000029 (void)g();
30}
31
Anders Carlsson6f680272009-08-16 03:42:12 +000032// Member function calls
33struct C {
34 C();
35 ~C();
36
37 C f();
38};
39
Anders Carlsson6f680272009-08-16 03:42:12 +000040void f3() {
Anders Carlssonfa4f5502009-10-18 21:11:11 +000041 // CHECK: call void @_ZN1CC1Ev
42 // CHECK: call void @_ZN1CD1Ev
43 // CHECK: call void @_ZN1CD1Ev
Anders Carlsson6f680272009-08-16 03:42:12 +000044 C().f();
45}
46
Anders Carlssona303f9e2009-08-16 03:53:54 +000047// Function call operator
48struct D {
49 D();
50 ~D();
51
52 D operator()();
53};
54
Anders Carlssona303f9e2009-08-16 03:53:54 +000055void f4() {
Benjamin Kramer3114af32009-10-31 20:42:26 +000056 // CHECK: call void @_ZN1DC1Ev
57 // CHECK: call void @_ZN1DD1Ev
58 // CHECK: call void @_ZN1DD1Ev
Anders Carlssona303f9e2009-08-16 03:53:54 +000059 D()();
60}
Anders Carlsson6f680272009-08-16 03:42:12 +000061
Anders Carlsson2d46eb22009-08-16 04:11:06 +000062// Overloaded operators
63struct E {
64 E();
65 ~E();
66 E operator+(const E&);
67 E operator!();
68};
69
Anders Carlsson2d46eb22009-08-16 04:11:06 +000070void f5() {
Anders Carlssonfa4f5502009-10-18 21:11:11 +000071 // CHECK: call void @_ZN1EC1Ev
72 // CHECK: call void @_ZN1EC1Ev
73 // CHECK: call void @_ZN1ED1Ev
74 // CHECK: call void @_ZN1ED1Ev
75 // CHECK: call void @_ZN1ED1Ev
Anders Carlsson2d46eb22009-08-16 04:11:06 +000076 E() + E();
Anders Carlssonfa4f5502009-10-18 21:11:11 +000077
78 // CHECK: call void @_ZN1EC1Ev
79 // CHECK: call void @_ZN1ED1Ev
80 // CHECK: call void @_ZN1ED1Ev
Anders Carlsson2d46eb22009-08-16 04:11:06 +000081 !E();
82}
Anders Carlsson6f680272009-08-16 03:42:12 +000083
Anders Carlsson283e4d52009-09-14 01:30:44 +000084struct F {
85 F();
86 ~F();
87 F& f();
88};
89
Anders Carlsson283e4d52009-09-14 01:30:44 +000090void f6() {
Anders Carlssonfa4f5502009-10-18 21:11:11 +000091 // CHECK: call void @_ZN1FC1Ev
92 // CHECK: call void @_ZN1FD1Ev
Anders Carlsson283e4d52009-09-14 01:30:44 +000093 F().f();
94}
95
Anders Carlsson4fa26842009-10-18 21:20:14 +000096struct G {
97 G();
98 G(A);
99 ~G();
100 operator A();
101};
102
103void a(const A&);
104
105void f7() {
106 // CHECK: call void @_ZN1AC1Ev
107 // CHECK: call void @_Z1aRK1A
108 // CHECK: call void @_ZN1AD1Ev
109 a(A());
110
111 // CHECK: call void @_ZN1GC1Ev
112 // CHECK: call void @_ZN1Gcv1AEv
113 // CHECK: call void @_Z1aRK1A
114 // CHECK: call void @_ZN1AD1Ev
115 // CHECK: call void @_ZN1GD1Ev
116 a(G());
117}
Anders Carlsson1faf6742009-11-06 04:11:09 +0000118
119namespace PR5077 {
120
121struct A {
122 A();
123 ~A();
124 int f();
125};
126
127void f();
128int g(const A&);
129
130struct B {
131 int a1;
132 int a2;
133 B();
Anders Carlsson5e1b9182009-11-06 04:19:02 +0000134 ~B();
Anders Carlsson1faf6742009-11-06 04:11:09 +0000135};
136
137B::B()
138 // CHECK: call void @_ZN6PR50771AC1Ev
139 // CHECK: call i32 @_ZN6PR50771A1fEv
140 // CHECK: call void @_ZN6PR50771AD1Ev
141 : a1(A().f())
142 // CHECK: call void @_ZN6PR50771AC1Ev
143 // CHECK: call i32 @_ZN6PR50771gERKNS_1AE
144 // CHECK: call void @_ZN6PR50771AD1Ev
145 , a2(g(A()))
146{
147 // CHECK: call void @_ZN6PR50771fEv
148 f();
149}
150
Anders Carlsson5e1b9182009-11-06 04:19:02 +0000151struct C {
152 C();
153
154 const B& b;
155};
156
157C::C()
158 // CHECK: call void @_ZN6PR50771BC1Ev
159 : b(B()) {
160 // CHECK: call void @_ZN6PR50771fEv
161 f();
162
163 // CHECK: call void @_ZN6PR50771BD1Ev
164}
Anders Carlsson03d8ed42009-11-13 04:34:45 +0000165}
Anders Carlsson5e1b9182009-11-06 04:19:02 +0000166
Anders Carlsson03d8ed42009-11-13 04:34:45 +0000167A f8() {
168 // CHECK: call void @_ZN1AC1Ev
169 // CHECK-NOT: call void @_ZN1AD1Ev
170 return A();
171 // CHECK: ret void
172}
Anders Carlsson5e1b9182009-11-06 04:19:02 +0000173
Anders Carlsson03d8ed42009-11-13 04:34:45 +0000174struct H {
175 H();
176 ~H();
177 H(const H&);
178};
179
180void f9(H h) {
181 // CHECK: call void @_ZN1HC1Ev
182 // CHECK: call void @_Z2f91H
183 // CHECK: call void @_ZN1HD1Ev
184 f9(H());
185
186 // CHECK: call void @_ZN1HC1ERKS_
187 // CHECK: call void @_Z2f91H
188 // CHECK: call void @_ZN1HD1Ev
189 f9(h);
Anders Carlsson1faf6742009-11-06 04:11:09 +0000190}
Anders Carlsson4b3cbea2009-11-13 17:04:35 +0000191
192void f10(const H&);
193
194void f11(H h) {
195 // CHECK: call void @_ZN1HC1Ev
196 // CHECK: call void @_Z3f10RK1H
197 // CHECK: call void @_ZN1HD1Ev
198 f10(H());
199
200 // CHECK: call void @_Z3f10RK1H
201 // CHECK-NOT: call void @_ZN1HD1Ev
202 // CHECK: ret void
203 f10(h);
204}