Skip to content

Commit

Permalink
Account for an additional reborrow inserted by UniqueImmBorrow and Mu…
Browse files Browse the repository at this point in the history
…tBorrow
  • Loading branch information
compiler-errors committed Apr 5, 2024
1 parent 49c4ebc commit ad0fcac
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 3 deletions.
11 changes: 8 additions & 3 deletions compiler/rustc_mir_transform/src/coroutine/by_move_body.rs
Original file line number Diff line number Diff line change
Expand Up @@ -289,10 +289,15 @@ impl<'tcx> MutVisitor<'tcx> for MakeByMoveBody<'tcx> {
// generating, we also are taking that field by value. Peel off a deref,
// since a layer of reffing has now become redundant.
let final_deref = if needs_deref {
let [mir::ProjectionElem::Deref] = projection else {
bug!("There should only be a single deref for an upvar local initialization");
let Some((mir::ProjectionElem::Deref, projection)) = projection.split_first()
else {
bug!(
"There should be at least a single deref for an upvar local initialization, found {projection:#?}"
);
};
&[]
// There may be more derefs, since we may also implicitly reborrow
// a captured mut pointer.
projection
} else {
projection
};
Expand Down
27 changes: 27 additions & 0 deletions tests/ui/async-await/async-closures/mut-ref-reborrow.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
//@ aux-build:block-on.rs
//@ run-pass
//@ check-run-results
//@ revisions: e2021 e2018
//@[e2018] edition:2018
//@[e2021] edition:2021

#![feature(async_closure)]

extern crate block_on;

async fn call_once(f: impl async FnOnce()) { f().await; }

pub async fn async_closure(x: &mut i32) {
let c = async move || {
*x += 1;
};
call_once(c).await;
}

fn main() {
block_on::block_on(async {
let mut x = 0;
async_closure(&mut x).await;
assert_eq!(x, 1);
});
}

0 comments on commit ad0fcac

Please sign in to comment.