@@ -993,7 +993,7 @@ fn check_impl_items_against_trait<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
993993 // Check existing impl methods to see if they are both present in trait
994994 // and compatible with trait signature
995995 for impl_item in impl_items {
996- let ty_impl_item = ccx . tcx . impl_or_trait_item ( ccx . tcx . map . local_def_id ( impl_item. id ) ) ;
996+ let ty_impl_item = tcx. impl_or_trait_item ( tcx. map . local_def_id ( impl_item. id ) ) ;
997997 let ty_trait_item = trait_items. iter ( )
998998 . find ( |ac| ac. name ( ) == ty_impl_item. name ( ) ) ;
999999
@@ -1014,11 +1014,18 @@ fn check_impl_items_against_trait<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
10141014 trait_const,
10151015 & impl_trait_ref) ;
10161016 } else {
1017- span_err ! ( tcx. sess, impl_item. span, E0323 ,
1017+ let mut err = struct_span_err ! ( tcx. sess, impl_item. span, E0323 ,
10181018 "item `{}` is an associated const, \
10191019 which doesn't match its trait `{:?}`",
10201020 impl_const. name,
1021- impl_trait_ref)
1021+ impl_trait_ref) ;
1022+ err. span_label ( impl_item. span , & format ! ( "does not match trait" ) ) ;
1023+ // We can only get the spans from local trait definition
1024+ // Same for E0324 and E0325
1025+ if let Some ( trait_span) = tcx. map . span_if_local ( ty_trait_item. def_id ( ) ) {
1026+ err. span_label ( trait_span, & format ! ( "original trait requirement" ) ) ;
1027+ }
1028+ err. emit ( )
10221029 }
10231030 }
10241031 hir:: ImplItemKind :: Method ( ref sig, ref body) => {
@@ -1037,11 +1044,16 @@ fn check_impl_items_against_trait<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
10371044 & trait_method,
10381045 & impl_trait_ref) ;
10391046 } else {
1040- span_err ! ( tcx. sess, impl_item. span, E0324 ,
1047+ let mut err = struct_span_err ! ( tcx. sess, impl_item. span, E0324 ,
10411048 "item `{}` is an associated method, \
10421049 which doesn't match its trait `{:?}`",
10431050 impl_method. name,
1044- impl_trait_ref)
1051+ impl_trait_ref) ;
1052+ err. span_label ( impl_item. span , & format ! ( "does not match trait" ) ) ;
1053+ if let Some ( trait_span) = tcx. map . span_if_local ( ty_trait_item. def_id ( ) ) {
1054+ err. span_label ( trait_span, & format ! ( "original trait requirement" ) ) ;
1055+ }
1056+ err. emit ( )
10451057 }
10461058 }
10471059 hir:: ImplItemKind :: Type ( _) => {
@@ -1055,11 +1067,16 @@ fn check_impl_items_against_trait<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
10551067 overridden_associated_type = Some ( impl_item) ;
10561068 }
10571069 } else {
1058- span_err ! ( tcx. sess, impl_item. span, E0325 ,
1070+ let mut err = struct_span_err ! ( tcx. sess, impl_item. span, E0325 ,
10591071 "item `{}` is an associated type, \
10601072 which doesn't match its trait `{:?}`",
10611073 impl_type. name,
1062- impl_trait_ref)
1074+ impl_trait_ref) ;
1075+ err. span_label ( impl_item. span , & format ! ( "does not match trait" ) ) ;
1076+ if let Some ( trait_span) = tcx. map . span_if_local ( ty_trait_item. def_id ( ) ) {
1077+ err. span_label ( trait_span, & format ! ( "original trait requirement" ) ) ;
1078+ }
1079+ err. emit ( )
10631080 }
10641081 }
10651082 }
0 commit comments