@@ -606,7 +606,8 @@ impl<'cx, 'gcx, 'tcx> SelectionContext<'cx, 'gcx, 'tcx> {
606
606
debug ! ( "select({:?})" , obligation) ;
607
607
debug_assert ! ( !obligation. predicate. has_escaping_bound_vars( ) ) ;
608
608
609
- let stack = self . push_stack ( TraitObligationStackList :: empty ( ) , obligation) ;
609
+ let pec = & ProvisionalEvaluationCache :: default ( ) ;
610
+ let stack = self . push_stack ( TraitObligationStackList :: empty ( pec) , obligation) ;
610
611
611
612
let candidate = match self . candidate_from_obligation ( & stack) {
612
613
Err ( SelectionError :: Overflow ) => {
@@ -666,7 +667,7 @@ impl<'cx, 'gcx, 'tcx> SelectionContext<'cx, 'gcx, 'tcx> {
666
667
) -> Result < EvaluationResult , OverflowError > {
667
668
self . evaluation_probe ( |this| {
668
669
this. evaluate_predicate_recursively (
669
- TraitObligationStackList :: empty ( ) ,
670
+ TraitObligationStackList :: empty ( & ProvisionalEvaluationCache :: default ( ) ) ,
670
671
obligation. clone ( ) ,
671
672
)
672
673
} )
@@ -3968,6 +3969,10 @@ impl<'o, 'tcx> TraitObligationStack<'o, 'tcx> {
3968
3969
TraitObligationStackList :: with ( self )
3969
3970
}
3970
3971
3972
+ fn cache ( & self ) -> & ' o ProvisionalEvaluationCache < ' tcx > {
3973
+ self . previous . cache
3974
+ }
3975
+
3971
3976
fn iter ( & ' o self ) -> TraitObligationStackList < ' o , ' tcx > {
3972
3977
self . list ( )
3973
3978
}
@@ -3992,18 +3997,24 @@ impl<'o, 'tcx> TraitObligationStack<'o, 'tcx> {
3992
3997
}
3993
3998
}
3994
3999
4000
+ #[ derive( Default ) ]
4001
+ struct ProvisionalEvaluationCache < ' tcx > {
4002
+ _dummy : Vec < & ' tcx ( ) > ,
4003
+ }
4004
+
3995
4005
#[ derive( Copy , Clone ) ]
3996
4006
struct TraitObligationStackList < ' o , ' tcx : ' o > {
4007
+ cache : & ' o ProvisionalEvaluationCache < ' tcx > ,
3997
4008
head : Option < & ' o TraitObligationStack < ' o , ' tcx > > ,
3998
4009
}
3999
4010
4000
4011
impl < ' o , ' tcx > TraitObligationStackList < ' o , ' tcx > {
4001
- fn empty ( ) -> TraitObligationStackList < ' o , ' tcx > {
4002
- TraitObligationStackList { head : None }
4012
+ fn empty ( cache : & ' o ProvisionalEvaluationCache < ' tcx > ) -> TraitObligationStackList < ' o , ' tcx > {
4013
+ TraitObligationStackList { cache , head : None }
4003
4014
}
4004
4015
4005
4016
fn with ( r : & ' o TraitObligationStack < ' o , ' tcx > ) -> TraitObligationStackList < ' o , ' tcx > {
4006
- TraitObligationStackList { head : Some ( r) }
4017
+ TraitObligationStackList { cache : r . cache ( ) , head : Some ( r) }
4007
4018
}
4008
4019
4009
4020
fn head ( & self ) -> Option < & ' o TraitObligationStack < ' o , ' tcx > > {
0 commit comments