xref: /aosp_15_r20/external/clang/test/CodeGen/temporary-lifetime.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 %s -std=c++11 -O1 -DWITH_DTOR -triple x86_64 -emit-llvm -o - | FileCheck -check-prefix=CHECK-DTOR %s
2*67e74705SXin Li // RUN: %clang_cc1 %s -std=c++11 -O1 -triple x86_64 -emit-llvm -o - | FileCheck -check-prefix=CHECK-NO-DTOR %s
3*67e74705SXin Li 
4*67e74705SXin Li struct A {
5*67e74705SXin Li   A();
6*67e74705SXin Li #ifdef WITH_DTOR
7*67e74705SXin Li   ~A();
8*67e74705SXin Li #endif
9*67e74705SXin Li   char a[1024];
10*67e74705SXin Li   operator bool() const;
11*67e74705SXin Li };
12*67e74705SXin Li 
13*67e74705SXin Li template <typename T>
14*67e74705SXin Li void Foo(T &&);
15*67e74705SXin Li 
16*67e74705SXin Li template <typename T>
17*67e74705SXin Li void Bar(T &&);
18*67e74705SXin Li 
19*67e74705SXin Li template <typename T>
20*67e74705SXin Li T Baz();
21*67e74705SXin Li 
Test1()22*67e74705SXin Li void Test1() {
23*67e74705SXin Li   // CHECK-DTOR-LABEL: Test1
24*67e74705SXin Li   // CHECK-DTOR: call void @llvm.lifetime.start(i64 1024, i8* %[[ADDR:[0-9]+]])
25*67e74705SXin Li   // CHECK-DTOR: call void @_ZN1AC1Ev(%struct.A* nonnull %[[VAR:[^ ]+]])
26*67e74705SXin Li   // CHECK-DTOR: call void @_Z3FooIRK1AEvOT_
27*67e74705SXin Li   // CHECK-DTOR: call void @_ZN1AD1Ev(%struct.A* nonnull %[[VAR]])
28*67e74705SXin Li   // CHECK-DTOR: call void @llvm.lifetime.end(i64 1024, i8* %[[ADDR]])
29*67e74705SXin Li   // CHECK-DTOR: call void @llvm.lifetime.start(i64 1024, i8* %[[ADDR:[0-9]+]])
30*67e74705SXin Li   // CHECK-DTOR: call void @_ZN1AC1Ev(%struct.A* nonnull %[[VAR:[^ ]+]])
31*67e74705SXin Li   // CHECK-DTOR: call void @_Z3FooIRK1AEvOT_
32*67e74705SXin Li   // CHECK-DTOR: call void @_ZN1AD1Ev(%struct.A* nonnull %[[VAR]])
33*67e74705SXin Li   // CHECK-DTOR: call void @llvm.lifetime.end(i64 1024, i8* %[[ADDR]])
34*67e74705SXin Li   // CHECK-DTOR: }
35*67e74705SXin Li 
36*67e74705SXin Li   // CHECK-NO-DTOR-LABEL: Test1
37*67e74705SXin Li   // CHECK-NO-DTOR: call void @llvm.lifetime.start(i64 1024, i8* %[[ADDR:[0-9]+]])
38*67e74705SXin Li   // CHECK-NO-DTOR: call void @_ZN1AC1Ev(%struct.A* nonnull %[[VAR:[^ ]+]])
39*67e74705SXin Li   // CHECK-NO-DTOR: call void @_Z3FooIRK1AEvOT_
40*67e74705SXin Li   // CHECK-NO-DTOR: call void @llvm.lifetime.end(i64 1024, i8* %[[ADDR]])
41*67e74705SXin Li   // CHECK-NO-DTOR: call void @llvm.lifetime.start(i64 1024, i8* %[[ADDR:[0-9]+]])
42*67e74705SXin Li   // CHECK-NO-DTOR: call void @_ZN1AC1Ev(%struct.A* nonnull %[[VAR:[^ ]+]])
43*67e74705SXin Li   // CHECK-NO-DTOR: call void @_Z3FooIRK1AEvOT_
44*67e74705SXin Li   // CHECK-NO-DTOR: call void @llvm.lifetime.end(i64 1024, i8* %[[ADDR]])
45*67e74705SXin Li   // CHECK-NO-DTOR: }
46*67e74705SXin Li   {
47*67e74705SXin Li     const A &a = A{};
48*67e74705SXin Li     Foo(a);
49*67e74705SXin Li   }
50*67e74705SXin Li   {
51*67e74705SXin Li     const A &a = A{};
52*67e74705SXin Li     Foo(a);
53*67e74705SXin Li   }
54*67e74705SXin Li }
55*67e74705SXin Li 
Test2()56*67e74705SXin Li void Test2() {
57*67e74705SXin Li   // CHECK-DTOR-LABEL: Test2
58*67e74705SXin Li   // CHECK-DTOR: call void @llvm.lifetime.start(i64 1024, i8* %[[ADDR1:[0-9]+]])
59*67e74705SXin Li   // CHECK-DTOR: call void @_ZN1AC1Ev(%struct.A* nonnull %[[VAR1:[^ ]+]])
60*67e74705SXin Li   // CHECK-DTOR: call void @_Z3FooIRK1AEvOT_
61*67e74705SXin Li   // CHECK-DTOR: call void @llvm.lifetime.start(i64 1024, i8* %[[ADDR2:[0-9]+]])
62*67e74705SXin Li   // CHECK-DTOR: call void @_ZN1AC1Ev(%struct.A* nonnull %[[VAR2:[^ ]+]])
63*67e74705SXin Li   // CHECK-DTOR: call void @_Z3FooIRK1AEvOT_
64*67e74705SXin Li   // CHECK-DTOR: call void @_ZN1AD1Ev(%struct.A* nonnull %[[VAR2]])
65*67e74705SXin Li   // CHECK-DTOR: call void @llvm.lifetime.end(i64 1024, i8* %[[ADDR2]])
66*67e74705SXin Li   // CHECK-DTOR: call void @_ZN1AD1Ev(%struct.A* nonnull %[[VAR1]])
67*67e74705SXin Li   // CHECK-DTOR: call void @llvm.lifetime.end(i64 1024, i8* %[[ADDR1]])
68*67e74705SXin Li   // CHECK-DTOR: }
69*67e74705SXin Li 
70*67e74705SXin Li   // CHECK-NO-DTOR-LABEL: Test2
71*67e74705SXin Li   // CHECK-NO-DTOR: call void @llvm.lifetime.start(i64 1024, i8* %[[ADDR1:[0-9]+]])
72*67e74705SXin Li   // CHECK-NO-DTOR: call void @_ZN1AC1Ev(%struct.A* nonnull %[[VAR1:[^ ]+]])
73*67e74705SXin Li   // CHECK-NO-DTOR: call void @_Z3FooIRK1AEvOT_
74*67e74705SXin Li   // CHECK-NO-DTOR: call void @llvm.lifetime.start(i64 1024, i8* %[[ADDR2:[0-9]+]])
75*67e74705SXin Li   // CHECK-NO-DTOR: call void @_ZN1AC1Ev(%struct.A* nonnull %[[VAR2:[^ ]+]])
76*67e74705SXin Li   // CHECK-NO-DTOR: call void @_Z3FooIRK1AEvOT_
77*67e74705SXin Li   // CHECK-NO-DTOR: call void @llvm.lifetime.end(i64 1024, i8* %[[ADDR2]])
78*67e74705SXin Li   // CHECK-NO-DTOR: call void @llvm.lifetime.end(i64 1024, i8* %[[ADDR1]])
79*67e74705SXin Li   // CHECK-NO-DTOR: }
80*67e74705SXin Li   const A &a = A{};
81*67e74705SXin Li   Foo(a);
82*67e74705SXin Li   const A &b = A{};
83*67e74705SXin Li   Foo(b);
84*67e74705SXin Li }
85*67e74705SXin Li 
Test3()86*67e74705SXin Li void Test3() {
87*67e74705SXin Li   // CHECK-DTOR-LABEL: Test3
88*67e74705SXin Li   // CHECK-DTOR: call void @llvm.lifetime.start
89*67e74705SXin Li   // CHECK-DTOR: call void @llvm.lifetime.start
90*67e74705SXin Li 
91*67e74705SXin Li   // if.then:
92*67e74705SXin Li   // CHECK-DTOR: call void @llvm.lifetime.end
93*67e74705SXin Li 
94*67e74705SXin Li   // cleanup:
95*67e74705SXin Li   // CHECK-DTOR: call void @llvm.lifetime.end
96*67e74705SXin Li 
97*67e74705SXin Li   // cleanup:
98*67e74705SXin Li   // CHECK-DTOR: call void @llvm.lifetime.end
99*67e74705SXin Li   // CHECK-DTOR: }
100*67e74705SXin Li   const A &a = A{};
101*67e74705SXin Li   if (const A &b = A(a)) {
102*67e74705SXin Li     Foo(b);
103*67e74705SXin Li     return;
104*67e74705SXin Li   }
105*67e74705SXin Li   Bar(a);
106*67e74705SXin Li }
107*67e74705SXin Li 
Test4()108*67e74705SXin Li void Test4() {
109*67e74705SXin Li   // CHECK-DTOR-LABEL: Test4
110*67e74705SXin Li   // CHECK-DTOR: call void @llvm.lifetime.start
111*67e74705SXin Li 
112*67e74705SXin Li   // for.cond.cleanup:
113*67e74705SXin Li   // CHECK-DTOR: call void @llvm.lifetime.end
114*67e74705SXin Li 
115*67e74705SXin Li   // for.body:
116*67e74705SXin Li   // CHECK-DTOR: }
117*67e74705SXin Li   for (const A &a = A{}; a;) {
118*67e74705SXin Li     Foo(a);
119*67e74705SXin Li   }
120*67e74705SXin Li }
121*67e74705SXin Li 
Test5()122*67e74705SXin Li int Test5() {
123*67e74705SXin Li   // CHECK-DTOR-LABEL: Test5
124*67e74705SXin Li   // CHECK-DTOR: call void @llvm.lifetime.start
125*67e74705SXin Li   // CHECK-DTOR: call i32 @_Z3BazIiET_v()
126*67e74705SXin Li   // CHECK-DTOR: store
127*67e74705SXin Li   // CHECK-DTOR: call void @_Z3FooIRKiEvOT_
128*67e74705SXin Li   // CHECK-DTOR: load
129*67e74705SXin Li   // CHECK-DTOR: call void @llvm.lifetime.end
130*67e74705SXin Li   // CHECK-DTOR: }
131*67e74705SXin Li   const int &a = Baz<int>();
132*67e74705SXin Li   Foo(a);
133*67e74705SXin Li   return a;
134*67e74705SXin Li }
135*67e74705SXin Li 
Test6()136*67e74705SXin Li void Test6() {
137*67e74705SXin Li   // CHECK-DTOR-LABEL: Test6
138*67e74705SXin Li   // CHECK-DTOR: call void @llvm.lifetime.start(i64 {{[0-9]+}}, i8* %[[ADDR:[0-9]+]])
139*67e74705SXin Li   // CHECK-DTOR: call i32 @_Z3BazIiET_v()
140*67e74705SXin Li   // CHECK-DTOR: store
141*67e74705SXin Li   // CHECK-DTOR: call void @_Z3FooIiEvOT_
142*67e74705SXin Li   // CHECK-DTOR: call void @llvm.lifetime.end(i64 {{[0-9]+}}, i8* %[[ADDR]])
143*67e74705SXin Li   // CHECK-DTOR: call void @llvm.lifetime.start(i64 {{[0-9]+}}, i8* %[[ADDR:[0-9]+]])
144*67e74705SXin Li   // CHECK-DTOR: call i32 @_Z3BazIiET_v()
145*67e74705SXin Li   // CHECK-DTOR: store
146*67e74705SXin Li   // CHECK-DTOR: call void @_Z3FooIiEvOT_
147*67e74705SXin Li   // CHECK-DTOR: call void @llvm.lifetime.end(i64 {{[0-9]+}}, i8* %[[ADDR]])
148*67e74705SXin Li   // CHECK-DTOR: }
149*67e74705SXin Li   Foo(Baz<int>());
150*67e74705SXin Li   Foo(Baz<int>());
151*67e74705SXin Li }
152*67e74705SXin Li 
Test7()153*67e74705SXin Li void Test7() {
154*67e74705SXin Li   // CHECK-DTOR-LABEL: Test7
155*67e74705SXin Li   // CHECK-DTOR: call void @llvm.lifetime.start(i64 1024, i8* %[[ADDR:[0-9]+]])
156*67e74705SXin Li   // CHECK-DTOR: call void @_Z3BazI1AET_v({{.*}} %[[SLOT:[^ ]+]])
157*67e74705SXin Li   // CHECK-DTOR: call void @_Z3FooI1AEvOT_({{.*}} %[[SLOT]])
158*67e74705SXin Li   // CHECK-DTOR: call void @_ZN1AD1Ev(%struct.A* nonnull %[[SLOT]])
159*67e74705SXin Li   // CHECK-DTOR: call void @llvm.lifetime.end(i64 1024, i8* %[[ADDR]])
160*67e74705SXin Li   // CHECK-DTOR: call void @llvm.lifetime.start(i64 1024, i8* %[[ADDR:[0-9]+]])
161*67e74705SXin Li   // CHECK-DTOR: call void @_Z3BazI1AET_v({{.*}} %[[SLOT:[^ ]+]])
162*67e74705SXin Li   // CHECK-DTOR: call void @_Z3FooI1AEvOT_({{.*}} %[[SLOT]])
163*67e74705SXin Li   // CHECK-DTOR: call void @_ZN1AD1Ev(%struct.A* nonnull %[[SLOT]])
164*67e74705SXin Li   // CHECK-DTOR: call void @llvm.lifetime.end(i64 1024, i8* %[[ADDR]])
165*67e74705SXin Li   // CHECK-DTOR: }
166*67e74705SXin Li   Foo(Baz<A>());
167*67e74705SXin Li   Foo(Baz<A>());
168*67e74705SXin Li }
169