@@ -700,27 +700,39 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
700
700
if let ( ty:: Param ( _) , ty:: PredicateKind :: Trait ( p) ) =
701
701
( self_ty. kind ( ) , parent_pred. kind ( ) . skip_binder ( ) )
702
702
{
703
- if let ty:: Adt ( def, _) = p. trait_ref . self_ty ( ) . kind ( ) {
704
- let node = def. did . as_local ( ) . map ( |def_id| {
703
+ let node = match p. trait_ref . self_ty ( ) . kind ( ) {
704
+ ty:: Param ( _) => {
705
+ // Account for `fn` items like in `issue-35677.rs` to
706
+ // suggest restricting its type params.
707
+ let did = self . tcx . hir ( ) . body_owner_def_id ( hir:: BodyId {
708
+ hir_id : self . body_id ,
709
+ } ) ;
710
+ Some (
711
+ self . tcx
712
+ . hir ( )
713
+ . get ( self . tcx . hir ( ) . local_def_id_to_hir_id ( did) ) ,
714
+ )
715
+ }
716
+ ty:: Adt ( def, _) => def. did . as_local ( ) . map ( |def_id| {
705
717
self . tcx
706
718
. hir ( )
707
719
. get ( self . tcx . hir ( ) . local_def_id_to_hir_id ( def_id) )
708
- } ) ;
709
- if let Some ( hir :: Node :: Item ( hir :: Item { kind , .. } ) ) = node {
710
- if let Some ( g ) = kind . generics ( ) {
711
- let key = match g . where_clause . predicates {
712
- [ .. , pred ] => ( pred . span ( ) . shrink_to_hi ( ) , false ) ,
713
- [ ] => (
714
- g . where_clause
715
- . span_for_predicates_or_empty_place ( ) ,
716
- true ,
717
- ) ,
718
- } ;
719
- type_params
720
- . entry ( key )
721
- . or_insert_with ( FxHashSet :: default )
722
- . insert ( obligation . to_owned ( ) ) ;
723
- }
720
+ } ) ,
721
+ _ => None ,
722
+ } ;
723
+ if let Some ( hir :: Node :: Item ( hir :: Item { kind , .. } ) ) = node {
724
+ if let Some ( g ) = kind . generics ( ) {
725
+ let key = match g . where_clause . predicates {
726
+ [ .. , pred ] => ( pred . span ( ) . shrink_to_hi ( ) , false ) ,
727
+ [ ] => (
728
+ g . where_clause . span_for_predicates_or_empty_place ( ) ,
729
+ true ,
730
+ ) ,
731
+ } ;
732
+ type_params
733
+ . entry ( key )
734
+ . or_insert_with ( FxHashSet :: default )
735
+ . insert ( obligation . to_owned ( ) ) ;
724
736
}
725
737
}
726
738
}
@@ -871,19 +883,27 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
871
883
. iter ( )
872
884
. filter ( |( pred, _, _parent_pred) | !skip_list. contains ( & pred) )
873
885
. filter_map ( |( pred, parent_pred, _cause) | {
874
- format_pred ( * pred) . map ( |( p, self_ty) | match parent_pred {
875
- None => format ! ( "`{}`" , & p) ,
876
- Some ( parent_pred ) => match format_pred ( * parent_pred) {
886
+ format_pred ( * pred) . map ( |( p, self_ty) | {
887
+ collect_type_param_suggestions ( self_ty , pred , & p) ;
888
+ match parent_pred {
877
889
None => format ! ( "`{}`" , & p) ,
878
- Some ( ( parent_p, _) ) => {
879
- collect_type_param_suggestions ( self_ty, parent_pred, & p) ;
880
- format ! ( "`{}`\n which is required by `{}`" , p, parent_p)
881
- }
882
- } ,
890
+ Some ( parent_pred) => match format_pred ( * parent_pred) {
891
+ None => format ! ( "`{}`" , & p) ,
892
+ Some ( ( parent_p, _) ) => {
893
+ collect_type_param_suggestions (
894
+ self_ty,
895
+ parent_pred,
896
+ & p,
897
+ ) ;
898
+ format ! ( "`{}`\n which is required by `{}`" , p, parent_p)
899
+ }
900
+ } ,
901
+ }
883
902
} )
884
903
} )
885
904
. enumerate ( )
886
905
. collect :: < Vec < ( usize , String ) > > ( ) ;
906
+
887
907
for ( ( span, empty_where) , obligations) in type_params. into_iter ( ) {
888
908
restrict_type_params = true ;
889
909
// #74886: Sort here so that the output is always the same.
0 commit comments