about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorTim Chevalier <chevalier@alum.wellesley.edu>2013-05-21 13:15:48 -0700
committerTim Chevalier <chevalier@alum.wellesley.edu>2013-05-21 13:15:48 -0700
commit8c68c4a52cc98608793bdab8188d76ce02649d68 (patch)
tree6cdee846ff862f543235c8ee68efff2447638331 /src
parent64963d6cbaea86e0d2a58f507e57a76da7512e3e (diff)
downloadrust-8c68c4a52cc98608793bdab8188d76ce02649d68.tar.gz
rust-8c68c4a52cc98608793bdab8188d76ce02649d68.zip
rustc: Don't generate code for unreachable expressions
The way we deal with unreachable expressions in trans is pretty ad hoc,
but this at least doesn't make it worse, and eliminates the LLVM
assertion failure reported in #5741.
Diffstat (limited to 'src')
-rw-r--r--src/librustc/middle/trans/expr.rs4
-rw-r--r--src/test/run-pass/issue-5741.rs14
2 files changed, 18 insertions, 0 deletions
diff --git a/src/librustc/middle/trans/expr.rs b/src/librustc/middle/trans/expr.rs
index f457cc80da8..9349c2bcd26 100644
--- a/src/librustc/middle/trans/expr.rs
+++ b/src/librustc/middle/trans/expr.rs
@@ -499,6 +499,10 @@ fn trans_rvalue_stmt_unadjusted(bcx: block, expr: @ast::expr) -> block {
     let mut bcx = bcx;
     let _icx = bcx.insn_ctxt("trans_rvalue_stmt");
 
+    if bcx.unreachable {
+        return bcx;
+    }
+
     trace_span!(bcx, expr.span, @shorten(bcx.expr_to_str(expr)));
 
     match expr.node {
diff --git a/src/test/run-pass/issue-5741.rs b/src/test/run-pass/issue-5741.rs
new file mode 100644
index 00000000000..b80e37a425b
--- /dev/null
+++ b/src/test/run-pass/issue-5741.rs
@@ -0,0 +1,14 @@
+// Copyright 2013 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.
+
+fn main() {
+    return;
+    while io::stdin().read_line() != ~"quit" { };
+}