Skip to content

Commit

Permalink
Rollup merge of #118010 - gurry:117821-ice-no-type-for-local-var, r=c…
Browse files Browse the repository at this point in the history
…ompiler-errors

Typeck break expr even if break is illegal

Fixes #117821

We were returning immediately when encountering an illegal break. However, this caused problems later when the expr that the break was returning was evaluated during writeback. So now we don't return and instead simply set tainted by error. This lets typeck of break expr to occur even though we've encountered an illegal break.
  • Loading branch information
matthiaskrgr authored Nov 20, 2023
2 parents 0270afe + 4657917 commit 1936e2c
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 10 deletions.
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`.

0 comments on commit 1936e2c

Please sign in to comment.