mirror of
https://github.com/rust-lang/rust.git
synced 2024-12-18 11:34:11 +00:00
save/restore pessimistic_yield
when entering bodies
This flag is used to make the execution order around `+=` operators pessimistic. Failure to save/restore the flag was causing independent async blocks to effect one another, leading to strange ICEs and failed assumptions.
This commit is contained in:
parent
2dcf54f564
commit
e7f8895359
@ -720,6 +720,7 @@ impl<'tcx> Visitor<'tcx> for RegionResolutionVisitor<'tcx> {
|
||||
let outer_ec = mem::replace(&mut self.expr_and_pat_count, 0);
|
||||
let outer_cx = self.cx;
|
||||
let outer_ts = mem::take(&mut self.terminating_scopes);
|
||||
let outer_pessimistic_yield = mem::replace(&mut self.pessimistic_yield, false);
|
||||
self.terminating_scopes.insert(body.value.hir_id.local_id);
|
||||
|
||||
if let Some(root_id) = self.cx.root_id {
|
||||
@ -771,6 +772,7 @@ impl<'tcx> Visitor<'tcx> for RegionResolutionVisitor<'tcx> {
|
||||
self.expr_and_pat_count = outer_ec;
|
||||
self.cx = outer_cx;
|
||||
self.terminating_scopes = outer_ts;
|
||||
self.pessimistic_yield = outer_pessimistic_yield;
|
||||
}
|
||||
|
||||
fn visit_arm(&mut self, a: &'tcx Arm<'tcx>) {
|
||||
|
23
src/test/ui/async-await/issues/issue-69307.rs
Normal file
23
src/test/ui/async-await/issues/issue-69307.rs
Normal file
@ -0,0 +1,23 @@
|
||||
// Regression test for #69307
|
||||
//
|
||||
// Having a `async { .. foo.await .. }` block appear inside of a `+=`
|
||||
// expression was causing an ICE due to a failure to save/restore
|
||||
// state in the AST numbering pass when entering a nested body.
|
||||
//
|
||||
// check-pass
|
||||
// edition:2018
|
||||
|
||||
fn block_on<F>(_: F) -> usize {
|
||||
0
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
||||
async fn bar() {
|
||||
let mut sum = 0;
|
||||
sum += block_on(async {
|
||||
baz().await;
|
||||
});
|
||||
}
|
||||
|
||||
async fn baz() {}
|
Loading…
Reference in New Issue
Block a user