@@ -131,10 +131,9 @@ impl<'cx, 'tcx> LexicalResolver<'cx, 'tcx> {
131
131
self . dump_constraints ( ) ;
132
132
}
133
133
134
- let graph = self . construct_graph ( ) ;
135
134
self . expansion ( & mut var_data) ;
136
135
self . collect_errors ( & mut var_data, errors) ;
137
- self . collect_var_errors ( & var_data, & graph , errors) ;
136
+ self . collect_var_errors ( & var_data, errors) ;
138
137
var_data
139
138
}
140
139
@@ -622,7 +621,6 @@ impl<'cx, 'tcx> LexicalResolver<'cx, 'tcx> {
622
621
fn collect_var_errors (
623
622
& self ,
624
623
var_data : & LexicalRegionResolutions < ' tcx > ,
625
- graph : & RegionGraph < ' tcx > ,
626
624
errors : & mut Vec < RegionResolutionError < ' tcx > > ,
627
625
) {
628
626
debug ! ( "collect_var_errors, var_data = {:#?}" , var_data. values) ;
@@ -640,6 +638,10 @@ impl<'cx, 'tcx> LexicalResolver<'cx, 'tcx> {
640
638
// overlapping locations.
641
639
let mut dup_vec = IndexVec :: from_elem_n ( None , self . num_vars ( ) ) ;
642
640
641
+ // Only construct the graph when necessary, because it's moderately
642
+ // expensive.
643
+ let mut graph = None ;
644
+
643
645
for ( node_vid, value) in var_data. values . iter_enumerated ( ) {
644
646
match * value {
645
647
VarValue :: Empty ( _) | VarValue :: Value ( _) => { /* Inference successful */ }
@@ -672,7 +674,8 @@ impl<'cx, 'tcx> LexicalResolver<'cx, 'tcx> {
672
674
// influence the constraints on this value for
673
675
// richer diagnostics in `static_impl_trait`.
674
676
675
- self . collect_error_for_expanding_node ( graph, & mut dup_vec, node_vid, errors) ;
677
+ let g = graph. get_or_insert_with ( || self . construct_graph ( ) ) ;
678
+ self . collect_error_for_expanding_node ( g, & mut dup_vec, node_vid, errors) ;
676
679
}
677
680
}
678
681
}
0 commit comments