#![warn(clippy::if_let_mutex)] use std::ops::Deref; use std::sync::Mutex; fn do_stuff(_: T) {} fn if_let() { let m = Mutex::new(1_u8); if let Err(locked) = m.lock() { //~^ ERROR: calling `Mutex::lock` inside the scope of another `Mutex::lock` causes a d do_stuff(locked); } else { let lock = m.lock().unwrap(); do_stuff(lock); }; } // This is the most common case as the above case is pretty // contrived. fn if_let_option() { let m = Mutex::new(Some(0_u8)); if let Some(locked) = m.lock().unwrap().deref() { //~^ ERROR: calling `Mutex::lock` inside the scope of another `Mutex::lock` causes a d do_stuff(locked); } else { let lock = m.lock().unwrap(); do_stuff(lock); }; } // When mutexes are different don't warn fn if_let_different_mutex() { let m = Mutex::new(Some(0_u8)); let other = Mutex::new(None::); if let Some(locked) = m.lock().unwrap().deref() { do_stuff(locked); } else { let lock = other.lock().unwrap(); do_stuff(lock); }; } fn mutex_ref(mutex: &Mutex) { if let Ok(i) = mutex.lock() { //~^ ERROR: calling `Mutex::lock` inside the scope of another `Mutex::lock` causes a d do_stuff(i); } else { let _x = mutex.lock(); }; } fn main() {}