diff options
| author | Graydon Hoare <[email protected]> | 2010-10-22 15:37:42 -0700 |
|---|---|---|
| committer | Graydon Hoare <[email protected]> | 2010-10-22 15:37:42 -0700 |
| commit | 6d47d2abdee023f46b35b95e26e418ab9d67d39c (patch) | |
| tree | 1de9d41c4903b1fd1f8b6cf233d68c8fb7a4d7c4 /src/comp/middle/trans.rs | |
| parent | rustboot: If the user tries to instantiate a non-parametric type with type pa... (diff) | |
| download | rust-6d47d2abdee023f46b35b95e26e418ab9d67d39c.tar.xz rust-6d47d2abdee023f46b35b95e26e418ab9d67d39c.zip | |
Implement check-exprs, un-xfail 5 rustc tests.
Diffstat (limited to 'src/comp/middle/trans.rs')
| -rw-r--r-- | src/comp/middle/trans.rs | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index a157d42d..cc1af53f 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -791,6 +791,26 @@ fn trans_log(@block_ctxt cx, &ast.expr e) -> result { } } +fn trans_check_expr(@block_ctxt cx, &ast.expr e) -> result { + auto cond_res = trans_expr(cx, e); + + // FIXME: need pretty-printer. + auto V_expr_str = p2i(C_str(cx.fcx.tcx, "<expr>")); + auto V_filename = p2i(C_str(cx.fcx.tcx, e.span.filename)); + auto V_line = e.span.lo.line as int; + auto args = vec(V_expr_str, V_filename, C_int(V_line)); + + auto fail_cx = new_empty_block_ctxt(cx.fcx); + auto fail_res = trans_upcall(fail_cx, "upcall_fail", args); + + auto next_cx = new_extension_block_ctxt(cx); + fail_res.bcx.build.Br(next_cx.llbb); + cond_res.bcx.build.CondBr(cond_res.val, + next_cx.llbb, + fail_cx.llbb); + ret res(next_cx, C_nil()); +} + fn trans_stmt(@block_ctxt cx, &ast.stmt s) -> result { auto sub = res(cx, C_nil()); alt (s.node) { @@ -798,6 +818,10 @@ fn trans_stmt(@block_ctxt cx, &ast.stmt s) -> result { sub.bcx = trans_log(cx, *a).bcx; } + case (ast.stmt_check_expr(?a)) { + sub.bcx = trans_check_expr(cx, *a).bcx; + } + case (ast.stmt_expr(?e)) { sub.bcx = trans_expr(cx, *e).bcx; } |