@@ -600,20 +600,37 @@ fn compare_number_of_generics<'a, 'tcx>(
600
600
if impl_count != trait_count {
601
601
err_occurred = true ;
602
602
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 ) {
604
607
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 ! [ ] )
607
610
} 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
+ }
610
622
} else {
611
- trait_span. map ( |s| vec ! [ s] )
623
+ ( trait_span. map ( |s| vec ! [ s] ) , vec ! [ ] )
612
624
} ;
613
625
614
626
let impl_hir_id = tcx. hir ( ) . as_local_hir_id ( impl_. def_id ) . unwrap ( ) ;
615
627
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 ( ) ;
617
634
let spans = impl_item. generics . spans ( ) ;
618
635
let span = spans. primary_span ( ) ;
619
636
@@ -661,6 +678,10 @@ fn compare_number_of_generics<'a, 'tcx>(
661
678
) ) ;
662
679
}
663
680
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
+
664
685
err. emit ( ) ;
665
686
}
666
687
}
0 commit comments