mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 06:44:35 +00:00
Typeck break expr even if break is illegal
We were earlier 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.
This commit is contained in:
parent
525c91d096
commit
4657917f6e
@ -626,15 +626,18 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let coerce_to = match opt_coerce_to {
|
// If the loop context is not a `loop { }`, then break with
|
||||||
Some(c) => c,
|
// a value is illegal, and `opt_coerce_to` will be `None`.
|
||||||
None => {
|
// Set expectation to error in that case and set tainted
|
||||||
// If the loop context is not a `loop { }`, then break with
|
// by error (#114529)
|
||||||
// a value is illegal, and `opt_coerce_to` will be `None`.
|
let coerce_to = opt_coerce_to.unwrap_or_else(|| {
|
||||||
// Return error in that case (#114529).
|
let guar = tcx.sess.delay_span_bug(
|
||||||
return Ty::new_misc_error(tcx);
|
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.
|
// Recurse without `enclosing_breakables` borrowed.
|
||||||
e_ty = self.check_expr_with_hint(e, coerce_to);
|
e_ty = self.check_expr_with_hint(e, coerce_to);
|
||||||
|
@ -17,4 +17,10 @@ fn main() {
|
|||||||
};
|
};
|
||||||
51
|
51
|
||||||
}];
|
}];
|
||||||
|
|
||||||
|
while true {
|
||||||
|
break (|| { //~ ERROR `break` with value from a `while` loop
|
||||||
|
let local = 9;
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -24,6 +24,21 @@ help: use `break` on its own without a value inside this `while` loop
|
|||||||
LL | break;
|
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`.
|
For more information about this error, try `rustc --explain E0571`.
|
||||||
|
Loading…
Reference in New Issue
Block a user