temporaries.cpp revision 8f51a4f2d00b0abda3cde7f3828fb2e2b9beafb5
1// RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin9 | FileCheck %s
2struct A {
3  A();
4  ~A();
5  void f();
6};
7
8void f1() {
9  // CHECK: call void @_ZN1AC1Ev
10  // CHECK: call void @_ZN1AD1Ev
11  (void)A();
12
13  // CHECK: call void @_ZN1AC1Ev
14  // CHECK: call void @_ZN1AD1Ev
15  A().f();
16}
17
18// Function calls
19struct B {
20  B();
21  ~B();
22};
23
24B g();
25
26void f2() {
27  // CHECK-NOT: call void @_ZN1BC1Ev
28  // CHECK: call void @_ZN1BD1Ev
29  (void)g();
30}
31
32// Member function calls
33struct C {
34  C();
35  ~C();
36
37  C f();
38};
39
40void f3() {
41  // CHECK: call void @_ZN1CC1Ev
42  // CHECK: call void @_ZN1CD1Ev
43  // CHECK: call void @_ZN1CD1Ev
44  C().f();
45}
46
47// Function call operator
48struct D {
49  D();
50  ~D();
51
52  D operator()();
53};
54
55void f4() {
56  // CHECK: call void @_ZN1DC1Ev
57  // CHECK: call void @_ZN1DD1Ev
58  // CHECK: call void @_ZN1DD1Ev
59  D()();
60}
61
62// Overloaded operators
63struct E {
64  E();
65  ~E();
66  E operator+(const E&);
67  E operator!();
68};
69
70void f5() {
71  // CHECK: call void @_ZN1EC1Ev
72  // CHECK: call void @_ZN1EC1Ev
73  // CHECK: call void @_ZN1ED1Ev
74  // CHECK: call void @_ZN1ED1Ev
75  // CHECK: call void @_ZN1ED1Ev
76  E() + E();
77
78  // CHECK: call void @_ZN1EC1Ev
79  // CHECK: call void @_ZN1ED1Ev
80  // CHECK: call void @_ZN1ED1Ev
81  !E();
82}
83
84struct F {
85  F();
86  ~F();
87  F& f();
88};
89
90void f6() {
91  // CHECK: call void @_ZN1FC1Ev
92  // CHECK: call void @_ZN1FD1Ev
93  F().f();
94}
95
96struct 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}
118
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();
134  ~B();
135};
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
151struct 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}
165}
166
167A f8() {
168  // CHECK: call void @_ZN1AC1Ev
169  // CHECK-NOT: call void @_ZN1AD1Ev
170  return A();
171  // CHECK: ret void
172}
173
174struct 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);
190}
191
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}
205
206// PR5808
207struct I {
208  I(const char *);
209  ~I();
210};
211
212// CHECK: _Z3f12v
213I f12() {
214  // CHECK: call void @_ZN1IC1EPKc
215  // CHECK-NOT: call void @_ZN1ID1Ev
216  // CHECK: ret void
217  return "Hello";
218}
219
220// PR5867
221namespace PR5867 {
222  struct S {
223    S();
224    S(const S &);
225    ~S();
226  };
227
228  void f(S, int);
229  // CHECK: define void @_ZN6PR58671gEv
230  void g() {
231    // CHECK: call void @_ZN6PR58671SC1Ev
232    // CHECK-NEXT: call void @_ZN6PR58671fENS_1SEi
233    // CHECK-NEXT: call void @_ZN6PR58671SD1Ev
234    // CHECK-NEXT: ret void
235    (f)(S(), 0);
236  }
237
238  // CHECK: define linkonce_odr void @_ZN6PR58672g2IiEEvT_
239  template<typename T>
240  void g2(T) {
241    // CHECK: call void @_ZN6PR58671SC1Ev
242    // CHECK-NEXT: call void @_ZN6PR58671fENS_1SEi
243    // CHECK-NEXT: call void @_ZN6PR58671SD1Ev
244    // CHECK-NEXT: ret void
245    (f)(S(), 0);
246  }
247
248  void h() {
249    g2(17);
250  }
251}
252
253// PR6199
254namespace PR6199 {
255  struct A { ~A(); };
256
257  struct B { operator A(); };
258
259  // CHECK: define weak_odr void @_ZN6PR61992f2IiEENS_1AET_
260  template<typename T> A f2(T) {
261    B b;
262    // CHECK: call void @_ZN6PR61991BcvNS_1AEEv
263    // CHECK-NEXT: ret void
264    return b;
265  }
266
267  template A f2<int>(int);
268
269}
270
271namespace T12 {
272
273struct A {
274  A();
275  ~A();
276  int f();
277};
278
279int& f(int);
280
281// CHECK: define void @_ZN3T121gEv
282void g() {
283  // CHECK: call void @_ZN3T121AC1Ev
284  // CHECK-NEXT: call i32 @_ZN3T121A1fEv(
285  // CHECK-NEXT: call i32* @_ZN3T121fEi(
286  // CHECK-NEXT: call void @_ZN3T121AD1Ev(
287  int& i = f(A().f());
288}
289
290}
291