@@ -59,10 +59,12 @@ struct Candidate<'tcx> {
5959}
6060
6161enum CandidateKind < ' tcx > {
62- InherentImplCandidate ( /* Impl */ ast:: DefId , subst:: Substs < ' tcx > ) ,
62+ InherentImplCandidate ( /* Impl */ ast:: DefId , subst:: Substs < ' tcx > ,
63+ /* Normalize obligations */ Vec < traits:: PredicateObligation < ' tcx > > ) ,
6364 ObjectCandidate ( /* Trait */ ast:: DefId , /* method_num */ usize , /* vtable index */ usize ) ,
6465 ExtensionImplCandidate ( /* Impl */ ast:: DefId , ty:: TraitRef < ' tcx > ,
65- subst:: Substs < ' tcx > , ItemIndex ) ,
66+ subst:: Substs < ' tcx > , ItemIndex ,
67+ /* Normalize obligations */ Vec < traits:: PredicateObligation < ' tcx > > ) ,
6668 ClosureCandidate ( /* Trait */ ast:: DefId , ItemIndex ) ,
6769 WhereClauseCandidate ( ty:: PolyTraitRef < ' tcx > , ItemIndex ) ,
6870 ProjectionCandidate ( ast:: DefId , ItemIndex ) ,
@@ -398,16 +400,24 @@ impl<'a,'tcx> ProbeContext<'a,'tcx> {
398400 }
399401
400402 let ( impl_ty, impl_substs) = self . impl_ty_and_substs ( impl_def_id) ;
401- let impl_ty = self . fcx . instantiate_type_scheme ( self . span , & impl_substs, & impl_ty ) ;
403+ let impl_ty = impl_ty . subst ( self . tcx ( ) , & impl_substs) ;
402404
403405 // Determine the receiver type that the method itself expects.
404- let xform_self_ty =
405- self . xform_self_ty ( & item, impl_ty, & impl_substs) ;
406+ let xform_self_ty = self . xform_self_ty ( & item, impl_ty, & impl_substs) ;
407+
408+ // We can't use normalize_associated_types_in as it will pollute the
409+ // fcx's fulfillment context after this probe is over.
410+ let cause = traits:: ObligationCause :: misc ( self . span , self . fcx . body_id ) ;
411+ let mut selcx = & mut traits:: SelectionContext :: new ( self . fcx . infcx ( ) , self . fcx ) ;
412+ let traits:: Normalized { value : xform_self_ty, obligations } =
413+ traits:: normalize ( selcx, cause, & xform_self_ty) ;
414+ debug ! ( "assemble_inherent_impl_probe: xform_self_ty = {:?}" ,
415+ xform_self_ty. repr( self . tcx( ) ) ) ;
406416
407417 self . inherent_candidates . push ( Candidate {
408418 xform_self_ty : xform_self_ty,
409419 item : item,
410- kind : InherentImplCandidate ( impl_def_id, impl_substs)
420+ kind : InherentImplCandidate ( impl_def_id, impl_substs, obligations )
411421 } ) ;
412422 }
413423
@@ -653,12 +663,24 @@ impl<'a,'tcx> ProbeContext<'a,'tcx> {
653663 impl_trait_ref. self_ty ( ) ,
654664 impl_trait_ref. substs ) ;
655665
666+ // Normalize the receiver. We can't use normalize_associated_types_in
667+ // as it will pollute the fcx's fulfillment context after this probe
668+ // is over.
669+ let cause = traits:: ObligationCause :: misc ( self . span , self . fcx . body_id ) ;
670+ let mut selcx = & mut traits:: SelectionContext :: new ( self . fcx . infcx ( ) , self . fcx ) ;
671+ let traits:: Normalized { value : xform_self_ty, obligations } =
672+ traits:: normalize ( selcx, cause, & xform_self_ty) ;
673+
656674 debug ! ( "xform_self_ty={}" , xform_self_ty. repr( self . tcx( ) ) ) ;
657675
658676 self . extension_candidates . push ( Candidate {
659677 xform_self_ty : xform_self_ty,
660678 item : item. clone ( ) ,
661- kind : ExtensionImplCandidate ( impl_def_id, impl_trait_ref, impl_substs, item_index)
679+ kind : ExtensionImplCandidate ( impl_def_id,
680+ impl_trait_ref,
681+ impl_substs,
682+ item_index,
683+ obligations)
662684 } ) ;
663685 } ) ;
664686 }
@@ -1026,8 +1048,8 @@ impl<'a,'tcx> ProbeContext<'a,'tcx> {
10261048 // match as well (or at least may match, sometimes we
10271049 // don't have enough information to fully evaluate).
10281050 match probe. kind {
1029- InherentImplCandidate ( impl_def_id, ref substs) |
1030- ExtensionImplCandidate ( impl_def_id, _, ref substs, _) => {
1051+ InherentImplCandidate ( impl_def_id, ref substs, ref ref_obligations ) |
1052+ ExtensionImplCandidate ( impl_def_id, _, ref substs, _, ref ref_obligations ) => {
10311053 let selcx = & mut traits:: SelectionContext :: new ( self . infcx ( ) , self . fcx ) ;
10321054 let cause = traits:: ObligationCause :: misc ( self . span , self . fcx . body_id ) ;
10331055
@@ -1046,8 +1068,10 @@ impl<'a,'tcx> ProbeContext<'a,'tcx> {
10461068 debug ! ( "impl_obligations={}" , obligations. repr( self . tcx( ) ) ) ;
10471069
10481070 // Evaluate those obligations to see if they might possibly hold.
1049- obligations. iter ( ) . all ( |o| selcx. evaluate_obligation ( o) ) &&
1050- norm_obligations. iter ( ) . all ( |o| selcx. evaluate_obligation ( o) )
1071+ obligations. iter ( )
1072+ . chain ( norm_obligations. iter ( ) ) . chain ( ref_obligations. iter ( ) )
1073+ . all ( |o| selcx. evaluate_obligation ( o) )
1074+
10511075 }
10521076
10531077 ProjectionCandidate ( ..) |
@@ -1281,13 +1305,13 @@ impl<'tcx> Candidate<'tcx> {
12811305 Pick {
12821306 item : self . item . clone ( ) ,
12831307 kind : match self . kind {
1284- InherentImplCandidate ( def_id, _) => {
1308+ InherentImplCandidate ( def_id, _, _ ) => {
12851309 InherentImplPick ( def_id)
12861310 }
12871311 ObjectCandidate ( def_id, item_num, real_index) => {
12881312 ObjectPick ( def_id, item_num, real_index)
12891313 }
1290- ExtensionImplCandidate ( def_id, _, _, index) => {
1314+ ExtensionImplCandidate ( def_id, _, _, index, _ ) => {
12911315 ExtensionImplPick ( def_id, index)
12921316 }
12931317 ClosureCandidate ( trait_def_id, index) => {
@@ -1315,9 +1339,9 @@ impl<'tcx> Candidate<'tcx> {
13151339
13161340 fn to_source ( & self ) -> CandidateSource {
13171341 match self . kind {
1318- InherentImplCandidate ( def_id, _) => ImplSource ( def_id) ,
1342+ InherentImplCandidate ( def_id, _, _ ) => ImplSource ( def_id) ,
13191343 ObjectCandidate ( def_id, _, _) => TraitSource ( def_id) ,
1320- ExtensionImplCandidate ( def_id, _, _, _) => ImplSource ( def_id) ,
1344+ ExtensionImplCandidate ( def_id, _, _, _, _ ) => ImplSource ( def_id) ,
13211345 ClosureCandidate ( trait_def_id, _) => TraitSource ( trait_def_id) ,
13221346 WhereClauseCandidate ( ref trait_ref, _) => TraitSource ( trait_ref. def_id ( ) ) ,
13231347 ProjectionCandidate ( trait_def_id, _) => TraitSource ( trait_def_id) ,
@@ -1335,7 +1359,7 @@ impl<'tcx> Candidate<'tcx> {
13351359 ClosureCandidate ( trait_def_id, item_num) => {
13361360 Some ( ( trait_def_id, item_num) )
13371361 }
1338- ExtensionImplCandidate ( _, ref trait_ref, _, item_num) => {
1362+ ExtensionImplCandidate ( _, ref trait_ref, _, item_num, _ ) => {
13391363 Some ( ( trait_ref. def_id , item_num) )
13401364 }
13411365 WhereClauseCandidate ( ref trait_ref, item_num) => {
@@ -1359,13 +1383,14 @@ impl<'tcx> Repr<'tcx> for Candidate<'tcx> {
13591383impl < ' tcx > Repr < ' tcx > for CandidateKind < ' tcx > {
13601384 fn repr ( & self , tcx : & ty:: ctxt < ' tcx > ) -> String {
13611385 match * self {
1362- InherentImplCandidate ( ref a, ref b) =>
1363- format ! ( "InherentImplCandidate({},{})" , a. repr( tcx) , b. repr( tcx) ) ,
1386+ InherentImplCandidate ( ref a, ref b, ref c) =>
1387+ format ! ( "InherentImplCandidate({},{},{})" , a. repr( tcx) , b. repr( tcx) ,
1388+ c. repr( tcx) ) ,
13641389 ObjectCandidate ( a, b, c) =>
13651390 format ! ( "ObjectCandidate({},{},{})" , a. repr( tcx) , b, c) ,
1366- ExtensionImplCandidate ( ref a, ref b, ref c, ref d) =>
1367- format ! ( "ExtensionImplCandidate({},{},{},{})" , a. repr( tcx) , b. repr( tcx) ,
1368- c. repr( tcx) , d) ,
1391+ ExtensionImplCandidate ( ref a, ref b, ref c, ref d, ref e ) =>
1392+ format ! ( "ExtensionImplCandidate({},{},{},{},{} )" , a. repr( tcx) , b. repr( tcx) ,
1393+ c. repr( tcx) , d, e . repr ( tcx ) ) ,
13691394 ClosureCandidate ( ref a, ref b) =>
13701395 format ! ( "ClosureCandidate({},{})" , a. repr( tcx) , b) ,
13711396 WhereClauseCandidate ( ref a, ref b) =>
0 commit comments