RS.CLIPPY.AWAIT_HOLDING_REFCELL_REF
Inside an async function, holding a `RefCell` ref while calling `await`
This checker is a Clippy lint created by The Rust Project Contributors. The documentation shown here is a copy of the original documentation for: await_holding_refcell_ref. Copyright ©2025 The Rust Team. All rights reserved.
What it does
Checks for calls to await while holding a RefCell, Ref, or RefMut.
Why is this bad?
RefCell refs only check for exclusive mutable access
at runtime. Holding a RefCell ref across an await suspension point
risks panics from a mutable ref shared while other refs are outstanding.
Known problems
Will report false positive for explicitly dropped refs
(#6353). A workaround for this is
to wrap the .borrow[_mut]() call in a block instead of explicitly dropping the ref.
Example
async fn foo(x: &RefCell<u32>) {
let mut y = x.borrow_mut();
*y += 1;
baz().await;
}
async fn bar(x: &RefCell<u32>) {
let mut y = x.borrow_mut();
*y += 1;
drop(y); // explicit drop
baz().await;
}
Use instead:
async fn foo(x: &RefCell<u32>) {
{
let mut y = x.borrow_mut();
*y += 1;
}
baz().await;
}
async fn bar(x: &RefCell<u32>) {
{
let mut y = x.borrow_mut();
*y += 1;
} // y dropped here at end of scope
baz().await;
}