about summary refs log tree commit diff
diff options
context:
space:
mode:
authorFelix S. Klock II <pnkfelix@pnkfx.org>2014-06-17 14:52:11 +0200
committerFelix S. Klock II <pnkfelix@pnkfx.org>2014-06-18 16:42:57 +0200
commit373b0fc56905c17d14438446e16712bf714c6f08 (patch)
tree664275a154c1ef624cabc085915c12f709788c94
parent95fdbeee48163691cf66de4a53fdc108157babcf (diff)
downloadrust-373b0fc56905c17d14438446e16712bf714c6f08.tar.gz
rust-373b0fc56905c17d14438446e16712bf714c6f08.zip
some extra test cases to cover in the borrow checker.
-rw-r--r--src/test/run-pass/loop-no-reinit-needed-post-bot.rs41
-rw-r--r--src/test/run-pass/struct-partial-move-1.rs30
-rw-r--r--src/test/run-pass/struct-partial-move-2.rs37
3 files changed, 108 insertions, 0 deletions
diff --git a/src/test/run-pass/loop-no-reinit-needed-post-bot.rs b/src/test/run-pass/loop-no-reinit-needed-post-bot.rs
new file mode 100644
index 00000000000..8b775002250
--- /dev/null
+++ b/src/test/run-pass/loop-no-reinit-needed-post-bot.rs
@@ -0,0 +1,41 @@
+// Copyright 2012-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.
+
+struct S;
+// Ensure S is moved, not copied, on assignment.
+impl Drop for S { fn drop(&mut self) { } }
+
+// user-defined function "returning" bottom (i.e. no return at all).
+fn my_fail() -> ! { loop {} }
+
+pub fn step(f: bool) {
+    let mut g = S;
+    let mut i = 0;
+    loop
+    {
+        if i > 10 { break; } else { i += 1; }
+
+        let _g = g;
+
+        if f {
+            // re-initialize g, but only before restarting loop.
+            g = S;
+            continue;
+        }
+
+        my_fail();
+
+        // we never get here, so we do not need to re-initialize g.
+    }
+}
+
+pub fn main() {
+    step(true);
+}
diff --git a/src/test/run-pass/struct-partial-move-1.rs b/src/test/run-pass/struct-partial-move-1.rs
new file mode 100644
index 00000000000..7e02d102081
--- /dev/null
+++ b/src/test/run-pass/struct-partial-move-1.rs
@@ -0,0 +1,30 @@
+// Copyright 2012 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.
+
+#[deriving(PartialEq, Show)]
+struct Partial<T> { x: T, y: T }
+
+#[deriving(PartialEq, Show)]
+struct S { val: int }
+impl S { fn new(v: int) -> S { S { val: v } } }
+impl Drop for S { fn drop(&mut self) { } }
+
+pub fn f<T>((b1, b2): (T, T), f: |T| -> T) -> Partial<T> {
+    let p = Partial { x: b1, y: b2 };
+
+    // Move of `p` is legal even though we are also moving `p.y`; the
+    // `..p` moves all fields *except* `p.y` in this context.
+    Partial { y: f(p.y), ..p }
+}
+
+pub fn main() {
+    let p = f((S::new(3), S::new(4)), |S { val: z }| S::new(z+1));
+    assert_eq!(p, Partial { x: S::new(3), y: S::new(5) });
+}
diff --git a/src/test/run-pass/struct-partial-move-2.rs b/src/test/run-pass/struct-partial-move-2.rs
new file mode 100644
index 00000000000..fe5e1eaaa1a
--- /dev/null
+++ b/src/test/run-pass/struct-partial-move-2.rs
@@ -0,0 +1,37 @@
+// Copyright 2012 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.
+
+#[deriving(PartialEq, Show)]
+struct Partial<T> { x: T, y: T }
+
+#[deriving(PartialEq, Show)]
+struct S { val: int }
+impl S { fn new(v: int) -> S { S { val: v } } }
+impl Drop for S { fn drop(&mut self) { } }
+
+type Two<T> = (Partial<T>, Partial<T>);
+
+pub fn f<T>((b1, b2): (T, T), (b3, b4): (T, T), f: |T| -> T) -> Two<T> {
+    let p = Partial { x: b1, y: b2 };
+    let q = Partial { x: b3, y: b4 };
+
+     // Move of `q` is legal even though we have already moved `q.y`;
+     // the `..q` moves all fields *except* `q.y` in this context.
+     // Likewise, the move of `p.x` is legal for similar reasons.
+    (Partial { x: f(q.y), ..p }, Partial { y: f(p.x), ..q })
+}
+
+pub fn main() {
+    let two = f((S::new(1), S::new(3)),
+                (S::new(5), S::new(7)),
+                |S { val: z }| S::new(z+1));
+    assert_eq!(two, (Partial { x: S::new(8), y: S::new(3) },
+                     Partial { x: S::new(5), y: S::new(2) }));
+}