Skip to content

Commit

Permalink
Check break target availability when checking breaks with values
Browse files Browse the repository at this point in the history
Fixes #66702
  • Loading branch information
osa1 committed Dec 3, 2019
1 parent 4787e97 commit 6857c93
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 4 deletions.
18 changes: 14 additions & 4 deletions src/librustc_typeck/check/expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -582,11 +582,21 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
// If this is a break with a value, we need to type-check
// the expression. Get an expected type from the loop context.
let opt_coerce_to = {
// We should release `enclosing_breakables` before the `check_expr_with_hint`
// below, so can't move this block of code to the enclosing scope and share
// `ctxt` with the second `encloding_breakables` borrow below.
let mut enclosing_breakables = self.enclosing_breakables.borrow_mut();
enclosing_breakables.find_breakable(target_id)
.coerce
.as_ref()
.map(|coerce| coerce.expected_ty())
match enclosing_breakables.opt_find_breakable(target_id) {
Some(ctxt) =>
ctxt.coerce.as_ref().map(|coerce| coerce.expected_ty()),
None => { // Avoid ICE when `break` is inside a closure (#65383).
self.tcx.sess.delay_span_bug(
expr.span,
"break was outside loop, but no error was emitted",
);
return tcx.types.err;
}
}
};

// If the loop context is not a `loop { }`, then break with
Expand Down
7 changes: 7 additions & 0 deletions src/test/ui/issues/issue-66702-break-outside-loop-val.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
// Breaks with values inside closures used to ICE (#66863)

fn main() {
'some_label: loop {
|| break 'some_label (); //~ ERROR: `break` inside of a closure
}
}
11 changes: 11 additions & 0 deletions src/test/ui/issues/issue-66702-break-outside-loop-val.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
error[E0267]: `break` inside of a closure
--> $DIR/issue-66702-break-outside-loop-val.rs:5:12
|
LL | || break 'some_label ();
| -- ^^^^^^^^^^^^^^^^^^^^ cannot `break` inside of a closure
| |
| enclosing closure

error: aborting due to previous error

For more information about this error, try `rustc --explain E0267`.

0 comments on commit 6857c93

Please sign in to comment.