mirror of
https://github.com/rust-lang/rust.git
synced 2025-01-27 23:22:58 +00:00
Teach rustc to use the result of if expressions
This commit is contained in:
parent
2b27d12ce1
commit
a5a319fa04
@ -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));
|
||||
}
|
||||
|
||||
|
98
src/test/run-pass/expr-if.rs
Normal file
98
src/test/run-pass/expr-if.rs
Normal 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();
|
||||
}
|
Loading…
Reference in New Issue
Block a user