From 774c6d01984b608047afedb5d8c579c00d69823f Mon Sep 17 00:00:00 2001 From: Tim Chevalier Date: Fri, 10 Jun 2011 14:34:01 -0700 Subject: [PATCH] Friendlier error message for break outside a loop The typechecker should really check for this, but at least now there's an error message rather than an inexhaustive match failure in trans. --- src/comp/middle/trans.rs | 19 ++++++++++++------- src/test/compile-fail/break-outside-loop.rs | 7 +++++++ 2 files changed, 19 insertions(+), 7 deletions(-) create mode 100644 src/test/compile-fail/break-outside-loop.rs diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index 2c0965ead2fc..d1b5d39516d0 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -5691,11 +5691,11 @@ fn trans_expr_out(&@block_ctxt cx, &@ast::expr e, out_method output) } case (ast::expr_break(?a)) { - ret trans_break(cx); + ret trans_break(e.span, cx); } case (ast::expr_cont(?a)) { - ret trans_cont(cx); + ret trans_cont(e.span, cx); } case (ast::expr_ret(?e, _)) { @@ -5972,7 +5972,7 @@ fn trans_put(&@block_ctxt cx, &option::t[@ast::expr] e) -> result { ret res(bcx, bcx.build.FastCall(llcallee, llargs)); } -fn trans_break_cont(&@block_ctxt cx, bool to_end) -> result { +fn trans_break_cont(&span sp, &@block_ctxt cx, bool to_end) -> result { auto bcx = cx; // Locate closest loop block, outputting cleanup as we go. auto cleanup_cx = cx; @@ -5998,6 +5998,11 @@ fn trans_break_cont(&@block_ctxt cx, bool to_end) -> result { case (_) { alt ({cleanup_cx.parent}) { case (parent_some(?cx)) { cleanup_cx = cx; } + case (parent_none) { + cx.fcx.lcx.ccx.sess.span_err(sp, + (if (to_end) { "Break" } else { "Cont" }) + + " outside a loop"); + } } } } @@ -6007,12 +6012,12 @@ fn trans_break_cont(&@block_ctxt cx, bool to_end) -> result { cx.fcx.lcx.ccx.sess.bug("in trans::trans_break_cont()"); } -fn trans_break(&@block_ctxt cx) -> result { - ret trans_break_cont(cx, true); +fn trans_break(&span sp, &@block_ctxt cx) -> result { + ret trans_break_cont(sp, cx, true); } -fn trans_cont(&@block_ctxt cx) -> result { - ret trans_break_cont(cx, false); +fn trans_cont(&span sp, &@block_ctxt cx) -> result { + ret trans_break_cont(sp, cx, false); } diff --git a/src/test/compile-fail/break-outside-loop.rs b/src/test/compile-fail/break-outside-loop.rs new file mode 100644 index 000000000000..9c5d8c5e7ed3 --- /dev/null +++ b/src/test/compile-fail/break-outside-loop.rs @@ -0,0 +1,7 @@ +// error-pattern:Break outside a loop +fn main() { + auto pth = break; + + let rec(str t) res = rec(t=pth); + +} \ No newline at end of file