From 2b170839880e82a72d463b00759c409cb61d41b0 Mon Sep 17 00:00:00 2001
From: Jorge Aparicio <japaricious@gmail.com>
Date: Mon, 1 Dec 2014 16:52:13 -0500
Subject: [PATCH] Test that binops consume their arguments

---
 src/test/compile-fail/binop-consume-args.rs | 73 +++++++++++++++++++++
 1 file changed, 73 insertions(+)
 create mode 100644 src/test/compile-fail/binop-consume-args.rs

diff --git a/src/test/compile-fail/binop-consume-args.rs b/src/test/compile-fail/binop-consume-args.rs
new file mode 100644
index 00000000000..2bdd148b99b
--- /dev/null
+++ b/src/test/compile-fail/binop-consume-args.rs
@@ -0,0 +1,73 @@
+// Copyright 2014 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.
+
+// Test that binary operators consume their arguments
+
+fn add<A: Add<B, ()>, B>(lhs: A, rhs: B) {
+    lhs + rhs;
+    drop(lhs);  //~ ERROR use of moved value: `lhs`
+    drop(rhs);  //~ ERROR use of moved value: `rhs`
+}
+
+fn sub<A: Sub<B, ()>, B>(lhs: A, rhs: B) {
+    lhs - rhs;
+    drop(lhs);  //~ ERROR use of moved value: `lhs`
+    drop(rhs);  //~ ERROR use of moved value: `rhs`
+}
+
+fn mul<A: Mul<B, ()>, B>(lhs: A, rhs: B) {
+    lhs * rhs;
+    drop(lhs);  //~ ERROR use of moved value: `lhs`
+    drop(rhs);  //~ ERROR use of moved value: `rhs`
+}
+
+fn div<A: Div<B, ()>, B>(lhs: A, rhs: B) {
+    lhs / rhs;
+    drop(lhs);  //~ ERROR use of moved value: `lhs`
+    drop(rhs);  //~ ERROR use of moved value: `rhs`
+}
+
+fn rem<A: Rem<B, ()>, B>(lhs: A, rhs: B) {
+    lhs % rhs;
+    drop(lhs);  //~ ERROR use of moved value: `lhs`
+    drop(rhs);  //~ ERROR use of moved value: `rhs`
+}
+
+fn bitand<A: BitAnd<B, ()>, B>(lhs: A, rhs: B) {
+    lhs & rhs;
+    drop(lhs);  //~ ERROR use of moved value: `lhs`
+    drop(rhs);  //~ ERROR use of moved value: `rhs`
+}
+
+fn bitor<A: BitOr<B, ()>, B>(lhs: A, rhs: B) {
+    lhs | rhs;
+    drop(lhs);  //~ ERROR use of moved value: `lhs`
+    drop(rhs);  //~ ERROR use of moved value: `rhs`
+}
+
+fn bitxor<A: BitXor<B, ()>, B>(lhs: A, rhs: B) {
+    lhs ^ rhs;
+    drop(lhs);  //~ ERROR use of moved value: `lhs`
+    drop(rhs);  //~ ERROR use of moved value: `rhs`
+}
+
+fn shl<A: Shl<B, ()>, B>(lhs: A, rhs: B) {
+    lhs << rhs;
+    drop(lhs);  //~ ERROR use of moved value: `lhs`
+    drop(rhs);  //~ ERROR use of moved value: `rhs`
+}
+
+fn shr<A: Shr<B, ()>, B>(lhs: A, rhs: B) {
+    lhs >> rhs;
+    drop(lhs);  //~ ERROR use of moved value: `lhs`
+    drop(rhs);  //~ ERROR use of moved value: `rhs`
+}
+
+fn main() {}