56 lines
1.0 KiB
Rust
56 lines
1.0 KiB
Rust
#![feature(tool_lints)]
|
|
|
|
use std::ops::{Deref, DerefMut};
|
|
|
|
#[allow(clippy::many_single_char_names, clippy::clone_double_ref)]
|
|
#[allow(unused_variables)]
|
|
#[warn(clippy::explicit_deref_method)]
|
|
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();
|
|
}
|
|
|
|
{
|
|
let b: String = a.deref().clone();
|
|
}
|
|
|
|
{
|
|
let b: usize = a.deref_mut().len();
|
|
}
|
|
|
|
{
|
|
let b: &usize = &a.deref().len();
|
|
}
|
|
|
|
{
|
|
// only first deref should get linted here
|
|
let b: &str = a.deref().deref();
|
|
}
|
|
|
|
{
|
|
// both derefs should get linted here
|
|
let b: String = format!("{}, {}", a.deref(), a.deref());
|
|
}
|
|
|
|
// these should not require linting
|
|
{
|
|
let b: &str = &*a;
|
|
}
|
|
|
|
{
|
|
let b: &mut str = &mut *a;
|
|
}
|
|
|
|
{
|
|
macro_rules! expr_deref { ($body:expr) => { $body.deref() } }
|
|
let b: &str = expr_deref!(a);
|
|
}
|
|
}
|