Teach rustc to use the result of if expressions

This commit is contained in:
Brian Anderson 2011-03-27 16:29:21 -04:00 committed by Graydon Hoare
parent 2b27d12ce1
commit a5a319fa04
2 changed files with 111 additions and 4 deletions

View file

@ -3037,21 +3037,30 @@ fn trans_if(@block_ctxt cx, @ast.expr cond,
auto then_res = trans_block(then_cx, thn);
auto else_cx = new_scope_block_ctxt(cx, "else");
auto else_res = res(else_cx, C_nil());
auto else_res;
auto expr_llty;
alt (els) {
case (some[@ast.expr](?elexpr)) {
else_res = trans_expr(else_cx, elexpr);
// If we have an else expression, then the entire
// if expression can have a non-nil type.
// FIXME: Handle dynamic type sizes
auto expr_ty = ty.expr_ty(elexpr);
expr_llty = type_of(else_res.bcx.fcx.ccx, expr_ty);
}
case (_) {
else_res = res(else_cx, C_nil());
expr_llty = T_nil();
}
case (_) { /* fall through */ }
}
cond_res.bcx.build.CondBr(cond_res.val,
then_cx.llbb,
else_cx.llbb);
// FIXME: use inferred type when available.
ret join_results(cx, T_nil(),
ret join_results(cx, expr_llty,
vec(then_res, else_res));
}

View file

@ -0,0 +1,98 @@
// xfail-boot
// -*- rust -*-
// Tests for if as expressions
fn test_if() {
let bool res = if (true) { true } else { false };
check (res);
}
fn test_else() {
let bool res = if (false) { false } else { true };
check (res);
}
fn test_elseif1() {
let bool res = if (true) {
true
} else if (true) {
false
} else {
false
};
check (res);
}
fn test_elseif2() {
let bool res = if (false) {
false
} else if (true) {
true
} else {
false
};
check (res);
}
fn test_elseif3() {
let bool res = if (false) {
false
} else if (false) {
false
} else {
true
};
check (res);
}
fn test_inferrence() {
auto res = if (true) { true } else { false };
check (res);
}
fn test_if_as_if_condition() {
auto res1 = if (if (false) { false } else { true }) {
true
} else {
false
};
check (res1);
auto res2 = if (if (true) { false } else { true }) {
false
} else {
true
};
check (res2);
}
fn test_if_as_block_result() {
auto res = if (true) {
if (false) {
false
} else {
true
}
} else {
false
};
check (res);
}
fn test_str() {
auto res = if (true) { "happy" } else { "sad" };
check (res == "happy");
}
fn main() {
test_if();
test_else();
test_elseif1();
test_elseif2();
test_elseif3();
test_inferrence();
test_if_as_if_condition();
test_if_as_block_result();
test_str();
}