about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMarijn Haverbeke <marijnh@gmail.com>2011-05-05 15:30:21 +0200
committerMarijn Haverbeke <marijnh@gmail.com>2011-05-05 20:19:43 +0200
commit3d738e9e0634a4cd6239d1317bd7dad53be68dc8 (patch)
treeb3757c980217884882ef803e484540e9806b6d83
parent9432626b686782f87e54960a4c019fd7c83ad7f7 (diff)
downloadrust-3d738e9e0634a4cd6239d1317bd7dad53be68dc8.tar.gz
rust-3d738e9e0634a4cd6239d1317bd7dad53be68dc8.zip
Return a fresh, unreachable context after ret, break, and cont
This ensures we don't get compile errors on unreachable code (see
test/run-pass/artificial-block.rs for an example of sane code that
wasn't compiling). In the future, we might want to warn about
non-trivial code appearing in an unreachable context, and/or avoid
generating unreachable code altogether (though I'm sure LLVM will weed
it out as well).
-rw-r--r--src/comp/middle/trans.rs4
-rw-r--r--src/test/run-pass/artificial-block.rs4
2 files changed, 2 insertions, 6 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index b479efef2a5..0790cf19c3b 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -5488,7 +5488,7 @@ fn trans_break_cont(@block_ctxt cx, bool to_end) -> result {
                         }
                     }
                 }
-                ret res(bcx, C_nil());
+                ret res(new_sub_block_ctxt(bcx, "unreachable"), C_nil());
             }
             case (_) {
                 alt (cleanup_cx.parent) {
@@ -5544,7 +5544,7 @@ fn trans_ret(@block_ctxt cx, &option.t[@ast.expr] e) -> result {
     }
 
     bcx.build.RetVoid();
-    ret res(bcx, C_nil());
+    ret res(new_sub_block_ctxt(bcx, "unreachable"), C_nil());
 }
 
 fn trans_be(@block_ctxt cx, @ast.expr e) -> result {
diff --git a/src/test/run-pass/artificial-block.rs b/src/test/run-pass/artificial-block.rs
index 30344c4c7ce..e09dbcc1f89 100644
--- a/src/test/run-pass/artificial-block.rs
+++ b/src/test/run-pass/artificial-block.rs
@@ -1,8 +1,4 @@
 // xfail-stage0
-// xfail-stage1
-// xfail-stage2
-// xfail-stage1
-// xfail-stage2
 fn f() -> int {
     { ret 3; }
 }