diff options
| author | Brian Anderson <[email protected]> | 2011-03-27 16:29:21 -0400 |
|---|---|---|
| committer | Graydon Hoare <[email protected]> | 2011-03-28 21:14:03 -0700 |
| commit | a5a319fa047b04b525066d560115ad93a18e4a4f (patch) | |
| tree | af19f3a3b4416049149e05020df2df849a8e0383 /src | |
| parent | Add expr_spawn, spawn parsing, folding, typechecking, ty_task (diff) | |
| download | rust-a5a319fa047b04b525066d560115ad93a18e4a4f.tar.xz rust-a5a319fa047b04b525066d560115ad93a18e4a4f.zip | |
Teach rustc to use the result of if expressions
Diffstat (limited to 'src')
| -rw-r--r-- | src/comp/middle/trans.rs | 17 | ||||
| -rw-r--r-- | src/test/run-pass/expr-if.rs | 98 |
2 files changed, 111 insertions, 4 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index 28f79dbb..82ba8654 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -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)); } diff --git a/src/test/run-pass/expr-if.rs b/src/test/run-pass/expr-if.rs new file mode 100644 index 00000000..e69a629f --- /dev/null +++ b/src/test/run-pass/expr-if.rs @@ -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(); +} |