@@ -27,13 +27,13 @@ use middle::region::CodeExtent;
27
27
use ty:: subst;
28
28
use ty:: subst:: Substs ;
29
29
use ty:: subst:: Subst ;
30
- use traits:: { self , ProjectionMode } ;
31
30
use ty:: adjustment;
32
31
use ty:: { TyVid , IntVid , FloatVid } ;
33
32
use ty:: { self , Ty , TyCtxt } ;
34
33
use ty:: error:: { ExpectedFound , TypeError , UnconstrainedNumeric } ;
35
34
use ty:: fold:: { TypeFolder , TypeFoldable } ;
36
35
use ty:: relate:: { Relate , RelateResult , TypeRelation } ;
36
+ use traits:: { self , PredicateObligations , ProjectionMode } ;
37
37
use rustc_data_structures:: unify:: { self , UnificationTable } ;
38
38
use std:: cell:: { RefCell , Ref } ;
39
39
use std:: fmt;
@@ -63,6 +63,12 @@ pub mod sub;
63
63
pub mod type_variable;
64
64
pub mod unify_key;
65
65
66
+ pub struct InferOk < ' tcx , T > {
67
+ pub value : T ,
68
+ pub obligations : PredicateObligations < ' tcx > ,
69
+ }
70
+ pub type InferResult < ' tcx , T > = Result < InferOk < ' tcx , T > , TypeError < ' tcx > > ;
71
+
66
72
pub type Bound < T > = Option < T > ;
67
73
pub type UnitResult < ' tcx > = RelateResult < ' tcx , ( ) > ; // "unify result"
68
74
pub type FixupResult < T > = Result < T , FixupError > ; // "fixup result"
@@ -391,16 +397,15 @@ pub fn mk_subty<'a, 'tcx>(cx: &InferCtxt<'a, 'tcx>,
391
397
origin : TypeOrigin ,
392
398
a : Ty < ' tcx > ,
393
399
b : Ty < ' tcx > )
394
- -> UnitResult < ' tcx >
400
+ -> InferResult < ' tcx , ( ) >
395
401
{
396
402
debug ! ( "mk_subty({:?} <: {:?})" , a, b) ;
397
403
cx. sub_types ( a_is_expected, origin, a, b)
398
404
}
399
405
400
- pub fn can_mk_subty < ' a , ' tcx > ( cx : & InferCtxt < ' a , ' tcx > ,
401
- a : Ty < ' tcx > ,
402
- b : Ty < ' tcx > )
403
- -> UnitResult < ' tcx > {
406
+ pub fn can_mk_subty < ' a , ' tcx > ( cx : & InferCtxt < ' a , ' tcx > , a : Ty < ' tcx > , b : Ty < ' tcx > )
407
+ -> UnitResult < ' tcx >
408
+ {
404
409
debug ! ( "can_mk_subty({:?} <: {:?})" , a, b) ;
405
410
cx. probe ( |_| {
406
411
let trace = TypeTrace {
@@ -412,7 +417,7 @@ pub fn can_mk_subty<'a, 'tcx>(cx: &InferCtxt<'a, 'tcx>,
412
417
}
413
418
414
419
pub fn can_mk_eqty < ' a , ' tcx > ( cx : & InferCtxt < ' a , ' tcx > , a : Ty < ' tcx > , b : Ty < ' tcx > )
415
- -> UnitResult < ' tcx >
420
+ -> UnitResult < ' tcx >
416
421
{
417
422
cx. can_equate ( & a, & b)
418
423
}
@@ -432,7 +437,7 @@ pub fn mk_eqty<'a, 'tcx>(cx: &InferCtxt<'a, 'tcx>,
432
437
origin : TypeOrigin ,
433
438
a : Ty < ' tcx > ,
434
439
b : Ty < ' tcx > )
435
- -> UnitResult < ' tcx >
440
+ -> InferResult < ' tcx , ( ) >
436
441
{
437
442
debug ! ( "mk_eqty({:?} <: {:?})" , a, b) ;
438
443
cx. eq_types ( a_is_expected, origin, a, b)
@@ -443,7 +448,7 @@ pub fn mk_eq_trait_refs<'a, 'tcx>(cx: &InferCtxt<'a, 'tcx>,
443
448
origin : TypeOrigin ,
444
449
a : ty:: TraitRef < ' tcx > ,
445
450
b : ty:: TraitRef < ' tcx > )
446
- -> UnitResult < ' tcx >
451
+ -> InferResult < ' tcx , ( ) >
447
452
{
448
453
debug ! ( "mk_eq_trait_refs({:?} = {:?})" , a, b) ;
449
454
cx. eq_trait_refs ( a_is_expected, origin, a, b)
@@ -454,7 +459,7 @@ pub fn mk_sub_poly_trait_refs<'a, 'tcx>(cx: &InferCtxt<'a, 'tcx>,
454
459
origin : TypeOrigin ,
455
460
a : ty:: PolyTraitRef < ' tcx > ,
456
461
b : ty:: PolyTraitRef < ' tcx > )
457
- -> UnitResult < ' tcx >
462
+ -> InferResult < ' tcx , ( ) >
458
463
{
459
464
debug ! ( "mk_sub_poly_trait_refs({:?} <: {:?})" , a, b) ;
460
465
cx. sub_poly_trait_refs ( a_is_expected, origin, a, b)
@@ -465,7 +470,7 @@ pub fn mk_eq_impl_headers<'a, 'tcx>(cx: &InferCtxt<'a, 'tcx>,
465
470
origin : TypeOrigin ,
466
471
a : & ty:: ImplHeader < ' tcx > ,
467
472
b : & ty:: ImplHeader < ' tcx > )
468
- -> UnitResult < ' tcx >
473
+ -> InferResult < ' tcx , ( ) >
469
474
{
470
475
debug ! ( "mk_eq_impl_header({:?} = {:?})" , a, b) ;
471
476
match ( a. trait_ref , b. trait_ref ) {
@@ -661,39 +666,51 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
661
666
}
662
667
663
668
fn combine_fields ( & ' a self , a_is_expected : bool , trace : TypeTrace < ' tcx > )
664
- -> CombineFields < ' a , ' tcx > {
665
- CombineFields { infcx : self ,
666
- a_is_expected : a_is_expected,
667
- trace : trace,
668
- cause : None }
669
+ -> CombineFields < ' a , ' tcx >
670
+ {
671
+ CombineFields {
672
+ infcx : self ,
673
+ a_is_expected : a_is_expected,
674
+ trace : trace,
675
+ cause : None ,
676
+ obligations : PredicateObligations :: new ( ) ,
677
+ }
669
678
}
670
679
671
680
pub fn equate < T > ( & ' a self , a_is_expected : bool , trace : TypeTrace < ' tcx > , a : & T , b : & T )
672
- -> RelateResult < ' tcx , T >
681
+ -> InferResult < ' tcx , T >
673
682
where T : Relate < ' a , ' tcx >
674
683
{
675
- self . combine_fields ( a_is_expected, trace) . equate ( ) . relate ( a, b)
684
+ let mut equate = self . combine_fields ( a_is_expected, trace) . equate ( ) ;
685
+ let result = equate. relate ( a, b) ;
686
+ result. map ( |t| InferOk { value : t, obligations : equate. obligations ( ) } )
676
687
}
677
688
678
689
pub fn sub < T > ( & ' a self , a_is_expected : bool , trace : TypeTrace < ' tcx > , a : & T , b : & T )
679
- -> RelateResult < ' tcx , T >
690
+ -> InferResult < ' tcx , T >
680
691
where T : Relate < ' a , ' tcx >
681
692
{
682
- self . combine_fields ( a_is_expected, trace) . sub ( ) . relate ( a, b)
693
+ let mut sub = self . combine_fields ( a_is_expected, trace) . sub ( ) ;
694
+ let result = sub. relate ( a, b) ;
695
+ result. map ( |t| InferOk { value : t, obligations : sub. obligations ( ) } )
683
696
}
684
697
685
698
pub fn lub < T > ( & ' a self , a_is_expected : bool , trace : TypeTrace < ' tcx > , a : & T , b : & T )
686
- -> RelateResult < ' tcx , T >
699
+ -> InferResult < ' tcx , T >
687
700
where T : Relate < ' a , ' tcx >
688
701
{
689
- self . combine_fields ( a_is_expected, trace) . lub ( ) . relate ( a, b)
702
+ let mut lub = self . combine_fields ( a_is_expected, trace) . lub ( ) ;
703
+ let result = lub. relate ( a, b) ;
704
+ result. map ( |t| InferOk { value : t, obligations : lub. obligations ( ) } )
690
705
}
691
706
692
707
pub fn glb < T > ( & ' a self , a_is_expected : bool , trace : TypeTrace < ' tcx > , a : & T , b : & T )
693
- -> RelateResult < ' tcx , T >
708
+ -> InferResult < ' tcx , T >
694
709
where T : Relate < ' a , ' tcx >
695
710
{
696
- self . combine_fields ( a_is_expected, trace) . glb ( ) . relate ( a, b)
711
+ let mut glb = self . combine_fields ( a_is_expected, trace) . glb ( ) ;
712
+ let result = glb. relate ( a, b) ;
713
+ result. map ( |t| InferOk { value : t, obligations : glb. obligations ( ) } )
697
714
}
698
715
699
716
fn start_snapshot ( & self ) -> CombinedSnapshot {
@@ -829,12 +846,13 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
829
846
origin : TypeOrigin ,
830
847
a : Ty < ' tcx > ,
831
848
b : Ty < ' tcx > )
832
- -> UnitResult < ' tcx >
849
+ -> InferResult < ' tcx , ( ) >
833
850
{
834
851
debug ! ( "sub_types({:?} <: {:?})" , a, b) ;
835
852
self . commit_if_ok ( |_| {
836
853
let trace = TypeTrace :: types ( origin, a_is_expected, a, b) ;
837
- self . sub ( a_is_expected, trace, & a, & b) . map ( |_| ( ) )
854
+ self . sub ( a_is_expected, trace, & a, & b)
855
+ . map ( |InferOk { obligations, .. } | InferOk { value : ( ) , obligations : obligations } )
838
856
} )
839
857
}
840
858
@@ -843,11 +861,12 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
843
861
origin : TypeOrigin ,
844
862
a : Ty < ' tcx > ,
845
863
b : Ty < ' tcx > )
846
- -> UnitResult < ' tcx >
864
+ -> InferResult < ' tcx , ( ) >
847
865
{
848
866
self . commit_if_ok ( |_| {
849
867
let trace = TypeTrace :: types ( origin, a_is_expected, a, b) ;
850
- self . equate ( a_is_expected, trace, & a, & b) . map ( |_| ( ) )
868
+ self . equate ( a_is_expected, trace, & a, & b)
869
+ . map ( |InferOk { obligations, .. } | InferOk { value : ( ) , obligations : obligations } )
851
870
} )
852
871
}
853
872
@@ -856,7 +875,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
856
875
origin : TypeOrigin ,
857
876
a : ty:: TraitRef < ' tcx > ,
858
877
b : ty:: TraitRef < ' tcx > )
859
- -> UnitResult < ' tcx >
878
+ -> InferResult < ' tcx , ( ) >
860
879
{
861
880
debug ! ( "eq_trait_refs({:?} <: {:?})" ,
862
881
a,
@@ -866,7 +885,8 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
866
885
origin : origin,
867
886
values : TraitRefs ( expected_found ( a_is_expected, a. clone ( ) , b. clone ( ) ) )
868
887
} ;
869
- self . equate ( a_is_expected, trace, & a, & b) . map ( |_| ( ) )
888
+ self . equate ( a_is_expected, trace, & a, & b)
889
+ . map ( |InferOk { obligations, .. } | InferOk { value : ( ) , obligations : obligations } )
870
890
} )
871
891
}
872
892
@@ -875,7 +895,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
875
895
origin : TypeOrigin ,
876
896
a : ty:: PolyTraitRef < ' tcx > ,
877
897
b : ty:: PolyTraitRef < ' tcx > )
878
- -> UnitResult < ' tcx >
898
+ -> InferResult < ' tcx , ( ) >
879
899
{
880
900
debug ! ( "sub_poly_trait_refs({:?} <: {:?})" ,
881
901
a,
@@ -885,7 +905,8 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
885
905
origin : origin,
886
906
values : PolyTraitRefs ( expected_found ( a_is_expected, a. clone ( ) , b. clone ( ) ) )
887
907
} ;
888
- self . sub ( a_is_expected, trace, & a, & b) . map ( |_| ( ) )
908
+ self . sub ( a_is_expected, trace, & a, & b)
909
+ . map ( |InferOk { obligations, .. } | InferOk { value : ( ) , obligations : obligations } )
889
910
} )
890
911
}
891
912
@@ -928,20 +949,23 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
928
949
pub fn equality_predicate ( & self ,
929
950
span : Span ,
930
951
predicate : & ty:: PolyEquatePredicate < ' tcx > )
931
- -> UnitResult < ' tcx > {
952
+ -> InferResult < ' tcx , ( ) >
953
+ {
932
954
self . commit_if_ok ( |snapshot| {
933
955
let ( ty:: EquatePredicate ( a, b) , skol_map) =
934
956
self . skolemize_late_bound_regions ( predicate, snapshot) ;
935
957
let origin = TypeOrigin :: EquatePredicate ( span) ;
936
- let ( ) = mk_eqty ( self , false , origin, a, b) ?;
958
+ let InferOk { obligations , .. } = mk_eqty ( self , false , origin, a, b) ?;
937
959
self . leak_check ( & skol_map, snapshot)
960
+ . map ( |_| InferOk { value : ( ) , obligations : obligations } )
938
961
} )
939
962
}
940
963
941
964
pub fn region_outlives_predicate ( & self ,
942
965
span : Span ,
943
966
predicate : & ty:: PolyRegionOutlivesPredicate )
944
- -> UnitResult < ' tcx > {
967
+ -> UnitResult < ' tcx >
968
+ {
945
969
self . commit_if_ok ( |snapshot| {
946
970
let ( ty:: OutlivesPredicate ( r_a, r_b) , skol_map) =
947
971
self . skolemize_late_bound_regions ( predicate, snapshot) ;
0 commit comments