blob: c537124c468c8d97bd8df50a9d385538efb71de9 [file] [log] [blame]
Richard Smith4e43dec2013-06-03 00:17:11 +00001// RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin9 -std=c++11 | FileCheck %s
Richard Smithd6b69872013-06-15 00:30:29 +00002
3namespace PR16263 {
4 const unsigned int n = 1234;
5 extern const int &r = (const int&)n;
Stephen Hines0e2c34f2015-03-23 12:09:02 -07006 // CHECK: @_ZGRN7PR162631rE_ = internal constant i32 1234,
Stephen Hines6bcf27b2014-05-29 04:14:42 -07007 // CHECK: @_ZN7PR162631rE = constant i32* @_ZGRN7PR162631rE_,
Richard Smithd6b69872013-06-15 00:30:29 +00008
9 extern const int &s = reinterpret_cast<const int&>(n);
10 // CHECK: @_ZN7PR16263L1nE = internal constant i32 1234, align 4
11 // CHECK: @_ZN7PR162631sE = constant i32* @_ZN7PR16263L1nE, align 8
12
13 struct A { int n; };
14 struct B { int n; };
15 struct C : A, B {};
16 extern const A &&a = (A&&)(A&&)(C&&)(C{});
Stephen Hines0e2c34f2015-03-23 12:09:02 -070017 // CHECK: @_ZGRN7PR162631aE_ = internal global {{.*}} zeroinitializer,
Stephen Hines6bcf27b2014-05-29 04:14:42 -070018 // CHECK: @_ZN7PR162631aE = constant {{.*}} bitcast ({{.*}}* @_ZGRN7PR162631aE_ to
Richard Smithd6b69872013-06-15 00:30:29 +000019
20 extern const int &&t = ((B&&)C{}).n;
Stephen Hines0e2c34f2015-03-23 12:09:02 -070021 // CHECK: @_ZGRN7PR162631tE_ = internal global {{.*}} zeroinitializer,
Stephen Hines6bcf27b2014-05-29 04:14:42 -070022 // CHECK: @_ZN7PR162631tE = constant i32* {{.*}}* @_ZGRN7PR162631tE_ {{.*}} 4
Richard Smithd6b69872013-06-15 00:30:29 +000023
24 struct D { double d; C c; };
25 extern const int &&u = (123, static_cast<B&&>(0, ((D&&)D{}).*&D::c).n);
Stephen Hines0e2c34f2015-03-23 12:09:02 -070026 // CHECK: @_ZGRN7PR162631uE_ = internal global {{.*}} zeroinitializer
Stephen Hines6bcf27b2014-05-29 04:14:42 -070027 // CHECK: @_ZN7PR162631uE = constant i32* {{.*}} @_ZGRN7PR162631uE_ {{.*}} 12
Richard Smithd6b69872013-06-15 00:30:29 +000028}
29
Stephen Hinesc568f1e2014-07-21 00:47:37 -070030namespace PR20227 {
31 struct A { ~A(); };
32 struct B { virtual ~B(); };
33 struct C : B {};
34
35 A &&a = dynamic_cast<A&&>(A{});
Stephen Hines0e2c34f2015-03-23 12:09:02 -070036 // CHECK: @_ZGRN7PR202271aE_ = internal global
Stephen Hinesc568f1e2014-07-21 00:47:37 -070037
38 B &&b = dynamic_cast<C&&>(dynamic_cast<B&&>(C{}));
Stephen Hines0e2c34f2015-03-23 12:09:02 -070039 // CHECK: @_ZGRN7PR202271bE_ = internal global
Stephen Hinesc568f1e2014-07-21 00:47:37 -070040
41 B &&c = static_cast<C&&>(static_cast<B&&>(C{}));
Stephen Hines0e2c34f2015-03-23 12:09:02 -070042 // CHECK: @_ZGRN7PR202271cE_ = internal global
43}
44
45namespace BraceInit {
46 typedef const int &CIR;
47 CIR x = CIR{3};
48 // CHECK: @_ZGRN9BraceInit1xE_ = internal constant i32 3
49 // CHECK: @_ZN9BraceInit1xE = constant i32* @_ZGRN9BraceInit1xE_
Stephen Hinesc568f1e2014-07-21 00:47:37 -070050}
51
Anders Carlsson7a039eb2009-08-15 22:30:50 +000052struct A {
53 A();
54 ~A();
55 void f();
56};
57
Anders Carlssonec74c592009-08-16 03:06:32 +000058void f1() {
Anders Carlssonfa4f5502009-10-18 21:11:11 +000059 // CHECK: call void @_ZN1AC1Ev
60 // CHECK: call void @_ZN1AD1Ev
Anders Carlssonec74c592009-08-16 03:06:32 +000061 (void)A();
Anders Carlssonfa4f5502009-10-18 21:11:11 +000062
63 // CHECK: call void @_ZN1AC1Ev
64 // CHECK: call void @_ZN1AD1Ev
Anders Carlsson7a039eb2009-08-15 22:30:50 +000065 A().f();
66}
Anders Carlssonec74c592009-08-16 03:06:32 +000067
Anders Carlsson6f680272009-08-16 03:42:12 +000068// Function calls
Anders Carlssonec74c592009-08-16 03:06:32 +000069struct B {
70 B();
71 ~B();
72};
73
74B g();
75
Anders Carlssonec74c592009-08-16 03:06:32 +000076void f2() {
Anders Carlssonfa4f5502009-10-18 21:11:11 +000077 // CHECK-NOT: call void @_ZN1BC1Ev
78 // CHECK: call void @_ZN1BD1Ev
Anders Carlssonec74c592009-08-16 03:06:32 +000079 (void)g();
80}
81
Anders Carlsson6f680272009-08-16 03:42:12 +000082// Member function calls
83struct C {
84 C();
85 ~C();
86
87 C f();
88};
89
Anders Carlsson6f680272009-08-16 03:42:12 +000090void f3() {
Anders Carlssonfa4f5502009-10-18 21:11:11 +000091 // CHECK: call void @_ZN1CC1Ev
92 // CHECK: call void @_ZN1CD1Ev
93 // CHECK: call void @_ZN1CD1Ev
Anders Carlsson6f680272009-08-16 03:42:12 +000094 C().f();
95}
96
Anders Carlssona303f9e2009-08-16 03:53:54 +000097// Function call operator
98struct D {
99 D();
100 ~D();
101
102 D operator()();
103};
104
Anders Carlssona303f9e2009-08-16 03:53:54 +0000105void f4() {
Benjamin Kramer3114af32009-10-31 20:42:26 +0000106 // CHECK: call void @_ZN1DC1Ev
107 // CHECK: call void @_ZN1DD1Ev
108 // CHECK: call void @_ZN1DD1Ev
Anders Carlssona303f9e2009-08-16 03:53:54 +0000109 D()();
110}
Anders Carlsson6f680272009-08-16 03:42:12 +0000111
Anders Carlsson2d46eb22009-08-16 04:11:06 +0000112// Overloaded operators
113struct E {
114 E();
115 ~E();
116 E operator+(const E&);
117 E operator!();
118};
119
Anders Carlsson2d46eb22009-08-16 04:11:06 +0000120void f5() {
Anders Carlssonfa4f5502009-10-18 21:11:11 +0000121 // CHECK: call void @_ZN1EC1Ev
122 // CHECK: call void @_ZN1EC1Ev
123 // CHECK: call void @_ZN1ED1Ev
124 // CHECK: call void @_ZN1ED1Ev
125 // CHECK: call void @_ZN1ED1Ev
Anders Carlsson2d46eb22009-08-16 04:11:06 +0000126 E() + E();
Anders Carlssonfa4f5502009-10-18 21:11:11 +0000127
128 // CHECK: call void @_ZN1EC1Ev
129 // CHECK: call void @_ZN1ED1Ev
130 // CHECK: call void @_ZN1ED1Ev
Anders Carlsson2d46eb22009-08-16 04:11:06 +0000131 !E();
132}
Anders Carlsson6f680272009-08-16 03:42:12 +0000133
Anders Carlsson283e4d52009-09-14 01:30:44 +0000134struct F {
135 F();
136 ~F();
137 F& f();
138};
139
Anders Carlsson283e4d52009-09-14 01:30:44 +0000140void f6() {
Anders Carlssonfa4f5502009-10-18 21:11:11 +0000141 // CHECK: call void @_ZN1FC1Ev
142 // CHECK: call void @_ZN1FD1Ev
Anders Carlsson283e4d52009-09-14 01:30:44 +0000143 F().f();
144}
145
Anders Carlsson4fa26842009-10-18 21:20:14 +0000146struct G {
147 G();
148 G(A);
149 ~G();
150 operator A();
151};
152
153void a(const A&);
154
155void f7() {
156 // CHECK: call void @_ZN1AC1Ev
157 // CHECK: call void @_Z1aRK1A
158 // CHECK: call void @_ZN1AD1Ev
159 a(A());
160
161 // CHECK: call void @_ZN1GC1Ev
162 // CHECK: call void @_ZN1Gcv1AEv
163 // CHECK: call void @_Z1aRK1A
164 // CHECK: call void @_ZN1AD1Ev
165 // CHECK: call void @_ZN1GD1Ev
166 a(G());
167}
Anders Carlsson1faf6742009-11-06 04:11:09 +0000168
169namespace PR5077 {
170
171struct A {
172 A();
173 ~A();
174 int f();
175};
176
177void f();
178int g(const A&);
179
180struct B {
181 int a1;
182 int a2;
183 B();
Anders Carlsson5e1b9182009-11-06 04:19:02 +0000184 ~B();
Anders Carlsson1faf6742009-11-06 04:11:09 +0000185};
186
187B::B()
188 // CHECK: call void @_ZN6PR50771AC1Ev
189 // CHECK: call i32 @_ZN6PR50771A1fEv
190 // CHECK: call void @_ZN6PR50771AD1Ev
191 : a1(A().f())
192 // CHECK: call void @_ZN6PR50771AC1Ev
193 // CHECK: call i32 @_ZN6PR50771gERKNS_1AE
194 // CHECK: call void @_ZN6PR50771AD1Ev
195 , a2(g(A()))
196{
197 // CHECK: call void @_ZN6PR50771fEv
198 f();
199}
200
Anders Carlsson5e1b9182009-11-06 04:19:02 +0000201struct C {
202 C();
203
204 const B& b;
205};
206
207C::C()
208 // CHECK: call void @_ZN6PR50771BC1Ev
209 : b(B()) {
210 // CHECK: call void @_ZN6PR50771fEv
211 f();
212
213 // CHECK: call void @_ZN6PR50771BD1Ev
214}
Anders Carlsson03d8ed42009-11-13 04:34:45 +0000215}
Anders Carlsson5e1b9182009-11-06 04:19:02 +0000216
Anders Carlsson03d8ed42009-11-13 04:34:45 +0000217A f8() {
218 // CHECK: call void @_ZN1AC1Ev
219 // CHECK-NOT: call void @_ZN1AD1Ev
220 return A();
221 // CHECK: ret void
222}
Anders Carlsson5e1b9182009-11-06 04:19:02 +0000223
Anders Carlsson03d8ed42009-11-13 04:34:45 +0000224struct H {
225 H();
226 ~H();
227 H(const H&);
228};
229
230void f9(H h) {
231 // CHECK: call void @_ZN1HC1Ev
232 // CHECK: call void @_Z2f91H
233 // CHECK: call void @_ZN1HD1Ev
234 f9(H());
235
236 // CHECK: call void @_ZN1HC1ERKS_
237 // CHECK: call void @_Z2f91H
238 // CHECK: call void @_ZN1HD1Ev
239 f9(h);
Anders Carlsson1faf6742009-11-06 04:11:09 +0000240}
Anders Carlsson4b3cbea2009-11-13 17:04:35 +0000241
242void f10(const H&);
243
244void f11(H h) {
245 // CHECK: call void @_ZN1HC1Ev
246 // CHECK: call void @_Z3f10RK1H
247 // CHECK: call void @_ZN1HD1Ev
248 f10(H());
249
250 // CHECK: call void @_Z3f10RK1H
251 // CHECK-NOT: call void @_ZN1HD1Ev
252 // CHECK: ret void
253 f10(h);
Daniel Dunbara5728872009-12-15 20:14:24 +0000254}
Douglas Gregor18ef5e22009-12-18 05:02:21 +0000255
256// PR5808
257struct I {
258 I(const char *);
259 ~I();
260};
261
262// CHECK: _Z3f12v
263I f12() {
264 // CHECK: call void @_ZN1IC1EPKc
265 // CHECK-NOT: call void @_ZN1ID1Ev
266 // CHECK: ret void
267 return "Hello";
268}
Douglas Gregor65552c42009-12-24 17:16:46 +0000269
270// PR5867
271namespace PR5867 {
272 struct S {
273 S();
274 S(const S &);
275 ~S();
276 };
277
278 void f(S, int);
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000279 // CHECK-LABEL: define void @_ZN6PR58671gEv
Douglas Gregor65552c42009-12-24 17:16:46 +0000280 void g() {
281 // CHECK: call void @_ZN6PR58671SC1Ev
282 // CHECK-NEXT: call void @_ZN6PR58671fENS_1SEi
283 // CHECK-NEXT: call void @_ZN6PR58671SD1Ev
284 // CHECK-NEXT: ret void
285 (f)(S(), 0);
286 }
Douglas Gregor51326552009-12-24 18:51:59 +0000287
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000288 // CHECK-LABEL: define linkonce_odr void @_ZN6PR58672g2IiEEvT_
Douglas Gregor51326552009-12-24 18:51:59 +0000289 template<typename T>
290 void g2(T) {
291 // CHECK: call void @_ZN6PR58671SC1Ev
292 // CHECK-NEXT: call void @_ZN6PR58671fENS_1SEi
293 // CHECK-NEXT: call void @_ZN6PR58671SD1Ev
294 // CHECK-NEXT: ret void
295 (f)(S(), 0);
296 }
297
298 void h() {
299 g2(17);
300 }
Douglas Gregor65552c42009-12-24 17:16:46 +0000301}
Anders Carlsson2e13db82010-02-02 07:10:35 +0000302
303// PR6199
304namespace PR6199 {
305 struct A { ~A(); };
306
307 struct B { operator A(); };
308
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000309 // CHECK-LABEL: define weak_odr void @_ZN6PR61992f2IiEENS_1AET_
Anders Carlsson2e13db82010-02-02 07:10:35 +0000310 template<typename T> A f2(T) {
311 B b;
312 // CHECK: call void @_ZN6PR61991BcvNS_1AEEv
313 // CHECK-NEXT: ret void
314 return b;
315 }
316
317 template A f2<int>(int);
318
319}
Anders Carlsson0dc73662010-02-04 17:32:58 +0000320
321namespace T12 {
322
323struct A {
324 A();
325 ~A();
326 int f();
327};
328
329int& f(int);
330
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000331// CHECK-LABEL: define void @_ZN3T121gEv
Anders Carlsson0dc73662010-02-04 17:32:58 +0000332void g() {
333 // CHECK: call void @_ZN3T121AC1Ev
334 // CHECK-NEXT: call i32 @_ZN3T121A1fEv(
Stephen Hines176edba2014-12-01 14:53:08 -0800335 // CHECK-NEXT: call dereferenceable({{[0-9]+}}) i32* @_ZN3T121fEi(
Anders Carlsson0dc73662010-02-04 17:32:58 +0000336 // CHECK-NEXT: call void @_ZN3T121AD1Ev(
337 int& i = f(A().f());
338}
339
340}
Rafael Espindola8682bda2010-03-21 17:11:05 +0000341
342namespace PR6648 {
343 struct B {
344 ~B();
345 };
346 B foo;
347 struct D;
348 D& zed(B);
349 void foobar() {
Stephen Hinesc568f1e2014-07-21 00:47:37 -0700350 // CHECK: call nonnull %"struct.PR6648::D"* @_ZN6PR66483zedENS_1BE
Rafael Espindola8682bda2010-03-21 17:11:05 +0000351 zed(foo);
352 }
353}
Douglas Gregorb86cf0c2010-04-25 00:55:24 +0000354
355namespace UserConvertToValue {
356 struct X {
357 X(int);
358 X(const X&);
359 ~X();
360 };
361
362 void f(X);
363
364 // CHECK: void @_ZN18UserConvertToValue1gEv()
365 void g() {
366 // CHECK: call void @_ZN18UserConvertToValue1XC1Ei
367 // CHECK: call void @_ZN18UserConvertToValue1fENS_1XE
368 // CHECK: call void @_ZN18UserConvertToValue1XD1Ev
Douglas Gregor9994eed2010-04-25 00:56:07 +0000369 // CHECK: ret void
Douglas Gregorb86cf0c2010-04-25 00:55:24 +0000370 f(1);
371 }
372}
Douglas Gregored8abf12010-07-08 06:14:04 +0000373
374namespace PR7556 {
375 struct A { ~A(); };
376 struct B { int i; ~B(); };
377 struct C { int C::*pm; ~C(); };
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000378 // CHECK-LABEL: define void @_ZN6PR75563fooEv()
Douglas Gregored8abf12010-07-08 06:14:04 +0000379 void foo() {
380 // CHECK: call void @_ZN6PR75561AD1Ev
381 A();
382 // CHECK: call void @llvm.memset.p0i8.i64
383 // CHECK: call void @_ZN6PR75561BD1Ev
384 B();
385 // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
386 // CHECK: call void @_ZN6PR75561CD1Ev
387 C();
388 // CHECK-NEXT: ret void
389 }
390}
John McCall558d2ab2010-09-15 10:14:12 +0000391
392namespace Elision {
John McCallfc1e6c72010-09-18 00:58:34 +0000393 struct A {
394 A(); A(const A &); ~A();
395 void *p;
396 void foo() const;
397 };
John McCall558d2ab2010-09-15 10:14:12 +0000398
399 void foo();
400 A fooA();
John McCall19e60ad2010-09-16 06:57:56 +0000401 void takeA(A a);
John McCall558d2ab2010-09-15 10:14:12 +0000402
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000403 // CHECK-LABEL: define void @_ZN7Elision5test0Ev()
John McCall558d2ab2010-09-15 10:14:12 +0000404 void test0() {
405 // CHECK: [[I:%.*]] = alloca [[A:%.*]], align 8
John McCall465e8c12010-09-15 10:38:11 +0000406 // CHECK-NEXT: [[J:%.*]] = alloca [[A]], align 8
407 // CHECK-NEXT: [[T0:%.*]] = alloca [[A]], align 8
408 // CHECK-NEXT: [[K:%.*]] = alloca [[A]], align 8
409 // CHECK-NEXT: [[T1:%.*]] = alloca [[A]], align 8
John McCall558d2ab2010-09-15 10:14:12 +0000410
411 // CHECK-NEXT: call void @_ZN7Elision3fooEv()
412 // CHECK-NEXT: call void @_ZN7Elision1AC1Ev([[A]]* [[I]])
413 A i = (foo(), A());
414
415 // CHECK-NEXT: call void @_ZN7Elision4fooAEv([[A]]* sret [[T0]])
416 // CHECK-NEXT: call void @_ZN7Elision1AC1Ev([[A]]* [[J]])
417 // CHECK-NEXT: call void @_ZN7Elision1AD1Ev([[A]]* [[T0]])
418 A j = (fooA(), A());
419
420 // CHECK-NEXT: call void @_ZN7Elision1AC1Ev([[A]]* [[T1]])
421 // CHECK-NEXT: call void @_ZN7Elision4fooAEv([[A]]* sret [[K]])
422 // CHECK-NEXT: call void @_ZN7Elision1AD1Ev([[A]]* [[T1]])
423 A k = (A(), fooA());
424
425 // CHECK-NEXT: call void @_ZN7Elision1AD1Ev([[A]]* [[K]])
426 // CHECK-NEXT: call void @_ZN7Elision1AD1Ev([[A]]* [[J]])
427 // CHECK-NEXT: call void @_ZN7Elision1AD1Ev([[A]]* [[I]])
428 }
429
430
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000431 // CHECK-LABEL: define void @_ZN7Elision5test1EbNS_1AE(
John McCall558d2ab2010-09-15 10:14:12 +0000432 void test1(bool c, A x) {
John McCall465e8c12010-09-15 10:38:11 +0000433 // CHECK: [[I:%.*]] = alloca [[A]], align 8
434 // CHECK-NEXT: [[J:%.*]] = alloca [[A]], align 8
John McCall558d2ab2010-09-15 10:14:12 +0000435
436 // CHECK: call void @_ZN7Elision1AC1Ev([[A]]* [[I]])
Stephen Hines176edba2014-12-01 14:53:08 -0800437 // CHECK: call void @_ZN7Elision1AC1ERKS0_([[A]]* [[I]], [[A]]* dereferenceable({{[0-9]+}}) [[X:%.*]])
John McCall558d2ab2010-09-15 10:14:12 +0000438 A i = (c ? A() : x);
439
Stephen Hines176edba2014-12-01 14:53:08 -0800440 // CHECK: call void @_ZN7Elision1AC1ERKS0_([[A]]* [[J]], [[A]]* dereferenceable({{[0-9]+}}) [[X]])
John McCall558d2ab2010-09-15 10:14:12 +0000441 // CHECK: call void @_ZN7Elision1AC1Ev([[A]]* [[J]])
442 A j = (c ? x : A());
443
444 // CHECK: call void @_ZN7Elision1AD1Ev([[A]]* [[J]])
445 // CHECK-NEXT: call void @_ZN7Elision1AD1Ev([[A]]* [[I]])
446 }
447
Bill Wendling5e314742013-01-31 23:17:12 +0000448 // CHECK: define void @_ZN7Elision5test2Ev([[A]]* noalias sret
John McCall558d2ab2010-09-15 10:14:12 +0000449 A test2() {
450 // CHECK: call void @_ZN7Elision3fooEv()
451 // CHECK-NEXT: call void @_ZN7Elision1AC1Ev([[A]]* [[RET:%.*]])
452 // CHECK-NEXT: ret void
453 return (foo(), A());
454 }
455
Bill Wendling5e314742013-01-31 23:17:12 +0000456 // CHECK: define void @_ZN7Elision5test3EiNS_1AE([[A]]* noalias sret
John McCall558d2ab2010-09-15 10:14:12 +0000457 A test3(int v, A x) {
458 if (v < 5)
459 // CHECK: call void @_ZN7Elision1AC1Ev([[A]]* [[RET:%.*]])
Stephen Hines176edba2014-12-01 14:53:08 -0800460 // CHECK: call void @_ZN7Elision1AC1ERKS0_([[A]]* [[RET]], [[A]]* dereferenceable({{[0-9]+}}) [[X:%.*]])
John McCall558d2ab2010-09-15 10:14:12 +0000461 return (v < 0 ? A() : x);
462 else
Stephen Hines176edba2014-12-01 14:53:08 -0800463 // CHECK: call void @_ZN7Elision1AC1ERKS0_([[A]]* [[RET]], [[A]]* dereferenceable({{[0-9]+}}) [[X]])
John McCall558d2ab2010-09-15 10:14:12 +0000464 // CHECK: call void @_ZN7Elision1AC1Ev([[A]]* [[RET]])
465 return (v > 10 ? x : A());
466
467 // CHECK: ret void
468 }
469
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000470 // CHECK-LABEL: define void @_ZN7Elision5test4Ev()
John McCall558d2ab2010-09-15 10:14:12 +0000471 void test4() {
472 // CHECK: [[X:%.*]] = alloca [[A]], align 8
473 // CHECK-NEXT: [[XS:%.*]] = alloca [2 x [[A]]], align 16
John McCall558d2ab2010-09-15 10:14:12 +0000474
475 // CHECK-NEXT: call void @_ZN7Elision1AC1Ev([[A]]* [[X]])
476 A x;
477
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700478 // CHECK-NEXT: [[XS0:%.*]] = getelementptr inbounds [2 x [[A]]], [2 x [[A]]]* [[XS]], i64 0, i64 0
John McCall558d2ab2010-09-15 10:14:12 +0000479 // CHECK-NEXT: call void @_ZN7Elision1AC1Ev([[A]]* [[XS0]])
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700480 // CHECK-NEXT: [[XS1:%.*]] = getelementptr inbounds [[A]], [[A]]* [[XS0]], i64 1
Stephen Hines176edba2014-12-01 14:53:08 -0800481 // CHECK-NEXT: call void @_ZN7Elision1AC1ERKS0_([[A]]* [[XS1]], [[A]]* dereferenceable({{[0-9]+}}) [[X]])
John McCall558d2ab2010-09-15 10:14:12 +0000482 A xs[] = { A(), x };
483
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700484 // CHECK-NEXT: [[BEGIN:%.*]] = getelementptr inbounds [2 x [[A]]], [2 x [[A]]]* [[XS]], i32 0, i32 0
485 // CHECK-NEXT: [[END:%.*]] = getelementptr inbounds [[A]], [[A]]* [[BEGIN]], i64 2
John McCall558d2ab2010-09-15 10:14:12 +0000486 // CHECK-NEXT: br label
John McCallbdc4d802011-07-09 01:37:26 +0000487 // CHECK: [[AFTER:%.*]] = phi [[A]]*
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700488 // CHECK-NEXT: [[CUR:%.*]] = getelementptr inbounds [[A]], [[A]]* [[AFTER]], i64 -1
John McCallbdc4d802011-07-09 01:37:26 +0000489 // CHECK-NEXT: call void @_ZN7Elision1AD1Ev([[A]]* [[CUR]])
490 // CHECK-NEXT: [[T0:%.*]] = icmp eq [[A]]* [[CUR]], [[BEGIN]]
491 // CHECK-NEXT: br i1 [[T0]],
John McCall558d2ab2010-09-15 10:14:12 +0000492
493 // CHECK: call void @_ZN7Elision1AD1Ev([[A]]* [[X]])
494 }
John McCall19e60ad2010-09-16 06:57:56 +0000495
496 // rdar://problem/8433352
Bill Wendling5e314742013-01-31 23:17:12 +0000497 // CHECK: define void @_ZN7Elision5test5Ev([[A]]* noalias sret
John McCall19e60ad2010-09-16 06:57:56 +0000498 struct B { A a; B(); };
499 A test5() {
500 // CHECK: [[AT0:%.*]] = alloca [[A]], align 8
501 // CHECK-NEXT: [[BT0:%.*]] = alloca [[B:%.*]], align 8
502 // CHECK-NEXT: [[X:%.*]] = alloca [[A]], align 8
503 // CHECK-NEXT: [[BT1:%.*]] = alloca [[B]], align 8
504 // CHECK-NEXT: [[BT2:%.*]] = alloca [[B]], align 8
505
506 // CHECK: call void @_ZN7Elision1BC1Ev([[B]]* [[BT0]])
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700507 // CHECK-NEXT: [[AM:%.*]] = getelementptr inbounds [[B]], [[B]]* [[BT0]], i32 0, i32 0
Stephen Hines176edba2014-12-01 14:53:08 -0800508 // CHECK-NEXT: call void @_ZN7Elision1AC1ERKS0_([[A]]* [[AT0]], [[A]]* dereferenceable({{[0-9]+}}) [[AM]])
John McCall19e60ad2010-09-16 06:57:56 +0000509 // CHECK-NEXT: call void @_ZN7Elision5takeAENS_1AE([[A]]* [[AT0]])
510 // CHECK-NEXT: call void @_ZN7Elision1AD1Ev([[A]]* [[AT0]])
511 // CHECK-NEXT: call void @_ZN7Elision1BD1Ev([[B]]* [[BT0]])
512 takeA(B().a);
513
514 // CHECK-NEXT: call void @_ZN7Elision1BC1Ev([[B]]* [[BT1]])
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700515 // CHECK-NEXT: [[AM:%.*]] = getelementptr inbounds [[B]], [[B]]* [[BT1]], i32 0, i32 0
Stephen Hines176edba2014-12-01 14:53:08 -0800516 // CHECK-NEXT: call void @_ZN7Elision1AC1ERKS0_([[A]]* [[X]], [[A]]* dereferenceable({{[0-9]+}}) [[AM]])
John McCall19e60ad2010-09-16 06:57:56 +0000517 // CHECK-NEXT: call void @_ZN7Elision1BD1Ev([[B]]* [[BT1]])
518 A x = B().a;
519
520 // CHECK-NEXT: call void @_ZN7Elision1BC1Ev([[B]]* [[BT2]])
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700521 // CHECK-NEXT: [[AM:%.*]] = getelementptr inbounds [[B]], [[B]]* [[BT2]], i32 0, i32 0
Stephen Hines176edba2014-12-01 14:53:08 -0800522 // CHECK-NEXT: call void @_ZN7Elision1AC1ERKS0_([[A]]* [[RET:%.*]], [[A]]* dereferenceable({{[0-9]+}}) [[AM]])
John McCall19e60ad2010-09-16 06:57:56 +0000523 // CHECK-NEXT: call void @_ZN7Elision1BD1Ev([[B]]* [[BT2]])
524 return B().a;
525
526 // CHECK: call void @_ZN7Elision1AD1Ev([[A]]* [[X]])
527 }
John McCallfc1e6c72010-09-18 00:58:34 +0000528
529 // Reduced from webkit.
530 // CHECK: define void @_ZN7Elision5test6EPKNS_1CE([[C:%.*]]*
531 struct C { operator A() const; };
532 void test6(const C *x) {
533 // CHECK: [[T0:%.*]] = alloca [[A]], align 8
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700534 // CHECK: [[X:%.*]] = load [[C]]*, [[C]]** {{%.*}}, align 8
John McCallfc1e6c72010-09-18 00:58:34 +0000535 // CHECK-NEXT: call void @_ZNK7Elision1CcvNS_1AEEv([[A]]* sret [[T0]], [[C]]* [[X]])
536 // CHECK-NEXT: call void @_ZNK7Elision1A3fooEv([[A]]* [[T0]])
537 // CHECK-NEXT: call void @_ZN7Elision1AD1Ev([[A]]* [[T0]])
538 // CHECK-NEXT: ret void
539 A(*x).foo();
540 }
John McCall558d2ab2010-09-15 10:14:12 +0000541}
John McCall74fb0ed2010-11-17 00:07:33 +0000542
543namespace PR8623 {
544 struct A { A(int); ~A(); };
545
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000546 // CHECK-LABEL: define void @_ZN6PR86233fooEb(
John McCall74fb0ed2010-11-17 00:07:33 +0000547 void foo(bool b) {
548 // CHECK: [[TMP:%.*]] = alloca [[A:%.*]], align 1
549 // CHECK-NEXT: [[LCONS:%.*]] = alloca i1
550 // CHECK-NEXT: [[RCONS:%.*]] = alloca i1
John McCall4bbcbda2011-01-26 19:15:39 +0000551 // CHECK: store i1 false, i1* [[LCONS]]
John McCall74fb0ed2010-11-17 00:07:33 +0000552 // CHECK-NEXT: store i1 false, i1* [[RCONS]]
John McCall4bbcbda2011-01-26 19:15:39 +0000553 // CHECK-NEXT: br i1
John McCall74fb0ed2010-11-17 00:07:33 +0000554 // CHECK: call void @_ZN6PR86231AC1Ei([[A]]* [[TMP]], i32 2)
555 // CHECK-NEXT: store i1 true, i1* [[LCONS]]
556 // CHECK-NEXT: br label
557 // CHECK: call void @_ZN6PR86231AC1Ei([[A]]* [[TMP]], i32 3)
558 // CHECK-NEXT: store i1 true, i1* [[RCONS]]
559 // CHECK-NEXT: br label
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700560 // CHECK: load i1, i1* [[RCONS]]
John McCall74fb0ed2010-11-17 00:07:33 +0000561 // CHECK-NEXT: br i1
562 // CHECK: call void @_ZN6PR86231AD1Ev([[A]]* [[TMP]])
John McCall74fb0ed2010-11-17 00:07:33 +0000563 // CHECK-NEXT: br label
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700564 // CHECK: load i1, i1* [[LCONS]]
John McCall74fb0ed2010-11-17 00:07:33 +0000565 // CHECK-NEXT: br i1
566 // CHECK: call void @_ZN6PR86231AD1Ev([[A]]* [[TMP]])
John McCall74fb0ed2010-11-17 00:07:33 +0000567 // CHECK-NEXT: br label
568 // CHECK: ret void
569 b ? A(2) : A(3);
570 }
571}
Peter Collingbournebceb7552011-11-27 22:09:28 +0000572
573namespace PR11365 {
574 struct A { A(); ~A(); };
575
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000576 // CHECK-LABEL: define void @_ZN7PR113653fooEv(
Peter Collingbournebceb7552011-11-27 22:09:28 +0000577 void foo() {
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700578 // CHECK: [[BEGIN:%.*]] = getelementptr inbounds [3 x [[A:%.*]]], [3 x [[A:%.*]]]* {{.*}}, i32 0, i32 0
579 // CHECK-NEXT: [[END:%.*]] = getelementptr inbounds [[A]], [[A]]* [[BEGIN]], i64 3
Peter Collingbournebceb7552011-11-27 22:09:28 +0000580 // CHECK-NEXT: br label
581
582 // CHECK: [[PHI:%.*]] = phi
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700583 // CHECK-NEXT: [[ELEM:%.*]] = getelementptr inbounds [[A]], [[A]]* [[PHI]], i64 -1
Peter Collingbournebceb7552011-11-27 22:09:28 +0000584 // CHECK-NEXT: call void @_ZN7PR113651AD1Ev([[A]]* [[ELEM]])
585 // CHECK-NEXT: icmp eq [[A]]* [[ELEM]], [[BEGIN]]
586 // CHECK-NEXT: br i1
587 (void) (A [3]) {};
588 }
589}
Richard Smith044c8aa2012-11-13 00:54:12 +0000590
591namespace AssignmentOp {
592 struct A { ~A(); };
593 struct B { A operator=(const B&); };
594 struct C : B { B b1, b2; };
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000595 // CHECK-LABEL: define void @_ZN12AssignmentOp1fE
Richard Smith044c8aa2012-11-13 00:54:12 +0000596 void f(C &c1, const C &c2) {
597 // CHECK: call {{.*}} @_ZN12AssignmentOp1CaSERKS0_(
598 c1 = c2;
599 }
600
601 // Ensure that each 'A' temporary is destroyed before the next subobject is
602 // copied.
603 // CHECK: define {{.*}} @_ZN12AssignmentOp1CaSERKS0_(
604 // CHECK: call {{.*}} @_ZN12AssignmentOp1BaSERKS
605 // CHECK: call {{.*}} @_ZN12AssignmentOp1AD1Ev(
606 // CHECK: call {{.*}} @_ZN12AssignmentOp1BaSERKS
607 // CHECK: call {{.*}} @_ZN12AssignmentOp1AD1Ev(
608 // CHECK: call {{.*}} @_ZN12AssignmentOp1BaSERKS
609 // CHECK: call {{.*}} @_ZN12AssignmentOp1AD1Ev(
610}
Richard Smith4e43dec2013-06-03 00:17:11 +0000611
612namespace BindToSubobject {
613 struct A {
614 A();
615 ~A();
616 int a;
617 };
618
619 void f(), g();
620
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700621 // CHECK: call void @_ZN15BindToSubobject1AC1Ev({{.*}} @_ZGRN15BindToSubobject1aE_)
622 // CHECK: call i32 @__cxa_atexit({{.*}} bitcast ({{.*}} @_ZN15BindToSubobject1AD1Ev to void (i8*)*), i8* bitcast ({{.*}} @_ZGRN15BindToSubobject1aE_ to i8*), i8* @__dso_handle)
623 // CHECK: store i32* getelementptr inbounds ({{.*}} @_ZGRN15BindToSubobject1aE_, i32 0, i32 0), i32** @_ZN15BindToSubobject1aE, align 8
Richard Smith4e43dec2013-06-03 00:17:11 +0000624 int &&a = A().a;
625
626 // CHECK: call void @_ZN15BindToSubobject1fEv()
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700627 // CHECK: call void @_ZN15BindToSubobject1AC1Ev({{.*}} @_ZGRN15BindToSubobject1bE_)
628 // CHECK: call i32 @__cxa_atexit({{.*}} bitcast ({{.*}} @_ZN15BindToSubobject1AD1Ev to void (i8*)*), i8* bitcast ({{.*}} @_ZGRN15BindToSubobject1bE_ to i8*), i8* @__dso_handle)
629 // CHECK: store i32* getelementptr inbounds ({{.*}} @_ZGRN15BindToSubobject1bE_, i32 0, i32 0), i32** @_ZN15BindToSubobject1bE, align 8
Richard Smith4e43dec2013-06-03 00:17:11 +0000630 int &&b = (f(), A().a);
631
632 int A::*h();
633
634 // CHECK: call void @_ZN15BindToSubobject1fEv()
635 // CHECK: call void @_ZN15BindToSubobject1gEv()
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700636 // CHECK: call void @_ZN15BindToSubobject1AC1Ev({{.*}} @_ZGRN15BindToSubobject1cE_)
637 // CHECK: call i32 @__cxa_atexit({{.*}} bitcast ({{.*}} @_ZN15BindToSubobject1AD1Ev to void (i8*)*), i8* bitcast ({{.*}} @_ZGRN15BindToSubobject1cE_ to i8*), i8* @__dso_handle)
Richard Smith4e43dec2013-06-03 00:17:11 +0000638 // CHECK: call {{.*}} @_ZN15BindToSubobject1hE
639 // CHECK: getelementptr
Richard Smith4e43dec2013-06-03 00:17:11 +0000640 // CHECK: store i32* {{.*}}, i32** @_ZN15BindToSubobject1cE, align 8
641 int &&c = (f(), (g(), A().*h()));
642
643 struct B {
644 int padding;
645 A a;
646 };
647
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700648 // CHECK: call void @_ZN15BindToSubobject1BC1Ev({{.*}} @_ZGRN15BindToSubobject1dE_)
649 // CHECK: call i32 @__cxa_atexit({{.*}} bitcast ({{.*}} @_ZN15BindToSubobject1BD1Ev to void (i8*)*), i8* bitcast ({{.*}} @_ZGRN15BindToSubobject1dE_ to i8*), i8* @__dso_handle)
Richard Smith4e43dec2013-06-03 00:17:11 +0000650 // CHECK: call {{.*}} @_ZN15BindToSubobject1hE
651 // CHECK: getelementptr {{.*}} getelementptr
Richard Smith4e43dec2013-06-03 00:17:11 +0000652 // CHECK: store i32* {{.*}}, i32** @_ZN15BindToSubobject1dE, align 8
653 int &&d = (B().a).*h();
654}
Richard Smithd1b55dc2013-06-03 07:13:35 +0000655
656namespace Bitfield {
657 struct S { int a : 5; ~S(); };
658
659 // Do not lifetime extend the S() temporary here.
Richard Smith75ddd142013-06-03 17:00:25 +0000660 // CHECK: alloca
661 // CHECK: call {{.*}}memset
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700662 // CHECK: store i32 {{.*}}, i32* @_ZGRN8Bitfield1rE_
Richard Smithd1b55dc2013-06-03 07:13:35 +0000663 // CHECK: call void @_ZN8Bitfield1SD1
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700664 // CHECK: store i32* @_ZGRN8Bitfield1rE_, i32** @_ZN8Bitfield1rE, align 8
Richard Smithd1b55dc2013-06-03 07:13:35 +0000665 int &&r = S().a;
666}
Richard Smith34f94f92013-06-04 04:45:03 +0000667
668namespace Vector {
669 typedef __attribute__((vector_size(16))) int vi4a;
670 typedef __attribute__((ext_vector_type(4))) int vi4b;
671 struct S {
672 vi4a v;
673 vi4b w;
674 };
675 // CHECK: alloca
676 // CHECK: extractelement
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700677 // CHECK: store i32 {{.*}}, i32* @_ZGRN6Vector1rE_
678 // CHECK: store i32* @_ZGRN6Vector1rE_, i32** @_ZN6Vector1rE,
Richard Smith34f94f92013-06-04 04:45:03 +0000679 int &&r = S().v[1];
680
681 // CHECK: alloca
682 // CHECK: extractelement
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700683 // CHECK: store i32 {{.*}}, i32* @_ZGRN6Vector1sE_
684 // CHECK: store i32* @_ZGRN6Vector1sE_, i32** @_ZN6Vector1sE,
Richard Smith34f94f92013-06-04 04:45:03 +0000685 int &&s = S().w[1];
686 // FIXME PR16204: The following code leads to an assertion in Sema.
687 //int &&s = S().w.y;
688}
Richard Smith8a07cd32013-06-12 20:42:33 +0000689
690namespace ImplicitTemporaryCleanup {
691 struct A { A(int); ~A(); };
692 void g();
693
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000694 // CHECK-LABEL: define void @_ZN24ImplicitTemporaryCleanup1fEv(
Richard Smith8a07cd32013-06-12 20:42:33 +0000695 void f() {
696 // CHECK: call {{.*}} @_ZN24ImplicitTemporaryCleanup1AC1Ei(
697 A &&a = 0;
698
699 // CHECK: call {{.*}} @_ZN24ImplicitTemporaryCleanup1gEv(
700 g();
701
702 // CHECK: call {{.*}} @_ZN24ImplicitTemporaryCleanup1AD1Ev(
703 }
704}
705
706namespace MultipleExtension {
707 struct A { A(); ~A(); };
708 struct B { B(); ~B(); };
709 struct C { C(); ~C(); };
710 struct D { D(); ~D(); int n; C c; };
711 struct E { const A &a; B b; const C &c; ~E(); };
712
713 E &&e1 = { A(), B(), D().c };
714
715 // CHECK: call void @_ZN17MultipleExtension1AC1Ev({{.*}} @[[TEMPA:_ZGRN17MultipleExtension2e1E.*]])
716 // CHECK: call i32 @__cxa_atexit({{.*}} @_ZN17MultipleExtension1AD1Ev {{.*}} @[[TEMPA]]
717 // CHECK: store {{.*}} @[[TEMPA]], {{.*}} getelementptr inbounds ({{.*}} @[[TEMPE:_ZGRN17MultipleExtension2e1E.*]], i32 0, i32 0)
718
719 // CHECK: call void @_ZN17MultipleExtension1BC1Ev({{.*}} getelementptr inbounds ({{.*}} @[[TEMPE]], i32 0, i32 1))
720
721 // CHECK: call void @_ZN17MultipleExtension1DC1Ev({{.*}} @[[TEMPD:_ZGRN17MultipleExtension2e1E.*]])
722 // CHECK: call i32 @__cxa_atexit({{.*}} @_ZN17MultipleExtension1DD1Ev {{.*}} @[[TEMPD]]
723 // CHECK: store {{.*}} @[[TEMPD]], {{.*}} getelementptr inbounds ({{.*}} @[[TEMPE]], i32 0, i32 2)
724 // CHECK: call i32 @__cxa_atexit({{.*}} @_ZN17MultipleExtension1ED1Ev {{.*}} @[[TEMPE]]
725 // CHECK: store {{.*}} @[[TEMPE]], %"struct.MultipleExtension::E"** @_ZN17MultipleExtension2e1E, align 8
726
727 E e2 = { A(), B(), D().c };
728
729 // CHECK: call void @_ZN17MultipleExtension1AC1Ev({{.*}} @[[TEMPA:_ZGRN17MultipleExtension2e2E.*]])
730 // CHECK: call i32 @__cxa_atexit({{.*}} @_ZN17MultipleExtension1AD1Ev {{.*}} @[[TEMPA]]
731 // CHECK: store {{.*}} @[[TEMPA]], {{.*}} getelementptr inbounds ({{.*}} @[[E:_ZN17MultipleExtension2e2E]], i32 0, i32 0)
732
733 // CHECK: call void @_ZN17MultipleExtension1BC1Ev({{.*}} getelementptr inbounds ({{.*}} @[[E]], i32 0, i32 1))
734
735 // CHECK: call void @_ZN17MultipleExtension1DC1Ev({{.*}} @[[TEMPD:_ZGRN17MultipleExtension2e2E.*]])
736 // CHECK: call i32 @__cxa_atexit({{.*}} @_ZN17MultipleExtension1DD1Ev {{.*}} @[[TEMPD]]
737 // CHECK: store {{.*}} @[[TEMPD]], {{.*}} getelementptr inbounds ({{.*}} @[[E]], i32 0, i32 2)
738 // CHECK: call i32 @__cxa_atexit({{.*}} @_ZN17MultipleExtension1ED1Ev {{.*}} @[[E]]
739
740
741 void g();
742 // CHECK: define void @[[NS:_ZN17MultipleExtension]]1fEv(
743 void f() {
744 E &&e1 = { A(), B(), D().c };
745 // CHECK: %[[TEMPE1_A:.*]] = getelementptr inbounds {{.*}} %[[TEMPE1:.*]], i32 0, i32 0
746 // CHECK: call void @[[NS]]1AC1Ev({{.*}} %[[TEMPA1:.*]])
747 // CHECK: store {{.*}} %[[TEMPA1]], {{.*}} %[[TEMPE1_A]]
748 // CHECK: %[[TEMPE1_B:.*]] = getelementptr inbounds {{.*}} %[[TEMPE1]], i32 0, i32 1
749 // CHECK: call void @[[NS]]1BC1Ev({{.*}} %[[TEMPE1_B]])
750 // CHECK: %[[TEMPE1_C:.*]] = getelementptr inbounds {{.*}} %[[TEMPE1]], i32 0, i32 2
751 // CHECK: call void @[[NS]]1DC1Ev({{.*}} %[[TEMPD1:.*]])
752 // CHECK: %[[TEMPD1_C:.*]] = getelementptr inbounds {{.*}} %[[TEMPD1]], i32 0, i32 1
753 // CHECK: store {{.*}} %[[TEMPD1_C]], {{.*}} %[[TEMPE1_C]]
754 // CHECK: store {{.*}} %[[TEMPE1]], {{.*}} %[[E1:.*]]
755
756 g();
757 // CHECK: call void @[[NS]]1gEv()
758
759 E e2 = { A(), B(), D().c };
760 // CHECK: %[[TEMPE2_A:.*]] = getelementptr inbounds {{.*}} %[[E2:.*]], i32 0, i32 0
761 // CHECK: call void @[[NS]]1AC1Ev({{.*}} %[[TEMPA2:.*]])
762 // CHECK: store {{.*}} %[[TEMPA2]], {{.*}} %[[TEMPE2_A]]
763 // CHECK: %[[TEMPE2_B:.*]] = getelementptr inbounds {{.*}} %[[E2]], i32 0, i32 1
764 // CHECK: call void @[[NS]]1BC1Ev({{.*}} %[[TEMPE2_B]])
765 // CHECK: %[[TEMPE2_C:.*]] = getelementptr inbounds {{.*}} %[[E2]], i32 0, i32 2
766 // CHECK: call void @[[NS]]1DC1Ev({{.*}} %[[TEMPD2:.*]])
767 // CHECK: %[[TEMPD2_C:.*]] = getelementptr inbounds {{.*}} %[[TEMPD2]], i32 0, i32 1
768 // CHECK: store {{.*}} %[[TEMPD2_C]], {{.*}}* %[[TEMPE2_C]]
769
770 g();
771 // CHECK: call void @[[NS]]1gEv()
772
773 // CHECK: call void @[[NS]]1ED1Ev({{.*}} %[[E2]])
774 // CHECK: call void @[[NS]]1DD1Ev({{.*}} %[[TEMPD2]])
775 // CHECK: call void @[[NS]]1AD1Ev({{.*}} %[[TEMPA2]])
776 // CHECK: call void @[[NS]]1ED1Ev({{.*}} %[[TEMPE1]])
777 // CHECK: call void @[[NS]]1DD1Ev({{.*}} %[[TEMPD1]])
778 // CHECK: call void @[[NS]]1AD1Ev({{.*}} %[[TEMPA1]])
779 }
780}
781
Richard Smith17dfe3f2013-07-04 04:04:20 +0000782namespace PR14130 {
783 struct S { S(int); };
784 struct U { S &&s; };
785 U v { { 0 } };
Stephen Hines6bcf27b2014-05-29 04:14:42 -0700786 // CHECK: call void @_ZN7PR141301SC1Ei({{.*}} @_ZGRN7PR141301vE_, i32 0)
787 // CHECK: store {{.*}} @_ZGRN7PR141301vE_, {{.*}} @_ZN7PR141301vE
Richard Smith17dfe3f2013-07-04 04:04:20 +0000788}
789
Richard Smith8a07cd32013-06-12 20:42:33 +0000790namespace Ctor {
791 struct A { A(); ~A(); };
792 void f();
793 struct B {
794 A &&a;
795 B() : a{} { f(); }
796 } b;
797 // CHECK: define {{.*}}void @_ZN4Ctor1BC1Ev(
798 // CHECK: call void @_ZN4Ctor1AC1Ev(
799 // CHECK: call void @_ZN4Ctor1fEv(
800 // CHECK: call void @_ZN4Ctor1AD1Ev(
801}