about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2013-05-21 16:13:15 -0700
committerbors <bors@rust-lang.org>2013-05-21 16:13:15 -0700
commit15e44381af4f6d89fc62111a8425087ccab40665 (patch)
tree24356c71253f638a8e45abdf399a77a45d88f3ea
parent799f281b43bbd52c01c5e404cc09674ec52eb696 (diff)
parent8c68c4a52cc98608793bdab8188d76ce02649d68 (diff)
downloadrust-15e44381af4f6d89fc62111a8425087ccab40665.tar.gz
rust-15e44381af4f6d89fc62111a8425087ccab40665.zip
auto merge of #6665 : catamorphism/rust/issue-5741, r=nikomatsakis
r? @nikomatsakis 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.
-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" { };
+}