@@ -436,7 +436,9 @@ impl<'tcx> RegionInferenceContext<'tcx> {
436436 ) -> Option < ClosureRegionRequirements < ' gcx > > {
437437 assert ! ( self . inferred_values. is_none( ) , "values already inferred" ) ;
438438
439- self . propagate_constraints ( mir) ;
439+ let dfs_storage = & mut self . new_dfs_storage ( ) ;
440+
441+ self . propagate_constraints ( mir, dfs_storage) ;
440442
441443 // If this is a closure, we can propagate unsatisfied
442444 // `outlives_requirements` to our creator, so create a vector
@@ -449,7 +451,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
449451 None
450452 } ;
451453
452- self . check_type_tests ( infcx, mir, mir_def_id, outlives_requirements. as_mut ( ) ) ;
454+ self . check_type_tests ( infcx, mir, dfs_storage , mir_def_id, outlives_requirements. as_mut ( ) ) ;
453455
454456 self . check_universal_regions ( infcx, mir_def_id, outlives_requirements. as_mut ( ) ) ;
455457
@@ -469,22 +471,28 @@ impl<'tcx> RegionInferenceContext<'tcx> {
469471 /// Re-execute the region inference, this time tracking causal information.
470472 /// This is significantly slower, so it is done only when an error is being reported.
471473 pub ( super ) fn compute_causal_info ( & self , mir : & Mir < ' tcx > ) -> RegionCausalInfo {
472- let inferred_values = self . compute_region_values ( mir, TrackCauses ( true ) ) ;
474+ let dfs_storage = & mut self . new_dfs_storage ( ) ;
475+ let inferred_values = self . compute_region_values ( mir, dfs_storage, TrackCauses ( true ) ) ;
473476 RegionCausalInfo { inferred_values }
474477 }
475478
476479 /// Propagate the region constraints: this will grow the values
477480 /// for each region variable until all the constraints are
478481 /// satisfied. Note that some values may grow **too** large to be
479482 /// feasible, but we check this later.
480- fn propagate_constraints ( & mut self , mir : & Mir < ' tcx > ) {
483+ fn propagate_constraints ( & mut self , mir : & Mir < ' tcx > , dfs_storage : & mut dfs :: DfsStorage ) {
481484 self . dependency_map = Some ( self . build_dependency_map ( ) ) ;
482- let inferred_values = self . compute_region_values ( mir, TrackCauses ( false ) ) ;
485+ let inferred_values = self . compute_region_values ( mir, dfs_storage , TrackCauses ( false ) ) ;
483486 self . inferred_values = Some ( inferred_values) ;
484487 }
485488
486489 #[ inline( never) ] // ensure dfs is identifiable in profiles
487- fn compute_region_values ( & self , mir : & Mir < ' tcx > , track_causes : TrackCauses ) -> RegionValues {
490+ fn compute_region_values (
491+ & self ,
492+ mir : & Mir < ' tcx > ,
493+ dfs_storage : & mut dfs:: DfsStorage ,
494+ track_causes : TrackCauses ,
495+ ) -> RegionValues {
488496 debug ! ( "compute_region_values()" ) ;
489497 debug ! ( "compute_region_values: constraints={:#?}" , {
490498 let mut constraints: Vec <_> = self . constraints. iter( ) . collect( ) ;
@@ -515,6 +523,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
515523 // outlives constraint.
516524 let Ok ( made_changes) = self . dfs (
517525 mir,
526+ dfs_storage,
518527 CopyFromSourceToTarget {
519528 source_region : constraint. sub ,
520529 target_region : constraint. sup ,
@@ -569,6 +578,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
569578 & self ,
570579 infcx : & InferCtxt < ' _ , ' gcx , ' tcx > ,
571580 mir : & Mir < ' tcx > ,
581+ dfs_storage : & mut dfs:: DfsStorage ,
572582 mir_def_id : DefId ,
573583 mut propagated_outlives_requirements : Option < & mut Vec < ClosureOutlivesRequirement < ' gcx > > > ,
574584 ) {
@@ -577,7 +587,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
577587 for type_test in & self . type_tests {
578588 debug ! ( "check_type_test: {:?}" , type_test) ;
579589
580- if self . eval_region_test ( mir, type_test. point , type_test. lower_bound , & type_test. test ) {
590+ if self . eval_region_test ( mir, dfs_storage , type_test. point , type_test. lower_bound , & type_test. test ) {
581591 continue ;
582592 }
583593
@@ -834,6 +844,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
834844 fn eval_region_test (
835845 & self ,
836846 mir : & Mir < ' tcx > ,
847+ dfs_storage : & mut dfs:: DfsStorage ,
837848 point : Location ,
838849 lower_bound : RegionVid ,
839850 test : & RegionTest ,
@@ -846,26 +857,27 @@ impl<'tcx> RegionInferenceContext<'tcx> {
846857 match test {
847858 RegionTest :: IsOutlivedByAllRegionsIn ( regions) => regions
848859 . iter ( )
849- . all ( |& r| self . eval_outlives ( mir, r, lower_bound, point) ) ,
860+ . all ( |& r| self . eval_outlives ( mir, dfs_storage , r, lower_bound, point) ) ,
850861
851862 RegionTest :: IsOutlivedByAnyRegionIn ( regions) => regions
852863 . iter ( )
853- . any ( |& r| self . eval_outlives ( mir, r, lower_bound, point) ) ,
864+ . any ( |& r| self . eval_outlives ( mir, dfs_storage , r, lower_bound, point) ) ,
854865
855866 RegionTest :: Any ( tests) => tests
856867 . iter ( )
857- . any ( |test| self . eval_region_test ( mir, point, lower_bound, test) ) ,
868+ . any ( |test| self . eval_region_test ( mir, dfs_storage , point, lower_bound, test) ) ,
858869
859870 RegionTest :: All ( tests) => tests
860871 . iter ( )
861- . all ( |test| self . eval_region_test ( mir, point, lower_bound, test) ) ,
872+ . all ( |test| self . eval_region_test ( mir, dfs_storage , point, lower_bound, test) ) ,
862873 }
863874 }
864875
865876 // Evaluate whether `sup_region: sub_region @ point`.
866877 fn eval_outlives (
867878 & self ,
868879 mir : & Mir < ' tcx > ,
880+ dfs_storage : & mut dfs:: DfsStorage ,
869881 sup_region : RegionVid ,
870882 sub_region : RegionVid ,
871883 point : Location ,
@@ -881,6 +893,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
881893 // yield an `Err` result.
882894 match self . dfs (
883895 mir,
896+ dfs_storage,
884897 TestTargetOutlivesSource {
885898 source_region : sub_region,
886899 target_region : sup_region,
0 commit comments