#![warn(clippy::explicit_deref_methods)] #![allow(unused_variables, unused_must_use)] #![allow( clippy::borrow_deref_ref, suspicious_double_ref_op, noop_method_call, clippy::explicit_auto_deref, clippy::needless_borrow, clippy::no_effect, clippy::uninlined_format_args, clippy::unnecessary_literal_unwrap )] use std::ops::{Deref, DerefMut}; fn concat(deref_str: &str) -> String { format!("{}bar", deref_str) } fn just_return(deref_str: &str) -> &str { deref_str } struct CustomVec(Vec); impl Deref for CustomVec { type Target = Vec; fn deref(&self) -> &Vec { &self.0 } } struct Aaa; impl Deref for Aaa { type Target = (); fn deref(&self) -> &Self::Target { todo!(); } } impl DerefMut for Aaa { fn deref_mut(&mut self) -> &mut Self::Target { todo!(); } } fn main() { let a: &mut String = &mut String::from("foo"); // these should require linting let b: &str = a.deref(); let b: &mut str = a.deref_mut(); // both derefs should get linted here let b: String = format!("{}, {}", a.deref(), a.deref()); println!("{}", a.deref()); #[allow(clippy::match_single_binding)] match a.deref() { _ => (), } let b: String = concat(a.deref()); let b = just_return(a).deref(); let b: String = concat(just_return(a).deref()); let b: &str = a.deref().deref(); let opt_a = Some(a.clone()); let b = opt_a.unwrap().deref(); // make sure `Aaa::deref` instead of `aaa.deref()` is not linted, as well as fully qualified // syntax Aaa::deref(&Aaa); Aaa::deref_mut(&mut Aaa); ::deref(&Aaa); ::deref_mut(&mut Aaa); let mut aaa = Aaa; Aaa::deref(&aaa); Aaa::deref_mut(&mut aaa); // following should not require linting let cv = CustomVec(vec![0, 42]); let c = cv.deref()[0]; let b: &str = &*a.deref(); let b: String = a.deref().clone(); let b: usize = a.deref_mut().len(); let b: &usize = &a.deref().len(); let b: &str = &*a; let b: &mut str = &mut *a; macro_rules! expr_deref { ($body:expr) => { $body.deref() }; } let b: &str = expr_deref!(a); let b: &str = expr_deref!(a.deref()); // The struct does not implement Deref trait #[derive(Copy, Clone)] struct NoLint(u32); impl NoLint { pub fn deref(self) -> u32 { self.0 } pub fn deref_mut(self) -> u32 { self.0 } } let no_lint = NoLint(42); let b = no_lint.deref(); let b = no_lint.deref_mut(); }