about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/comp/middle/trans.rs19
-rw-r--r--src/test/run-fail/unwind-fail.rs6
2 files changed, 21 insertions, 4 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index aa82e03d57b..a78b452a4bd 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -3794,14 +3794,25 @@ fn trans_call(in_cx: &@block_ctxt, f: &@ast::expr,
     ret rslt(bcx, retval);
 }
 
+fn invoke(bcx: &@block_ctxt, llfn: ValueRef,
+          llargs: &[ValueRef]) -> result {
+    ret invoke_(bcx, llfn, llargs, Invoke);
+}
+
 fn invoke_fastcall(bcx: &@block_ctxt, llfn: ValueRef,
                    llargs: &[ValueRef]) -> result {
+    ret invoke_(bcx, llfn, llargs, FastInvoke);
+}
 
+fn invoke_(bcx: &@block_ctxt, llfn: ValueRef,
+           llargs: &[ValueRef],
+           invoker: fn(&@block_ctxt, ValueRef, &[ValueRef],
+                       BasicBlockRef, BasicBlockRef) -> ValueRef) -> result {
     let normal_bcx = new_sub_block_ctxt(bcx, "normal return");
     let unwind_bcx = new_sub_block_ctxt(bcx, "unwind");
-    let retval = FastInvoke(bcx, llfn, llargs,
-                            normal_bcx.llbb,
-                            unwind_bcx.llbb);
+    let retval = invoker(bcx, llfn, llargs,
+                         normal_bcx.llbb,
+                         unwind_bcx.llbb);
     trans_landing_pad(unwind_bcx);
     ret rslt(normal_bcx, retval);
 }
@@ -4291,7 +4302,7 @@ fn trans_fail_value(cx: &@block_ctxt, sp_opt: &option::t<span>,
     let V_str = PointerCast(cx, V_fail_str, T_ptr(T_i8()));
     V_filename = PointerCast(cx, V_filename, T_ptr(T_i8()));
     let args = [cx.fcx.lltaskptr, V_str, V_filename, C_int(V_line)];
-    Call(cx, bcx_ccx(cx).upcalls._fail, args);
+    let cx = invoke(cx, bcx_ccx(cx).upcalls._fail, args).bcx;
     Unreachable(cx);
     ret rslt(cx, C_nil());
 }
diff --git a/src/test/run-fail/unwind-fail.rs b/src/test/run-fail/unwind-fail.rs
new file mode 100644
index 00000000000..2d4f138e715
--- /dev/null
+++ b/src/test/run-fail/unwind-fail.rs
@@ -0,0 +1,6 @@
+// error-pattern:fail
+
+fn main() {
+    @0;
+    fail;
+}
\ No newline at end of file