From 948f8090ae66ea9207473bf97d5c0dfaee4244ed Mon Sep 17 00:00:00 2001 From: Tim Chevalier Date: Tue, 2 Aug 2011 19:02:38 -0700 Subject: [PATCH] Handle _|_ - typed discriminants in alts correctly Stop me, won't you, if you've heard this one before? Closes #794 --- src/comp/middle/trans_alt.rs | 13 ++++++++++++- src/test/run-fail/alt-disc-bot.rs | 4 ++++ 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 src/test/run-fail/alt-disc-bot.rs diff --git a/src/comp/middle/trans_alt.rs b/src/comp/middle/trans_alt.rs index 024f29224559..4a1734d3bc11 100644 --- a/src/comp/middle/trans_alt.rs +++ b/src/comp/middle/trans_alt.rs @@ -425,6 +425,18 @@ fn trans_alt(cx: &@block_ctxt, expr: &@ast::expr, arms: &ast::arm[], id: ast::node_id, output: &trans::out_method) -> result { let bodies = ~[]; let match: match = ~[]; + let er = trans::trans_expr(cx, expr); + if (ty::type_is_bot(bcx_tcx(cx), ty::expr_ty(bcx_tcx(cx), expr))) { + // No need to generate code for alt, + // since the disc diverges. + if (!cx.build.is_terminated()) { + ret rslt(cx, cx.build.Unreachable()); + } + else { + ret rslt(cx, C_nil()); + } + } + for a: ast::arm in arms { let body = new_scope_block_ctxt(cx, "case_body"); bodies += ~[body]; @@ -445,7 +457,6 @@ fn trans_alt(cx: &@block_ctxt, expr: &@ast::expr, arms: &ast::arm[], } let exit_map = ~[]; - let er = trans::trans_expr(cx, expr); let t = trans::node_id_type(cx.fcx.lcx.ccx, expr.id); let v = trans::spill_if_immediate(er.bcx, er.val, t); compile_submatch(er.bcx, match, ~[v], diff --git a/src/test/run-fail/alt-disc-bot.rs b/src/test/run-fail/alt-disc-bot.rs new file mode 100644 index 000000000000..8b4d30ef6ac4 --- /dev/null +++ b/src/test/run-fail/alt-disc-bot.rs @@ -0,0 +1,4 @@ +// error-pattern:quux +fn f() -> ! { fail "quux" } +fn g() -> int { alt f() { true { 1 } false { 0 } }; } +fn main() { g(); }