- Notifications
You must be signed in to change notification settings - Fork 1.8k
Open
Labels
C-bugCategory: Clippy is not doing the correct thingCategory: Clippy is not doing the correct thingI-false-positiveIssue: The lint was triggered on code it shouldn't haveIssue: The lint was triggered on code it shouldn't have
Description
I tried this code:
#[deny(clippy::pedantic)] pub async fn doesnt_work() { use std::collections::HashSet; use std::sync::Mutex; use std::time::Duration; let lock: Mutex<HashSet<u8>> = Mutex::new(HashSet::new()); let mut set = lock.lock().unwrap(); set.insert(0); drop(set); tokio::time::sleep(Duration::from_secs(1)).await; }
I expected to see this happen: it should pass Clippy with no linting errors because the MutexGuard
is explicitly dropped before the await point with a call to std::mem::drop
.
Instead, this happened: Clippy failed the lint check because of a violation of clippy::await_holding_lock
:
$ cargo clippy ... error: this MutexGuard is held across an 'await' point. Consider using an async-aware Mutex type or ensuring the MutexGuard is dropped before calling await. --> src/lib.rs:8:9 | 8 | let mut set = lock.lock().unwrap(); | ^^^^^^^ | note: the lint level is defined here --> src/lib.rs:1:8 | 1 | #[deny(clippy::pedantic)] | ^^^^^^^^^^^^^^^^ = note: `#[deny(clippy::await_holding_lock)]` implied by `#[deny(clippy::pedantic)]` note: these are all the await points this lock is held through --> src/lib.rs:8:5 | 8 | / let mut set = lock.lock().unwrap(); 9 | | set.insert(0); 10 | | drop(set); 11 | | tokio::time::sleep(Duration::from_secs(1)).await; 12 | | } | |_^ = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#await_holding_lock error: aborting due to previous error
Running with --verbose
does not provide any additional information.
Additionally, of note, the following code does pass Clippy:
#[deny(clippy::pedantic)] pub async fn does_work() { use std::collections::HashSet; use std::sync::Mutex; use std::time::Duration; let lock: Mutex<HashSet<u8>> = Mutex::new(HashSet::new()); { let mut set = lock.lock().unwrap(); set.insert(0); } tokio::time::sleep(Duration::from_secs(1)).await; }
Meta
cargo clippy -V
: clippy 0.0.212 (7eac88a 2020-11-16)rustc -Vv
:rustc 1.48.0 (7eac88abb 2020-11-16) binary: rustc commit-hash: 7eac88abb2e57e752f3302f02be5f3ce3d7adfb4 commit-date: 2020-11-16 host: x86_64-unknown-linux-gnu release: 1.48.0 LLVM version: 11.0
Backtrace
$ RUST_BACKTRACE=1 cargo clippy Checking bug_report v0.1.0 (/home/jazev/dev/architus/logs/bug_report) error: this MutexGuard is held across an 'await' point. Consider using an async-aware Mutex type or ensuring the MutexGuard is dropped before calling await. --> src/lib.rs:8:9 | 8 | let mut set = lock.lock().unwrap(); | ^^^^^^^ | note: the lint level is defined here --> src/lib.rs:1:8 | 1 | #[deny(clippy::pedantic)] | ^^^^^^^^^^^^^^^^ = note: `#[deny(clippy::await_holding_lock)]` implied by `#[deny(clippy::pedantic)]` note: these are all the await points this lock is held through --> src/lib.rs:8:5 | 8 | / let mut set = lock.lock().unwrap(); 9 | | set.insert(0); 10 | | drop(set); 11 | | tokio::time::sleep(Duration::from_secs(1)).await; 12 | | } | |_^ = help: for further information visit https://rust-lang.github.io/rust- clippy/master/index.html#await_holding_lock error: aborting due to previous error error: could not compile `bug_report` To learn more, run the command again with --verbose.
patrickfreed, johnyburd, DenialAdams, trevyn, loyd and 12 more
Metadata
Metadata
Assignees
Labels
C-bugCategory: Clippy is not doing the correct thingCategory: Clippy is not doing the correct thingI-false-positiveIssue: The lint was triggered on code it shouldn't haveIssue: The lint was triggered on code it shouldn't have