@@ -700,27 +700,39 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
700700 if let ( ty:: Param ( _) , ty:: PredicateKind :: Trait ( p) ) =
701701 ( self_ty. kind ( ) , parent_pred. kind ( ) . skip_binder ( ) )
702702 {
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| {
705717 self . tcx
706718 . hir ( )
707719 . 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 ( ) ) ;
724736 }
725737 }
726738 }
@@ -871,19 +883,27 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
871883 . iter ( )
872884 . filter ( |( pred, _, _parent_pred) | !skip_list. contains ( & pred) )
873885 . 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 {
877889 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+ }
883902 } )
884903 } )
885904 . enumerate ( )
886905 . collect :: < Vec < ( usize , String ) > > ( ) ;
906+
887907 for ( ( span, empty_where) , obligations) in type_params. into_iter ( ) {
888908 restrict_type_params = true ;
889909 // #74886: Sort here so that the output is always the same.
0 commit comments