Clippy lints / Correctness
Clippy lint · Correctness · checked with Clippy 0.1.99
clippy::if_let_mutex: Checks for Mutex::lock calls in if let expression with lock calls in any of the else blocks
What it meansChecks for Mutex::lock calls in if let expression with lock calls in any of the else blocks. It is in the correctness group and denied by default (the build fails).
Does it matter?
The Mutex lock remains held for the whole if let ... else block and deadlocks.
Code that is almost certainly wrong. Denied by default: the build fails until you fix it or allow it.
How to fix it
Clippy does not fix this one automatically. Change the code by hand:
Flagged
if let Ok(thing) = mutex.lock() {
do_thing();
} else {
mutex.lock();
}
Write this instead
let locked = mutex.lock();
if let Ok(thing) = locked {
do_thing(thing);
} else {
use_locked(locked);
}
Turn it off, or on
Allow it where it does not fit your code, as narrowly as you can:
On one item
#[allow(clippy::if_let_mutex)]
fn my_function() { /* ... */ }Whole crate (Cargo.toml)
[lints.clippy]
if_let_mutex = "allow"One run
cargo clippy -- -A clippy::if-let-mutexThe [lints] table needs Rust 1.74 or newer. In a workspace, put it under [workspace.lints.clippy] and add [lints] workspace = true to each member.
Clippy's own documentation
What it does
Checks for Mutex::lock calls in if let expression
with lock calls in any of the else blocks.
Disabled starting in Edition 2024
This lint is effectively disabled starting in
Edition 2024 as if let ... else scoping was reworked
such that this is no longer an issue. See
Proposal: stabilize if_let_rescope for Edition 2024
Why is this bad?
The Mutex lock remains held for the whole
if let ... else block and deadlocks.
Example
if let Ok(thing) = mutex.lock() {
do_thing();
} else {
mutex.lock();
}
Should be written
let locked = mutex.lock();
if let Ok(thing) = locked {
do_thing(thing);
} else {
use_locked(locked);
}
From the Clippy lint list (0.1.99), part of the Rust project, MIT or Apache-2.0. Official entry.
Related lints
- enum_clike_unportable_variantC-like enum variant discriminant is not portable to 32-bit targets
- eq_opChecks for equal operands to comparison, logical and bitwise, difference and division binary operators (==, >, etc., &&, ||, &, |, ^, - and /)
- erasing_opthis operation will always return zero. This is likely not the intended outcome
- ifs_same_condChecks for consecutive ifs with the same condition
- impl_hash_borrow_with_str_and_bytesthe semantics of `Borrow<T>` around `Hash` can't be satisfied when both `Borrow<str>` and `Borrow<[u8]>` are implemented
- impossible_comparisonsChecks for double comparisons that can never succeed
All 847 Clippy lints · Rust compiler errors · Cargo.toml checker
Up next
Related lintclippy::enum_clike_unportable_variantC-like enum variant discriminant is not portable to 32-bit targetsRead it next →Did this answer your question?