1
Fork 0

fix span for invalid number of parameters in trait method

This commit is contained in:
Guillaume Gomez 2018-12-08 20:04:14 +01:00
parent 118e052d84
commit 05cea31c8d
5 changed files with 61 additions and 11 deletions

View file

@ -648,12 +648,19 @@ fn compare_number_of_method_arguments<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
let trait_span = if let Some(trait_id) = trait_m_node_id { let trait_span = if let Some(trait_id) = trait_m_node_id {
match tcx.hir.expect_trait_item(trait_id).node { match tcx.hir.expect_trait_item(trait_id).node {
TraitItemKind::Method(ref trait_m_sig, _) => { TraitItemKind::Method(ref trait_m_sig, _) => {
if let Some(arg) = trait_m_sig.decl.inputs.get(if trait_number_args > 0 { let pos = if trait_number_args > 0 {
trait_number_args - 1 trait_number_args - 1
} else { } else {
0 0
}) { };
Some(arg.span) if let Some(arg) = trait_m_sig.decl.inputs.get(pos) {
Some(if pos == 0 {
arg.span
} else {
Span::new(trait_m_sig.decl.inputs[0].span.lo(),
arg.span.hi(),
arg.span.ctxt())
})
} else { } else {
trait_item_span trait_item_span
} }
@ -666,12 +673,19 @@ fn compare_number_of_method_arguments<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
let impl_m_node_id = tcx.hir.as_local_node_id(impl_m.def_id).unwrap(); let impl_m_node_id = tcx.hir.as_local_node_id(impl_m.def_id).unwrap();
let impl_span = match tcx.hir.expect_impl_item(impl_m_node_id).node { let impl_span = match tcx.hir.expect_impl_item(impl_m_node_id).node {
ImplItemKind::Method(ref impl_m_sig, _) => { ImplItemKind::Method(ref impl_m_sig, _) => {
if let Some(arg) = impl_m_sig.decl.inputs.get(if impl_number_args > 0 { let pos = if impl_number_args > 0 {
impl_number_args - 1 impl_number_args - 1
} else { } else {
0 0
}) { };
arg.span if let Some(arg) = impl_m_sig.decl.inputs.get(pos) {
if pos == 0 {
arg.span
} else {
Span::new(impl_m_sig.decl.inputs[0].span.lo(),
arg.span.hi(),
arg.span.ctxt())
}
} else { } else {
impl_m_span impl_m_span
} }

View file

@ -2,7 +2,7 @@ error[E0050]: method `foo` has 1 parameter but the declaration in trait `Foo::fo
--> $DIR/E0050.rs:20:12 --> $DIR/E0050.rs:20:12
| |
LL | fn foo(&self, x: u8) -> bool; LL | fn foo(&self, x: u8) -> bool;
| -- trait requires 2 parameters | ------------ trait requires 2 parameters
... ...
LL | fn foo(&self) -> bool { true } //~ ERROR E0050 LL | fn foo(&self) -> bool { true } //~ ERROR E0050
| ^^^^^ expected 2 parameters, found 1 | ^^^^^ expected 2 parameters, found 1
@ -11,19 +11,19 @@ error[E0050]: method `bar` has 1 parameter but the declaration in trait `Foo::ba
--> $DIR/E0050.rs:21:12 --> $DIR/E0050.rs:21:12
| |
LL | fn bar(&self, x: u8, y: u8, z: u8); LL | fn bar(&self, x: u8, y: u8, z: u8);
| -- trait requires 4 parameters | -------------------------- trait requires 4 parameters
... ...
LL | fn bar(&self) { } //~ ERROR E0050 LL | fn bar(&self) { } //~ ERROR E0050
| ^^^^^ expected 4 parameters, found 1 | ^^^^^ expected 4 parameters, found 1
error[E0050]: method `less` has 4 parameters but the declaration in trait `Foo::less` has 1 error[E0050]: method `less` has 4 parameters but the declaration in trait `Foo::less` has 1
--> $DIR/E0050.rs:22:37 --> $DIR/E0050.rs:22:13
| |
LL | fn less(&self); LL | fn less(&self);
| ----- trait requires 1 parameter | ----- trait requires 1 parameter
... ...
LL | fn less(&self, x: u8, y: u8, z: u8) { } //~ ERROR E0050 LL | fn less(&self, x: u8, y: u8, z: u8) { } //~ ERROR E0050
| ^^ expected 1 parameter, found 4 | ^^^^^^^^^^^^^^^^^^^^^^^^^^ expected 1 parameter, found 4
error: aborting due to 3 previous errors error: aborting due to 3 previous errors

View file

@ -0,0 +1,23 @@
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
trait Foo {
fn foo(&mut self, x: i32, y: i32) -> i32;
}
impl Foo for i32 {
fn foo(
&mut self, //~ ERROR
x: i32,
) {
}
}
fn main() {}

View file

@ -0,0 +1,13 @@
error[E0050]: method `foo` has 2 parameters but the declaration in trait `Foo::foo` has 3
--> $DIR/trait-method-number-parameters.rs:17:9
|
LL | fn foo(&mut self, x: i32, y: i32) -> i32;
| ------------------------- trait requires 3 parameters
...
LL | / &mut self, //~ ERROR
LL | | x: i32,
| |______________^ expected 3 parameters, found 2
error: aborting due to previous error
For more information about this error, try `rustc --explain E0050`.

View file

@ -2,7 +2,7 @@ error[E0050]: method `bar` has 1 parameter but the declaration in trait `foo::ba
--> $DIR/trait-impl-different-num-params.rs:15:12 --> $DIR/trait-impl-different-num-params.rs:15:12
| |
LL | fn bar(&self, x: usize) -> Self; LL | fn bar(&self, x: usize) -> Self;
| ----- trait requires 2 parameters | --------------- trait requires 2 parameters
... ...
LL | fn bar(&self) -> isize { LL | fn bar(&self) -> isize {
| ^^^^^ expected 2 parameters, found 1 | ^^^^^ expected 2 parameters, found 1