@@ -225,9 +225,15 @@ struct FulfillProcessor<'a, 'tcx> {
225
225
selcx : SelectionContext < ' a , ' tcx > ,
226
226
}
227
227
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 > {
229
232
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
+ } )
231
237
. collect ( )
232
238
}
233
239
@@ -341,7 +347,7 @@ impl<'a, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'tcx> {
341
347
) ;
342
348
if predicate != obligation. predicate {
343
349
obligations. push ( obligation. with ( infcx. tcx , predicate) ) ;
344
- return ProcessResult :: Changed ( mk_pending ( obligations) ) ;
350
+ return ProcessResult :: Changed ( mk_pending ( obligation , obligations) ) ;
345
351
}
346
352
}
347
353
let binder = obligation. predicate . kind ( ) ;
@@ -385,7 +391,7 @@ impl<'a, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'tcx> {
385
391
let mut obligations = PredicateObligations :: with_capacity ( 1 ) ;
386
392
obligations. push ( obligation. with ( infcx. tcx , pred) ) ;
387
393
388
- ProcessResult :: Changed ( mk_pending ( obligations) )
394
+ ProcessResult :: Changed ( mk_pending ( obligation , obligations) )
389
395
}
390
396
ty:: PredicateKind :: Ambiguous => ProcessResult :: Unchanged ,
391
397
ty:: PredicateKind :: NormalizesTo ( ..) => {
@@ -410,6 +416,7 @@ impl<'a, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'tcx> {
410
416
let host_obligation = obligation. with ( infcx. tcx , data) ;
411
417
412
418
self . process_host_obligation (
419
+ obligation,
413
420
host_obligation,
414
421
& mut pending_obligation. stalled_on ,
415
422
)
@@ -486,7 +493,10 @@ impl<'a, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'tcx> {
486
493
// `<lhs_ty as Add<rhs_ty>>::Output` when this is an `Expr` representing
487
494
// `lhs + rhs`.
488
495
ty:: ConstKind :: Expr ( _) => {
489
- return ProcessResult :: Changed ( mk_pending ( PredicateObligations :: new ( ) ) ) ;
496
+ return ProcessResult :: Changed ( mk_pending (
497
+ obligation,
498
+ PredicateObligations :: new ( ) ,
499
+ ) ) ;
490
500
}
491
501
ty:: ConstKind :: Placeholder ( _) => {
492
502
bug ! ( "placeholder const {:?} in old solver" , ct)
@@ -503,7 +513,10 @@ impl<'a, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'tcx> {
503
513
ct_ty,
504
514
ty,
505
515
) {
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
+ ) ) ,
507
520
Err ( _) => ProcessResult :: Error ( FulfillmentErrorCode :: Select (
508
521
SelectionError :: ConstArgHasWrongType { ct, ct_ty, expected_ty : ty } ,
509
522
) ) ,
@@ -537,7 +550,7 @@ impl<'a, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'tcx> {
537
550
vec ! [ TyOrConstInferVar :: maybe_from_generic_arg( arg) . unwrap( ) ] ;
538
551
ProcessResult :: Unchanged
539
552
}
540
- Some ( os) => ProcessResult :: Changed ( mk_pending ( os) ) ,
553
+ Some ( os) => ProcessResult :: Changed ( mk_pending ( obligation , os) ) ,
541
554
}
542
555
}
543
556
@@ -557,7 +570,7 @@ impl<'a, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'tcx> {
557
570
for subobligation in & mut ok. obligations {
558
571
subobligation. set_depth_from_parent ( obligation. recursion_depth ) ;
559
572
}
560
- ProcessResult :: Changed ( mk_pending ( ok. obligations ) )
573
+ ProcessResult :: Changed ( mk_pending ( obligation , ok. obligations ) )
561
574
}
562
575
Ok ( Err ( err) ) => {
563
576
let expected_found = if subtype. a_is_expected {
@@ -582,7 +595,9 @@ impl<'a, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'tcx> {
582
595
vec ! [ TyOrConstInferVar :: Ty ( a) , TyOrConstInferVar :: Ty ( b) ] ;
583
596
ProcessResult :: Unchanged
584
597
}
585
- Ok ( Ok ( ok) ) => ProcessResult :: Changed ( mk_pending ( ok. obligations ) ) ,
598
+ Ok ( Ok ( ok) ) => {
599
+ ProcessResult :: Changed ( mk_pending ( obligation, ok. obligations ) )
600
+ }
586
601
Ok ( Err ( err) ) => {
587
602
let expected_found = ExpectedFound :: new ( coerce. b , coerce. a ) ;
588
603
ProcessResult :: Error ( FulfillmentErrorCode :: Subtype ( expected_found, err) )
@@ -645,6 +660,7 @@ impl<'a, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'tcx> {
645
660
)
646
661
{
647
662
return ProcessResult :: Changed ( mk_pending (
663
+ obligation,
648
664
new_obligations. into_obligations ( ) ,
649
665
) ) ;
650
666
}
@@ -659,6 +675,7 @@ impl<'a, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'tcx> {
659
675
. eq ( DefineOpaqueTypes :: Yes , c1, c2)
660
676
{
661
677
return ProcessResult :: Changed ( mk_pending (
678
+ obligation,
662
679
new_obligations. into_obligations ( ) ,
663
680
) ) ;
664
681
}
@@ -704,9 +721,10 @@ impl<'a, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'tcx> {
704
721
c1,
705
722
c2,
706
723
) {
707
- Ok ( inf_ok) => {
708
- ProcessResult :: Changed ( mk_pending ( inf_ok. into_obligations ( ) ) )
709
- }
724
+ Ok ( inf_ok) => ProcessResult :: Changed ( mk_pending (
725
+ obligation,
726
+ inf_ok. into_obligations ( ) ,
727
+ ) ) ,
710
728
Err ( err) => {
711
729
ProcessResult :: Error ( FulfillmentErrorCode :: ConstEquate (
712
730
ExpectedFound :: new ( c1, c2) ,
@@ -790,7 +808,7 @@ impl<'a, 'tcx> FulfillProcessor<'a, 'tcx> {
790
808
match self . selcx . poly_select ( & trait_obligation) {
791
809
Ok ( Some ( impl_source) ) => {
792
810
debug ! ( "selecting trait at depth {} yielded Ok(Some)" , obligation. recursion_depth) ;
793
- ProcessResult :: Changed ( mk_pending ( impl_source. nested_obligations ( ) ) )
811
+ ProcessResult :: Changed ( mk_pending ( obligation , impl_source. nested_obligations ( ) ) )
794
812
}
795
813
Ok ( None ) => {
796
814
debug ! ( "selecting trait at depth {} yielded Ok(None)" , obligation. recursion_depth) ;
@@ -854,7 +872,7 @@ impl<'a, 'tcx> FulfillProcessor<'a, 'tcx> {
854
872
}
855
873
856
874
match project:: poly_project_and_unify_term ( & mut self . selcx , & project_obligation) {
857
- ProjectAndUnifyResult :: Holds ( os) => ProcessResult :: Changed ( mk_pending ( os) ) ,
875
+ ProjectAndUnifyResult :: Holds ( os) => ProcessResult :: Changed ( mk_pending ( obligation , os) ) ,
858
876
ProjectAndUnifyResult :: FailedNormalization => {
859
877
stalled_on. clear ( ) ;
860
878
stalled_on. extend ( args_infer_vars (
@@ -868,7 +886,7 @@ impl<'a, 'tcx> FulfillProcessor<'a, 'tcx> {
868
886
let mut obligations = PredicateObligations :: with_capacity ( 1 ) ;
869
887
obligations. push ( project_obligation. with ( tcx, project_obligation. predicate ) ) ;
870
888
871
- ProcessResult :: Changed ( mk_pending ( obligations) )
889
+ ProcessResult :: Changed ( mk_pending ( obligation , obligations) )
872
890
}
873
891
ProjectAndUnifyResult :: MismatchedProjectionTypes ( e) => {
874
892
ProcessResult :: Error ( FulfillmentErrorCode :: Project ( e) )
@@ -878,11 +896,12 @@ impl<'a, 'tcx> FulfillProcessor<'a, 'tcx> {
878
896
879
897
fn process_host_obligation (
880
898
& mut self ,
899
+ obligation : & PredicateObligation < ' tcx > ,
881
900
host_obligation : HostEffectObligation < ' tcx > ,
882
901
stalled_on : & mut Vec < TyOrConstInferVar > ,
883
902
) -> ProcessResult < PendingPredicateObligation < ' tcx > , FulfillmentErrorCode < ' tcx > > {
884
903
match effects:: evaluate_host_effect_obligation ( & mut self . selcx , & host_obligation) {
885
- Ok ( nested) => ProcessResult :: Changed ( mk_pending ( nested) ) ,
904
+ Ok ( nested) => ProcessResult :: Changed ( mk_pending ( obligation , nested) ) ,
886
905
Err ( effects:: EvaluationFailure :: Ambiguous ) => {
887
906
stalled_on. clear ( ) ;
888
907
stalled_on. extend ( args_infer_vars (
0 commit comments