@@ -272,21 +272,28 @@ impl<'tcx> PoloniusOutOfScopePrecomputer<'_, 'tcx> {
272
272
loan_issued_at : Location ,
273
273
) {
274
274
let sccs = self . regioncx . constraint_sccs ( ) ;
275
+ let universal_regions = self . regioncx . universal_regions ( ) ;
275
276
let issuing_region_scc = sccs. scc ( issuing_region) ;
276
277
277
278
// We first handle the cases where the loan doesn't go out of scope, depending on the issuing
278
279
// region's successors.
279
280
for scc in sccs. depth_first_search ( issuing_region_scc) {
280
- // 1. Via member constraints
281
+ // 1. Via applied member constraints
281
282
//
282
283
// The issuing region can flow into the choice regions, and they are either:
283
284
// - placeholders or free regions themselves,
284
285
// - or also transitively outlive a free region.
285
286
//
286
- // That is to say, if there are member constraints here, the loan escapes the function
287
- // and cannot go out of scope. We can early return.
288
- if self . regioncx . scc_has_member_constraints ( scc) {
289
- return ;
287
+ // That is to say, if there are applied member constraints here, the loan escapes the
288
+ // function and cannot go out of scope. We could early return here.
289
+ //
290
+ // For additional insurance via fuzzing and crater, we verify that the constraint's min
291
+ // choice indeed escapes the function. In the future, we could e.g. turn this check into
292
+ // a debug assert and early return as an optimization.
293
+ for constraint in self . regioncx . applied_member_constraints ( scc) {
294
+ if universal_regions. is_universal_region ( constraint. min_choice ) {
295
+ return ;
296
+ }
290
297
}
291
298
292
299
// 2. Via regions that are live at all points: placeholders and free regions.
@@ -413,12 +420,12 @@ impl<'a, 'tcx> Borrows<'a, 'tcx> {
413
420
let mut polonius_prec = PoloniusOutOfScopePrecomputer :: new ( body, regioncx) ;
414
421
for ( loan_idx, loan_data) in borrow_set. iter_enumerated ( ) {
415
422
let issuing_region = loan_data. region ;
416
- let issued_location = loan_data. reserve_location ;
423
+ let loan_issued_at = loan_data. reserve_location ;
417
424
418
425
polonius_prec. precompute_loans_out_of_scope (
419
426
loan_idx,
420
427
issuing_region,
421
- issued_location ,
428
+ loan_issued_at ,
422
429
) ;
423
430
}
424
431
0 commit comments