Skip to content

Commit 61cbf41

Browse files
Update E0050 to new error format
1 parent bdad702 commit 61cbf41

File tree

3 files changed

+69
-6
lines changed

3 files changed

+69
-6
lines changed

src/librustc/hir/map/mod.rs

Lines changed: 1 addition & 1 deletion
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

Lines changed: 60 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -138,14 +138,70 @@ 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 trait_m_node_id = tcx.map.as_local_node_id(trait_m.def_id);
144+
let trait_span = if let Some(trait_id) = trait_m_node_id {
145+
match tcx.map.expect_trait_item(trait_id).node {
146+
TraitItem_::MethodTraitItem(ref trait_m_sig, _) => {
147+
if let Some(arg) = trait_m_sig.decl.inputs.get(
148+
if trait_number_args > 0 {
149+
trait_number_args - 1
150+
} else {
151+
0
152+
}) {
153+
Some(arg.pat.span)
154+
} else {
155+
trait_item_span
156+
}
157+
}
158+
_ => bug!("{:?} is not a method", impl_m)
159+
}
160+
} else {
161+
trait_item_span
162+
};
163+
let impl_m_node_id = tcx.map.as_local_node_id(impl_m.def_id).unwrap();
164+
let impl_span = match tcx.map.expect_impl_item(impl_m_node_id).node {
165+
ImplItemKind::Method(ref impl_m_sig, _) => {
166+
if let Some(arg) = impl_m_sig.decl.inputs.get(
167+
if impl_number_args > 0 {
168+
impl_number_args - 1
169+
} else {
170+
0
171+
}) {
172+
arg.pat.span
173+
} else {
174+
impl_m_span
175+
}
176+
}
177+
_ => bug!("{:?} is not a method", impl_m)
178+
};
179+
let mut err = struct_span_err!(tcx.sess, impl_span, E0050,
142180
"method `{}` has {} parameter{} \
143181
but the declaration in trait `{}` has {}",
144182
trait_m.name,
145-
impl_m.fty.sig.0.inputs.len(),
146-
if impl_m.fty.sig.0.inputs.len() == 1 {""} else {"s"},
183+
impl_number_args,
184+
if impl_number_args == 1 {""} else {"s"},
147185
tcx.item_path_str(trait_m.def_id),
148-
trait_m.fty.sig.0.inputs.len());
186+
trait_number_args);
187+
if let Some(trait_span) = trait_span {
188+
err.span_label(trait_span,
189+
&format!("trait requires {}",
190+
&if trait_number_args != 1 {
191+
format!("{} parameters", trait_number_args)
192+
} else {
193+
format!("{} parameter", trait_number_args)
194+
}));
195+
}
196+
err.span_label(impl_span,
197+
&format!("expected {}, found {}",
198+
&if trait_number_args != 1 {
199+
format!("{} parameters", trait_number_args)
200+
} else {
201+
format!("{} parameter", trait_number_args)
202+
},
203+
impl_number_args));
204+
err.emit();
149205
return;
150206
}
151207

src/test/compile-fail/E0050.rs

Lines changed: 8 additions & 1 deletion
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)