Skip to content

Commit 07598f5

Browse files
Update E0050 to new error format
1 parent bdad702 commit 07598f5

File tree

3 files changed

+50
-6
lines changed

3 files changed

+50
-6
lines changed

src/librustc/hir/map/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ impl<'ast> Map<'ast> {
260260
EntryVariant(p, _) |
261261
EntryExpr(p, _) |
262262
EntryStmt(p, _) |
263-
EntryTy(p, _) |
263+
EntryTy(p, _) |
264264
EntryLocal(p, _) |
265265
EntryPat(p, _) |
266266
EntryBlock(p, _) |

src/librustc_typeck/check/compare_method.rs

+41-4
Original file line numberDiff line numberDiff line change
@@ -138,14 +138,51 @@ pub fn compare_impl_method<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
138138
}
139139

140140
if impl_m.fty.sig.0.inputs.len() != trait_m.fty.sig.0.inputs.len() {
141-
span_err!(tcx.sess, impl_m_span, E0050,
141+
let trait_number_args = trait_m.fty.sig.0.inputs.len();
142+
let impl_number_args = impl_m.fty.sig.0.inputs.len();
143+
let impl_m_node_id = tcx.map.as_local_node_id(impl_m.def_id).unwrap();
144+
let mspan = match tcx.map.expect_impl_item(impl_m_node_id).node {
145+
ImplItemKind::Method(ref impl_m_sig, _) => {
146+
if let Some(arg) = impl_m_sig.decl.inputs.get(
147+
if trait_number_args > 0 {
148+
trait_number_args - 1
149+
} else {
150+
0
151+
}) {
152+
arg.pat.span
153+
} else {
154+
impl_m_span
155+
}
156+
}
157+
_ => bug!("{:?} is not a method", impl_m)
158+
};
159+
let span = impl_m_span;
160+
struct_span_err!(tcx.sess, mspan, E0050,
142161
"method `{}` has {} parameter{} \
143162
but the declaration in trait `{}` has {}",
144163
trait_m.name,
145-
impl_m.fty.sig.0.inputs.len(),
146-
if impl_m.fty.sig.0.inputs.len() == 1 {""} else {"s"},
164+
impl_number_args,
165+
if impl_number_args == 1 {""} else {"s"},
147166
tcx.item_path_str(trait_m.def_id),
148-
trait_m.fty.sig.0.inputs.len());
167+
trait_number_args)
168+
.span_label(trait_item_span.unwrap(),
169+
&format!("trait requires {}",
170+
&if trait_number_args != 1 {
171+
format!("{} parameters", trait_number_args)
172+
} else {
173+
format!("{} parameter", trait_number_args)
174+
}))
175+
.span_label(span,
176+
&format!("expected {}, found {}",
177+
&if trait_number_args != 1 {
178+
format!("{} parameters",
179+
trait_number_args)
180+
} else {
181+
format!("{} parameter",
182+
trait_number_args)
183+
},
184+
impl_number_args))
185+
.emit();
149186
return;
150187
}
151188

src/test/compile-fail/E0050.rs

+8-1
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,20 @@
99
// except according to those terms.
1010

1111
trait Foo {
12-
fn foo(&self, x: u8) -> bool;
12+
fn foo(&self, x: u8) -> bool; //~ NOTE trait requires 2 parameters
13+
fn bar(&self, x: u8, y: u8, z: u8); //~ NOTE trait requires 4 parameters
14+
fn less(&self); //~ NOTE trait requires 1 parameter
1315
}
1416

1517
struct Bar;
1618

1719
impl Foo for Bar {
1820
fn foo(&self) -> bool { true } //~ ERROR E0050
21+
//~| NOTE expected 2 parameters, found 1
22+
fn bar(&self) { } //~ ERROR E0050
23+
//~| NOTE expected 4 parameters, found 1
24+
fn less(&self, x: u8, y: u8, z: u8) { } //~ ERROR E0050
25+
//~| NOTE expected 1 parameter, found 4
1926
}
2027

2128
fn main() {

0 commit comments

Comments
 (0)