80 lines
1.6 KiB
Rust
80 lines
1.6 KiB
Rust
|
// run-rustfix
|
||
|
|
||
|
#![allow(unused_variables, clippy::many_single_char_names, clippy::clone_double_ref)]
|
||
|
#![warn(clippy::explicit_deref_method)]
|
||
|
|
||
|
use std::ops::{Deref, DerefMut};
|
||
|
|
||
|
fn concat(deref_str: &str) -> String {
|
||
|
format!("{}bar", deref_str)
|
||
|
}
|
||
|
|
||
|
fn just_return(deref_str: &str) -> &str {
|
||
|
deref_str
|
||
|
}
|
||
|
|
||
|
fn main() {
|
||
|
let a: &mut String = &mut String::from("foo");
|
||
|
|
||
|
// these should require linting
|
||
|
|
||
|
let b: &str = &*a;
|
||
|
|
||
|
let b: &mut str = &mut *a;
|
||
|
|
||
|
// both derefs should get linted here
|
||
|
let b: String = format!("{}, {}", &*a, &*a);
|
||
|
|
||
|
println!("{}", &*a);
|
||
|
|
||
|
#[allow(clippy::match_single_binding)]
|
||
|
match &*a {
|
||
|
_ => (),
|
||
|
}
|
||
|
|
||
|
let b: String = concat(&*a);
|
||
|
|
||
|
// following should not require linting
|
||
|
|
||
|
let b = just_return(a).deref();
|
||
|
|
||
|
let b: String = concat(just_return(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.deref().deref();
|
||
|
|
||
|
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 opt_a = Some(a);
|
||
|
let b = opt_a.unwrap().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();
|
||
|
}
|