diff options
Diffstat (limited to '')
-rw-r--r-- | src/tools/clippy/tests/ui/await_holding_refcell_ref.rs | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/src/tools/clippy/tests/ui/await_holding_refcell_ref.rs b/src/tools/clippy/tests/ui/await_holding_refcell_ref.rs new file mode 100644 index 000000000..23b7095de --- /dev/null +++ b/src/tools/clippy/tests/ui/await_holding_refcell_ref.rs @@ -0,0 +1,85 @@ +#![warn(clippy::await_holding_refcell_ref)] + +use std::cell::RefCell; + +async fn bad(x: &RefCell<u32>) -> u32 { + let b = x.borrow(); + baz().await +} + +async fn bad_mut(x: &RefCell<u32>) -> u32 { + let b = x.borrow_mut(); + baz().await +} + +async fn good(x: &RefCell<u32>) -> u32 { + { + let b = x.borrow_mut(); + let y = *b + 1; + } + baz().await; + let b = x.borrow_mut(); + 47 +} + +async fn baz() -> u32 { + 42 +} + +async fn also_bad(x: &RefCell<u32>) -> u32 { + let first = baz().await; + + let b = x.borrow_mut(); + + let second = baz().await; + + let third = baz().await; + + first + second + third +} + +async fn less_bad(x: &RefCell<u32>) -> u32 { + let first = baz().await; + + let b = x.borrow_mut(); + + let second = baz().await; + + drop(b); + + let third = baz().await; + + first + second + third +} + +async fn not_good(x: &RefCell<u32>) -> u32 { + let first = baz().await; + + let second = { + let b = x.borrow_mut(); + baz().await + }; + + let third = baz().await; + + first + second + third +} + +#[allow(clippy::manual_async_fn)] +fn block_bad(x: &RefCell<u32>) -> impl std::future::Future<Output = u32> + '_ { + async move { + let b = x.borrow_mut(); + baz().await + } +} + +fn main() { + let rc = RefCell::new(100); + good(&rc); + bad(&rc); + bad_mut(&rc); + also_bad(&rc); + less_bad(&rc); + not_good(&rc); + block_bad(&rc); +} |