hir-trans: Don't generate code for unreachable operands in short-circuiting logical operations.

This commit is contained in:
Michael Woerister 2016-06-03 13:24:46 -04:00
parent b33240e2cc
commit 4a3f9b8962
1 changed files with 13 additions and 0 deletions

View File

@ -1695,11 +1695,13 @@ fn trans_scalar_binop<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
}
// refinement types would obviate the need for this
#[derive(Clone, Copy)]
enum lazy_binop_ty {
lazy_and,
lazy_or,
}
fn trans_lazy_binop<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
binop_expr: &hir::Expr,
op: lazy_binop_ty,
@ -1717,6 +1719,17 @@ fn trans_lazy_binop<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
return immediate_rvalue_bcx(past_lhs, lhs, binop_ty).to_expr_datumblock();
}
// If the rhs can never be reached, don't generate code for it.
if let Some(cond_val) = const_to_opt_uint(lhs) {
match (cond_val, op) {
(0, lazy_and) |
(1, lazy_or) => {
return immediate_rvalue_bcx(past_lhs, lhs, binop_ty).to_expr_datumblock();
}
_ => { /* continue */ }
}
}
let join = fcx.new_id_block("join", binop_expr.id);
let before_rhs = fcx.new_id_block("before_rhs", b.id);