@@ -2619,8 +2619,9 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
2619
2619
this. with_current_self_type ( self_type, |this| {
2620
2620
this. with_self_rib_ns ( ValueNS , Res :: SelfCtor ( item_def_id) , |this| {
2621
2621
debug ! ( "resolve_implementation with_self_rib_ns(ValueNS, ...)" ) ;
2622
+ let mut seen_trait_items = Default :: default ( ) ;
2622
2623
for item in impl_items {
2623
- this. resolve_impl_item ( & * * item) ;
2624
+ this. resolve_impl_item ( & * * item, & mut seen_trait_items ) ;
2624
2625
}
2625
2626
} ) ;
2626
2627
} ) ;
@@ -2634,7 +2635,11 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
2634
2635
) ;
2635
2636
}
2636
2637
2637
- fn resolve_impl_item ( & mut self , item : & ' ast AssocItem ) {
2638
+ fn resolve_impl_item (
2639
+ & mut self ,
2640
+ item : & ' ast AssocItem ,
2641
+ seen_trait_items : & mut FxHashMap < DefId , Span > ,
2642
+ ) {
2638
2643
use crate :: ResolutionError :: * ;
2639
2644
match & item. kind {
2640
2645
AssocItemKind :: Const ( _, ty, default) => {
@@ -2647,6 +2652,7 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
2647
2652
& item. kind ,
2648
2653
ValueNS ,
2649
2654
item. span ,
2655
+ seen_trait_items,
2650
2656
|i, s, c| ConstNotMemberOfTrait ( i, s, c) ,
2651
2657
) ;
2652
2658
@@ -2687,6 +2693,7 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
2687
2693
& item. kind ,
2688
2694
ValueNS ,
2689
2695
item. span ,
2696
+ seen_trait_items,
2690
2697
|i, s, c| MethodNotMemberOfTrait ( i, s, c) ,
2691
2698
) ;
2692
2699
@@ -2715,6 +2722,7 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
2715
2722
& item. kind ,
2716
2723
TypeNS ,
2717
2724
item. span ,
2725
+ seen_trait_items,
2718
2726
|i, s, c| TypeNotMemberOfTrait ( i, s, c) ,
2719
2727
) ;
2720
2728
@@ -2736,6 +2744,7 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
2736
2744
kind : & AssocItemKind ,
2737
2745
ns : Namespace ,
2738
2746
span : Span ,
2747
+ seen_trait_items : & mut FxHashMap < DefId , Span > ,
2739
2748
err : F ,
2740
2749
) where
2741
2750
F : FnOnce ( Ident , String , Option < Symbol > ) -> ResolutionError < ' a > ,
@@ -2768,7 +2777,25 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
2768
2777
} ;
2769
2778
2770
2779
let res = binding. res ( ) ;
2771
- let Res :: Def ( def_kind, _) = res else { bug ! ( ) } ;
2780
+ let Res :: Def ( def_kind, id_in_trait) = res else { bug ! ( ) } ;
2781
+
2782
+ match seen_trait_items. entry ( id_in_trait) {
2783
+ Entry :: Occupied ( entry) => {
2784
+ self . report_error (
2785
+ span,
2786
+ ResolutionError :: TraitImplDuplicate {
2787
+ name : ident. name ,
2788
+ old_span : * entry. get ( ) ,
2789
+ trait_item_span : binding. span ,
2790
+ } ,
2791
+ ) ;
2792
+ return ;
2793
+ }
2794
+ Entry :: Vacant ( entry) => {
2795
+ entry. insert ( span) ;
2796
+ }
2797
+ } ;
2798
+
2772
2799
match ( def_kind, kind) {
2773
2800
( DefKind :: AssocTy , AssocItemKind :: TyAlias ( ..) )
2774
2801
| ( DefKind :: AssocFn , AssocItemKind :: Fn ( ..) )
0 commit comments