about summary refs log tree commit diff
path: root/src/test
diff options
context:
space:
mode:
authorNiko Matsakis <niko@alum.mit.edu>2012-05-19 05:52:01 -0700
committerNiko Matsakis <niko@alum.mit.edu>2012-05-24 09:52:03 -0700
commit30b47649ea37d211ee2dec4c541e6ba1e64c31a8 (patch)
treeb6b5825a2711f7911bd64bd1e505d44253d4e256 /src/test
parenta3be0b105436118e187ea52deb89788afaf1edb5 (diff)
downloadrust-30b47649ea37d211ee2dec4c541e6ba1e64c31a8.tar.gz
rust-30b47649ea37d211ee2dec4c541e6ba1e64c31a8.zip
new liveness pass to supercede last_use / initedness
Diffstat (limited to 'src/test')
-rw-r--r--src/test/compile-fail/and-init.rs8
-rw-r--r--src/test/compile-fail/assign-imm-local-twice.rs9
-rw-r--r--src/test/compile-fail/block-uninit.rs4
-rw-r--r--src/test/compile-fail/break-uninit.rs14
-rw-r--r--src/test/compile-fail/break-uninit2.rs14
-rw-r--r--src/test/compile-fail/fn-expr-type-state.rs7
-rw-r--r--src/test/compile-fail/fn-expr-typestate-2.rs6
-rw-r--r--src/test/compile-fail/fru-typestate.rs12
-rw-r--r--src/test/compile-fail/issue-2163.rs5
-rw-r--r--src/test/compile-fail/liveness-and-init.rs6
-rw-r--r--src/test/compile-fail/liveness-assign-imm-local-in-loop.rs11
-rw-r--r--src/test/compile-fail/liveness-assign-imm-local-in-op-eq.rs9
-rw-r--r--src/test/compile-fail/liveness-assign-imm-local-in-swap.rs18
-rw-r--r--src/test/compile-fail/liveness-bad-bang-2.rs (renamed from src/test/compile-fail/bad-bang-ann-2.rs)0
-rw-r--r--src/test/compile-fail/liveness-block-unint.rs7
-rw-r--r--src/test/compile-fail/liveness-break-uninit-2.rs16
-rw-r--r--src/test/compile-fail/liveness-break-uninit.rs16
-rw-r--r--src/test/compile-fail/liveness-closure-require-ret.rs (renamed from src/test/compile-fail/block-require-return.rs)0
-rw-r--r--src/test/compile-fail/liveness-ctor-access-self-with-uninit-fields.rs11
-rw-r--r--src/test/compile-fail/liveness-ctor-field-never-init.rs7
-rw-r--r--src/test/compile-fail/liveness-ctor-uninit-field.rs14
-rw-r--r--src/test/compile-fail/liveness-ctor-uninit-var.rs (renamed from src/test/compile-fail/ctor-uninit-var.rs)3
-rw-r--r--src/test/compile-fail/liveness-forgot-ret.rs (renamed from src/test/compile-fail/forgot-ret.rs)0
-rw-r--r--src/test/compile-fail/liveness-if-no-else.rs6
-rw-r--r--src/test/compile-fail/liveness-if-with-else.rs (renamed from src/test/compile-fail/use-uninit-3.rs)4
-rw-r--r--src/test/compile-fail/liveness-init-in-called-fn-expr.rs7
-rw-r--r--src/test/compile-fail/liveness-init-in-fn-expr.rs7
-rw-r--r--src/test/compile-fail/liveness-init-in-fru.rs8
-rw-r--r--src/test/compile-fail/liveness-init-op-equal.rs8
-rw-r--r--src/test/compile-fail/liveness-init-plus-equal.rs8
-rw-r--r--src/test/compile-fail/liveness-issue-2163.rs5
-rw-r--r--src/test/compile-fail/liveness-missing-ret2.rs (renamed from src/test/compile-fail/missing-return2.rs)0
-rw-r--r--src/test/compile-fail/liveness-move-from-mode.rs10
-rw-r--r--src/test/compile-fail/liveness-move-in-loop.rs16
-rw-r--r--src/test/compile-fail/liveness-move-in-while.rs (renamed from src/test/compile-fail/while-constraints.rs)5
-rw-r--r--src/test/compile-fail/liveness-or-init.rs6
-rw-r--r--src/test/compile-fail/liveness-return.rs6
-rw-r--r--src/test/compile-fail/liveness-swap-uninit.rs5
-rw-r--r--src/test/compile-fail/liveness-uninit-after-item.rs6
-rw-r--r--src/test/compile-fail/liveness-uninit.rs6
-rw-r--r--src/test/compile-fail/liveness-use-after-move.rs5
-rw-r--r--src/test/compile-fail/liveness-use-after-send.rs (renamed from src/test/compile-fail/use-after-send.rs)5
-rw-r--r--src/test/compile-fail/liveness-use-in-index-lvalue.rs6
-rw-r--r--src/test/compile-fail/liveness-while-break.rs12
-rw-r--r--src/test/compile-fail/liveness-while-cond.rs4
-rw-r--r--src/test/compile-fail/liveness-while.rs7
-rw-r--r--src/test/compile-fail/move-arg.rs4
-rw-r--r--src/test/compile-fail/or-init.rs8
-rw-r--r--src/test/compile-fail/return-uninit.rs5
-rw-r--r--src/test/compile-fail/swap-uninit.rs3
-rw-r--r--src/test/compile-fail/tstate-and-init.rs7
-rw-r--r--src/test/compile-fail/tstate-block-uninit.rs11
-rw-r--r--src/test/compile-fail/tstate-break-uninit-2.rs16
-rw-r--r--src/test/compile-fail/tstate-break-uninit.rs16
-rw-r--r--src/test/compile-fail/tstate-ctor-unsat.rs25
-rw-r--r--src/test/compile-fail/tstate-fru.rs13
-rw-r--r--src/test/compile-fail/tstate-if-no-else.rs10
-rw-r--r--src/test/compile-fail/tstate-if-with-else.rs14
-rw-r--r--src/test/compile-fail/tstate-loop-constraints.rs19
-rw-r--r--src/test/compile-fail/tstate-or-init.rs7
-rw-r--r--src/test/compile-fail/tstate-return.rs9
-rw-r--r--src/test/compile-fail/tstate-unsat-after-item.rs9
-rw-r--r--src/test/compile-fail/tstate-unsat-in-called-fn-expr.rs9
-rw-r--r--src/test/compile-fail/tstate-unsat-in-fn-expr.rs9
-rw-r--r--src/test/compile-fail/tstate-unsat.rs7
-rw-r--r--src/test/compile-fail/tstate-while-break.rs15
-rw-r--r--src/test/compile-fail/tstate-while-cond.rs7
-rw-r--r--src/test/compile-fail/tstate-while-loop-unsat-constriants.rs (renamed from src/test/compile-fail/while-loop-pred-constraints.rs)0
-rw-r--r--src/test/compile-fail/tstate-while.rs10
-rw-r--r--src/test/compile-fail/uninit-after-item.rs7
-rw-r--r--src/test/compile-fail/use-after-move.rs2
-rw-r--r--src/test/compile-fail/use-uninit-2.rs5
-rw-r--r--src/test/compile-fail/use-uninit.rs5
-rw-r--r--src/test/compile-fail/while-bypass.rs5
-rw-r--r--src/test/compile-fail/while-expr.rs3
-rw-r--r--src/test/compile-fail/while-loop-constraints.rs14
-rw-r--r--src/test/compile-fail/writing-through-uninit-vec.rs5
-rw-r--r--src/test/run-pass/liveness-assign-imm-local-after-loop.rs10
-rw-r--r--src/test/run-pass/liveness-assign-imm-local-after-ret.rs9
-rw-r--r--src/test/run-pass/liveness-loop-break.rs14
-rw-r--r--src/test/run-pass/liveness-move-in-loop.rs15
-rw-r--r--src/test/run-pass/tstate-loop-break.rs17
82 files changed, 547 insertions, 146 deletions
diff --git a/src/test/compile-fail/and-init.rs b/src/test/compile-fail/and-init.rs
deleted file mode 100644
index c053180bf43..00000000000
--- a/src/test/compile-fail/and-init.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-// error-pattern:unsatisfied precondition constraint (for example, init(i
-
-fn main() {
-    let i: int;
-
-    log(debug, false && { i = 5; true });
-    log(debug, i);
-}
diff --git a/src/test/compile-fail/assign-imm-local-twice.rs b/src/test/compile-fail/assign-imm-local-twice.rs
new file mode 100644
index 00000000000..13ec17e0585
--- /dev/null
+++ b/src/test/compile-fail/assign-imm-local-twice.rs
@@ -0,0 +1,9 @@
+fn test(cond: bool) {
+    let v: int;
+    v = 1; //! NOTE prior assignment occurs here
+    v = 2; //! ERROR re-assignment of immutable variable
+}
+
+fn main() {
+    test(true);
+}
diff --git a/src/test/compile-fail/block-uninit.rs b/src/test/compile-fail/block-uninit.rs
deleted file mode 100644
index 99b8346166a..00000000000
--- a/src/test/compile-fail/block-uninit.rs
+++ /dev/null
@@ -1,4 +0,0 @@
-// error-pattern:unsatisfied precondition constraint
-
-fn force(f: fn()) { f(); }
-fn main() { let x: int; force(fn&() { log(error, x); }); }
diff --git a/src/test/compile-fail/break-uninit.rs b/src/test/compile-fail/break-uninit.rs
deleted file mode 100644
index 8babc95f0dc..00000000000
--- a/src/test/compile-fail/break-uninit.rs
+++ /dev/null
@@ -1,14 +0,0 @@
-// error-pattern:unsatisfied precondition
-
-fn foo() -> int {
-    let x: int;
-    let i: int;
-
-    loop { i = 0; break; x = 0; }
-
-    log(debug, x);
-
-    ret 17;
-}
-
-fn main() { log(debug, foo()); }
diff --git a/src/test/compile-fail/break-uninit2.rs b/src/test/compile-fail/break-uninit2.rs
deleted file mode 100644
index 1229e0dc0ee..00000000000
--- a/src/test/compile-fail/break-uninit2.rs
+++ /dev/null
@@ -1,14 +0,0 @@
-// error-pattern:unsatisfied precondition
-
-fn foo() -> int {
-    let x: int;
-    let i: int;
-
-    while 1 != 2  { i = 0; break; x = 0; }
-
-    log(debug, x);
-
-    ret 17;
-}
-
-fn main() { log(debug, foo()); }
diff --git a/src/test/compile-fail/fn-expr-type-state.rs b/src/test/compile-fail/fn-expr-type-state.rs
deleted file mode 100644
index ab3f1dd1087..00000000000
--- a/src/test/compile-fail/fn-expr-type-state.rs
+++ /dev/null
@@ -1,7 +0,0 @@
-// error-pattern:unsatisfied precondition
-
-fn main() {
-    // Typestate should work even in a fn@. we should reject this program.
-    let f = fn@() -> int { let i: int; ret i; };
-    log(error, f());
-}
diff --git a/src/test/compile-fail/fn-expr-typestate-2.rs b/src/test/compile-fail/fn-expr-typestate-2.rs
deleted file mode 100644
index 75682c8ddf8..00000000000
--- a/src/test/compile-fail/fn-expr-typestate-2.rs
+++ /dev/null
@@ -1,6 +0,0 @@
-// error-pattern:unsatisfied precondition
-
-fn main() {
-    let j = fn@() -> int { let i: int; ret i; }();
-    log(error, j);
-}
diff --git a/src/test/compile-fail/fru-typestate.rs b/src/test/compile-fail/fru-typestate.rs
deleted file mode 100644
index 447f6f44dc5..00000000000
--- a/src/test/compile-fail/fru-typestate.rs
+++ /dev/null
@@ -1,12 +0,0 @@
-// -*- rust -*-
-
-// error-pattern: precondition
-
-type point = {x: int, y: int};
-
-fn main() {
-    let origin: point;
-
-    let right: point = {x: 10 with origin};
-    origin = {x: 0, y: 0};
-}
diff --git a/src/test/compile-fail/issue-2163.rs b/src/test/compile-fail/issue-2163.rs
deleted file mode 100644
index 15b3d6d96c7..00000000000
--- a/src/test/compile-fail/issue-2163.rs
+++ /dev/null
@@ -1,5 +0,0 @@
-fn main(s: [str]) {
-    let a: [int] = [];
-    vec::each(a) { |x| //! ERROR in function `anon`, not all control paths
-    }                  //! ERROR see function return type of `bool`
-}
diff --git a/src/test/compile-fail/liveness-and-init.rs b/src/test/compile-fail/liveness-and-init.rs
new file mode 100644
index 00000000000..aea30e3465c
--- /dev/null
+++ b/src/test/compile-fail/liveness-and-init.rs
@@ -0,0 +1,6 @@
+fn main() {
+    let i: int;
+
+    log(debug, false && { i = 5; true });
+    log(debug, i); //! ERROR use of possibly uninitialized variable: `i`
+}
diff --git a/src/test/compile-fail/liveness-assign-imm-local-in-loop.rs b/src/test/compile-fail/liveness-assign-imm-local-in-loop.rs
new file mode 100644
index 00000000000..a68528418e6
--- /dev/null
+++ b/src/test/compile-fail/liveness-assign-imm-local-in-loop.rs
@@ -0,0 +1,11 @@
+fn test(cond: bool) {
+    let v: int;
+    loop {
+        v = 1; //! ERROR re-assignment of immutable variable
+        //!^ NOTE prior assignment occurs here
+    }
+}
+
+fn main() {
+    test(true);
+}
diff --git a/src/test/compile-fail/liveness-assign-imm-local-in-op-eq.rs b/src/test/compile-fail/liveness-assign-imm-local-in-op-eq.rs
new file mode 100644
index 00000000000..2f880e03c74
--- /dev/null
+++ b/src/test/compile-fail/liveness-assign-imm-local-in-op-eq.rs
@@ -0,0 +1,9 @@
+fn test(cond: bool) {
+    let v: int;
+    v = 2;  //! NOTE prior assignment occurs here
+    v += 1; //! ERROR re-assignment of immutable variable
+}
+
+fn main() {
+    test(true);
+}
diff --git a/src/test/compile-fail/liveness-assign-imm-local-in-swap.rs b/src/test/compile-fail/liveness-assign-imm-local-in-swap.rs
new file mode 100644
index 00000000000..c432d03bed3
--- /dev/null
+++ b/src/test/compile-fail/liveness-assign-imm-local-in-swap.rs
@@ -0,0 +1,18 @@
+fn test1() {
+    let v: int;
+    let mut w: int;
+    v = 1; //! NOTE prior assignment occurs here
+    w = 2;
+    v <-> w; //! ERROR re-assignment of immutable variable
+}
+
+fn test2() {
+    let v: int;
+    let mut w: int;
+    v = 1; //! NOTE prior assignment occurs here
+    w = 2;
+    w <-> v; //! ERROR re-assignment of immutable variable
+}
+
+fn main() {
+}
diff --git a/src/test/compile-fail/bad-bang-ann-2.rs b/src/test/compile-fail/liveness-bad-bang-2.rs
index 8fb6a9e8737..8fb6a9e8737 100644
--- a/src/test/compile-fail/bad-bang-ann-2.rs
+++ b/src/test/compile-fail/liveness-bad-bang-2.rs
diff --git a/src/test/compile-fail/liveness-block-unint.rs b/src/test/compile-fail/liveness-block-unint.rs
new file mode 100644
index 00000000000..698f9f7cf79
--- /dev/null
+++ b/src/test/compile-fail/liveness-block-unint.rs
@@ -0,0 +1,7 @@
+fn force(f: fn()) { f(); }
+fn main() {
+    let x: int;
+    force(fn&() {
+        log(debug, x); //! ERROR capture of possibly uninitialized variable: `x`
+    });
+}
diff --git a/src/test/compile-fail/liveness-break-uninit-2.rs b/src/test/compile-fail/liveness-break-uninit-2.rs
new file mode 100644
index 00000000000..30038dbe96e
--- /dev/null
+++ b/src/test/compile-fail/liveness-break-uninit-2.rs
@@ -0,0 +1,16 @@
+fn foo() -> int {
+    let x: int;
+    let i: int;
+
+    while 1 != 2  {
+        i = 0;
+        break;
+        x = 0; //! WARNING unreachable statement
+    }
+
+    log(debug, x); //! ERROR use of possibly uninitialized variable: `x`
+
+    ret 17;
+}
+
+fn main() { log(debug, foo()); }
diff --git a/src/test/compile-fail/liveness-break-uninit.rs b/src/test/compile-fail/liveness-break-uninit.rs
new file mode 100644
index 00000000000..55041daa7fb
--- /dev/null
+++ b/src/test/compile-fail/liveness-break-uninit.rs
@@ -0,0 +1,16 @@
+fn foo() -> int {
+    let x: int;
+    let i: int;
+
+    loop {
+        i = 0;
+        break;
+        x = 0;  //! WARNING unreachable statement
+    }
+
+    log(debug, x); //! ERROR use of possibly uninitialized variable: `x`
+
+    ret 17;
+}
+
+fn main() { log(debug, foo()); }
diff --git a/src/test/compile-fail/block-require-return.rs b/src/test/compile-fail/liveness-closure-require-ret.rs
index 6a05ccf0605..6a05ccf0605 100644
--- a/src/test/compile-fail/block-require-return.rs
+++ b/src/test/compile-fail/liveness-closure-require-ret.rs
diff --git a/src/test/compile-fail/liveness-ctor-access-self-with-uninit-fields.rs b/src/test/compile-fail/liveness-ctor-access-self-with-uninit-fields.rs
new file mode 100644
index 00000000000..9c982292816
--- /dev/null
+++ b/src/test/compile-fail/liveness-ctor-access-self-with-uninit-fields.rs
@@ -0,0 +1,11 @@
+class cat {
+  let how_hungry : int;
+  fn meow() {}
+  new() {
+     self.meow();
+     //!^ ERROR use of possibly uninitialized field: `self.how_hungry`
+  }
+}
+
+fn main() {
+}
diff --git a/src/test/compile-fail/liveness-ctor-field-never-init.rs b/src/test/compile-fail/liveness-ctor-field-never-init.rs
new file mode 100644
index 00000000000..b979bdd9255
--- /dev/null
+++ b/src/test/compile-fail/liveness-ctor-field-never-init.rs
@@ -0,0 +1,7 @@
+class cat {
+  let how_hungry : int;
+  new() {} //! ERROR field `self.how_hungry` is never initialized
+}
+
+fn main() {
+}
diff --git a/src/test/compile-fail/liveness-ctor-uninit-field.rs b/src/test/compile-fail/liveness-ctor-uninit-field.rs
new file mode 100644
index 00000000000..080d4678a2f
--- /dev/null
+++ b/src/test/compile-fail/liveness-ctor-uninit-field.rs
@@ -0,0 +1,14 @@
+class cat {
+  let mut a: int;
+  let mut b: int;
+  let mut c: int;
+
+  new() {
+     self.a = 3;
+     self.b = self.a;
+     self.a += self.c; //! ERROR use of possibly uninitialized field: `self.c`
+  }
+}
+
+fn main() {
+}
diff --git a/src/test/compile-fail/ctor-uninit-var.rs b/src/test/compile-fail/liveness-ctor-uninit-var.rs
index b6f94c11fe5..3bbccd62ae3 100644
--- a/src/test/compile-fail/ctor-uninit-var.rs
+++ b/src/test/compile-fail/liveness-ctor-uninit-var.rs
@@ -1,4 +1,3 @@
-// error-pattern:unsatisfied precondition
 class cat {
   priv {
     let mut meows : uint;
@@ -13,7 +12,7 @@ class cat {
   new(in_x : uint, in_y : int) {
     let foo;
     self.meows = in_x + (in_y as uint);
-    self.how_hungry = foo;
+    self.how_hungry = foo; //! ERROR use of possibly uninitialized variable: `foo`
   }
 }
 
diff --git a/src/test/compile-fail/forgot-ret.rs b/src/test/compile-fail/liveness-forgot-ret.rs
index 4d78b7a7aff..4d78b7a7aff 100644
--- a/src/test/compile-fail/forgot-ret.rs
+++ b/src/test/compile-fail/liveness-forgot-ret.rs
diff --git a/src/test/compile-fail/liveness-if-no-else.rs b/src/test/compile-fail/liveness-if-no-else.rs
new file mode 100644
index 00000000000..5cbd24a6a5b
--- /dev/null
+++ b/src/test/compile-fail/liveness-if-no-else.rs
@@ -0,0 +1,6 @@
+fn foo(x: int) { log(debug, x); }
+
+fn main() {
+	let x: int; if 1 > 2 { x = 10; }
+	foo(x); //! ERROR use of possibly uninitialized variable: `x`
+}
diff --git a/src/test/compile-fail/use-uninit-3.rs b/src/test/compile-fail/liveness-if-with-else.rs
index 2a6522ab407..dbb3e6b1645 100644
--- a/src/test/compile-fail/use-uninit-3.rs
+++ b/src/test/compile-fail/liveness-if-with-else.rs
@@ -1,5 +1,3 @@
-// error-pattern:unsatisfied precondition
-
 fn foo(x: int) { log(debug, x); }
 
 fn main() {
@@ -9,5 +7,5 @@ fn main() {
     } else {
         x = 10;
     }
-    foo(x);
+    foo(x); //! ERROR use of possibly uninitialized variable: `x`
 }
diff --git a/src/test/compile-fail/liveness-init-in-called-fn-expr.rs b/src/test/compile-fail/liveness-init-in-called-fn-expr.rs
new file mode 100644
index 00000000000..28351ceeb08
--- /dev/null
+++ b/src/test/compile-fail/liveness-init-in-called-fn-expr.rs
@@ -0,0 +1,7 @@
+fn main() {
+    let j = fn@() -> int {
+        let i: int;
+        ret i; //! ERROR use of possibly uninitialized variable: `i`
+    };
+    j();
+}
diff --git a/src/test/compile-fail/liveness-init-in-fn-expr.rs b/src/test/compile-fail/liveness-init-in-fn-expr.rs
new file mode 100644
index 00000000000..8c68ba750a8
--- /dev/null
+++ b/src/test/compile-fail/liveness-init-in-fn-expr.rs
@@ -0,0 +1,7 @@
+fn main() {
+    let f = fn@() -> int {
+        let i: int;
+        ret i; //! ERROR use of possibly uninitialized variable: `i`
+    };
+    log(error, f());
+}
diff --git a/src/test/compile-fail/liveness-init-in-fru.rs b/src/test/compile-fail/liveness-init-in-fru.rs
new file mode 100644
index 00000000000..1c17a2503dc
--- /dev/null
+++ b/src/test/compile-fail/liveness-init-in-fru.rs
@@ -0,0 +1,8 @@
+// -*- rust -*-
+
+type point = {x: int, y: int};
+
+fn main() {
+    let mut origin: point;
+    origin = {x: 10 with origin}; //! ERROR use of possibly uninitialized variable: `origin`
+}
diff --git a/src/test/compile-fail/liveness-init-op-equal.rs b/src/test/compile-fail/liveness-init-op-equal.rs
new file mode 100644
index 00000000000..2f37dc5070f
--- /dev/null
+++ b/src/test/compile-fail/liveness-init-op-equal.rs
@@ -0,0 +1,8 @@
+fn test(cond: bool) {
+    let v: int;
+    v += 1; //! ERROR use of possibly uninitialized variable: `v`
+}
+
+fn main() {
+    test(true);
+}
diff --git a/src/test/compile-fail/liveness-init-plus-equal.rs b/src/test/compile-fail/liveness-init-plus-equal.rs
new file mode 100644
index 00000000000..56c5b3b2717
--- /dev/null
+++ b/src/test/compile-fail/liveness-init-plus-equal.rs
@@ -0,0 +1,8 @@
+fn test(cond: bool) {
+    let mut v: int;
+    v = v + 1; //! ERROR use of possibly uninitialized variable: `v`
+}
+
+fn main() {
+    test(true);
+}
diff --git a/src/test/compile-fail/liveness-issue-2163.rs b/src/test/compile-fail/liveness-issue-2163.rs
new file mode 100644
index 00000000000..dea27e585ef
--- /dev/null
+++ b/src/test/compile-fail/liveness-issue-2163.rs
@@ -0,0 +1,5 @@
+fn main(s: [str]) {
+    let a: [int] = [];
+    vec::each(a) { |x| //! ERROR not all control paths return a value
+    }
+}
diff --git a/src/test/compile-fail/missing-return2.rs b/src/test/compile-fail/liveness-missing-ret2.rs
index 54d8de63014..54d8de63014 100644
--- a/src/test/compile-fail/missing-return2.rs
+++ b/src/test/compile-fail/liveness-missing-ret2.rs
diff --git a/src/test/compile-fail/liveness-move-from-mode.rs b/src/test/compile-fail/liveness-move-from-mode.rs
new file mode 100644
index 00000000000..01483f033eb
--- /dev/null
+++ b/src/test/compile-fail/liveness-move-from-mode.rs
@@ -0,0 +1,10 @@
+fn take(-x: int) {}
+
+fn main() {
+
+    let x: int = 25;
+    loop {
+        take(x); //! ERROR use of moved variable: `x`
+        //!^ NOTE move of variable occurred here
+    }
+}
diff --git a/src/test/compile-fail/liveness-move-in-loop.rs b/src/test/compile-fail/liveness-move-in-loop.rs
new file mode 100644
index 00000000000..81467d8a2b4
--- /dev/null
+++ b/src/test/compile-fail/liveness-move-in-loop.rs
@@ -0,0 +1,16 @@
+fn main() {
+
+    let y: int = 42;
+    let mut x: int;
+    loop {
+        log(debug, y);
+        loop {
+            loop {
+                loop {
+                    x <- y; //! ERROR use of moved variable
+                    //!^ NOTE move of variable occurred here
+                }
+            }
+        }
+    }
+}
diff --git a/src/test/compile-fail/while-constraints.rs b/src/test/compile-fail/liveness-move-in-while.rs
index ca8d0140108..6acbc5a9f35 100644
--- a/src/test/compile-fail/while-constraints.rs
+++ b/src/test/compile-fail/liveness-move-in-while.rs
@@ -1,10 +1,11 @@
-// error-pattern:unsatisfied precondition constraint (for example, init(y
 fn main() {
 
     let y: int = 42;
-    let x: int;
+    let mut x: int;
     loop {
         log(debug, y);
         while true { while true { while true { x <- y; } } }
+        //!^ ERROR use of moved variable: `y`
+        //!^^ NOTE move of variable occurred here
     }
 }
diff --git a/src/test/compile-fail/liveness-or-init.rs b/src/test/compile-fail/liveness-or-init.rs
new file mode 100644
index 00000000000..5912378cf42
--- /dev/null
+++ b/src/test/compile-fail/liveness-or-init.rs
@@ -0,0 +1,6 @@
+fn main() {
+    let i: int;
+
+    log(debug, false || { i = 5; true });
+    log(debug, i); //! ERROR use of possibly uninitialized variable: `i`
+}
diff --git a/src/test/compile-fail/liveness-return.rs b/src/test/compile-fail/liveness-return.rs
new file mode 100644
index 00000000000..cee1444ca63
--- /dev/null
+++ b/src/test/compile-fail/liveness-return.rs
@@ -0,0 +1,6 @@
+fn f() -> int {
+	let x: int;
+	ret x; //! ERROR use of possibly uninitialized variable: `x`
+}
+
+fn main() { f(); }
diff --git a/src/test/compile-fail/liveness-swap-uninit.rs b/src/test/compile-fail/liveness-swap-uninit.rs
new file mode 100644
index 00000000000..53714c1f740
--- /dev/null
+++ b/src/test/compile-fail/liveness-swap-uninit.rs
@@ -0,0 +1,5 @@
+fn main() {
+	let x = 3;
+	let y;
+	x <-> y; //! ERROR use of possibly uninitialized variable: `y`
+}
diff --git a/src/test/compile-fail/liveness-uninit-after-item.rs b/src/test/compile-fail/liveness-uninit-after-item.rs
new file mode 100644
index 00000000000..7c619804c3c
--- /dev/null
+++ b/src/test/compile-fail/liveness-uninit-after-item.rs
@@ -0,0 +1,6 @@
+fn main() {
+    let bar;
+    fn baz(x: int) { }
+    bind baz(bar); //! ERROR use of possibly uninitialized variable: `bar`
+}
+
diff --git a/src/test/compile-fail/liveness-uninit.rs b/src/test/compile-fail/liveness-uninit.rs
new file mode 100644
index 00000000000..1930a2e3352
--- /dev/null
+++ b/src/test/compile-fail/liveness-uninit.rs
@@ -0,0 +1,6 @@
+fn foo(x: int) { log(debug, x); }
+
+fn main() {
+	let x: int;
+	foo(x); //! ERROR use of possibly uninitialized variable: `x`
+}
diff --git a/src/test/compile-fail/liveness-use-after-move.rs b/src/test/compile-fail/liveness-use-after-move.rs
new file mode 100644
index 00000000000..48d7a9a303e
--- /dev/null
+++ b/src/test/compile-fail/liveness-use-after-move.rs
@@ -0,0 +1,5 @@
+fn main() {
+    let x = @5;
+    let y <- x; //! NOTE move of variable occurred here
+    log(debug, *x); //! ERROR use of moved variable: `x`
+}
diff --git a/src/test/compile-fail/use-after-send.rs b/src/test/compile-fail/liveness-use-after-send.rs
index 4fe164878a8..63e42bee3c9 100644
--- a/src/test/compile-fail/use-after-send.rs
+++ b/src/test/compile-fail/liveness-use-after-send.rs
@@ -1,4 +1,3 @@
-// error-pattern:unsatisfied precondition constraint
 fn send<T: send>(ch: _chan<T>, -data: T) {
     log(debug, ch);
     log(debug, data);
@@ -10,8 +9,8 @@ enum _chan<T> = int;
 // Tests that "log(debug, message);" is flagged as using
 // message after the send deinitializes it
 fn test00_start(ch: _chan<int>, message: int, count: int) {
-    send(ch, message);
-    log(debug, message);
+    send(ch, message); //! NOTE move of variable occurred here
+    log(debug, message); //! ERROR use of moved variable: `message`
 }
 
 fn main() { fail; }
diff --git a/src/test/compile-fail/liveness-use-in-index-lvalue.rs b/src/test/compile-fail/liveness-use-in-index-lvalue.rs
new file mode 100644
index 00000000000..50d0662f803
--- /dev/null
+++ b/src/test/compile-fail/liveness-use-in-index-lvalue.rs
@@ -0,0 +1,6 @@
+fn test() {
+    let w: [int];
+    w[5] = 0; //! ERROR use of possibly uninitialized variable: `w`
+}
+
+fn main() { test(); }
diff --git a/src/test/compile-fail/liveness-while-break.rs b/src/test/compile-fail/liveness-while-break.rs
new file mode 100644
index 00000000000..755deb31fba
--- /dev/null
+++ b/src/test/compile-fail/liveness-while-break.rs
@@ -0,0 +1,12 @@
+fn test(cond: bool) {
+    let v;
+    while cond {
+        v = 3;
+        break;
+    }
+    #debug["%d", v]; //! ERROR use of possibly uninitialized variable: `v`
+}
+
+fn main() {
+    test(true);
+}
diff --git a/src/test/compile-fail/liveness-while-cond.rs b/src/test/compile-fail/liveness-while-cond.rs
new file mode 100644
index 00000000000..a0a90e9550c
--- /dev/null
+++ b/src/test/compile-fail/liveness-while-cond.rs
@@ -0,0 +1,4 @@
+fn main() {
+    let x: bool;
+    while x { } //! ERROR use of possibly uninitialized variable: `x`
+}
diff --git a/src/test/compile-fail/liveness-while.rs b/src/test/compile-fail/liveness-while.rs
new file mode 100644
index 00000000000..b69012bc3f2
--- /dev/null
+++ b/src/test/compile-fail/liveness-while.rs
@@ -0,0 +1,7 @@
+fn f() -> int {
+    let mut x: int;
+    while 1 == 1 { x = 10; }
+    ret x; //! ERROR use of possibly uninitialized variable: `x`
+}
+
+fn main() { f(); }
diff --git a/src/test/compile-fail/move-arg.rs b/src/test/compile-fail/move-arg.rs
deleted file mode 100644
index 512cd44e206..00000000000
--- a/src/test/compile-fail/move-arg.rs
+++ /dev/null
@@ -1,4 +0,0 @@
-// error-pattern:unsatisfied precondition constraint
-fn test(-foo: int) { assert (foo == 10); }
-
-fn main() { let x = 10; test(x); log(debug, x); }
diff --git a/src/test/compile-fail/or-init.rs b/src/test/compile-fail/or-init.rs
deleted file mode 100644
index 0bc339904ba..00000000000
--- a/src/test/compile-fail/or-init.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-// error-pattern:unsatisfied precondition constraint (for example, init(i
-
-fn main() {
-    let i: int;
-
-    log(debug, false || { i = 5; true });
-    log(debug, i);
-}
diff --git a/src/test/compile-fail/return-uninit.rs b/src/test/compile-fail/return-uninit.rs
deleted file mode 100644
index 1978ec5f420..00000000000
--- a/src/test/compile-fail/return-uninit.rs
+++ /dev/null
@@ -1,5 +0,0 @@
-// error-pattern: precondition constraint
-
-fn f() -> int { let x: int; ret x; }
-
-fn main() { f(); }
diff --git a/src/test/compile-fail/swap-uninit.rs b/src/test/compile-fail/swap-uninit.rs
deleted file mode 100644
index fbf400db08a..00000000000
--- a/src/test/compile-fail/swap-uninit.rs
+++ /dev/null
@@ -1,3 +0,0 @@
-// error-pattern:unsatisfied precondition
-
-fn main() { let x = 3; let y; x <-> y; }
diff --git a/src/test/compile-fail/tstate-and-init.rs b/src/test/compile-fail/tstate-and-init.rs
new file mode 100644
index 00000000000..7b254fe2e19
--- /dev/null
+++ b/src/test/compile-fail/tstate-and-init.rs
@@ -0,0 +1,7 @@
+pure fn is_even(i: int) -> bool { (i%2) == 0 }
+fn even(i: int) : is_even(i) -> int { i }
+fn main() {
+    let i: int = 4;
+    log(debug, false && { check is_even(i); true });
+    even(i); //! ERROR unsatisfied precondition
+}
diff --git a/src/test/compile-fail/tstate-block-uninit.rs b/src/test/compile-fail/tstate-block-uninit.rs
new file mode 100644
index 00000000000..3fbf812a9dc
--- /dev/null
+++ b/src/test/compile-fail/tstate-block-uninit.rs
@@ -0,0 +1,11 @@
+pure fn is_even(i: int) -> bool { (i%2) == 0 }
+fn even(i: int) : is_even(i) -> int { i }
+
+fn force(f: fn()) { f(); }
+
+fn main() {
+    let x: int = 4;
+    force(fn&() {
+        even(x); //! ERROR unsatisfied precondition
+    });
+}
diff --git a/src/test/compile-fail/tstate-break-uninit-2.rs b/src/test/compile-fail/tstate-break-uninit-2.rs
new file mode 100644
index 00000000000..8ea5446c809
--- /dev/null
+++ b/src/test/compile-fail/tstate-break-uninit-2.rs
@@ -0,0 +1,16 @@
+pure fn is_even(i: int) -> bool { (i%2) == 0 }
+fn even(i: int) : is_even(i) -> int { i }
+
+fn foo() -> int {
+    let x: int = 4;
+
+    while 1 != 2 {
+        break;
+        check is_even(x); //! WARNING unreachable statement
+    }
+
+    even(x); //! ERROR unsatisfied precondition
+    ret 17;
+}
+
+fn main() { log(debug, foo()); }
diff --git a/src/test/compile-fail/tstate-break-uninit.rs b/src/test/compile-fail/tstate-break-uninit.rs
new file mode 100644
index 00000000000..55146447b44
--- /dev/null
+++ b/src/test/compile-fail/tstate-break-uninit.rs
@@ -0,0 +1,16 @@
+pure fn is_even(i: int) -> bool { (i%2) == 0 }
+fn even(i: int) : is_even(i) -> int { i }
+
+fn foo() -> int {
+    let x: int = 4;
+
+    loop {
+        break;
+        check is_even(x); //! WARNING unreachable statement
+    }
+
+    even(x); //! ERROR unsatisfied precondition
+    ret 17;
+}
+
+fn main() { log(debug, foo()); }
diff --git a/src/test/compile-fail/tstate-ctor-unsat.rs b/src/test/compile-fail/tstate-ctor-unsat.rs
new file mode 100644
index 00000000000..d249865cd49
--- /dev/null
+++ b/src/test/compile-fail/tstate-ctor-unsat.rs
@@ -0,0 +1,25 @@
+pure fn is_even(i: int) -> bool { (i%2) == 0 }
+fn even(i: int) : is_even(i) -> int { i }
+
+class cat {
+  priv {
+    let mut meows : uint;
+  }
+
+  let how_hungry : int;
+
+  fn eat() {
+    self.how_hungry -= 5;
+  }
+
+  new(in_x : uint, in_y : int) {
+    let foo = 3;
+    self.meows = in_x + (in_y as uint);
+    self.how_hungry = even(foo); //! ERROR unsatisfied precondition
+  }
+}
+
+fn main() {
+  let nyan : cat = cat(52u, 99);
+  nyan.eat();
+}
diff --git a/src/test/compile-fail/tstate-fru.rs b/src/test/compile-fail/tstate-fru.rs
new file mode 100644
index 00000000000..a4989d86ab4
--- /dev/null
+++ b/src/test/compile-fail/tstate-fru.rs
@@ -0,0 +1,13 @@
+// -*- rust -*-
+
+type point = {x: int, y: int};
+
+pure fn test(_p: point) -> bool { true }
+fn tested(p: point) : test(p) -> point { p }
+
+fn main() {
+    let origin: point;
+    origin = {x: 0, y: 0};
+    let right: point = {x: 10 with tested(origin)};
+        //!^ ERROR precondition
+}
diff --git a/src/test/compile-fail/tstate-if-no-else.rs b/src/test/compile-fail/tstate-if-no-else.rs
new file mode 100644
index 00000000000..fbc02bf591a
--- /dev/null
+++ b/src/test/compile-fail/tstate-if-no-else.rs
@@ -0,0 +1,10 @@
+pure fn is_even(i: int) -> bool { (i%2) == 0 }
+fn even(i: int) : is_even(i) -> int { i }
+
+fn foo(x: int) { log(debug, x); }
+
+fn main() {
+	let x: int = 10;
+        if 1 > 2 { check is_even(x); }
+        even(x); //! ERROR unsatisfied precondition
+}
diff --git a/src/test/compile-fail/tstate-if-with-else.rs b/src/test/compile-fail/tstate-if-with-else.rs
new file mode 100644
index 00000000000..74edb4b8d8b
--- /dev/null
+++ b/src/test/compile-fail/tstate-if-with-else.rs
@@ -0,0 +1,14 @@
+pure fn is_even(i: int) -> bool { (i%2) == 0 }
+fn even(i: int) : is_even(i) -> int { i }
+
+fn foo(x: int) { log(debug, x); }
+
+fn main() {
+    let x: int = 10;
+    if 1 > 2 {
+        #debug("whoops");
+    } else {
+        check is_even(x);
+    }
+    even(x); //! ERROR unsatisfied precondition
+}
diff --git a/src/test/compile-fail/tstate-loop-constraints.rs b/src/test/compile-fail/tstate-loop-constraints.rs
new file mode 100644
index 00000000000..34ff0753d86
--- /dev/null
+++ b/src/test/compile-fail/tstate-loop-constraints.rs
@@ -0,0 +1,19 @@
+pure fn is_even(i: int) -> bool { (i%2) == 0 }
+fn even(i: int) : is_even(i) -> int { i }
+
+fn main() {
+
+    let mut x: int = 42;
+    loop {
+        loop {
+            loop {
+                check is_even(x);
+                even(x); // OK
+                loop {
+                    even(x); //! ERROR unsatisfied precondition
+                    x = 11; 
+                }
+            }
+        }
+    }
+}
diff --git a/src/test/compile-fail/tstate-or-init.rs b/src/test/compile-fail/tstate-or-init.rs
new file mode 100644
index 00000000000..c26925929a6
--- /dev/null
+++ b/src/test/compile-fail/tstate-or-init.rs
@@ -0,0 +1,7 @@
+pure fn is_even(i: int) -> bool { (i%2) == 0 }
+fn even(i: int) : is_even(i) -> int { i }
+fn main() {
+    let i: int = 4;
+    log(debug, false || { check is_even(i); true });
+    even(i); //! ERROR unsatisfied precondition
+}
diff --git a/src/test/compile-fail/tstate-return.rs b/src/test/compile-fail/tstate-return.rs
new file mode 100644
index 00000000000..6d786bacd7b
--- /dev/null
+++ b/src/test/compile-fail/tstate-return.rs
@@ -0,0 +1,9 @@
+pure fn is_even(i: int) -> bool { (i%2) == 0 }
+fn even(i: int) : is_even(i) -> int { i }
+
+fn f() -> int {
+	let x: int = 4;
+	ret even(x); //! ERROR unsatisfied precondition
+}
+
+fn main() { f(); }
diff --git a/src/test/compile-fail/tstate-unsat-after-item.rs b/src/test/compile-fail/tstate-unsat-after-item.rs
new file mode 100644
index 00000000000..b82df3a8657
--- /dev/null
+++ b/src/test/compile-fail/tstate-unsat-after-item.rs
@@ -0,0 +1,9 @@
+pure fn is_even(i: int) -> bool { (i%2) == 0 }
+fn even(i: int) : is_even(i) -> int { i }
+
+fn main() {
+    let x = 4;
+    fn baz(_x: int) { }
+    bind baz(even(x)); //! ERROR unsatisfied precondition
+}
+
diff --git a/src/test/compile-fail/tstate-unsat-in-called-fn-expr.rs b/src/test/compile-fail/tstate-unsat-in-called-fn-expr.rs
new file mode 100644
index 00000000000..010ac92f7b0
--- /dev/null
+++ b/src/test/compile-fail/tstate-unsat-in-called-fn-expr.rs
@@ -0,0 +1,9 @@
+fn foo(v: [int]) : vec::is_empty(v) { #debug("%d", v[0]); }
+
+fn main() {
+    let f = fn@() {
+        let v = [1];
+        foo(v); //! ERROR unsatisfied precondition constraint
+    }();
+    log(error, f);
+}
diff --git a/src/test/compile-fail/tstate-unsat-in-fn-expr.rs b/src/test/compile-fail/tstate-unsat-in-fn-expr.rs
new file mode 100644
index 00000000000..b9cd2582537
--- /dev/null
+++ b/src/test/compile-fail/tstate-unsat-in-fn-expr.rs
@@ -0,0 +1,9 @@
+fn foo(v: [int]) : vec::is_empty(v) { #debug("%d", v[0]); }
+
+fn main() {
+    let f = fn@() {
+        let v = [1];
+        foo(v); //! ERROR unsatisfied precondition constraint
+    };
+    log(error, f());
+}
diff --git a/src/test/compile-fail/tstate-unsat.rs b/src/test/compile-fail/tstate-unsat.rs
new file mode 100644
index 00000000000..44a3e88fdee
--- /dev/null
+++ b/src/test/compile-fail/tstate-unsat.rs
@@ -0,0 +1,7 @@
+pure fn is_even(i: int) -> bool { (i%2) == 0 }
+fn even(i: int) : is_even(i) -> int { i }
+
+fn main() {
+    let x: int = 4;
+    even(x); //! ERROR unsatisfied precondition
+}
diff --git a/src/test/compile-fail/tstate-while-break.rs b/src/test/compile-fail/tstate-while-break.rs
new file mode 100644
index 00000000000..6a25929a85b
--- /dev/null
+++ b/src/test/compile-fail/tstate-while-break.rs
@@ -0,0 +1,15 @@
+pure fn is_even(i: int) -> bool { (i%2) == 0 }
+fn even(i: int) : is_even(i) -> int { i }
+
+fn test(cond: bool) {
+    let v = 4;
+    while cond {
+        check is_even(v);
+        break;
+    }
+    even(v); //! ERROR unsatisfied precondition
+}
+
+fn main() {
+    test(true);
+}
diff --git a/src/test/compile-fail/tstate-while-cond.rs b/src/test/compile-fail/tstate-while-cond.rs
new file mode 100644
index 00000000000..ae5436aa4e8
--- /dev/null
+++ b/src/test/compile-fail/tstate-while-cond.rs
@@ -0,0 +1,7 @@
+pure fn is_even(i: int) -> bool { (i%2) == 0 }
+fn even(i: int) : is_even(i) -> int { i }
+
+fn main() {
+    let x: int = 4;
+    while even(x) != 0 { } //! ERROR unsatisfied precondition
+}
diff --git a/src/test/compile-fail/while-loop-pred-constraints.rs b/src/test/compile-fail/tstate-while-loop-unsat-constriants.rs
index 646d2466c74..646d2466c74 100644
--- a/src/test/compile-fail/while-loop-pred-constraints.rs
+++ b/src/test/compile-fail/tstate-while-loop-unsat-constriants.rs
diff --git a/src/test/compile-fail/tstate-while.rs b/src/test/compile-fail/tstate-while.rs
new file mode 100644
index 00000000000..6091a0237a2
--- /dev/null
+++ b/src/test/compile-fail/tstate-while.rs
@@ -0,0 +1,10 @@
+pure fn is_even(i: int) -> bool { (i%2) == 0 }
+fn even(i: int) : is_even(i) -> int { i }
+
+fn f() {
+    let mut x: int = 10;
+    while 1 == 1 { x = 10; }
+    even(x); //! ERROR unsatisfied precondition
+}
+
+fn main() { f(); }
diff --git a/src/test/compile-fail/uninit-after-item.rs b/src/test/compile-fail/uninit-after-item.rs
deleted file mode 100644
index 560c855a7e6..00000000000
--- a/src/test/compile-fail/uninit-after-item.rs
+++ /dev/null
@@ -1,7 +0,0 @@
-// error-pattern:unsatisfied precondition constraint (for example, init(bar
-fn main() {
-    let bar;
-    fn baz(x: int) { }
-    bind baz(bar);
-}
-
diff --git a/src/test/compile-fail/use-after-move.rs b/src/test/compile-fail/use-after-move.rs
deleted file mode 100644
index 177ad0010be..00000000000
--- a/src/test/compile-fail/use-after-move.rs
+++ /dev/null
@@ -1,2 +0,0 @@
-// error-pattern:unsatisfied precondition constraint (for example, init(x
-fn main() { let x = @5; let y <- x; log(debug, *x); }
diff --git a/src/test/compile-fail/use-uninit-2.rs b/src/test/compile-fail/use-uninit-2.rs
deleted file mode 100644
index 82946cf022a..00000000000
--- a/src/test/compile-fail/use-uninit-2.rs
+++ /dev/null
@@ -1,5 +0,0 @@
-// error-pattern:unsatisfied precondition
-
-fn foo(x: int) { log(debug, x); }
-
-fn main() { let x: int; if 1 > 2 { x = 10; } foo(x); }
diff --git a/src/test/compile-fail/use-uninit.rs b/src/test/compile-fail/use-uninit.rs
deleted file mode 100644
index 3ad93fe0a08..00000000000
--- a/src/test/compile-fail/use-uninit.rs
+++ /dev/null
@@ -1,5 +0,0 @@
-// error-pattern:unsatisfied precondition
-
-fn foo(x: int) { log(debug, x); }
-
-fn main() { let x: int; foo(x); }
diff --git a/src/test/compile-fail/while-bypass.rs b/src/test/compile-fail/while-bypass.rs
deleted file mode 100644
index 231fb299898..00000000000
--- a/src/test/compile-fail/while-bypass.rs
+++ /dev/null
@@ -1,5 +0,0 @@
-// error-pattern: precondition constraint
-
-fn f() -> int { let x: int; while 1 == 1 { x = 10; } ret x; }
-
-fn main() { f(); }
diff --git a/src/test/compile-fail/while-expr.rs b/src/test/compile-fail/while-expr.rs
deleted file mode 100644
index 5ff3adf34c3..00000000000
--- a/src/test/compile-fail/while-expr.rs
+++ /dev/null
@@ -1,3 +0,0 @@
-// error-pattern: precondition constraint
-
-fn main() { let x: bool; while x { } }
diff --git a/src/test/compile-fail/while-loop-constraints.rs b/src/test/compile-fail/while-loop-constraints.rs
deleted file mode 100644
index 38c1d471593..00000000000
--- a/src/test/compile-fail/while-loop-constraints.rs
+++ /dev/null
@@ -1,14 +0,0 @@
-// error-pattern:unsatisfied precondition constraint (for example, init(y
-fn main() {
-
-    let y: int = 42;
-    let x: int;
-    loop {
-        log(debug, y);
-        loop {
-            loop {
-                loop { x <- y; }
-            }
-        }
-    }
-}
diff --git a/src/test/compile-fail/writing-through-uninit-vec.rs b/src/test/compile-fail/writing-through-uninit-vec.rs
deleted file mode 100644
index 283e925e207..00000000000
--- a/src/test/compile-fail/writing-through-uninit-vec.rs
+++ /dev/null
@@ -1,5 +0,0 @@
-// error-pattern:unsatisfied precondition constraint
-
-fn test() { let w: [int]; w[5] = 0; }
-
-fn main() { test(); }
diff --git a/src/test/run-pass/liveness-assign-imm-local-after-loop.rs b/src/test/run-pass/liveness-assign-imm-local-after-loop.rs
new file mode 100644
index 00000000000..9fbf5fb447f
--- /dev/null
+++ b/src/test/run-pass/liveness-assign-imm-local-after-loop.rs
@@ -0,0 +1,10 @@
+fn test(cond: bool) {
+    let v: int;
+    v = 1;
+    loop { } // loop never terminates, so no error is reported
+    v = 2;
+}
+
+fn main() {
+	// note: don't call test()... :)
+}
diff --git a/src/test/run-pass/liveness-assign-imm-local-after-ret.rs b/src/test/run-pass/liveness-assign-imm-local-after-ret.rs
new file mode 100644
index 00000000000..4b1cc591713
--- /dev/null
+++ b/src/test/run-pass/liveness-assign-imm-local-after-ret.rs
@@ -0,0 +1,9 @@
+fn test() {
+    let _v: int;
+    _v = 1;
+    ret;
+    _v = 2; //! WARNING: unreachable statement
+}
+
+fn main() {
+}
diff --git a/src/test/run-pass/liveness-loop-break.rs b/src/test/run-pass/liveness-loop-break.rs
new file mode 100644
index 00000000000..58274555202
--- /dev/null
+++ b/src/test/run-pass/liveness-loop-break.rs
@@ -0,0 +1,14 @@
+// xfail-test --- tstate incorrectly fails this
+
+fn test() {
+    let v;
+    loop {
+        v = 3;
+        break;
+    }
+    #debug["%d", v];
+}
+
+fn main() {
+    test();
+}
diff --git a/src/test/run-pass/liveness-move-in-loop.rs b/src/test/run-pass/liveness-move-in-loop.rs
new file mode 100644
index 00000000000..a7f9547c059
--- /dev/null
+++ b/src/test/run-pass/liveness-move-in-loop.rs
@@ -0,0 +1,15 @@
+fn take(-x: int) -> int {x}
+
+fn the_loop() {
+    let mut list = [];
+    loop {
+        let x = 5;
+        if x > 3 {
+            list += [take(x)];
+        } else {
+            break;
+        }
+    }
+}
+
+fn main() {}
diff --git a/src/test/run-pass/tstate-loop-break.rs b/src/test/run-pass/tstate-loop-break.rs
new file mode 100644
index 00000000000..14a276b316a
--- /dev/null
+++ b/src/test/run-pass/tstate-loop-break.rs
@@ -0,0 +1,17 @@
+// xfail-test
+
+pure fn is_even(i: int) -> bool { (i%2) == 0 }
+fn even(i: int) : is_even(i) -> int { i }
+
+fn test() {
+    let v = 4;
+    loop {
+        check is_even(v);
+        break;
+    }
+    even(v);
+}
+
+fn main() {
+    test();
+}