1
- // RUN: %clang_cc1 -mllvm -debug-only=LifetimeFacts,LifetimeLoanPropagation -Wexperimental-lifetime-safety %s 2>&1 | FileCheck %s
1
+ // RUN: %clang_cc1 -fexperimental-lifetime-safety - mllvm -debug-only=LifetimeFacts -Wexperimental-lifetime-safety %s 2>&1 | FileCheck %s
2
2
// REQUIRES: asserts
3
3
4
4
struct MyObj {
@@ -19,10 +19,6 @@ MyObj* return_local_addr() {
19
19
// CHECK: ReturnOfOrigin (OriginID: [[O_RET_VAL]])
20
20
// CHECK: Expire (LoanID: [[L_X]])
21
21
}
22
- // CHECK: LoanPropagation results:
23
- // CHECK-DAG: Origin [[O_ADDR_X]] contains Loan [[L_X]]
24
- // CHECK-DAG: Origin [[O_P]] contains Loan [[L_X]]
25
- // CHECK-DAG: Origin [[O_RET_VAL]] contains Loan [[L_X]]
26
22
27
23
28
24
// Pointer Assignment and Return
@@ -47,15 +43,6 @@ MyObj* assign_and_return_local_addr() {
47
43
// CHECK: ReturnOfOrigin (OriginID: [[O_PTR2_RVAL_2]])
48
44
// CHECK: Expire (LoanID: [[L_Y]])
49
45
}
50
- // CHECK: LoanPropagation results:
51
- // CHECK-DAG: Origin [[O_ADDR_Y]] contains Loan [[L_Y]]
52
- // CHECK-DAG: Origin [[O_PTR1]] contains Loan [[L_Y]]
53
- // CHECK-DAG: Origin [[O_PTR2]] contains Loan [[L_Y]]
54
- // CHECK-DAG: Origin [[O_PTR1_RVAL]] contains Loan [[L_Y]]
55
- // CHECK-DAG: Origin [[O_PTR1_RVAL_2]] contains Loan [[L_Y]]
56
- // CHECK-DAG: Origin [[O_PTR2_RVAL]] contains Loan [[L_Y]]
57
- // CHECK-DAG: Origin [[O_PTR2_RVAL_2]] contains Loan [[L_Y]]
58
-
59
46
60
47
// Return of Non-Pointer Type
61
48
// CHECK-LABEL: Function: return_int_val
@@ -65,8 +52,6 @@ int return_int_val() {
65
52
return x;
66
53
}
67
54
// CHECK-NEXT: End of Block
68
- // CHECK: LoanPropagation results:
69
- // CHECK: <empty>
70
55
71
56
72
57
// Loan Expiration (Automatic Variable, C++)
@@ -79,9 +64,6 @@ void loan_expires_cpp() {
79
64
// CHECK: AssignOrigin (DestID: [[O_POBJ:[0-9]+]], SrcID: [[O_ADDR_OBJ]])
80
65
// CHECK: Expire (LoanID: [[L_OBJ]])
81
66
}
82
- // CHECK: LoanPropagation results:
83
- // CHECK-DAG: Origin [[O_ADDR_OBJ]] contains Loan [[L_OBJ]]
84
- // CHECK-DAG: Origin [[O_POBJ]] contains Loan [[L_OBJ]]
85
67
86
68
87
69
// FIXME: No expire for Trivial Destructors
@@ -96,10 +78,6 @@ void loan_expires_trivial() {
96
78
// CHECK-NEXT: End of Block
97
79
// FIXME: Add check for Expire once trivial destructors are handled for expiration.
98
80
}
99
- // CHECK: LoanPropagation results:
100
- // CHECK-DAG: Origin [[O_ADDR_TRIVIAL_OBJ]] contains Loan [[L_TRIVIAL_OBJ]]
101
- // CHECK-DAG: Origin [[O_PTOBJ]] contains Loan [[L_TRIVIAL_OBJ]]
102
-
103
81
104
82
// CHECK-LABEL: Function: conditional
105
83
void conditional (bool condition) {
@@ -119,13 +97,6 @@ void conditional(bool condition) {
119
97
// CHECK: AssignOrigin (DestID: [[O_P_RVAL:[0-9]+]], SrcID: [[O_P]])
120
98
// CHECK: AssignOrigin (DestID: [[O_Q:[0-9]+]], SrcID: [[O_P_RVAL]])
121
99
}
122
- // CHECK: LoanPropagation results:
123
- // CHECK-DAG: Origin [[O_ADDR_A]] contains Loan [[L_A]]
124
- // CHECK-DAG: Origin [[O_ADDR_B]] contains Loan [[L_B]]
125
- // CHECK-DAG: Origin [[O_P]] contains Loan [[L_A]]
126
- // CHECK-DAG: Origin [[O_P]] contains Loan [[L_B]]
127
- // CHECK-DAG: Origin [[O_Q]] contains Loan [[L_A]]
128
- // CHECK-DAG: Origin [[O_Q]] contains Loan [[L_B]]
129
100
130
101
131
102
// CHECK-LABEL: Function: pointers_in_a_cycle
@@ -161,25 +132,6 @@ void pointers_in_a_cycle(bool condition) {
161
132
// CHECK: AssignOrigin (DestID: [[O_P3]], SrcID: [[O_TEMP_RVAL]])
162
133
}
163
134
}
164
- // At the end of the analysis, the origins for the pointers involved in the cycle
165
- // (p1, p2, p3, temp) should all contain the loans from v1, v2, and v3 at the fixed point.
166
- // CHECK: LoanPropagation results:
167
- // CHECK-DAG: Origin [[O_P1]] contains Loan [[L_V1]]
168
- // CHECK-DAG: Origin [[O_P1]] contains Loan [[L_V2]]
169
- // CHECK-DAG: Origin [[O_P1]] contains Loan [[L_V3]]
170
- // CHECK-DAG: Origin [[O_P2]] contains Loan [[L_V1]]
171
- // CHECK-DAG: Origin [[O_P2]] contains Loan [[L_V2]]
172
- // CHECK-DAG: Origin [[O_P2]] contains Loan [[L_V3]]
173
- // CHECK-DAG: Origin [[O_P3]] contains Loan [[L_V1]]
174
- // CHECK-DAG: Origin [[O_P3]] contains Loan [[L_V2]]
175
- // CHECK-DAG: Origin [[O_P3]] contains Loan [[L_V3]]
176
- // CHECK-DAG: Origin [[O_TEMP]] contains Loan [[L_V1]]
177
- // CHECK-DAG: Origin [[O_TEMP]] contains Loan [[L_V2]]
178
- // CHECK-DAG: Origin [[O_TEMP]] contains Loan [[L_V3]]
179
- // CHECK-DAG: Origin [[O_ADDR_V1]] contains Loan [[L_V1]]
180
- // CHECK-DAG: Origin [[O_ADDR_V2]] contains Loan [[L_V2]]
181
- // CHECK-DAG: Origin [[O_ADDR_V3]] contains Loan [[L_V3]]
182
-
183
135
184
136
// CHECK-LABEL: Function: overwrite_origin
185
137
void overwrite_origin () {
@@ -195,10 +147,6 @@ void overwrite_origin() {
195
147
// CHECK: Expire (LoanID: [[L_S2]])
196
148
// CHECK: Expire (LoanID: [[L_S1]])
197
149
}
198
- // CHECK: LoanPropagation results:
199
- // CHECK: Origin [[O_P]] contains Loan [[L_S2]]
200
- // CHECK-NOT: Origin [[O_P]] contains Loan [[L_S1]]
201
-
202
150
203
151
// CHECK-LABEL: Function: reassign_to_null
204
152
void reassign_to_null () {
@@ -213,8 +161,6 @@ void reassign_to_null() {
213
161
}
214
162
// FIXME: Have a better representation for nullptr than just an empty origin.
215
163
// It should be a separate loan and origin kind.
216
- // CHECK: LoanPropagation results:
217
- // CHECK: Origin [[O_P]] contains no loans
218
164
219
165
220
166
// CHECK-LABEL: Function: reassign_in_if
@@ -235,11 +181,6 @@ void reassign_in_if(bool condition) {
235
181
// CHECK: Expire (LoanID: [[L_S2]])
236
182
// CHECK: Expire (LoanID: [[L_S1]])
237
183
}
238
- // CHECK: LoanPropagation results:
239
- // CHECK-DAG: Origin [[O_P]] contains Loan [[L_S1]]
240
- // CHECK-DAG: Origin [[O_P]] contains Loan [[L_S2]]
241
- // CHECK-DAG: Origin [[O_ADDR_S1]] contains Loan [[L_S1]]
242
- // CHECK-DAG: Origin [[O_ADDR_S2]] contains Loan [[L_S2]]
243
184
244
185
245
186
// CHECK-LABEL: Function: assign_in_switch
@@ -276,14 +217,6 @@ void assign_in_switch(int mode) {
276
217
// CHECK-DAG: Expire (LoanID: [[L_S2]])
277
218
// CHECK-DAG: Expire (LoanID: [[L_S1]])
278
219
}
279
- // CHECK: LoanPropagation results:
280
- // CHECK-DAG: Origin [[O_P]] contains Loan [[L_S1]]
281
- // CHECK-DAG: Origin [[O_P]] contains Loan [[L_S2]]
282
- // CHECK-DAG: Origin [[O_P]] contains Loan [[L_S3]]
283
- // CHECK-DAG: Origin [[O_ADDR_S1]] contains Loan [[L_S1]]
284
- // CHECK-DAG: Origin [[O_ADDR_S2]] contains Loan [[L_S2]]
285
- // CHECK-DAG: Origin [[O_ADDR_S3]] contains Loan [[L_S3]]
286
-
287
220
288
221
// CHECK-LABEL: Function: loan_in_loop
289
222
void loan_in_loop (bool condition) {
@@ -299,10 +232,6 @@ void loan_in_loop(bool condition) {
299
232
// CHECK: Expire (LoanID: [[L_INNER]])
300
233
}
301
234
}
302
- // CHECK: LoanPropagation results:
303
- // CHECK-DAG: Origin [[O_P]] contains Loan [[L_INNER]]
304
- // CHECK-DAG: Origin [[O_ADDR_INNER]] contains Loan [[L_INNER]]
305
-
306
235
307
236
// CHECK-LABEL: Function: loop_with_break
308
237
void loop_with_break (int count) {
@@ -326,13 +255,6 @@ void loop_with_break(int count) {
326
255
// CHECK: Expire (LoanID: [[L_S1]])
327
256
}
328
257
329
- // CHECK-LABEL: LoanPropagation results:
330
- // CHECK-DAG: Origin [[O_P]] contains Loan [[L_S1]]
331
- // CHECK-DAG: Origin [[O_P]] contains Loan [[L_S2]]
332
- // CHECK-DAG: Origin [[O_ADDR_S1]] contains Loan [[L_S1]]
333
- // CHECK-DAG: Origin [[O_ADDR_S2]] contains Loan [[L_S2]]
334
-
335
-
336
258
// CHECK-LABEL: Function: nested_scopes
337
259
void nested_scopes () {
338
260
MyObj* p = nullptr ;
@@ -355,13 +277,6 @@ void nested_scopes() {
355
277
// CHECK: Expire (LoanID: [[L_OUTER]])
356
278
}
357
279
358
- // CHECK-LABEL: LoanPropagation results:
359
- // CHECK-DAG: Origin [[O_P]] contains Loan [[L_INNER]]
360
- // CHECK-DAG: Origin [[O_ADDR_INNER]] contains Loan [[L_INNER]]
361
- // CHECK-DAG: Origin [[O_ADDR_OUTER]] contains Loan [[L_OUTER]]
362
- // CHECK-NOT: Origin [[O_P]] contains Loan [[L_OUTER]]
363
-
364
-
365
280
// CHECK-LABEL: Function: pointer_indirection
366
281
void pointer_indirection () {
367
282
int a;
0 commit comments