about summary refs log tree commit diff
diff options
context:
space:
mode:
authorKevin Butler <haqkrs@gmail.com>2014-04-05 02:19:33 +0100
committerKevin Butler <haqkrs@gmail.com>2014-04-05 02:22:00 +0100
commit28938d08a09c016cdb23eb2e56d803454a82918b (patch)
tree30df3c5a88d26621d5d036e022195ad11d01e992
parent4cf8d8ce69c1d1d10e90b04230d4c4e8dbb67bcc (diff)
downloadrust-28938d08a09c016cdb23eb2e56d803454a82918b.tar.gz
rust-28938d08a09c016cdb23eb2e56d803454a82918b.zip
librustc: Improve error message for incompatible trait method signatures.
-rw-r--r--src/librustc/middle/typeck/check/mod.rs2
-rw-r--r--src/test/compile-fail/wrong-mul-method-signature.rs33
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;
 }