2021-01-10 23:51:43 +00:00
|
|
|
#![warn(clippy::map_clone)]
|
|
|
|
#![allow(
|
|
|
|
clippy::clone_on_copy,
|
|
|
|
clippy::iter_cloned_collect,
|
|
|
|
clippy::many_single_char_names,
|
2023-06-06 20:56:57 +00:00
|
|
|
clippy::redundant_clone,
|
2024-01-07 12:18:11 +00:00
|
|
|
clippy::redundant_closure,
|
2024-01-09 16:39:13 +00:00
|
|
|
clippy::useless_asref,
|
2024-02-12 18:01:56 +00:00
|
|
|
clippy::useless_vec,
|
|
|
|
clippy::empty_loop
|
2021-01-10 23:51:43 +00:00
|
|
|
)]
|
2018-10-02 13:13:43 +00:00
|
|
|
|
|
|
|
fn main() {
|
|
|
|
let _: Vec<i8> = vec![5_i8; 6].iter().map(|x| *x).collect();
|
|
|
|
let _: Vec<String> = vec![String::new()].iter().map(|x| x.clone()).collect();
|
|
|
|
let _: Vec<u32> = vec![42, 43].iter().map(|&x| x).collect();
|
2018-10-07 19:20:32 +00:00
|
|
|
let _: Option<u64> = Some(Box::new(16)).map(|b| *b);
|
2019-04-15 21:48:45 +00:00
|
|
|
let _: Option<u64> = Some(&16).map(|b| *b);
|
|
|
|
let _: Option<u8> = Some(&1).map(|x| x.clone());
|
2019-01-15 06:09:47 +00:00
|
|
|
|
|
|
|
// Don't lint these
|
|
|
|
let v = vec![5_i8; 6];
|
|
|
|
let a = 0;
|
|
|
|
let b = &a;
|
|
|
|
let _ = v.iter().map(|_x| *b);
|
|
|
|
let _ = v.iter().map(|_x| a.clone());
|
|
|
|
let _ = v.iter().map(|&_x| a);
|
|
|
|
|
2019-01-15 06:36:56 +00:00
|
|
|
// Issue #498
|
2019-01-15 06:09:47 +00:00
|
|
|
let _ = std::env::args().map(|v| v.clone());
|
2019-12-22 09:26:51 +00:00
|
|
|
|
|
|
|
// Issue #4824 item types that aren't references
|
|
|
|
{
|
|
|
|
use std::rc::Rc;
|
|
|
|
|
|
|
|
let o: Option<Rc<u32>> = Some(Rc::new(0_u32));
|
|
|
|
let _: Option<u32> = o.map(|x| *x);
|
|
|
|
let v: Vec<Rc<u32>> = vec![Rc::new(0_u32)];
|
|
|
|
let _: Vec<u32> = v.into_iter().map(|x| *x).collect();
|
|
|
|
}
|
2020-04-25 20:49:06 +00:00
|
|
|
|
|
|
|
// Issue #5524 mutable references
|
|
|
|
{
|
|
|
|
let mut c = 42;
|
|
|
|
let v = vec![&mut c];
|
|
|
|
let _: Vec<u32> = v.into_iter().map(|x| *x).collect();
|
|
|
|
let mut d = 21;
|
|
|
|
let v = vec![&mut d];
|
|
|
|
let _: Vec<u32> = v.into_iter().map(|&mut x| x).collect();
|
|
|
|
}
|
2020-11-06 11:38:46 +00:00
|
|
|
|
|
|
|
// Issue #6299
|
|
|
|
{
|
|
|
|
let mut aa = 5;
|
|
|
|
let mut bb = 3;
|
|
|
|
let items = vec![&mut aa, &mut bb];
|
|
|
|
let _: Vec<_> = items.into_iter().map(|x| x.clone()).collect();
|
|
|
|
}
|
2020-10-30 14:18:16 +00:00
|
|
|
|
|
|
|
// Issue #6239 deref coercion and clone deref
|
|
|
|
{
|
|
|
|
use std::cell::RefCell;
|
|
|
|
|
|
|
|
let _ = Some(RefCell::new(String::new()).borrow()).map(|s| s.clone());
|
|
|
|
}
|
2024-01-07 12:18:11 +00:00
|
|
|
|
|
|
|
let x = Some(String::new());
|
2024-01-06 18:33:09 +00:00
|
|
|
let x = x.as_ref(); // We do this to prevent triggering the `useless_asref` lint.
|
|
|
|
let y = x.map(|x| String::clone(x));
|
|
|
|
//~^ ERROR: you are explicitly cloning with `.map()`
|
|
|
|
let y = x.map(Clone::clone);
|
|
|
|
//~^ ERROR: you are explicitly cloning with `.map()`
|
2024-01-11 16:03:30 +00:00
|
|
|
//~| HELP: consider calling the dedicated `cloned` method
|
2024-01-06 18:33:09 +00:00
|
|
|
let y = x.map(String::clone);
|
2024-01-07 12:18:11 +00:00
|
|
|
//~^ ERROR: you are explicitly cloning with `.map()`
|
2024-01-11 16:03:30 +00:00
|
|
|
//~| HELP: consider calling the dedicated `cloned` method
|
|
|
|
|
|
|
|
let x: Option<u32> = Some(0);
|
|
|
|
let x = x.as_ref(); // We do this to prevent triggering the `useless_asref` lint.
|
|
|
|
let y = x.map(|x| u32::clone(x));
|
|
|
|
//~^ ERROR: you are explicitly cloning with `.map()`
|
|
|
|
//~| HELP: consider calling the dedicated `copied` method
|
|
|
|
let y = x.map(|x| Clone::clone(x));
|
|
|
|
//~^ ERROR: you are explicitly cloning with `.map()`
|
|
|
|
//~| HELP: consider calling the dedicated `copied` method
|
|
|
|
|
|
|
|
// Should not suggest `copied` or `cloned` here since `T` is not a reference.
|
|
|
|
let x: Option<u32> = Some(0);
|
|
|
|
let y = x.map(|x| u32::clone(&x));
|
|
|
|
let y = x.map(|x| Clone::clone(&x));
|
2024-01-09 15:35:10 +00:00
|
|
|
|
|
|
|
// Testing with `Result` now.
|
|
|
|
let x: Result<String, ()> = Ok(String::new());
|
|
|
|
let x = x.as_ref(); // We do this to prevent triggering the `useless_asref` lint.
|
|
|
|
let y = x.map(|x| String::clone(x));
|
|
|
|
//~^ ERROR: you are explicitly cloning with `.map()`
|
2024-01-11 16:03:30 +00:00
|
|
|
//~| HELP: consider calling the dedicated `cloned` method
|
|
|
|
let y = x.map(|x| Clone::clone(x));
|
|
|
|
//~^ ERROR: you are explicitly cloning with `.map()`
|
|
|
|
//~| HELP: consider calling the dedicated `cloned` method
|
|
|
|
|
|
|
|
let x: Result<u32, ()> = Ok(0);
|
|
|
|
let x = x.as_ref(); // We do this to prevent triggering the `useless_asref` lint.
|
|
|
|
let y = x.map(|x| u32::clone(x));
|
|
|
|
//~^ ERROR: you are explicitly cloning with `.map()`
|
|
|
|
//~| HELP: consider calling the dedicated `copied` method
|
|
|
|
let y = x.map(|x| Clone::clone(x));
|
|
|
|
//~^ ERROR: you are explicitly cloning with `.map()`
|
|
|
|
//~| HELP: consider calling the dedicated `copied` method
|
|
|
|
|
|
|
|
// Should not suggest `copied` or `cloned` here since `T` is not a reference.
|
|
|
|
let x: Result<u32, ()> = Ok(0);
|
|
|
|
let y = x.map(|x| u32::clone(&x));
|
|
|
|
let y = x.map(|x| Clone::clone(&x));
|
2024-01-09 16:39:13 +00:00
|
|
|
|
|
|
|
// We ensure that no warning is emitted here because `useless_asref` is taking over.
|
|
|
|
let x = Some(String::new());
|
|
|
|
let y = x.as_ref().map(|x| String::clone(x));
|
|
|
|
let x: Result<String, ()> = Ok(String::new());
|
|
|
|
let y = x.as_ref().map(|x| String::clone(x));
|
2024-02-12 18:01:56 +00:00
|
|
|
|
|
|
|
// Issue #12271
|
|
|
|
{
|
|
|
|
// Don't lint these
|
|
|
|
let x: Option<&u8> = None;
|
|
|
|
let y = x.map(|x| String::clone(loop {}));
|
|
|
|
let x: Option<&u8> = None;
|
|
|
|
let y = x.map(|x| u8::clone(loop {}));
|
|
|
|
let x: Vec<&u8> = vec![];
|
|
|
|
let y = x.into_iter().map(|x| String::clone(loop {}));
|
|
|
|
let x: Vec<&u8> = vec![];
|
|
|
|
let y = x.into_iter().map(|x| u8::clone(loop {}));
|
|
|
|
}
|
2024-03-21 23:33:31 +00:00
|
|
|
|
|
|
|
// Issue #12528
|
|
|
|
{
|
|
|
|
// Don't lint these
|
|
|
|
use std::rc::{Rc, Weak as RcWeak};
|
|
|
|
use std::sync::{Arc, Weak as ArcWeak};
|
|
|
|
struct Foo;
|
|
|
|
|
|
|
|
let x = Arc::new(Foo);
|
|
|
|
let y = Some(&x);
|
|
|
|
let _z = y.map(Arc::clone);
|
|
|
|
|
|
|
|
let x = Rc::new(Foo);
|
|
|
|
let y = Some(&x);
|
|
|
|
let _z = y.map(Rc::clone);
|
|
|
|
|
|
|
|
let x = Arc::downgrade(&Arc::new(Foo));
|
|
|
|
let y = Some(&x);
|
|
|
|
let _z = y.map(ArcWeak::clone);
|
|
|
|
|
|
|
|
let x = Rc::downgrade(&Rc::new(Foo));
|
|
|
|
let y = Some(&x);
|
|
|
|
let _z = y.map(RcWeak::clone);
|
|
|
|
}
|
2018-10-02 13:13:43 +00:00
|
|
|
}
|