Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Typeck break expr even if break is illegal #118010

Merged
merged 1 commit into from
Nov 21, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
21 changes: 12 additions & 9 deletions compiler/rustc_hir_typeck/src/expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -626,15 +626,18 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
}
};

let coerce_to = match opt_coerce_to {
Some(c) => c,
None => {
// If the loop context is not a `loop { }`, then break with
// a value is illegal, and `opt_coerce_to` will be `None`.
// Return error in that case (#114529).
return Ty::new_misc_error(tcx);
}
};
// If the loop context is not a `loop { }`, then break with
// a value is illegal, and `opt_coerce_to` will be `None`.
// Set expectation to error in that case and set tainted
// by error (#114529)
let coerce_to = opt_coerce_to.unwrap_or_else(|| {
let guar = tcx.sess.delay_span_bug(
expr.span,
"illegal break with value found but no error reported",
);
self.set_tainted_by_errors(guar);
Ty::new_error(tcx, guar)
});

// Recurse without `enclosing_breakables` borrowed.
e_ty = self.check_expr_with_hint(e, coerce_to);
Expand Down
6 changes: 6 additions & 0 deletions tests/ui/typeck/issue-114529-illegal-break-with-value.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,10 @@ fn main() {
};
51
}];

while true {
break (|| { //~ ERROR `break` with value from a `while` loop
let local = 9;
});
}
}
17 changes: 16 additions & 1 deletion tests/ui/typeck/issue-114529-illegal-break-with-value.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,21 @@ help: use `break` on its own without a value inside this `while` loop
LL | break;
| ~~~~~

error: aborting due to 2 previous errors
error[E0571]: `break` with value from a `while` loop
--> $DIR/issue-114529-illegal-break-with-value.rs:22:9
|
LL | while true {
| ---------- you can't `break` with a value in a `while` loop
LL | / break (|| {
LL | | let local = 9;
LL | | });
| |__________^ can only break with a value inside `loop` or breakable block
|
help: use `break` on its own without a value inside this `while` loop
|
LL | break;
| ~~~~~

error: aborting due to 3 previous errors

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