@@ -657,21 +657,18 @@ fn sig_for_projection<'tcx>(cx: &LateContext<'tcx>, ty: ProjectionTy<'tcx>) -> O
657
657
let mut output = None ;
658
658
let lang_items = cx. tcx . lang_items ( ) ;
659
659
660
- for pred in cx
660
+ for ( pred, _ ) in cx
661
661
. tcx
662
662
. bound_explicit_item_bounds ( ty. item_def_id )
663
- . transpose_iter ( )
664
- . map ( |x| x. map_bound ( |( p, _) | p) )
663
+ . subst_iter_copied ( cx. tcx , ty. substs )
665
664
{
666
- match pred. 0 . kind ( ) . skip_binder ( ) {
665
+ match pred. kind ( ) . skip_binder ( ) {
667
666
PredicateKind :: Trait ( p)
668
667
if ( lang_items. fn_trait ( ) == Some ( p. def_id ( ) )
669
668
|| lang_items. fn_mut_trait ( ) == Some ( p. def_id ( ) )
670
669
|| lang_items. fn_once_trait ( ) == Some ( p. def_id ( ) ) ) =>
671
670
{
672
- let i = pred
673
- . map_bound ( |pred| pred. kind ( ) . rebind ( p. trait_ref . substs . type_at ( 1 ) ) )
674
- . subst ( cx. tcx , ty. substs ) ;
671
+ let i = pred. kind ( ) . rebind ( p. trait_ref . substs . type_at ( 1 ) ) ;
675
672
676
673
if inputs. map_or ( false , |inputs| inputs != i) {
677
674
// Multiple different fn trait impls. Is this even allowed?
@@ -684,10 +681,7 @@ fn sig_for_projection<'tcx>(cx: &LateContext<'tcx>, ty: ProjectionTy<'tcx>) -> O
684
681
// Multiple different fn trait impls. Is this even allowed?
685
682
return None ;
686
683
}
687
- output = Some (
688
- pred. map_bound ( |pred| pred. kind ( ) . rebind ( p. term . ty ( ) . unwrap ( ) ) )
689
- . subst ( cx. tcx , ty. substs ) ,
690
- ) ;
684
+ output = pred. kind ( ) . rebind ( p. term . ty ( ) ) . transpose ( ) ;
691
685
} ,
692
686
_ => ( ) ,
693
687
}
0 commit comments