about summary refs log tree commit diff
path: root/src/test
diff options
context:
space:
mode:
authorMarijn Haverbeke <marijnh@gmail.com>2012-01-26 12:26:14 +0100
committerMarijn Haverbeke <marijnh@gmail.com>2012-01-26 14:25:06 +0100
commit87b064b249657c8e65079d01beb77409f69d49cd (patch)
treececb525f7ddf7312521d1a65e93ea8531f23426e /src/test
parent1792d9ec96d680cb3ec257bfef84baffea352d80 (diff)
downloadrust-87b064b249657c8e65079d01beb77409f69d49cd.tar.gz
rust-87b064b249657c8e65079d01beb77409f69d49cd.zip
First stab at operator overloading
When no built-in interpretation is found for one of the operators
mentioned below, the typechecker will try to turn it into a method
call with the name written next to it. For binary operators, the
method will be called on the LHS with the RHS as only parameter.

Binary:

    +   op_add
    -   op_sub
    *   op_mul
    /   op_div
    %   op_rem
    &   op_and
    |   op_or
    ^   op_xor
    <<  op_shift_left
    >>  op_shift_right
    >>> op_ashift_right

Unary:

    -   op_neg
    !   op_not

Overloading of the indexing ([]) operator isn't finished yet.

Issue #1520
Diffstat (limited to 'src/test')
-rw-r--r--src/test/compile-fail/minus-string.rs2
-rw-r--r--src/test/run-pass/operator-overloading.rs17
2 files changed, 18 insertions, 1 deletions
diff --git a/src/test/compile-fail/minus-string.rs b/src/test/compile-fail/minus-string.rs
index f77756942b1..776d82bf492 100644
--- a/src/test/compile-fail/minus-string.rs
+++ b/src/test/compile-fail/minus-string.rs
@@ -1,3 +1,3 @@
-// error-pattern:applying unary minus to non-numeric type `str`
+// error-pattern:can not apply unary operator `-` to type `str`
 
 fn main() { -"foo"; }
diff --git a/src/test/run-pass/operator-overloading.rs b/src/test/run-pass/operator-overloading.rs
new file mode 100644
index 00000000000..4265f0023b7
--- /dev/null
+++ b/src/test/run-pass/operator-overloading.rs
@@ -0,0 +1,17 @@
+type point = {x: int, y: int};
+
+impl add_point for point {
+    fn op_add(other: point) -> point {
+        {x: self.x + other.x, y: self.y + other.y}
+    }
+    fn op_neg() -> point {
+        {x: -self.x, y: -self.y}
+    }
+}
+
+fn main() {
+    let p = {x: 10, y: 20};
+    p += {x: 1, y: 2};
+    assert p + {x: 5, y: 5} == {x: 16, y: 27};
+    assert -p == {x: -11, y: -22};
+}