Manipulate contexts correctly in trans_fail_expr

This fixes Issue #617
This commit is contained in:
Tim Chevalier 2011-07-03 02:38:11 -07:00
parent 9349826909
commit c425a422ed
3 changed files with 20 additions and 7 deletions

View file

@ -6370,24 +6370,26 @@ fn trans_check_expr(&@block_ctxt cx, &@ast::expr e, &str s) -> result {
fn trans_fail_expr(&@block_ctxt cx, &option::t[common::span] sp_opt,
&option::t[@ast::expr] fail_expr)
-> result {
auto bcx = cx;
alt (fail_expr) {
case (some(?expr)) {
auto tcx = cx.fcx.lcx.ccx.tcx;
auto expr_res = trans_expr(cx, expr);
auto tcx = bcx.fcx.lcx.ccx.tcx;
auto expr_res = trans_expr(bcx, expr);
auto e_ty = ty::expr_ty(tcx, expr);
bcx = expr_res.bcx;
if (ty::type_is_str(tcx, e_ty)) {
auto elt = cx.build.GEP(expr_res.val,
auto elt = bcx.build.GEP(expr_res.val,
[C_int(0), C_int(abi::vec_elt_data)]);
ret trans_fail_value(cx, sp_opt, elt);
ret trans_fail_value(bcx, sp_opt, elt);
} else {
cx.fcx.lcx.ccx.sess.span_fatal(expr.span,
bcx.fcx.lcx.ccx.sess.span_fatal(expr.span,
"fail called with unsupported \
type " + ty_to_str(tcx, e_ty));
}
}
case (_) {
ret trans_fail(cx, sp_opt, "explicit failure");
ret trans_fail(bcx, sp_opt, "explicit failure");
}
}
}

View file

@ -359,7 +359,9 @@ fn visit_expr[E](&@expr ex, &E e, &vt[E] v) {
case (expr_ext(_, _, _, ?expansion)) {
vt(v).visit_expr(expansion, e, v);
}
case (expr_fail(_)) { }
case (expr_fail(?eo)) {
visit_expr_opt(eo, e, v);
}
case (expr_break) { }
case (expr_cont) { }
case (expr_ret(?eo)) { visit_expr_opt(eo, e, v); }

View file

@ -0,0 +1,9 @@
// xfail-stage0
// error-pattern:meh
use std;
import std::str;
fn main() {
let str str_var = "meh";
fail #fmt("%s", str_var);
}