Skip to content

Commit e0035c9

Browse files
author
Vincent Prouillet
committed
Update error message for E0323, E0324 and E0325
1 parent 271d048 commit e0035c9

File tree

2 files changed

+30
-8
lines changed

2 files changed

+30
-8
lines changed

src/librustc_typeck/check/mod.rs

+24-7
Original file line numberDiff line numberDiff line change
@@ -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
}

src/test/compile-fail/impl-wrong-item-for-trait.rs

+6-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@
1212

1313
trait Foo {
1414
fn bar(&self);
15-
const MY_CONST: u32;
15+
//~^ NOTE original trait requirement
16+
//~| NOTE original trait requirement
17+
const MY_CONST: u32; //~ NOTE original trait requirement
1618
}
1719

1820
pub struct FooConstForMethod;
@@ -21,6 +23,7 @@ impl Foo for FooConstForMethod {
2123
//~^ ERROR E0046
2224
const bar: u64 = 1;
2325
//~^ ERROR E0323
26+
//~| NOTE does not match trait
2427
const MY_CONST: u32 = 1;
2528
}
2629

@@ -31,6 +34,7 @@ impl Foo for FooMethodForConst {
3134
fn bar(&self) {}
3235
fn MY_CONST() {}
3336
//~^ ERROR E0324
37+
//~| NOTE does not match trait
3438
}
3539

3640
pub struct FooTypeForMethod;
@@ -39,6 +43,7 @@ impl Foo for FooTypeForMethod {
3943
//~^ ERROR E0046
4044
type bar = u64;
4145
//~^ ERROR E0325
46+
//~| NOTE does not match trait
4247
const MY_CONST: u32 = 1;
4348
}
4449

0 commit comments

Comments
 (0)