@@ -600,20 +600,37 @@ fn compare_number_of_generics<'a, 'tcx>(
600600 if impl_count != trait_count {
601601 err_occurred = true ;
602602
603- let trait_spans = if let Some ( trait_hir_id) = tcx. hir ( ) . as_local_hir_id ( trait_. def_id ) {
603+ let (
604+ trait_spans,
605+ impl_trait_spans,
606+ ) = if let Some ( trait_hir_id) = tcx. hir ( ) . as_local_hir_id ( trait_. def_id ) {
604607 let trait_item = tcx. hir ( ) . expect_trait_item ( trait_hir_id) ;
605- Some ( if trait_item. generics . params . is_empty ( ) {
606- vec ! [ trait_item. generics. span]
608+ if trait_item. generics . params . is_empty ( ) {
609+ ( Some ( vec ! [ trait_item. generics. span] ) , vec ! [ ] )
607610 } else {
608- trait_item. generics . params . iter ( ) . map ( |p| p. span ) . collect :: < Vec < Span > > ( )
609- } )
611+ let arg_spans: Vec < Span > = trait_item. generics . params . iter ( )
612+ . map ( |p| p. span )
613+ . collect ( ) ;
614+ let impl_trait_spans: Vec < Span > = trait_item. generics . params . iter ( )
615+ . filter_map ( |p| if !trait_item. generics . span . overlaps ( p. span ) {
616+ Some ( p. span )
617+ } else {
618+ None
619+ } ) . collect ( ) ;
620+ ( Some ( arg_spans) , impl_trait_spans)
621+ }
610622 } else {
611- trait_span. map ( |s| vec ! [ s] )
623+ ( trait_span. map ( |s| vec ! [ s] ) , vec ! [ ] )
612624 } ;
613625
614626 let impl_hir_id = tcx. hir ( ) . as_local_hir_id ( impl_. def_id ) . unwrap ( ) ;
615627 let impl_item = tcx. hir ( ) . expect_impl_item ( impl_hir_id) ;
616- // let span = impl_item.generics.span;
628+ let impl_item_impl_trait_spans: Vec < Span > = impl_item. generics . params . iter ( )
629+ . filter_map ( |p| if !impl_item. generics . span . overlaps ( p. span ) {
630+ Some ( p. span )
631+ } else {
632+ None
633+ } ) . collect ( ) ;
617634 let spans = impl_item. generics . spans ( ) ;
618635 let span = spans. primary_span ( ) ;
619636
@@ -661,6 +678,10 @@ fn compare_number_of_generics<'a, 'tcx>(
661678 ) ) ;
662679 }
663680
681+ for span in impl_trait_spans. iter ( ) . chain ( impl_item_impl_trait_spans. iter ( ) ) {
682+ err. span_label ( * span, "`impl Trait` introduces an implicit type parameter" ) ;
683+ }
684+
664685 err. emit ( ) ;
665686 }
666687 }
0 commit comments