]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/CodeGenCXX/temporaries.cpp
Update clang to r100181.
[FreeBSD/FreeBSD.git] / test / CodeGenCXX / temporaries.cpp
1 // RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin9 | FileCheck %s
2 struct A {
3   A();
4   ~A();
5   void f();
6 };
7
8 void 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
19 struct B {
20   B();
21   ~B();
22 };
23
24 B g();
25
26 void f2() {
27   // CHECK-NOT: call void @_ZN1BC1Ev
28   // CHECK: call void @_ZN1BD1Ev
29   (void)g();
30 }
31
32 // Member function calls
33 struct C {
34   C();
35   ~C();
36   
37   C f();
38 };
39
40 void 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
48 struct D {
49   D();
50   ~D();
51   
52   D operator()();
53 };
54
55 void f4() {
56   // CHECK: call void @_ZN1DC1Ev
57   // CHECK: call void @_ZN1DD1Ev
58   // CHECK: call void @_ZN1DD1Ev
59   D()();
60 }
61
62 // Overloaded operators
63 struct E {
64   E();
65   ~E();
66   E operator+(const E&);
67   E operator!();
68 };
69
70 void 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
84 struct F {
85   F();
86   ~F();
87   F& f();
88 };
89
90 void f6() {
91   // CHECK: call void @_ZN1FC1Ev
92   // CHECK: call void @_ZN1FD1Ev
93   F().f();
94 }
95
96 struct G {
97   G();
98   G(A);
99   ~G();
100   operator A();
101 };
102
103 void a(const A&);
104
105 void 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
119 namespace PR5077 {
120
121 struct A {
122   A();
123   ~A();
124   int f();
125 };
126
127 void f();
128 int g(const A&);
129
130 struct B {
131   int a1;
132   int a2;
133   B();
134   ~B();
135 };
136
137 B::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   
151 struct C {
152   C();
153   
154   const B& b;
155 };
156
157 C::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
167 A f8() {
168   // CHECK: call void @_ZN1AC1Ev
169   // CHECK-NOT: call void @_ZN1AD1Ev
170   return A();
171   // CHECK: ret void
172 }
173
174 struct H {
175   H();
176   ~H();
177   H(const H&);
178 };
179
180 void 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
192 void f10(const H&);
193
194 void 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
207 struct I {
208   I(const char *);
209   ~I();
210 };
211
212 // CHECK: _Z3f12v
213 I f12() {
214   // CHECK: call void @_ZN1IC1EPKc
215   // CHECK-NOT: call void @_ZN1ID1Ev
216   // CHECK: ret void
217   return "Hello";
218 }
219
220 // PR5867
221 namespace 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
254 namespace 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
271 namespace T12 {
272
273 struct A { 
274   A(); 
275   ~A();
276   int f();
277 };
278
279 int& f(int);
280
281 // CHECK: define void @_ZN3T121gEv
282 void 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
292 namespace PR6648 {
293   struct B {
294     ~B();
295   };
296   B foo;
297   struct D;
298   D& zed(B);
299   void foobar() {
300     // CHECK: call %"struct.PR6648::D"* @_ZN6PR66483zedENS_1BE
301     zed(foo);
302   }
303 }