diff options
| author | Kevin Butler <haqkrs@gmail.com> | 2014-04-05 02:19:33 +0100 |
|---|---|---|
| committer | Kevin Butler <haqkrs@gmail.com> | 2014-04-05 02:22:00 +0100 |
| commit | 28938d08a09c016cdb23eb2e56d803454a82918b (patch) | |
| tree | 30df3c5a88d26621d5d036e022195ad11d01e992 | |
| parent | 4cf8d8ce69c1d1d10e90b04230d4c4e8dbb67bcc (diff) | |
| download | rust-28938d08a09c016cdb23eb2e56d803454a82918b.tar.gz rust-28938d08a09c016cdb23eb2e56d803454a82918b.zip | |
librustc: Improve error message for incompatible trait method signatures.
| -rw-r--r-- | src/librustc/middle/typeck/check/mod.rs | 2 | ||||
| -rw-r--r-- | src/test/compile-fail/wrong-mul-method-signature.rs | 33 |
2 files changed, 33 insertions, 2 deletions
diff --git a/src/librustc/middle/typeck/check/mod.rs b/src/librustc/middle/typeck/check/mod.rs index a1e878b592e..9e0f3c9faa5 100644 --- a/src/librustc/middle/typeck/check/mod.rs +++ b/src/librustc/middle/typeck/check/mod.rs @@ -923,7 +923,7 @@ fn compare_impl_method(tcx: &ty::ctxt, result::Err(ref terr) => { tcx.sess.span_err( impl_m_span, - format!("method `{}` has an incompatible type: {}", + format!("method `{}` has an incompatible type for trait: {}", token::get_ident(trait_m.ident), ty::type_err_to_str(tcx, terr))); ty::note_and_explain_type_err(tcx, terr); diff --git a/src/test/compile-fail/wrong-mul-method-signature.rs b/src/test/compile-fail/wrong-mul-method-signature.rs index a39226faee6..bb30715f75e 100644 --- a/src/test/compile-fail/wrong-mul-method-signature.rs +++ b/src/test/compile-fail/wrong-mul-method-signature.rs @@ -13,14 +13,29 @@ // (In this case the mul method should take &f64 and not f64) // See: #11450 +struct Vec1 { + x: f64 +} + +// Expecting ref in input signature +impl Mul<f64, Vec1> for Vec1 { + fn mul(&self, s: f64) -> Vec1 { + //~^ ERROR: method `mul` has an incompatible type for trait: expected &-ptr but found f64 + Vec1 { + x: self.x * s + } + } +} + struct Vec2 { x: f64, y: f64 } +// Wrong type parameter ordering impl Mul<Vec2, f64> for Vec2 { fn mul(&self, s: f64) -> Vec2 { - //~^ ERROR: method `mul` has an incompatible type: expected &-ptr but found f64 + //~^ ERROR: method `mul` has an incompatible type for trait: expected &-ptr but found f64 Vec2 { x: self.x * s, y: self.y * s @@ -28,6 +43,22 @@ impl Mul<Vec2, f64> for Vec2 { } } +struct Vec3 { + x: f64, + y: f64, + z: f64 +} + +// Unexpected return type +impl Mul<f64, i32> for Vec3 { + fn mul(&self, s: &f64) -> f64 { + //~^ ERROR: method `mul` has an incompatible type for trait: expected i32 but found f64 + *s + } +} + pub fn main() { + Vec1 { x: 1.0 } * 2.0; Vec2 { x: 1.0, y: 2.0 } * 2.0; + Vec3 { x: 1.0, y: 2.0, z: 3.0 } * 2.0; } |
