aboutsummaryrefslogtreecommitdiff
path: root/src/comp
diff options
context:
space:
mode:
authorBrian Anderson <[email protected]>2011-01-28 00:09:26 -0500
committerGraydon Hoare <[email protected]>2011-01-28 11:12:57 -0800
commit6b7cab3602eae7893a4efcee760600ab69d75173 (patch)
tree0e73b029562b16641daae1b11ddf6a4396948016 /src/comp
parentCorrectly handle "import foo = bar.zed;". (diff)
downloadrust-6b7cab3602eae7893a4efcee760600ab69d75173.tar.xz
rust-6b7cab3602eae7893a4efcee760600ab69d75173.zip
Teach rustc to fail
Diffstat (limited to 'src/comp')
-rw-r--r--src/comp/front/ast.rs1
-rw-r--r--src/comp/front/parser.rs6
-rw-r--r--src/comp/middle/fold.rs4
-rw-r--r--src/comp/middle/trans.rs27
-rw-r--r--src/comp/middle/typeck.rs4
5 files changed, 31 insertions, 11 deletions
diff --git a/src/comp/front/ast.rs b/src/comp/front/ast.rs
index 70da87dd..10bcd5c4 100644
--- a/src/comp/front/ast.rs
+++ b/src/comp/front/ast.rs
@@ -116,6 +116,7 @@ tag stmt_ {
stmt_ret(option.t[@expr]);
stmt_log(@expr);
stmt_check_expr(@expr);
+ stmt_fail;
stmt_expr(@expr);
}
diff --git a/src/comp/front/parser.rs b/src/comp/front/parser.rs
index 5c13ef86..bef37a3c 100644
--- a/src/comp/front/parser.rs
+++ b/src/comp/front/parser.rs
@@ -1158,6 +1158,11 @@ impure fn parse_stmt(parser p) -> @ast.stmt {
}
}
+ case (token.FAIL) {
+ p.bump();
+ ret @spanned(lo, p.get_span(), ast.stmt_fail);
+ }
+
case (token.RET) {
p.bump();
alt (p.peek()) {
@@ -1315,6 +1320,7 @@ fn stmt_ends_with_semi(@ast.stmt stmt) -> bool {
case (ast.stmt_ret(_)) { ret true; }
case (ast.stmt_log(_)) { ret true; }
case (ast.stmt_check_expr(_)) { ret true; }
+ case (ast.stmt_fail) { ret true; }
case (ast.stmt_expr(?e)) {
alt (e.node) {
case (ast.expr_vec(_,_)) { ret true; }
diff --git a/src/comp/middle/fold.rs b/src/comp/middle/fold.rs
index 711db111..67c26014 100644
--- a/src/comp/middle/fold.rs
+++ b/src/comp/middle/fold.rs
@@ -615,6 +615,10 @@ fn fold_stmt[ENV](&ENV env, ast_fold[ENV] fld, &@stmt s) -> @stmt {
ret fld.fold_stmt_check_expr(env_, s.span, ee);
}
+ case (ast.stmt_fail) {
+ ret s;
+ }
+
case (ast.stmt_expr(?e)) {
auto ee = fold_expr(env_, fld, e);
ret fld.fold_stmt_expr(env_, s.span, ee);
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index 249cb73e..54e9426e 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -2251,11 +2251,7 @@ fn trans_index(@block_ctxt cx, &ast.span sp, @ast.expr base,
ix.bcx.build.CondBr(bounds_check, next_cx.llbb, fail_cx.llbb);
// fail: bad bounds check.
- auto V_expr_str = p2i(C_cstr(cx.fcx.ccx, "out-of-bounds access"));
- auto V_filename = p2i(C_cstr(cx.fcx.ccx, sp.filename));
- auto V_line = sp.lo.line as int;
- auto args = vec(V_expr_str, V_filename, C_int(V_line));
- auto fail_res = trans_upcall(fail_cx, "upcall_fail", args);
+ auto fail_res = trans_fail(fail_cx, sp, "bounds check");
fail_res.bcx.build.Br(next_cx.llbb);
auto body = next_cx.build.GEP(v, vec(C_int(0), C_int(abi.vec_elt_data)));
@@ -2904,13 +2900,9 @@ 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_cstr(cx.fcx.ccx, "<expr>"));
- auto V_filename = p2i(C_cstr(cx.fcx.ccx, 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 expr_str = "<expr>";
auto fail_cx = new_sub_block_ctxt(cx, "fail");
- auto fail_res = trans_upcall(fail_cx, "upcall_fail", args);
+ auto fail_res = trans_fail(fail_cx, e.span, expr_str);
auto next_cx = new_sub_block_ctxt(cx, "next");
fail_res.bcx.build.Br(next_cx.llbb);
@@ -2920,6 +2912,15 @@ fn trans_check_expr(@block_ctxt cx, @ast.expr e) -> result {
ret res(next_cx, C_nil());
}
+fn trans_fail(@block_ctxt cx, common.span sp, str fail_str) -> result {
+ auto V_fail_str = p2i(C_cstr(cx.fcx.ccx, fail_str));
+ auto V_filename = p2i(C_cstr(cx.fcx.ccx, sp.filename));
+ auto V_line = sp.lo.line as int;
+ auto args = vec(V_fail_str, V_filename, C_int(V_line));
+
+ ret trans_upcall(cx, "upcall_fail", args);
+}
+
fn trans_ret(@block_ctxt cx, &option.t[@ast.expr] e) -> result {
auto bcx = cx;
auto val = C_nil();
@@ -3035,6 +3036,10 @@ fn trans_stmt(@block_ctxt cx, &ast.stmt s) -> result {
bcx = trans_check_expr(cx, a).bcx;
}
+ case (ast.stmt_fail) {
+ bcx = trans_fail(cx, s.span, "explicit failure").bcx;
+ }
+
case (ast.stmt_ret(?e)) {
bcx = trans_ret(cx, e).bcx;
}
diff --git a/src/comp/middle/typeck.rs b/src/comp/middle/typeck.rs
index c3ae8f58..ea9002ae 100644
--- a/src/comp/middle/typeck.rs
+++ b/src/comp/middle/typeck.rs
@@ -1682,6 +1682,10 @@ fn check_stmt(&@fn_ctxt fcx, &@ast.stmt stmt) -> @ast.stmt {
ast.stmt_check_expr(expr_t));
}
+ case (ast.stmt_fail) {
+ ret stmt;
+ }
+
case (ast.stmt_expr(?expr)) {
auto expr_t = check_expr(fcx, expr);
ret @fold.respan[ast.stmt_](stmt.span, ast.stmt_expr(expr_t));