From 6824f119fcaef80e6ac377e887cbe6789e587f77 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Fri, 13 May 2011 14:42:23 -0400 Subject: [PATCH] rustc: Allow alt expressions to fail --- src/comp/middle/typeck.rs | 12 +++++++++--- src/test/run-fail/expr-alt-fail.rs | 13 +++++++++++++ src/test/run-pass/expr-alt-fail.rs | 30 ++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+), 3 deletions(-) create mode 100644 src/test/run-fail/expr-alt-fail.rs create mode 100644 src/test/run-pass/expr-alt-fail.rs diff --git a/src/comp/middle/typeck.rs b/src/comp/middle/typeck.rs index 6a37d1d22eba..aedbb89f2a8a 100644 --- a/src/comp/middle/typeck.rs +++ b/src/comp/middle/typeck.rs @@ -1457,7 +1457,10 @@ mod Pushdown { for (ast::arm arm_0 in arms_0) { pushdown_block(scx, expected, arm_0.block); auto bty = block_ty(scx.fcx.ccx.tcx, arm_0.block); - t = Demand::simple(scx, e.span, t, bty); + // Failing alt arms don't need to have a matching type + if (!ty::type_is_bot(scx.fcx.ccx.tcx, bty)) { + t = Demand::simple(scx, e.span, t, bty); + } } write::ty_only_fixup(scx, ann.id, t); } @@ -2209,8 +2212,11 @@ fn check_expr(&@stmt_ctxt scx, &@ast::expr expr) { check_block(scx, arm.block); auto bty = block_ty(scx.fcx.ccx.tcx, arm.block); - result_ty = Demand::simple(scx, arm.block.span, result_ty, - bty); + // Failing alt arms don't need to have a matching type + if (!ty::type_is_bot(scx.fcx.ccx.tcx, bty)) { + result_ty = Demand::simple(scx, arm.block.span, + result_ty, bty); + } } auto i = 0u; diff --git a/src/test/run-fail/expr-alt-fail.rs b/src/test/run-fail/expr-alt-fail.rs new file mode 100644 index 000000000000..33d09cce8c0f --- /dev/null +++ b/src/test/run-fail/expr-alt-fail.rs @@ -0,0 +1,13 @@ +// xfail-stage0 +// error-pattern:explicit failure + +fn main() { + auto x = alt(true) { + case (false) { + 0 + } + case (true) { + fail + } + }; +} diff --git a/src/test/run-pass/expr-alt-fail.rs b/src/test/run-pass/expr-alt-fail.rs new file mode 100644 index 000000000000..373e0f02b369 --- /dev/null +++ b/src/test/run-pass/expr-alt-fail.rs @@ -0,0 +1,30 @@ +// xfail-stage0 + +fn test_simple() { + auto r = alt (true) { + case (true) { + true + } + case (false) { + fail + } + }; + assert (r == true); +} + +fn test_box() { + auto r = alt (true) { + case (true) { + [10] + } + case (false) { + fail + } + }; + assert (r.(0) == 10); +} + +fn main() { + test_simple(); + test_box(); +}