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