xref: /llvm-project/clang/test/CodeGenCXX/temporaries.cpp (revision 94473f4db6a6f5f12d7c4081455b5b596094eac5)
1 // RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin9 -std=c++11 | FileCheck %s -check-prefixes=CHECK,NULL-INVALID,CHECK-CXX11
2 // RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin9 -std=c++17 | FileCheck %s -check-prefixes=CHECK,NULL-INVALID,CHECK-CXX17
3 // RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin9 -std=c++11 -fno-delete-null-pointer-checks | FileCheck %s -check-prefixes=CHECK,NULL-VALID,CHECK-CXX11
4 
5 namespace PR16263 {
6   const unsigned int n = 1234;
7   extern const int &r = (const int&)n;
8   // CHECK: @_ZGRN7PR162631rE_ = internal constant i32 1234,
9   // CHECK: @_ZN7PR162631rE ={{.*}} constant ptr @_ZGRN7PR162631rE_,
10 
11   extern const int &s = reinterpret_cast<const int&>(n);
12   // CHECK: @_ZN7PR16263L1nE = internal constant i32 1234, align 4
13   // CHECK: @_ZN7PR162631sE ={{.*}} constant ptr @_ZN7PR16263L1nE, align 8
14 
15   struct A { int n; };
16   struct B { int n; };
17   struct C : A, B {};
18   extern const A &&a = (A&&)(A&&)(C&&)(C{});
19   // CHECK: @_ZGRN7PR162631aE_ = internal global {{.*}} zeroinitializer,
20   // CHECK: @_ZN7PR162631aE ={{.*}} constant {{.*}} @_ZGRN7PR162631aE_
21 
22   extern const int &&t = ((B&&)C{}).n;
23   // CHECK: @_ZGRN7PR162631tE_ = internal global {{.*}} zeroinitializer,
24   // CHECK: @_ZN7PR162631tE ={{.*}} constant ptr {{.*}} @_ZGRN7PR162631tE_, {{.*}} 4
25 
26   struct D { double d; C c; };
27   extern const int &&u = (123, static_cast<B&&>(0, ((D&&)D{}).*&D::c).n);
28   // CHECK: @_ZGRN7PR162631uE_ = internal global {{.*}} zeroinitializer
29   // CHECK: @_ZN7PR162631uE ={{.*}} constant ptr {{.*}} @_ZGRN7PR162631uE_, {{.*}} 12
30 }
31 
32 namespace PR20227 {
33   struct A { ~A(); };
34   struct B { virtual ~B(); };
35   struct C : B {};
36 
37   A &&a = dynamic_cast<A&&>(A{});
38   // CHECK: @_ZGRN7PR202271aE_ = internal global
39 
40   B &&b = dynamic_cast<C&&>(dynamic_cast<B&&>(C{}));
41   // CHECK: @_ZGRN7PR202271bE_ = internal global
42 
43   B &&c = static_cast<C&&>(static_cast<B&&>(C{}));
44   // CHECK: @_ZGRN7PR202271cE_ = internal global
45 }
46 
47 namespace BraceInit {
48   typedef const int &CIR;
49   CIR x = CIR{3};
50   // CHECK-CXX11: @_ZGRN9BraceInit1xE_ = internal constant i32 3
51   // FIXME: This should still be emitted as 'constant' in C++17.
52   // CHECK-CXX17: @_ZGRN9BraceInit1xE_ = internal global i32 3
53   // CHECK: @_ZN9BraceInit1xE ={{.*}} constant ptr @_ZGRN9BraceInit1xE_
54 }
55 
56 namespace RefTempSubobject {
57   struct SelfReferential {
58     int *p = ints;
59     int ints[3] = {1, 2, 3};
60   };
61 
62   // CHECK: @_ZGRN16RefTempSubobject2srE_ = internal global { ptr, [3 x i32] } { {{.*}} getelementptr {{.*}} @_ZGRN16RefTempSubobject2srE_, {{.*}}, [3 x i32] [i32 1, i32 2, i32 3] }
63   // CHECK: @_ZN16RefTempSubobject2srE = constant {{.*}} @_ZGRN16RefTempSubobject2srE_
64   constexpr const SelfReferential &sr = SelfReferential();
65 }
66 
67 namespace Vector {
68   typedef __attribute__((vector_size(16))) int vi4a;
69   typedef __attribute__((ext_vector_type(4))) int vi4b;
70   struct S {
71     vi4a v;
72     vi4b w;
73   };
74 
75   int &&r = S().v[1];
76   // CHECK: @_ZGRN6Vector1rE_ = internal global i32 0, align 4
77   // CHECK: @_ZN6Vector1rE = constant ptr @_ZGRN6Vector1rE_, align 8
78 
79   int &&s = S().w[1];
80   // CHECK: @_ZGRN6Vector1sE_ = internal global i32 0, align 4
81   // CHECK: @_ZN6Vector1sE = constant ptr @_ZGRN6Vector1sE_, align 8
82 
83   int &&t = S().w.y;
84   // CHECK: @_ZGRN6Vector1tE_ = internal global i32 0, align 4
85   // CHECK: @_ZN6Vector1tE = constant ptr @_ZGRN6Vector1tE_, align 8
86 }
87 struct A {
88   A();
89   ~A();
90   void f();
91 };
92 
93 void f1() {
94   // CHECK: call void @_ZN1AC1Ev
95   // CHECK: call void @_ZN1AD1Ev
96   (void)A();
97 
98   // CHECK: call void @_ZN1AC1Ev
99   // CHECK: call void @_ZN1AD1Ev
100   A().f();
101 }
102 
103 // Function calls
104 struct B {
105   B();
106   ~B();
107 };
108 
109 B g();
110 
111 void f2() {
112   // CHECK-NOT: call void @_ZN1BC1Ev
113   // CHECK: call void @_ZN1BD1Ev
114   (void)g();
115 }
116 
117 // Member function calls
118 struct C {
119   C();
120   ~C();
121 
122   C f();
123 };
124 
125 void f3() {
126   // CHECK: call void @_ZN1CC1Ev
127   // CHECK: call void @_ZN1CD1Ev
128   // CHECK: call void @_ZN1CD1Ev
129   C().f();
130 }
131 
132 // Function call operator
133 struct D {
134   D();
135   ~D();
136 
137   D operator()();
138 };
139 
140 void f4() {
141   // CHECK: call void @_ZN1DC1Ev
142   // CHECK: call void @_ZN1DD1Ev
143   // CHECK: call void @_ZN1DD1Ev
144   D()();
145 }
146 
147 // Overloaded operators
148 struct E {
149   E();
150   ~E();
151   E operator+(const E&);
152   E operator!();
153 };
154 
155 void f5() {
156   // CHECK: call void @_ZN1EC1Ev
157   // CHECK: call void @_ZN1EC1Ev
158   // CHECK: call void @_ZN1ED1Ev
159   // CHECK: call void @_ZN1ED1Ev
160   // CHECK: call void @_ZN1ED1Ev
161   E() + E();
162 
163   // CHECK: call void @_ZN1EC1Ev
164   // CHECK: call void @_ZN1ED1Ev
165   // CHECK: call void @_ZN1ED1Ev
166   !E();
167 }
168 
169 struct F {
170   F();
171   ~F();
172   F& f();
173 };
174 
175 void f6() {
176   // CHECK: call void @_ZN1FC1Ev
177   // CHECK: call void @_ZN1FD1Ev
178   F().f();
179 }
180 
181 struct G {
182   G();
183   G(A);
184   ~G();
185   operator A();
186 };
187 
188 void a(const A&);
189 
190 void f7() {
191   // CHECK: call void @_ZN1AC1Ev
192   // CHECK: call void @_Z1aRK1A
193   // CHECK: call void @_ZN1AD1Ev
194   a(A());
195 
196   // CHECK: call void @_ZN1GC1Ev
197   // CHECK: call void @_ZN1Gcv1AEv
198   // CHECK: call void @_Z1aRK1A
199   // CHECK: call void @_ZN1AD1Ev
200   // CHECK: call void @_ZN1GD1Ev
201   a(G());
202 }
203 
204 namespace PR5077 {
205 
206 struct A {
207   A();
208   ~A();
209   int f();
210 };
211 
212 void f();
213 int g(const A&);
214 
215 struct B {
216   int a1;
217   int a2;
218   B();
219   ~B();
220 };
221 
222 B::B()
223   // CHECK: call void @_ZN6PR50771AC1Ev
224   // CHECK: call noundef i32 @_ZN6PR50771A1fEv
225   // CHECK: call void @_ZN6PR50771AD1Ev
226   : a1(A().f())
227   // CHECK: call void @_ZN6PR50771AC1Ev
228   // CHECK: call noundef i32 @_ZN6PR50771gERKNS_1AE
229   // CHECK: call void @_ZN6PR50771AD1Ev
230   , a2(g(A()))
231 {
232   // CHECK: call void @_ZN6PR50771fEv
233   f();
234 }
235 
236 }
237 
238 A f8() {
239   // CHECK: call void @_ZN1AC1Ev
240   // CHECK-NOT: call void @_ZN1AD1Ev
241   return A();
242   // CHECK: ret void
243 }
244 
245 struct H {
246   H();
247   ~H();
248   H(const H&);
249 };
250 
251 void f9(H h) {
252   // CHECK: call void @_ZN1HC1Ev
253   // CHECK: call void @_Z2f91H
254   // CHECK: call void @_ZN1HD1Ev
255   f9(H());
256 
257   // CHECK: call void @_ZN1HC1ERKS_
258   // CHECK: call void @_Z2f91H
259   // CHECK: call void @_ZN1HD1Ev
260   f9(h);
261 }
262 
263 void f10(const H&);
264 
265 void f11(H h) {
266   // CHECK: call void @_ZN1HC1Ev
267   // CHECK: call void @_Z3f10RK1H
268   // CHECK: call void @_ZN1HD1Ev
269   f10(H());
270 
271   // CHECK: call void @_Z3f10RK1H
272   // CHECK-NOT: call void @_ZN1HD1Ev
273   // CHECK: ret void
274   f10(h);
275 }
276 
277 // PR5808
278 struct I {
279   I(const char *);
280   ~I();
281 };
282 
283 // CHECK: _Z3f12v
284 I f12() {
285   // CHECK: call void @_ZN1IC1EPKc
286   // CHECK-NOT: call void @_ZN1ID1Ev
287   // CHECK: ret void
288   return "Hello";
289 }
290 
291 // PR5867
292 namespace PR5867 {
293   struct S {
294     S();
295     S(const S &);
296     ~S();
297   };
298 
299   void f(S, int);
300   // CHECK-LABEL: define{{.*}} void @_ZN6PR58671gEv
301   void g() {
302     // CHECK: call void @_ZN6PR58671SC1Ev
303     // CHECK-NEXT: call void @_ZN6PR58671fENS_1SEi
304     // CHECK-NEXT: call void @_ZN6PR58671SD1Ev
305     // CHECK-NEXT: ret void
306     (f)(S(), 0);
307   }
308 
309   // CHECK-LABEL: define linkonce_odr void @_ZN6PR58672g2IiEEvT_
310   template<typename T>
311   void g2(T) {
312     // CHECK: call void @_ZN6PR58671SC1Ev
313     // CHECK-NEXT: call void @_ZN6PR58671fENS_1SEi
314     // CHECK-NEXT: call void @_ZN6PR58671SD1Ev
315     // CHECK-NEXT: ret void
316     (f)(S(), 0);
317   }
318 
319   void h() {
320     g2(17);
321   }
322 }
323 
324 // PR6199
325 namespace PR6199 {
326   struct A { ~A(); };
327 
328   struct B { operator A(); };
329 
330   // CHECK-LABEL: define weak_odr void @_ZN6PR61992f2IiEENS_1AET_
331   template<typename T> A f2(T) {
332     B b;
333     // CHECK: call void @_ZN6PR61991BcvNS_1AEEv
334     // CHECK-NEXT: ret void
335     return b;
336   }
337 
338   template A f2<int>(int);
339 
340 }
341 
342 namespace T12 {
343 
344 struct A {
345   A();
346   ~A();
347   int f();
348 };
349 
350 int& f(int);
351 
352 // CHECK-LABEL: define{{.*}} void @_ZN3T121gEv
353 void g() {
354   // CHECK: call void @_ZN3T121AC1Ev
355   // CHECK-NEXT: call noundef i32 @_ZN3T121A1fEv(
356   // CHECK-NEXT: call noundef {{(nonnull )?}}align {{[0-9]+}} dereferenceable({{[0-9]+}}) ptr @_ZN3T121fEi(
357   // CHECK-NEXT: call void @_ZN3T121AD1Ev(
358   int& i = f(A().f());
359 }
360 
361 }
362 
363 namespace PR6648 {
364   struct B {
365     ~B();
366   };
367   B foo;
368   struct D;
369   D& zed(B);
370   void foobar() {
371     // NULL-INVALID: call noundef nonnull align 1 ptr @_ZN6PR66483zedENS_1BE
372     // NULL-VALID: call noundef align 1 ptr @_ZN6PR66483zedENS_1BE
373     zed(foo);
374   }
375 }
376 
377 namespace UserConvertToValue {
378   struct X {
379     X(int);
380     X(const X&);
381     ~X();
382   };
383 
384   void f(X);
385 
386   // CHECK: void @_ZN18UserConvertToValue1gEv()
387   void g() {
388     // CHECK: call void @_ZN18UserConvertToValue1XC1Ei
389     // CHECK: call void @_ZN18UserConvertToValue1fENS_1XE
390     // CHECK: call void @_ZN18UserConvertToValue1XD1Ev
391     // CHECK: ret void
392     f(1);
393   }
394 }
395 
396 namespace PR7556 {
397   struct A { ~A(); };
398   struct B { int i; ~B(); };
399   struct C { int C::*pm; ~C(); };
400   // CHECK-LABEL: define{{.*}} void @_ZN6PR75563fooEv()
401   void foo() {
402     // CHECK: call void @_ZN6PR75561AD1Ev
403     A();
404     // CHECK: call void @llvm.memset.p0.i64
405     // CHECK: call void @_ZN6PR75561BD1Ev
406     B();
407     // CHECK: call void @llvm.memcpy.p0.p0.i64
408     // CHECK: call void @_ZN6PR75561CD1Ev
409     C();
410     // CHECK-NEXT: ret void
411   }
412 }
413 
414 namespace Elision {
415   struct A {
416     A(); A(const A &); ~A();
417     void *p;
418     void foo() const;
419   };
420 
421   void foo();
422   A fooA();
423   void takeA(A a);
424 
425   // CHECK-LABEL: define{{.*}} void @_ZN7Elision5test0Ev()
426   void test0() {
427     // CHECK:      [[I:%.*]] = alloca [[A:%.*]], align 8
428     // CHECK-NEXT: [[J:%.*]] = alloca [[A]], align 8
429     // CHECK-NEXT: [[T0:%.*]] = alloca [[A]], align 8
430     // CHECK-NEXT: [[K:%.*]] = alloca [[A]], align 8
431     // CHECK-NEXT: [[T1:%.*]] = alloca [[A]], align 8
432 
433     // CHECK-NEXT: call void @_ZN7Elision3fooEv()
434     // CHECK-NEXT: call void @_ZN7Elision1AC1Ev(ptr {{[^,]*}} [[I]])
435     A i = (foo(), A());
436 
437     // CHECK-NEXT: call void @_ZN7Elision4fooAEv(ptr dead_on_unwind writable sret([[A]]) align 8 [[T0]])
438     // CHECK-NEXT: call void @_ZN7Elision1AC1Ev(ptr {{[^,]*}} [[J]])
439     // CHECK-NEXT: call void @_ZN7Elision1AD1Ev(ptr {{[^,]*}} [[T0]])
440     A j = (fooA(), A());
441 
442     // CHECK-NEXT: call void @_ZN7Elision1AC1Ev(ptr {{[^,]*}} [[T1]])
443     // CHECK-NEXT: call void @_ZN7Elision4fooAEv(ptr dead_on_unwind writable sret([[A]]) align 8 [[K]])
444     // CHECK-NEXT: call void @_ZN7Elision1AD1Ev(ptr {{[^,]*}} [[T1]])
445     A k = (A(), fooA());
446 
447     // CHECK-NEXT: call void @_ZN7Elision1AD1Ev(ptr {{[^,]*}} [[K]])
448     // CHECK-NEXT: call void @_ZN7Elision1AD1Ev(ptr {{[^,]*}} [[J]])
449     // CHECK-NEXT: call void @_ZN7Elision1AD1Ev(ptr {{[^,]*}} [[I]])
450   }
451 
452 
453   // CHECK-LABEL: define{{.*}} void @_ZN7Elision5test1EbNS_1AE(
454   void test1(bool c, A x) {
455     // CHECK:      [[I:%.*]] = alloca [[A]], align 8
456     // CHECK-NEXT: [[J:%.*]] = alloca [[A]], align 8
457 
458     // CHECK:      call void @_ZN7Elision1AC1Ev(ptr {{[^,]*}} [[I]])
459     // CHECK:      call void @_ZN7Elision1AC1ERKS0_(ptr {{[^,]*}} [[I]], ptr noundef {{(nonnull )?}}align {{[0-9]+}} dereferenceable({{[0-9]+}}) [[X:%.*]])
460     A i = (c ? A() : x);
461 
462     // CHECK:      call void @_ZN7Elision1AC1ERKS0_(ptr {{[^,]*}} [[J]], ptr noundef {{(nonnull )?}}align {{[0-9]+}} dereferenceable({{[0-9]+}}) [[X]])
463     // CHECK:      call void @_ZN7Elision1AC1Ev(ptr {{[^,]*}} [[J]])
464     A j = (c ? x : A());
465 
466     // CHECK:      call void @_ZN7Elision1AD1Ev(ptr {{[^,]*}} [[J]])
467     // CHECK-NEXT: call void @_ZN7Elision1AD1Ev(ptr {{[^,]*}} [[I]])
468   }
469 
470   // CHECK: define{{.*}} void @_ZN7Elision5test2Ev(ptr dead_on_unwind noalias writable sret([[A]]) align 8
471   A test2() {
472     // CHECK:      call void @_ZN7Elision3fooEv()
473     // CHECK-NEXT: call void @_ZN7Elision1AC1Ev(ptr {{[^,]*}} [[RET:%.*]])
474     // CHECK-NEXT: ret void
475     return (foo(), A());
476   }
477 
478   // CHECK: define{{.*}} void @_ZN7Elision5test3EiNS_1AE(ptr dead_on_unwind noalias writable sret([[A]]) align 8
479   A test3(int v, A x) {
480     if (v < 5)
481     // CHECK:      call void @_ZN7Elision1AC1Ev(ptr {{[^,]*}} [[RET:%.*]])
482     // CHECK:      call void @_ZN7Elision1AC1ERKS0_(ptr {{[^,]*}} [[RET]], ptr noundef {{(nonnull )?}}align {{[0-9]+}} dereferenceable({{[0-9]+}}) [[X:%.*]])
483       return (v < 0 ? A() : x);
484     else
485     // CHECK:      call void @_ZN7Elision1AC1ERKS0_(ptr {{[^,]*}} [[RET]], ptr noundef {{(nonnull )?}}align {{[0-9]+}} dereferenceable({{[0-9]+}}) [[X]])
486     // CHECK:      call void @_ZN7Elision1AC1Ev(ptr {{[^,]*}} [[RET]])
487       return (v > 10 ? x : A());
488 
489     // CHECK:      ret void
490   }
491 
492   // CHECK-LABEL: define{{.*}} void @_ZN7Elision5test4Ev()
493   void test4() {
494     // CHECK:      [[X:%.*]] = alloca [[A]], align 8
495     // CHECK-NEXT: [[XS:%.*]] = alloca [2 x [[A]]], align 16
496 
497     // CHECK-NEXT: call void @_ZN7Elision1AC1Ev(ptr {{[^,]*}} [[X]])
498     A x;
499 
500     // CHECK-NEXT: call void @_ZN7Elision1AC1Ev(ptr {{[^,]*}} [[XS]])
501     // CHECK-NEXT: [[XS1:%.*]] = getelementptr inbounds [[A]], ptr [[XS]], i64 1
502     // CHECK-NEXT: call void @_ZN7Elision1AC1ERKS0_(ptr {{[^,]*}} [[XS1]], ptr noundef {{(nonnull )?}}align {{[0-9]+}} dereferenceable({{[0-9]+}}) [[X]])
503     A xs[] = { A(), x };
504 
505     // CHECK-NEXT: [[BEGIN:%.*]] = getelementptr inbounds [2 x [[A]]], ptr [[XS]], i32 0, i32 0
506     // CHECK-NEXT: [[END:%.*]] = getelementptr inbounds [[A]], ptr [[BEGIN]], i64 2
507     // CHECK-NEXT: br label
508     // CHECK:      [[AFTER:%.*]] = phi ptr
509     // CHECK-NEXT: [[CUR:%.*]] = getelementptr inbounds [[A]], ptr [[AFTER]], i64 -1
510     // CHECK-NEXT: call void @_ZN7Elision1AD1Ev(ptr {{[^,]*}} [[CUR]])
511     // CHECK-NEXT: [[T0:%.*]] = icmp eq ptr [[CUR]], [[BEGIN]]
512     // CHECK-NEXT: br i1 [[T0]],
513 
514     // CHECK:      call void @_ZN7Elision1AD1Ev(ptr {{[^,]*}} [[X]])
515   }
516 
517   // CHECK: define{{.*}} void @_ZN7Elision5test5Ev(ptr dead_on_unwind noalias writable sret([[A]]) align 8
518   struct B { A a; B(); };
519   A test5() {
520     // CHECK:      [[AT0:%.*]] = alloca [[A]], align 8
521     // CHECK-NEXT: [[BT0:%.*]] = alloca [[B:%.*]], align 8
522     // CHECK-NEXT: [[X:%.*]] = alloca [[A]], align 8
523     // CHECK-NEXT: [[BT1:%.*]] = alloca [[B]], align 8
524     // CHECK-NEXT: [[BT2:%.*]] = alloca [[B]], align 8
525 
526     // CHECK:      call void @_ZN7Elision1BC1Ev(ptr {{[^,]*}} [[BT0]])
527     // CHECK-NEXT: [[AM:%.*]] = getelementptr inbounds nuw [[B]], ptr [[BT0]], i32 0, i32 0
528     // CHECK-NEXT: call void @_ZN7Elision1AC1ERKS0_(ptr {{[^,]*}} [[AT0]], ptr noundef {{(nonnull )?}}align {{[0-9]+}} dereferenceable({{[0-9]+}}) [[AM]])
529     // CHECK-NEXT: call void @_ZN7Elision5takeAENS_1AE(ptr noundef [[AT0]])
530     // CHECK-NEXT: call void @_ZN7Elision1AD1Ev(ptr {{[^,]*}} [[AT0]])
531     // CHECK-NEXT: call void @_ZN7Elision1BD1Ev(ptr {{[^,]*}} [[BT0]])
532     takeA(B().a);
533 
534     // CHECK-NEXT: call void @_ZN7Elision1BC1Ev(ptr {{[^,]*}} [[BT1]])
535     // CHECK-NEXT: [[AM:%.*]] = getelementptr inbounds nuw [[B]], ptr [[BT1]], i32 0, i32 0
536     // CHECK-NEXT: call void @_ZN7Elision1AC1ERKS0_(ptr {{[^,]*}} [[X]], ptr noundef {{(nonnull )?}}align {{[0-9]+}} dereferenceable({{[0-9]+}}) [[AM]])
537     // CHECK-NEXT: call void @_ZN7Elision1BD1Ev(ptr {{[^,]*}} [[BT1]])
538     A x = B().a;
539 
540     // CHECK-NEXT: call void @_ZN7Elision1BC1Ev(ptr {{[^,]*}} [[BT2]])
541     // CHECK-NEXT: [[AM:%.*]] = getelementptr inbounds nuw [[B]], ptr [[BT2]], i32 0, i32 0
542     // CHECK-NEXT: call void @_ZN7Elision1AC1ERKS0_(ptr {{[^,]*}} [[RET:%.*]], ptr noundef {{(nonnull )?}}align {{[0-9]+}} dereferenceable({{[0-9]+}}) [[AM]])
543     // CHECK-NEXT: call void @_ZN7Elision1BD1Ev(ptr {{[^,]*}} [[BT2]])
544     return B().a;
545 
546     // CHECK:      call void @_ZN7Elision1AD1Ev(ptr {{[^,]*}} [[X]])
547   }
548 
549   // Reduced from webkit.
550   // CHECK: define{{.*}} void @_ZN7Elision5test6EPKNS_1CE(ptr
551   struct C { operator A() const; };
552   void test6(const C *x) {
553     // CHECK:      [[T0:%.*]] = alloca [[A]], align 8
554     // CHECK:      [[X:%.*]] = load ptr, ptr {{%.*}}, align 8
555     // CHECK-NEXT: call void @_ZNK7Elision1CcvNS_1AEEv(ptr dead_on_unwind writable sret([[A]]) align 8 [[T0]], ptr {{[^,]*}} [[X]])
556     // CHECK-NEXT: call void @_ZNK7Elision1A3fooEv(ptr {{[^,]*}} [[T0]])
557     // CHECK-NEXT: call void @_ZN7Elision1AD1Ev(ptr {{[^,]*}} [[T0]])
558     // CHECK-NEXT: ret void
559     A(*x).foo();
560   }
561 }
562 
563 namespace PR8623 {
564   struct A { A(int); ~A(); };
565 
566   // CHECK-LABEL: define{{.*}} void @_ZN6PR86233fooEb(
567   void foo(bool b) {
568     // CHECK:      [[TMP:%.*]] = alloca [[A:%.*]], align 1
569     // CHECK-NEXT: [[LCONS:%.*]] = alloca i1
570     // CHECK-NEXT: [[RCONS:%.*]] = alloca i1
571     // CHECK:      store i1 false, ptr [[LCONS]]
572     // CHECK-NEXT: store i1 false, ptr [[RCONS]]
573     // CHECK-NEXT: br i1
574     // CHECK:      call void @_ZN6PR86231AC1Ei(ptr {{[^,]*}} [[TMP]], i32 noundef 2)
575     // CHECK-NEXT: store i1 true, ptr [[LCONS]]
576     // CHECK-NEXT: br label
577     // CHECK:      call void @_ZN6PR86231AC1Ei(ptr {{[^,]*}} [[TMP]], i32 noundef 3)
578     // CHECK-NEXT: store i1 true, ptr [[RCONS]]
579     // CHECK-NEXT: br label
580     // CHECK:      load i1, ptr [[RCONS]]
581     // CHECK-NEXT: br i1
582     // CHECK:      call void @_ZN6PR86231AD1Ev(ptr {{[^,]*}} [[TMP]])
583     // CHECK-NEXT: br label
584     // CHECK:      load i1, ptr [[LCONS]]
585     // CHECK-NEXT: br i1
586     // CHECK:      call void @_ZN6PR86231AD1Ev(ptr {{[^,]*}} [[TMP]])
587     // CHECK-NEXT: br label
588     // CHECK:      ret void
589     b ? A(2) : A(3);
590   }
591 }
592 
593 namespace PR11365 {
594   struct A { A(); ~A(); };
595 
596   // CHECK-LABEL: define{{.*}} void @_ZN7PR113653fooEv(
597   void foo() {
598     // CHECK: [[BEGIN:%.*]] = getelementptr inbounds [3 x [[A:%.*]]], ptr {{.*}}, i32 0, i32 0
599     // CHECK-NEXT: [[END:%.*]] = getelementptr inbounds [[A]], ptr [[BEGIN]], i64 3
600     // CHECK-NEXT: br label
601 
602     // CHECK: [[PHI:%.*]] = phi
603     // CHECK-NEXT: [[ELEM:%.*]] = getelementptr inbounds [[A]], ptr [[PHI]], i64 -1
604     // CHECK-NEXT: call void @_ZN7PR113651AD1Ev(ptr {{[^,]*}} [[ELEM]])
605     // CHECK-NEXT: icmp eq ptr [[ELEM]], [[BEGIN]]
606     // CHECK-NEXT: br i1
607     (void) (A [3]) {};
608   }
609 }
610 
611 namespace AssignmentOp {
612   struct A { ~A(); };
613   struct B { A operator=(const B&); };
614   struct C : B { B b1, b2; };
615   // CHECK-LABEL: define{{.*}} void @_ZN12AssignmentOp1fE
616   void f(C &c1, const C &c2) {
617     // CHECK: call {{.*}} @_ZN12AssignmentOp1CaSERKS0_(
618     c1 = c2;
619   }
620 
621   // Ensure that each 'A' temporary is destroyed before the next subobject is
622   // copied.
623   // CHECK: define {{.*}} @_ZN12AssignmentOp1CaSERKS0_(
624   // CHECK: call {{.*}} @_ZN12AssignmentOp1BaSERKS
625   // CHECK: call {{.*}} @_ZN12AssignmentOp1AD1Ev(
626   // CHECK: call {{.*}} @_ZN12AssignmentOp1BaSERKS
627   // CHECK: call {{.*}} @_ZN12AssignmentOp1AD1Ev(
628   // CHECK: call {{.*}} @_ZN12AssignmentOp1BaSERKS
629   // CHECK: call {{.*}} @_ZN12AssignmentOp1AD1Ev(
630 }
631 
632 namespace BindToSubobject {
633   struct A {
634     A();
635     ~A();
636     int a;
637   };
638 
639   void f(), g();
640 
641   // CHECK: call void @_ZN15BindToSubobject1AC1Ev({{.*}} @_ZGRN15BindToSubobject1aE_)
642   // CHECK: call i32 @__cxa_atexit({{.*}} @_ZN15BindToSubobject1AD1Ev, ptr @_ZGRN15BindToSubobject1aE_, ptr @__dso_handle)
643   // CHECK: store ptr @_ZGRN15BindToSubobject1aE_, ptr @_ZN15BindToSubobject1aE, align 8
644   int &&a = A().a;
645 
646   // CHECK: call void @_ZN15BindToSubobject1fEv()
647   // CHECK: call void @_ZN15BindToSubobject1AC1Ev({{.*}} @_ZGRN15BindToSubobject1bE_)
648   // CHECK: call i32 @__cxa_atexit({{.*}} @_ZN15BindToSubobject1AD1Ev, ptr @_ZGRN15BindToSubobject1bE_, ptr @__dso_handle)
649   // CHECK: store ptr @_ZGRN15BindToSubobject1bE_, ptr @_ZN15BindToSubobject1bE, align 8
650   int &&b = (f(), A().a);
651 
652   int A::*h();
653 
654   // CHECK: call void @_ZN15BindToSubobject1fEv()
655   // CHECK: call void @_ZN15BindToSubobject1gEv()
656   // CHECK: call void @_ZN15BindToSubobject1AC1Ev({{.*}} @_ZGRN15BindToSubobject1cE_)
657   // CHECK: call i32 @__cxa_atexit({{.*}} @_ZN15BindToSubobject1AD1Ev, ptr @_ZGRN15BindToSubobject1cE_, ptr @__dso_handle)
658   // CHECK: call {{.*}} @_ZN15BindToSubobject1hE
659   // CHECK: getelementptr
660   // CHECK: store ptr {{.*}}, ptr @_ZN15BindToSubobject1cE, align 8
661   int &&c = (f(), (g(), A().*h()));
662 
663   struct B {
664     int padding;
665     A a;
666   };
667 
668   // CHECK: call void @_ZN15BindToSubobject1BC1Ev({{.*}} @_ZGRN15BindToSubobject1dE_)
669   // CHECK: call i32 @__cxa_atexit({{.*}} @_ZN15BindToSubobject1BD1Ev, ptr @_ZGRN15BindToSubobject1dE_, ptr @__dso_handle)
670   // CHECK: call {{.*}} @_ZN15BindToSubobject1hE
671   // CHECK: getelementptr {{.*}} getelementptr
672   // CHECK: store ptr {{.*}}, ptr @_ZN15BindToSubobject1dE, align 8
673   int &&d = (B().a).*h();
674 }
675 
676 namespace Bitfield {
677   struct S { int a : 5; ~S(); };
678 
679   // Do not lifetime extend the S() temporary here.
680   // CHECK: alloca
681   // CHECK: call {{.*}}memset
682   // CHECK: store i32 {{.*}}, ptr @_ZGRN8Bitfield1rE_
683   // CHECK: call void @_ZN8Bitfield1SD1
684   // CHECK: store ptr @_ZGRN8Bitfield1rE_, ptr @_ZN8Bitfield1rE, align 8
685   int &&r = S().a;
686 }
687 
688 namespace ImplicitTemporaryCleanup {
689   struct A { A(int); ~A(); };
690   void g();
691 
692   // CHECK-LABEL: define{{.*}} void @_ZN24ImplicitTemporaryCleanup1fEv(
693   void f() {
694     // CHECK: call {{.*}} @_ZN24ImplicitTemporaryCleanup1AC1Ei(
695     A &&a = 0;
696 
697     // CHECK: call {{.*}} @_ZN24ImplicitTemporaryCleanup1gEv(
698     g();
699 
700     // CHECK: call {{.*}} @_ZN24ImplicitTemporaryCleanup1AD1Ev(
701   }
702 }
703 
704 namespace MultipleExtension {
705   struct A { A(); ~A(); };
706   struct B { B(); ~B(); };
707   struct C { C(); ~C(); };
708   struct D { D(); ~D(); int n; C c; };
709   struct E { const A &a; B b; const C &c; ~E(); };
710 
711   E &&e1 = { A(), B(), D().c };
712 
713   // CHECK: call void @_ZN17MultipleExtension1AC1Ev({{.*}} @[[TEMPA:_ZGRN17MultipleExtension2e1E.*]])
714   // CHECK: call i32 @__cxa_atexit({{.*}} @_ZN17MultipleExtension1AD1Ev, {{.*}} @[[TEMPA]]
715   // CHECK: store {{.*}} @[[TEMPA]], {{.*}} @[[TEMPE:_ZGRN17MultipleExtension2e1E.*]],
716 
717   // CHECK: call void @_ZN17MultipleExtension1BC1Ev({{.*}} getelementptr inbounds ({{.*}} @[[TEMPE]], i64 8))
718 
719   // CHECK: call void @_ZN17MultipleExtension1DC1Ev({{.*}} @[[TEMPD:_ZGRN17MultipleExtension2e1E.*]])
720   // CHECK: call i32 @__cxa_atexit({{.*}} @_ZN17MultipleExtension1DD1Ev, {{.*}} @[[TEMPD]]
721   // CHECK: store {{.*}} @[[TEMPD]], {{.*}} getelementptr inbounds nuw ({{.*}} @[[TEMPE]], i32 0, i32 2)
722   // CHECK: call i32 @__cxa_atexit({{.*}} @_ZN17MultipleExtension1ED1Ev, {{.*}} @[[TEMPE]]
723   // CHECK: store {{.*}} @[[TEMPE]], ptr @_ZN17MultipleExtension2e1E, align 8
724 
725   E e2 = { A(), B(), D().c };
726 
727   // CHECK: call void @_ZN17MultipleExtension1AC1Ev({{.*}} @[[TEMPA:_ZGRN17MultipleExtension2e2E.*]])
728   // CHECK: call i32 @__cxa_atexit({{.*}} @_ZN17MultipleExtension1AD1Ev, {{.*}} @[[TEMPA]]
729   // CHECK: store {{.*}} @[[TEMPA]], {{.*}} @[[E:_ZN17MultipleExtension2e2E]]
730 
731   // CHECK: call void @_ZN17MultipleExtension1BC1Ev({{.*}} getelementptr inbounds ({{.*}} @[[E]], i64 8))
732 
733   // CHECK: call void @_ZN17MultipleExtension1DC1Ev({{.*}} @[[TEMPD:_ZGRN17MultipleExtension2e2E.*]])
734   // CHECK: call i32 @__cxa_atexit({{.*}} @_ZN17MultipleExtension1DD1Ev, {{.*}} @[[TEMPD]]
735   // CHECK: store {{.*}} @[[TEMPD]], {{.*}} getelementptr inbounds nuw ({{.*}} @[[E]], i32 0, i32 2)
736   // CHECK: call i32 @__cxa_atexit({{.*}} @_ZN17MultipleExtension1ED1Ev, {{.*}} @[[E]]
737 
738 
739   void g();
740   // CHECK: define{{.*}} void @[[NS:_ZN17MultipleExtension]]1fEv(
741   void f() {
742     E &&e1 = { A(), B(), D().c };
743     // CHECK: %[[TEMPE1_A:.*]] = getelementptr inbounds {{.*}} %[[TEMPE1:.*]], i32 0, i32 0
744     // CHECK: call void @[[NS]]1AC1Ev({{.*}} %[[TEMPA1:.*]])
745     // CHECK: store {{.*}} %[[TEMPA1]], {{.*}} %[[TEMPE1_A]]
746     // CHECK: %[[TEMPE1_B:.*]] = getelementptr inbounds {{.*}} %[[TEMPE1]], i64 8
747     // CHECK: call void @[[NS]]1BC1Ev({{.*}} %[[TEMPE1_B]])
748     // CHECK: %[[TEMPE1_C:.*]] = getelementptr inbounds {{.*}} %[[TEMPE1]], i32 0, i32 2
749     // CHECK: call void @[[NS]]1DC1Ev({{.*}} %[[TEMPD1:.*]])
750     // CHECK: %[[TEMPD1_C:.*]] = getelementptr inbounds {{.*}} %[[TEMPD1]], i64 4
751     // CHECK: store {{.*}} %[[TEMPD1_C]], {{.*}} %[[TEMPE1_C]]
752     // CHECK: store {{.*}} %[[TEMPE1]], {{.*}} %[[E1:.*]]
753 
754     g();
755     // CHECK: call void @[[NS]]1gEv()
756 
757     E e2 = { A(), B(), D().c };
758     // CHECK: %[[TEMPE2_A:.*]] = getelementptr inbounds {{.*}} %[[E2:.*]], i32 0, i32 0
759     // CHECK: call void @[[NS]]1AC1Ev({{.*}} %[[TEMPA2:.*]])
760     // CHECK: store {{.*}} %[[TEMPA2]], {{.*}} %[[TEMPE2_A]]
761     // CHECK: %[[TEMPE2_B:.*]] = getelementptr inbounds {{.*}} %[[E2]], i64 8
762     // CHECK: call void @[[NS]]1BC1Ev({{.*}} %[[TEMPE2_B]])
763     // CHECK: %[[TEMPE2_C:.*]] = getelementptr inbounds {{.*}} %[[E2]], i32 0, i32 2
764     // CHECK: call void @[[NS]]1DC1Ev({{.*}} %[[TEMPD2:.*]])
765     // CHECK: %[[TEMPD2_C:.*]] = getelementptr inbounds {{.*}} %[[TEMPD2]], i64 4
766     // CHECK: store {{.*}} %[[TEMPD2_C]], ptr %[[TEMPE2_C]]
767 
768     g();
769     // CHECK: call void @[[NS]]1gEv()
770 
771     // CHECK: call void @[[NS]]1ED1Ev({{.*}} %[[E2]])
772     // CHECK: call void @[[NS]]1DD1Ev({{.*}} %[[TEMPD2]])
773     // CHECK: call void @[[NS]]1AD1Ev({{.*}} %[[TEMPA2]])
774     // CHECK: call void @[[NS]]1ED1Ev({{.*}} %[[TEMPE1]])
775     // CHECK: call void @[[NS]]1DD1Ev({{.*}} %[[TEMPD1]])
776     // CHECK: call void @[[NS]]1AD1Ev({{.*}} %[[TEMPA1]])
777   }
778 }
779 
780 namespace ArrayAccess {
781   struct A { A(int); ~A(); };
782   void g();
783   void f() {
784     using T = A[3];
785 
786     // CHECK: call void @_ZN11ArrayAccess1AC1Ei({{.*}}, i32 noundef 1
787     // CHECK-NOT: @_ZN11ArrayAccess1AD
788     // CHECK: call void @_ZN11ArrayAccess1AC1Ei({{.*}}, i32 noundef 2
789     // CHECK-NOT: @_ZN11ArrayAccess1AD
790     // CHECK: call void @_ZN11ArrayAccess1AC1Ei({{.*}}, i32 noundef 3
791     // CHECK-NOT: @_ZN11ArrayAccess1AD
792     A &&a = T{1, 2, 3}[1];
793 
794     // CHECK: call void @_ZN11ArrayAccess1AC1Ei({{.*}}, i32 noundef 4
795     // CHECK-NOT: @_ZN11ArrayAccess1AD
796     // CHECK: call void @_ZN11ArrayAccess1AC1Ei({{.*}}, i32 noundef 5
797     // CHECK-NOT: @_ZN11ArrayAccess1AD
798     // CHECK: call void @_ZN11ArrayAccess1AC1Ei({{.*}}, i32 noundef 6
799     // CHECK-NOT: @_ZN11ArrayAccess1AD
800     A &&b = 2[T{4, 5, 6}];
801 
802     // CHECK: call void @_ZN11ArrayAccess1gEv(
803     g();
804 
805     // CHECK: call void @_ZN11ArrayAccess1AD
806     // CHECK: call void @_ZN11ArrayAccess1AD
807   }
808 }
809 
810 namespace PR14130 {
811   struct S { S(int); };
812   struct U { S &&s; };
813   U v { { 0 } };
814   // CHECK: call void @_ZN7PR141301SC1Ei({{.*}} @_ZGRN7PR141301vE_, i32 noundef 0)
815   // CHECK: store {{.*}} @_ZGRN7PR141301vE_, {{.*}} @_ZN7PR141301vE
816 }
817 
818 namespace Conditional {
819   struct A {};
820   struct B : A { B(); ~B(); };
821   struct C : A { C(); ~C(); };
822 
823   void g();
824 
825   // CHECK-LABEL: define {{.*}} @_ZN11Conditional1fEb(
826   void f(bool b) {
827     // CHECK: store i1 false, ptr %[[CLEANUP_B:.*]],
828     // CHECK: store i1 false, ptr %[[CLEANUP_C:.*]],
829     // CHECK: br i1
830     //
831     // CHECK: call {{.*}} @_ZN11Conditional1BC1Ev(
832     // CHECK: store i1 true, ptr %[[CLEANUP_B]],
833     // CHECK: br label
834     //
835     // CHECK: call {{.*}} @_ZN11Conditional1CC1Ev(
836     // CHECK: store i1 true, ptr %[[CLEANUP_C]],
837     // CHECK: br label
838     A &&r = b ? static_cast<A&&>(B()) : static_cast<A&&>(C());
839 
840     // CHECK: call {{.*}} @_ZN11Conditional1gEv(
841     g();
842 
843     // CHECK: load {{.*}} %[[CLEANUP_C]]
844     // CHECK: br i1
845     // CHECK: call {{.*}} @_ZN11Conditional1CD1Ev(
846     // CHECK: br label
847 
848     // CHECK: load {{.*}} %[[CLEANUP_B]]
849     // CHECK: br i1
850     // CHECK: call {{.*}} @_ZN11Conditional1BD1Ev(
851     // CHECK: br label
852   }
853 
854   struct D { A &&a; };
855   // CHECK-LABEL: define {{.*}} @_ZN11Conditional10f_indirectEb(
856   void f_indirect(bool b) {
857     // CHECK: store i1 false, ptr %[[CLEANUP_B:.*]],
858     // CHECK: store i1 false, ptr %[[CLEANUP_C:.*]],
859     // CHECK: br i1
860     //
861     // CHECK: call {{.*}} @_ZN11Conditional1BC1Ev(
862     // CHECK: store i1 true, ptr %[[CLEANUP_B]],
863     // CHECK: br label
864     //
865     // CHECK: call {{.*}} @_ZN11Conditional1CC1Ev(
866     // CHECK: store i1 true, ptr %[[CLEANUP_C]],
867     // CHECK: br label
868     D d = b ? D{B()} : D{C()};
869 
870     // In C++17, the expression D{...} directly initializes the 'd' object, so
871     // lifetime-extending the temporaries to the lifetime of the D object
872     // extends them past the call to g().
873     //
874     // In C++14 and before, D is move-constructed from the result of the
875     // conditional expression, so no lifetime extension occurs.
876 
877     // CHECK-CXX17: call {{.*}} @_ZN11Conditional1gEv(
878 
879     // CHECK: load {{.*}} %[[CLEANUP_C]]
880     // CHECK: br i1
881     // CHECK: call {{.*}} @_ZN11Conditional1CD1Ev(
882     // CHECK: br label
883 
884     // CHECK: load {{.*}} %[[CLEANUP_B]]
885     // CHECK: br i1
886     // CHECK: call {{.*}} @_ZN11Conditional1BD1Ev(
887     // CHECK: br label
888 
889     // CHECK-CXX11: call {{.*}} @_ZN11Conditional1gEv(
890     g();
891   }
892 
893   extern bool b;
894   // CHECK: load {{.*}} @_ZN11Conditional1b
895   // CHECK: br i1
896   //
897   // CHECK: call {{.*}} @_ZN11Conditional1BC1Ev({{.*}} @_ZGRN11Conditional1rE_)
898   // CHECK: call {{.*}} @__cxa_atexit({{.*}} @_ZN11Conditional1BD1Ev, ptr @_ZGRN11Conditional1rE_,
899   // CHECK: br label
900   //
901   // CHECK: call {{.*}} @_ZN11Conditional1CC1Ev({{.*}} @_ZGRN11Conditional1rE0_)
902   // CHECK: call {{.*}} @__cxa_atexit({{.*}} @_ZN11Conditional1CD1Ev, ptr @_ZGRN11Conditional1rE0_,
903   // CHECK: br label
904   A &&r = b ? static_cast<A&&>(B()) : static_cast<A&&>(C());
905 }
906 
907 #if __cplusplus >= 201703L
908 namespace PR42220 {
909   struct X { X(); ~X(); };
910   struct A { X &&x; };
911   struct B : A {};
912   void g() noexcept;
913   // CHECK-CXX17-LABEL: define{{.*}} @_ZN7PR422201fEv(
914   void f() {
915     // CHECK-CXX17: call{{.*}} @_ZN7PR422201XC1Ev(
916     B &&b = {X()};
917     // CHECK-CXX17-NOT: call{{.*}} @_ZN7PR422201XD1Ev(
918     // CHECK-CXX17: call{{.*}} @_ZN7PR422201gEv(
919     g();
920     // CHECK-CXX17: call{{.*}} @_ZN7PR422201XD1Ev(
921   }
922 }
923 #endif
924