@@ -583,7 +583,7 @@ fn compare_self_type<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
583583fn compare_number_of_generics < ' a , ' tcx > (
584584 tcx : TyCtxt < ' a , ' tcx , ' tcx > ,
585585 impl_ : & ty:: AssocItem ,
586- impl_span : Span ,
586+ _impl_span : Span ,
587587 trait_ : & ty:: AssocItem ,
588588 trait_span : Option < Span > ,
589589) -> Result < ( ) , ErrorReported > {
@@ -600,17 +600,25 @@ fn compare_number_of_generics<'a, 'tcx>(
600600 if impl_count != trait_count {
601601 err_occurred = true ;
602602
603- let impl_hir_id = tcx. hir ( ) . as_local_hir_id ( impl_. def_id ) . unwrap ( ) ;
604- let impl_item = tcx. hir ( ) . expect_impl_item ( impl_hir_id) ;
605- let span = if impl_item. generics . params . is_empty ( )
606- || impl_item. generics . span . is_dummy ( ) { // argument position impl Trait (#55374)
607- impl_span
603+ let trait_spans = if let Some ( trait_hir_id) = tcx. hir ( ) . as_local_hir_id ( trait_. def_id ) {
604+ 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]
607+ } else {
608+ trait_item. generics . params . iter ( ) . map ( |p| p. span ) . collect :: < Vec < Span > > ( )
609+ } )
608610 } else {
609- impl_item . generics . span
611+ trait_span . map ( |s| vec ! [ s ] )
610612 } ;
611613
614+ let impl_hir_id = tcx. hir ( ) . as_local_hir_id ( impl_. def_id ) . unwrap ( ) ;
615+ let impl_item = tcx. hir ( ) . expect_impl_item ( impl_hir_id) ;
616+ // let span = impl_item.generics.span;
617+ let spans = impl_item. generics . spans ( ) ;
618+ let span = spans. primary_span ( ) ;
619+
612620 let mut err = tcx. sess . struct_span_err_with_code (
613- span ,
621+ spans ,
614622 & format ! (
615623 "method `{}` has {} {kind} parameter{} but its trait \
616624 declaration has {} {kind} parameter{}",
@@ -626,22 +634,32 @@ fn compare_number_of_generics<'a, 'tcx>(
626634
627635 let mut suffix = None ;
628636
629- if let Some ( span) = trait_span {
630- err. span_label (
631- span,
632- format ! ( "expected {} {} parameter{}" , trait_count, kind,
633- if trait_count != 1 { "s" } else { "" } )
634- ) ;
637+ if let Some ( spans) = trait_spans {
638+ let mut spans = spans. iter ( ) ;
639+ if let Some ( span) = spans. next ( ) {
640+ err. span_label ( * span, format ! (
641+ "expected {} {} parameter{}" ,
642+ trait_count,
643+ kind,
644+ if trait_count != 1 { "s" } else { "" } ,
645+ ) ) ;
646+ }
647+ for span in spans {
648+ err. span_label ( * span, "" ) ;
649+ }
635650 } else {
636651 suffix = Some ( format ! ( ", expected {}" , trait_count) ) ;
637652 }
638653
639- err. span_label (
640- span,
641- format ! ( "found {} {} parameter{}{}" , impl_count, kind,
654+ if let Some ( span) = span {
655+ err. span_label ( span, format ! (
656+ "found {} {} parameter{}{}" ,
657+ impl_count,
658+ kind,
642659 if impl_count != 1 { "s" } else { "" } ,
643- suffix. unwrap_or_else( || String :: new( ) ) ) ,
644- ) ;
660+ suffix. unwrap_or_else( || String :: new( ) ) ,
661+ ) ) ;
662+ }
645663
646664 err. emit ( ) ;
647665 }
0 commit comments