Fail typeck for illegal break-with-value
This is fixes the issue wherein typeck was succeeding for break-with-value at illegal locations such as inside `while`, `while let` and `for` loops which eventually caused an ICE during MIR interpetation for const eval. Now we fail typeck for such code which prevents faulty MIR from being generated and interpreted, thus fixing the ICE.
This commit is contained in:
parent
98108dc26c
commit
0c8bdd0bf3
@ -625,10 +625,15 @@ fn check_expr_break(
|
||||
}
|
||||
};
|
||||
|
||||
// If the loop context is not a `loop { }`, then break with
|
||||
// a value is illegal, and `opt_coerce_to` will be `None`.
|
||||
// Just set expectation to error in that case.
|
||||
let coerce_to = opt_coerce_to.unwrap_or_else(|| Ty::new_misc_error(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);
|
||||
}
|
||||
};
|
||||
|
||||
// Recurse without `enclosing_breakables` borrowed.
|
||||
e_ty = self.check_expr_with_hint(e, coerce_to);
|
||||
|
20
tests/ui/typeck/issue-114529-illegal-break-with-value.rs
Normal file
20
tests/ui/typeck/issue-114529-illegal-break-with-value.rs
Normal file
@ -0,0 +1,20 @@
|
||||
// Regression test for issue #114529
|
||||
// Tests that we do not ICE during const eval for a
|
||||
// break-with-value in contexts where it is illegal
|
||||
|
||||
#[allow(while_true)]
|
||||
fn main() {
|
||||
[(); {
|
||||
while true {
|
||||
break 9; //~ ERROR `break` with value from a `while` loop
|
||||
};
|
||||
51
|
||||
}];
|
||||
|
||||
[(); {
|
||||
while let Some(v) = Some(9) {
|
||||
break v; //~ ERROR `break` with value from a `while` loop
|
||||
};
|
||||
51
|
||||
}];
|
||||
}
|
29
tests/ui/typeck/issue-114529-illegal-break-with-value.stderr
Normal file
29
tests/ui/typeck/issue-114529-illegal-break-with-value.stderr
Normal file
@ -0,0 +1,29 @@
|
||||
error[E0571]: `break` with value from a `while` loop
|
||||
--> $DIR/issue-114529-illegal-break-with-value.rs:9:13
|
||||
|
|
||||
LL | while true {
|
||||
| ---------- you can't `break` with a value in a `while` loop
|
||||
LL | break 9;
|
||||
| ^^^^^^^ 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[E0571]: `break` with value from a `while` loop
|
||||
--> $DIR/issue-114529-illegal-break-with-value.rs:16:13
|
||||
|
|
||||
LL | while let Some(v) = Some(9) {
|
||||
| --------------------------- you can't `break` with a value in a `while` loop
|
||||
LL | break v;
|
||||
| ^^^^^^^ 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 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0571`.
|
Loading…
Reference in New Issue
Block a user