@@ -225,9 +225,15 @@ struct FulfillProcessor<'a, 'tcx> {
225225 selcx : SelectionContext < ' a , ' tcx > ,
226226}
227227
228- fn mk_pending < ' tcx > ( os : PredicateObligations < ' tcx > ) -> PendingPredicateObligations < ' tcx > {
228+ fn mk_pending < ' tcx > (
229+ parent : & PredicateObligation < ' tcx > ,
230+ os : PredicateObligations < ' tcx > ,
231+ ) -> PendingPredicateObligations < ' tcx > {
229232 os. into_iter ( )
230- . map ( |o| PendingPredicateObligation { obligation : o, stalled_on : vec ! [ ] } )
233+ . map ( |mut o| {
234+ o. set_depth_from_parent ( parent. recursion_depth ) ;
235+ PendingPredicateObligation { obligation : o, stalled_on : vec ! [ ] }
236+ } )
231237 . collect ( )
232238}
233239
@@ -341,7 +347,7 @@ impl<'a, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'tcx> {
341347 ) ;
342348 if predicate != obligation. predicate {
343349 obligations. push ( obligation. with ( infcx. tcx , predicate) ) ;
344- return ProcessResult :: Changed ( mk_pending ( obligations) ) ;
350+ return ProcessResult :: Changed ( mk_pending ( obligation , obligations) ) ;
345351 }
346352 }
347353 let binder = obligation. predicate . kind ( ) ;
@@ -385,7 +391,7 @@ impl<'a, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'tcx> {
385391 let mut obligations = PredicateObligations :: with_capacity ( 1 ) ;
386392 obligations. push ( obligation. with ( infcx. tcx , pred) ) ;
387393
388- ProcessResult :: Changed ( mk_pending ( obligations) )
394+ ProcessResult :: Changed ( mk_pending ( obligation , obligations) )
389395 }
390396 ty:: PredicateKind :: Ambiguous => ProcessResult :: Unchanged ,
391397 ty:: PredicateKind :: NormalizesTo ( ..) => {
@@ -410,6 +416,7 @@ impl<'a, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'tcx> {
410416 let host_obligation = obligation. with ( infcx. tcx , data) ;
411417
412418 self . process_host_obligation (
419+ obligation,
413420 host_obligation,
414421 & mut pending_obligation. stalled_on ,
415422 )
@@ -486,7 +493,10 @@ impl<'a, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'tcx> {
486493 // `<lhs_ty as Add<rhs_ty>>::Output` when this is an `Expr` representing
487494 // `lhs + rhs`.
488495 ty:: ConstKind :: Expr ( _) => {
489- return ProcessResult :: Changed ( mk_pending ( PredicateObligations :: new ( ) ) ) ;
496+ return ProcessResult :: Changed ( mk_pending (
497+ obligation,
498+ PredicateObligations :: new ( ) ,
499+ ) ) ;
490500 }
491501 ty:: ConstKind :: Placeholder ( _) => {
492502 bug ! ( "placeholder const {:?} in old solver" , ct)
@@ -503,7 +513,10 @@ impl<'a, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'tcx> {
503513 ct_ty,
504514 ty,
505515 ) {
506- Ok ( inf_ok) => ProcessResult :: Changed ( mk_pending ( inf_ok. into_obligations ( ) ) ) ,
516+ Ok ( inf_ok) => ProcessResult :: Changed ( mk_pending (
517+ obligation,
518+ inf_ok. into_obligations ( ) ,
519+ ) ) ,
507520 Err ( _) => ProcessResult :: Error ( FulfillmentErrorCode :: Select (
508521 SelectionError :: ConstArgHasWrongType { ct, ct_ty, expected_ty : ty } ,
509522 ) ) ,
@@ -537,7 +550,7 @@ impl<'a, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'tcx> {
537550 vec ! [ TyOrConstInferVar :: maybe_from_generic_arg( arg) . unwrap( ) ] ;
538551 ProcessResult :: Unchanged
539552 }
540- Some ( os) => ProcessResult :: Changed ( mk_pending ( os) ) ,
553+ Some ( os) => ProcessResult :: Changed ( mk_pending ( obligation , os) ) ,
541554 }
542555 }
543556
@@ -553,11 +566,8 @@ impl<'a, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'tcx> {
553566 vec ! [ TyOrConstInferVar :: Ty ( a) , TyOrConstInferVar :: Ty ( b) ] ;
554567 ProcessResult :: Unchanged
555568 }
556- Ok ( Ok ( mut ok) ) => {
557- for subobligation in & mut ok. obligations {
558- subobligation. set_depth_from_parent ( obligation. recursion_depth ) ;
559- }
560- ProcessResult :: Changed ( mk_pending ( ok. obligations ) )
569+ Ok ( Ok ( ok) ) => {
570+ ProcessResult :: Changed ( mk_pending ( obligation, ok. obligations ) )
561571 }
562572 Ok ( Err ( err) ) => {
563573 let expected_found = if subtype. a_is_expected {
@@ -582,7 +592,9 @@ impl<'a, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'tcx> {
582592 vec ! [ TyOrConstInferVar :: Ty ( a) , TyOrConstInferVar :: Ty ( b) ] ;
583593 ProcessResult :: Unchanged
584594 }
585- Ok ( Ok ( ok) ) => ProcessResult :: Changed ( mk_pending ( ok. obligations ) ) ,
595+ Ok ( Ok ( ok) ) => {
596+ ProcessResult :: Changed ( mk_pending ( obligation, ok. obligations ) )
597+ }
586598 Ok ( Err ( err) ) => {
587599 let expected_found = ExpectedFound :: new ( coerce. b , coerce. a ) ;
588600 ProcessResult :: Error ( FulfillmentErrorCode :: Subtype ( expected_found, err) )
@@ -645,6 +657,7 @@ impl<'a, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'tcx> {
645657 )
646658 {
647659 return ProcessResult :: Changed ( mk_pending (
660+ obligation,
648661 new_obligations. into_obligations ( ) ,
649662 ) ) ;
650663 }
@@ -659,6 +672,7 @@ impl<'a, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'tcx> {
659672 . eq ( DefineOpaqueTypes :: Yes , c1, c2)
660673 {
661674 return ProcessResult :: Changed ( mk_pending (
675+ obligation,
662676 new_obligations. into_obligations ( ) ,
663677 ) ) ;
664678 }
@@ -704,9 +718,10 @@ impl<'a, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'tcx> {
704718 c1,
705719 c2,
706720 ) {
707- Ok ( inf_ok) => {
708- ProcessResult :: Changed ( mk_pending ( inf_ok. into_obligations ( ) ) )
709- }
721+ Ok ( inf_ok) => ProcessResult :: Changed ( mk_pending (
722+ obligation,
723+ inf_ok. into_obligations ( ) ,
724+ ) ) ,
710725 Err ( err) => {
711726 ProcessResult :: Error ( FulfillmentErrorCode :: ConstEquate (
712727 ExpectedFound :: new ( c1, c2) ,
@@ -790,7 +805,7 @@ impl<'a, 'tcx> FulfillProcessor<'a, 'tcx> {
790805 match self . selcx . poly_select ( & trait_obligation) {
791806 Ok ( Some ( impl_source) ) => {
792807 debug ! ( "selecting trait at depth {} yielded Ok(Some)" , obligation. recursion_depth) ;
793- ProcessResult :: Changed ( mk_pending ( impl_source. nested_obligations ( ) ) )
808+ ProcessResult :: Changed ( mk_pending ( obligation , impl_source. nested_obligations ( ) ) )
794809 }
795810 Ok ( None ) => {
796811 debug ! ( "selecting trait at depth {} yielded Ok(None)" , obligation. recursion_depth) ;
@@ -854,7 +869,7 @@ impl<'a, 'tcx> FulfillProcessor<'a, 'tcx> {
854869 }
855870
856871 match project:: poly_project_and_unify_term ( & mut self . selcx , & project_obligation) {
857- ProjectAndUnifyResult :: Holds ( os) => ProcessResult :: Changed ( mk_pending ( os) ) ,
872+ ProjectAndUnifyResult :: Holds ( os) => ProcessResult :: Changed ( mk_pending ( obligation , os) ) ,
858873 ProjectAndUnifyResult :: FailedNormalization => {
859874 stalled_on. clear ( ) ;
860875 stalled_on. extend ( args_infer_vars (
@@ -868,7 +883,7 @@ impl<'a, 'tcx> FulfillProcessor<'a, 'tcx> {
868883 let mut obligations = PredicateObligations :: with_capacity ( 1 ) ;
869884 obligations. push ( project_obligation. with ( tcx, project_obligation. predicate ) ) ;
870885
871- ProcessResult :: Changed ( mk_pending ( obligations) )
886+ ProcessResult :: Changed ( mk_pending ( obligation , obligations) )
872887 }
873888 ProjectAndUnifyResult :: MismatchedProjectionTypes ( e) => {
874889 ProcessResult :: Error ( FulfillmentErrorCode :: Project ( e) )
@@ -878,11 +893,12 @@ impl<'a, 'tcx> FulfillProcessor<'a, 'tcx> {
878893
879894 fn process_host_obligation (
880895 & mut self ,
896+ obligation : & PredicateObligation < ' tcx > ,
881897 host_obligation : HostEffectObligation < ' tcx > ,
882898 stalled_on : & mut Vec < TyOrConstInferVar > ,
883899 ) -> ProcessResult < PendingPredicateObligation < ' tcx > , FulfillmentErrorCode < ' tcx > > {
884900 match effects:: evaluate_host_effect_obligation ( & mut self . selcx , & host_obligation) {
885- Ok ( nested) => ProcessResult :: Changed ( mk_pending ( nested) ) ,
901+ Ok ( nested) => ProcessResult :: Changed ( mk_pending ( obligation , nested) ) ,
886902 Err ( effects:: EvaluationFailure :: Ambiguous ) => {
887903 stalled_on. clear ( ) ;
888904 stalled_on. extend ( args_infer_vars (
0 commit comments