blob: 309b4e52da52a3e83d02f44fd32cb55bbf8e5813 [file] [log] [blame]
Tim Shen421119f2016-07-01 21:08:47 +00001// RUN: %clang_cc1 %s -std=c++11 -O1 -DWITH_DTOR -triple x86_64 -emit-llvm -o - | FileCheck -check-prefix=CHECK-DTOR %s
2// RUN: %clang_cc1 %s -std=c++11 -O1 -triple x86_64 -emit-llvm -o - | FileCheck -check-prefix=CHECK-NO-DTOR %s
3
4struct A {
5 A();
6#ifdef WITH_DTOR
7 ~A();
8#endif
9 char a[1024];
10 operator bool() const;
11};
12
13template <typename T>
14void Foo(T &&);
15
16template <typename T>
17void Bar(T &&);
18
19template <typename T>
20T Baz();
21
22void Test1() {
23 // CHECK-DTOR-LABEL: Test1
Matt Arsenaultd9729492017-04-10 20:18:45 +000024 // CHECK-DTOR: call void @llvm.lifetime.start.p0i8(i64 1024, i8* nonnull %[[ADDR:[0-9]+]])
Tim Shen421119f2016-07-01 21:08:47 +000025 // CHECK-DTOR: call void @_ZN1AC1Ev(%struct.A* nonnull %[[VAR:[^ ]+]])
26 // CHECK-DTOR: call void @_Z3FooIRK1AEvOT_
27 // CHECK-DTOR: call void @_ZN1AD1Ev(%struct.A* nonnull %[[VAR]])
Matt Arsenaultd9729492017-04-10 20:18:45 +000028 // CHECK-DTOR: call void @llvm.lifetime.end.p0i8(i64 1024, i8* nonnull %[[ADDR]])
29 // CHECK-DTOR: call void @llvm.lifetime.start.p0i8(i64 1024, i8* nonnull %[[ADDR:[0-9]+]])
Tim Shen421119f2016-07-01 21:08:47 +000030 // CHECK-DTOR: call void @_ZN1AC1Ev(%struct.A* nonnull %[[VAR:[^ ]+]])
31 // CHECK-DTOR: call void @_Z3FooIRK1AEvOT_
32 // CHECK-DTOR: call void @_ZN1AD1Ev(%struct.A* nonnull %[[VAR]])
Matt Arsenaultd9729492017-04-10 20:18:45 +000033 // CHECK-DTOR: call void @llvm.lifetime.end.p0i8(i64 1024, i8* nonnull %[[ADDR]])
Tim Shen421119f2016-07-01 21:08:47 +000034 // CHECK-DTOR: }
35
36 // CHECK-NO-DTOR-LABEL: Test1
Matt Arsenaultd9729492017-04-10 20:18:45 +000037 // CHECK-NO-DTOR: call void @llvm.lifetime.start.p0i8(i64 1024, i8* nonnull %[[ADDR:[0-9]+]])
Tim Shen421119f2016-07-01 21:08:47 +000038 // CHECK-NO-DTOR: call void @_ZN1AC1Ev(%struct.A* nonnull %[[VAR:[^ ]+]])
39 // CHECK-NO-DTOR: call void @_Z3FooIRK1AEvOT_
Matt Arsenaultd9729492017-04-10 20:18:45 +000040 // CHECK-NO-DTOR: call void @llvm.lifetime.end.p0i8(i64 1024, i8* nonnull %[[ADDR]])
41 // CHECK-NO-DTOR: call void @llvm.lifetime.start.p0i8(i64 1024, i8* nonnull %[[ADDR:[0-9]+]])
Tim Shen421119f2016-07-01 21:08:47 +000042 // CHECK-NO-DTOR: call void @_ZN1AC1Ev(%struct.A* nonnull %[[VAR:[^ ]+]])
43 // CHECK-NO-DTOR: call void @_Z3FooIRK1AEvOT_
Matt Arsenaultd9729492017-04-10 20:18:45 +000044 // CHECK-NO-DTOR: call void @llvm.lifetime.end.p0i8(i64 1024, i8* nonnull %[[ADDR]])
Tim Shen421119f2016-07-01 21:08:47 +000045 // CHECK-NO-DTOR: }
46 {
47 const A &a = A{};
48 Foo(a);
49 }
50 {
51 const A &a = A{};
52 Foo(a);
53 }
54}
55
56void Test2() {
57 // CHECK-DTOR-LABEL: Test2
Matt Arsenaultd9729492017-04-10 20:18:45 +000058 // CHECK-DTOR: call void @llvm.lifetime.start.p0i8(i64 1024, i8* nonnull %[[ADDR1:[0-9]+]])
Tim Shen421119f2016-07-01 21:08:47 +000059 // CHECK-DTOR: call void @_ZN1AC1Ev(%struct.A* nonnull %[[VAR1:[^ ]+]])
60 // CHECK-DTOR: call void @_Z3FooIRK1AEvOT_
Matt Arsenaultd9729492017-04-10 20:18:45 +000061 // CHECK-DTOR: call void @llvm.lifetime.start.p0i8(i64 1024, i8* nonnull %[[ADDR2:[0-9]+]])
Tim Shen421119f2016-07-01 21:08:47 +000062 // CHECK-DTOR: call void @_ZN1AC1Ev(%struct.A* nonnull %[[VAR2:[^ ]+]])
63 // CHECK-DTOR: call void @_Z3FooIRK1AEvOT_
64 // CHECK-DTOR: call void @_ZN1AD1Ev(%struct.A* nonnull %[[VAR2]])
Matt Arsenaultd9729492017-04-10 20:18:45 +000065 // CHECK-DTOR: call void @llvm.lifetime.end.p0i8(i64 1024, i8* nonnull %[[ADDR2]])
Tim Shen421119f2016-07-01 21:08:47 +000066 // CHECK-DTOR: call void @_ZN1AD1Ev(%struct.A* nonnull %[[VAR1]])
Matt Arsenaultd9729492017-04-10 20:18:45 +000067 // CHECK-DTOR: call void @llvm.lifetime.end.p0i8(i64 1024, i8* nonnull %[[ADDR1]])
Tim Shen421119f2016-07-01 21:08:47 +000068 // CHECK-DTOR: }
69
70 // CHECK-NO-DTOR-LABEL: Test2
Matt Arsenaultd9729492017-04-10 20:18:45 +000071 // CHECK-NO-DTOR: call void @llvm.lifetime.start.p0i8(i64 1024, i8* nonnull %[[ADDR1:[0-9]+]])
Tim Shen421119f2016-07-01 21:08:47 +000072 // CHECK-NO-DTOR: call void @_ZN1AC1Ev(%struct.A* nonnull %[[VAR1:[^ ]+]])
73 // CHECK-NO-DTOR: call void @_Z3FooIRK1AEvOT_
Matt Arsenaultd9729492017-04-10 20:18:45 +000074 // CHECK-NO-DTOR: call void @llvm.lifetime.start.p0i8(i64 1024, i8* nonnull %[[ADDR2:[0-9]+]])
Tim Shen421119f2016-07-01 21:08:47 +000075 // CHECK-NO-DTOR: call void @_ZN1AC1Ev(%struct.A* nonnull %[[VAR2:[^ ]+]])
76 // CHECK-NO-DTOR: call void @_Z3FooIRK1AEvOT_
Matt Arsenaultd9729492017-04-10 20:18:45 +000077 // CHECK-NO-DTOR: call void @llvm.lifetime.end.p0i8(i64 1024, i8* nonnull %[[ADDR2]])
78 // CHECK-NO-DTOR: call void @llvm.lifetime.end.p0i8(i64 1024, i8* nonnull %[[ADDR1]])
Tim Shen421119f2016-07-01 21:08:47 +000079 // CHECK-NO-DTOR: }
80 const A &a = A{};
81 Foo(a);
82 const A &b = A{};
83 Foo(b);
84}
85
86void Test3() {
87 // CHECK-DTOR-LABEL: Test3
Tim Shen421119f2016-07-01 21:08:47 +000088 // CHECK-DTOR: call void @llvm.lifetime.start
89 // CHECK-DTOR: call void @llvm.lifetime.start
Tim Shen53547d92016-07-01 22:50:00 +000090
91 // if.then:
Tim Shen421119f2016-07-01 21:08:47 +000092 // CHECK-DTOR: call void @llvm.lifetime.end
Tim Shen53547d92016-07-01 22:50:00 +000093
94 // cleanup:
Tim Shen421119f2016-07-01 21:08:47 +000095 // CHECK-DTOR: call void @llvm.lifetime.end
Tim Shen53547d92016-07-01 22:50:00 +000096
97 // cleanup:
Tim Shen421119f2016-07-01 21:08:47 +000098 // CHECK-DTOR: call void @llvm.lifetime.end
99 // CHECK-DTOR: }
100 const A &a = A{};
101 if (const A &b = A(a)) {
102 Foo(b);
103 return;
104 }
105 Bar(a);
106}
107
108void Test4() {
109 // CHECK-DTOR-LABEL: Test4
Tim Shen421119f2016-07-01 21:08:47 +0000110 // CHECK-DTOR: call void @llvm.lifetime.start
Tim Shen53547d92016-07-01 22:50:00 +0000111
112 // for.cond.cleanup:
Tim Shen421119f2016-07-01 21:08:47 +0000113 // CHECK-DTOR: call void @llvm.lifetime.end
Tim Shen53547d92016-07-01 22:50:00 +0000114
115 // for.body:
Tim Shen421119f2016-07-01 21:08:47 +0000116 // CHECK-DTOR: }
117 for (const A &a = A{}; a;) {
118 Foo(a);
119 }
120}
121
122int Test5() {
123 // CHECK-DTOR-LABEL: Test5
124 // CHECK-DTOR: call void @llvm.lifetime.start
125 // CHECK-DTOR: call i32 @_Z3BazIiET_v()
126 // CHECK-DTOR: store
127 // CHECK-DTOR: call void @_Z3FooIRKiEvOT_
128 // CHECK-DTOR: load
129 // CHECK-DTOR: call void @llvm.lifetime.end
130 // CHECK-DTOR: }
131 const int &a = Baz<int>();
132 Foo(a);
133 return a;
134}
135
136void Test6() {
137 // CHECK-DTOR-LABEL: Test6
Matt Arsenaultd9729492017-04-10 20:18:45 +0000138 // CHECK-DTOR: call void @llvm.lifetime.start.p0i8(i64 {{[0-9]+}}, i8* nonnull %[[ADDR:[0-9]+]])
Tim Shen421119f2016-07-01 21:08:47 +0000139 // CHECK-DTOR: call i32 @_Z3BazIiET_v()
140 // CHECK-DTOR: store
141 // CHECK-DTOR: call void @_Z3FooIiEvOT_
Matt Arsenaultd9729492017-04-10 20:18:45 +0000142 // CHECK-DTOR: call void @llvm.lifetime.end.p0i8(i64 {{[0-9]+}}, i8* nonnull %[[ADDR]])
143 // CHECK-DTOR: call void @llvm.lifetime.start.p0i8(i64 {{[0-9]+}}, i8* nonnull %[[ADDR:[0-9]+]])
Tim Shen421119f2016-07-01 21:08:47 +0000144 // CHECK-DTOR: call i32 @_Z3BazIiET_v()
145 // CHECK-DTOR: store
146 // CHECK-DTOR: call void @_Z3FooIiEvOT_
Matt Arsenaultd9729492017-04-10 20:18:45 +0000147 // CHECK-DTOR: call void @llvm.lifetime.end.p0i8(i64 {{[0-9]+}}, i8* nonnull %[[ADDR]])
Tim Shen421119f2016-07-01 21:08:47 +0000148 // CHECK-DTOR: }
149 Foo(Baz<int>());
150 Foo(Baz<int>());
151}
152
153void Test7() {
154 // CHECK-DTOR-LABEL: Test7
Matt Arsenaultd9729492017-04-10 20:18:45 +0000155 // CHECK-DTOR: call void @llvm.lifetime.start.p0i8(i64 1024, i8* nonnull %[[ADDR:[0-9]+]])
Tim Shen421119f2016-07-01 21:08:47 +0000156 // CHECK-DTOR: call void @_Z3BazI1AET_v({{.*}} %[[SLOT:[^ ]+]])
157 // CHECK-DTOR: call void @_Z3FooI1AEvOT_({{.*}} %[[SLOT]])
158 // CHECK-DTOR: call void @_ZN1AD1Ev(%struct.A* nonnull %[[SLOT]])
Matt Arsenaultd9729492017-04-10 20:18:45 +0000159 // CHECK-DTOR: call void @llvm.lifetime.end.p0i8(i64 1024, i8* nonnull %[[ADDR]])
160 // CHECK-DTOR: call void @llvm.lifetime.start.p0i8(i64 1024, i8* nonnull %[[ADDR:[0-9]+]])
Tim Shen421119f2016-07-01 21:08:47 +0000161 // CHECK-DTOR: call void @_Z3BazI1AET_v({{.*}} %[[SLOT:[^ ]+]])
162 // CHECK-DTOR: call void @_Z3FooI1AEvOT_({{.*}} %[[SLOT]])
163 // CHECK-DTOR: call void @_ZN1AD1Ev(%struct.A* nonnull %[[SLOT]])
Matt Arsenaultd9729492017-04-10 20:18:45 +0000164 // CHECK-DTOR: call void @llvm.lifetime.end.p0i8(i64 1024, i8* nonnull %[[ADDR]])
Tim Shen421119f2016-07-01 21:08:47 +0000165 // CHECK-DTOR: }
166 Foo(Baz<A>());
167 Foo(Baz<A>());
168}