about summary refs log tree commit diff
path: root/src/comp
diff options
context:
space:
mode:
authorMarijn Haverbeke <marijnh@gmail.com>2011-09-26 03:57:08 +0200
committerMarijn Haverbeke <marijnh@gmail.com>2011-09-26 03:57:08 +0200
commit4c5e42a1396396dcf36f84fda2f08c5f9fa6b6c4 (patch)
tree0c65ef95559913d7a8bb157edeaf5f928fffab06 /src/comp
parent6164b724029d652e539a76b859c63cd7937157d8 (diff)
downloadrust-4c5e42a1396396dcf36f84fda2f08c5f9fa6b6c4.tar.gz
rust-4c5e42a1396396dcf36f84fda2f08c5f9fa6b6c4.zip
Make 'fail fail;' compile.
Closes #972
Diffstat (limited to 'src/comp')
-rw-r--r--src/comp/middle/trans.rs4
1 files changed, 4 insertions, 0 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index 6495ded7d1c..e5190aaa635 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -438,11 +438,13 @@ fn align_of(cx: @block_ctxt, t: ty::t) -> result {
 }
 
 fn alloca(cx: @block_ctxt, t: TypeRef) -> ValueRef {
+    if cx.unreachable { ret llvm::LLVMGetUndef(t); }
     ret Alloca(new_raw_block_ctxt(cx.fcx, cx.fcx.llstaticallocas), t);
 }
 
 fn dynastack_alloca(cx: @block_ctxt, t: TypeRef, n: ValueRef, ty: ty::t) ->
    ValueRef {
+    if cx.unreachable { ret llvm::LLVMGetUndef(t); }
     let bcx = cx;
     let dy_cx = new_raw_block_ctxt(cx.fcx, cx.fcx.lldynamicallocas);
     let lltaskptr = bcx_fcx(bcx).lltaskptr;
@@ -4474,6 +4476,8 @@ fn trans_fail_expr(cx: @block_ctxt, sp_opt: option::t<span>,
                                                 ty::mk_mach(tcx,
                                                             ast::ty_u8)));
             ret trans_fail_value(bcx, sp_opt, data);
+        } else if bcx.unreachable {
+            ret rslt(bcx, C_nil());
         } else {
             bcx_ccx(cx).sess.span_bug(expr.span,
                                       "fail called with unsupported type " +