@@ -295,46 +295,63 @@ impl<'cx, 'tcx> LexicalResolver<'cx, 'tcx> {
295
295
}
296
296
297
297
fn expansion ( & self , var_values : & mut LexicalRegionResolutions < ' tcx > ) {
298
- let mut process_constraint = |constraint : & Constraint < ' tcx > | {
299
- let ( a_region, b_vid, b_data, retain) = match * constraint {
298
+ let mut changed = false ;
299
+ let mut constraints = Vec :: new ( ) ;
300
+ for constraint in self . data . constraints . keys ( ) {
301
+ let ( a_region, b_vid, b_data) = match * constraint {
300
302
Constraint :: RegSubVar ( a_region, b_vid) => {
301
303
let b_data = var_values. value_mut ( b_vid) ;
302
- ( a_region, b_vid, b_data, false )
304
+ ( a_region, b_vid, b_data)
303
305
}
304
306
Constraint :: VarSubVar ( a_vid, b_vid) => match * var_values. value ( a_vid) {
305
- VarValue :: ErrorValue => return ( false , false ) ,
307
+ VarValue :: ErrorValue => continue ,
306
308
VarValue :: Value ( a_region) => {
307
309
let b_data = var_values. value_mut ( b_vid) ;
308
- let retain = match * b_data {
309
- VarValue :: Value ( ReStatic ) | VarValue :: ErrorValue => false ,
310
- _ => true ,
311
- } ;
312
- ( a_region, b_vid, b_data, retain )
310
+ match * b_data {
311
+ VarValue :: Value ( ReStatic ) | VarValue :: ErrorValue => ( ) ,
312
+ _ => constraints . push ( ( a_vid , b_vid ) ) ,
313
+ }
314
+ ( a_region, b_vid, b_data)
313
315
}
314
316
} ,
315
317
Constraint :: RegSubReg ( ..) | Constraint :: VarSubReg ( ..) => {
316
318
// These constraints are checked after expansion
317
319
// is done, in `collect_errors`.
318
- return ( false , false ) ;
320
+ continue ;
319
321
}
320
322
} ;
323
+ let edge_changed = self . expand_node ( a_region, b_vid, b_data) ;
324
+ if edge_changed {
325
+ changed = true
326
+ }
327
+ }
321
328
329
+ let mut process_constraint = |a_vid, b_vid| {
330
+ let ( a_region, b_data, retain) = match * var_values. value ( a_vid) {
331
+ VarValue :: ErrorValue => return ( false , false ) ,
332
+ VarValue :: Value ( a_region) => {
333
+ let b_data = var_values. value_mut ( b_vid) ;
334
+ let retain = match * b_data {
335
+ VarValue :: Value ( ReStatic ) | VarValue :: ErrorValue => false ,
336
+ _ => true ,
337
+ } ;
338
+ ( a_region, b_data, retain)
339
+ }
340
+ } ;
322
341
let changed = self . expand_node ( a_region, b_vid, b_data) ;
323
342
( changed, retain)
324
343
} ;
325
344
326
345
// Using bitsets to track the remaining elements is faster than using a
327
346
// `Vec` by itself (which requires removing elements, which requires
328
347
// element shuffling, which is slow).
329
- let constraints: Vec < _ > = self . data . constraints . keys ( ) . collect ( ) ;
330
348
let mut live_indices: BitSet < usize > = BitSet :: new_filled ( constraints. len ( ) ) ;
331
349
let mut killed_indices: BitSet < usize > = BitSet :: new_empty ( constraints. len ( ) ) ;
332
- let mut changed = true ;
333
350
while changed {
334
351
changed = false ;
335
352
for index in live_indices. iter ( ) {
336
- let constraint = constraints[ index] ;
337
- let ( edge_changed, retain) = process_constraint ( constraint ) ;
353
+ let ( a_vid , b_vid ) = constraints[ index] ;
354
+ let ( edge_changed, retain) = process_constraint ( a_vid , b_vid ) ;
338
355
changed |= edge_changed;
339
356
if !retain {
340
357
let changed = killed_indices. insert ( index) ;
@@ -790,8 +807,8 @@ impl<'cx, 'tcx> LexicalResolver<'cx, 'tcx> {
790
807
self . var_infos [ node_idx] . origin . span ( ) ,
791
808
& format ! (
792
809
"collect_error_for_expanding_node() could not find \
793
- error for var {:?} in universe {:?}, lower_bounds={:#?}, \
794
- upper_bounds={:#?}",
810
+ error for var {:?} in universe {:?}, lower_bounds={:#?}, \
811
+ upper_bounds={:#?}",
795
812
node_idx, node_universe, lower_bounds, upper_bounds
796
813
) ,
797
814
) ;
0 commit comments