diff options
Diffstat (limited to 'tests/ui/binop/binop-move-semantics.rs')
-rw-r--r-- | tests/ui/binop/binop-move-semantics.rs | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/tests/ui/binop/binop-move-semantics.rs b/tests/ui/binop/binop-move-semantics.rs new file mode 100644 index 000000000..b5133ea7c --- /dev/null +++ b/tests/ui/binop/binop-move-semantics.rs @@ -0,0 +1,68 @@ +// Test that move restrictions are enforced on overloaded binary operations + +use std::ops::Add; + +fn double_move<T: Add<Output=()>>(x: T) { + x + + + x; //~ ERROR: use of moved value +} + +fn move_then_borrow<T: Add<Output=()> + Clone>(x: T) { + x + + + x.clone(); //~ ERROR: borrow of moved value +} + +fn move_borrowed<T: Add<Output=()>>(x: T, mut y: T) { + let m = &x; + let n = &mut y; + + x //~ ERROR: cannot move out of `x` because it is borrowed + + + y; //~ ERROR: cannot move out of `y` because it is borrowed + use_mut(n); use_imm(m); +} +fn illegal_dereference<T: Add<Output=()>>(mut x: T, y: T) { + let m = &mut x; + let n = &y; + + *m //~ ERROR: cannot move + + + *n; //~ ERROR: cannot move + use_imm(n); use_mut(m); +} +struct Foo; + +impl<'a, 'b> Add<&'b Foo> for &'a mut Foo { + type Output = (); + + fn add(self, _: &Foo) {} +} + +impl<'a, 'b> Add<&'b mut Foo> for &'a Foo { + type Output = (); + + fn add(self, _: &mut Foo) {} +} + +fn mut_plus_immut() { + let mut f = Foo; + + &mut f + + + &f; //~ ERROR: cannot borrow `f` as immutable because it is also borrowed as mutable +} + +fn immut_plus_mut() { + let mut f = Foo; + + &f + + + &mut f; //~ ERROR: cannot borrow `f` as mutable because it is also borrowed as immutable +} + +fn main() {} + +fn use_mut<T>(_: &mut T) { } +fn use_imm<T>(_: &T) { } |