From c425a422ed8aec799532ba96e6f274ef83a0b759 Mon Sep 17 00:00:00 2001 From: Tim Chevalier Date: Sun, 3 Jul 2011 02:38:11 -0700 Subject: [PATCH] Manipulate contexts correctly in trans_fail_expr This fixes Issue #617 --- src/comp/middle/trans.rs | 14 ++++++++------ src/comp/middle/visit.rs | 4 +++- src/test/run-fail/fmt-fail.rs | 9 +++++++++ 3 files changed, 20 insertions(+), 7 deletions(-) create mode 100644 src/test/run-fail/fmt-fail.rs diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index aaaa54e4779..b41553c385b 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -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"); } } } diff --git a/src/comp/middle/visit.rs b/src/comp/middle/visit.rs index 3e80ed90032..7956752b856 100644 --- a/src/comp/middle/visit.rs +++ b/src/comp/middle/visit.rs @@ -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); } diff --git a/src/test/run-fail/fmt-fail.rs b/src/test/run-fail/fmt-fail.rs new file mode 100644 index 00000000000..2b8a39ff2c5 --- /dev/null +++ b/src/test/run-fail/fmt-fail.rs @@ -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); +} \ No newline at end of file