diff --git a/src/comp/middle/typeck.rs b/src/comp/middle/typeck.rs index a679804e0b6e..af1a1a066a6f 100644 --- a/src/comp/middle/typeck.rs +++ b/src/comp/middle/typeck.rs @@ -2144,10 +2144,8 @@ fn check_expr(&@stmt_ctxt scx, &@ast::expr expr) { if (!ty::type_is_bot(scx.fcx.ccx.tcx, elsopt_t)) { Pushdown::pushdown_expr(scx, thn_t, els); if_t = elsopt_t; - } else if (!ty::type_is_bot(scx.fcx.ccx.tcx, thn_t)) { - if_t = thn_t; } else { - if_t = ty::mk_nil(scx.fcx.ccx.tcx); + if_t = thn_t; } } case (none[@ast::expr]) { diff --git a/src/test/run-pass/expr-if-fail-all.rs b/src/test/run-pass/expr-if-fail-all.rs new file mode 100644 index 000000000000..1c8775774cd5 --- /dev/null +++ b/src/test/run-pass/expr-if-fail-all.rs @@ -0,0 +1,16 @@ +// xfail-stage0 + +// When all branches of an if expression result in fail, the entire if +// expression results in fail. + +fn main() { + auto x = if (true) { + 10 + } else { + if (true) { + fail + } else { + fail + } + }; +}