| #![warn(clippy::map_clone)] | |
| #![allow( | |
| clippy::clone_on_copy, | |
| clippy::iter_cloned_collect, | |
| clippy::many_single_char_names, | |
| clippy::redundant_clone, | |
| clippy::redundant_closure, | |
| clippy::useless_asref, | |
| clippy::useless_vec, | |
| clippy::empty_loop | |
| )] | |
| fn main() { | |
| let _: Vec<i8> = vec![5_i8; 6].iter().copied().collect(); | |
| //~^ map_clone | |
| let _: Vec<String> = vec![String::new()].iter().cloned().collect(); | |
| //~^ map_clone | |
| let _: Vec<u32> = vec![42, 43].iter().copied().collect(); | |
| //~^ map_clone | |
| let _: Option<u64> = Some(Box::new(16)).map(|b| *b); | |
| let _: Option<u64> = Some(&16).copied(); | |
| //~^ map_clone | |
| let _: Option<u8> = Some(&1).copied(); | |
| //~^ map_clone | |
| // 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); | |
| // Issue #498 | |
| let _ = std::env::args(); | |
| //~^ map_clone | |
| // 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(); | |
| } | |
| // 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(); | |
| } | |
| // 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(); | |
| } | |
| // Issue #6239 deref coercion and clone deref | |
| { | |
| use std::cell::RefCell; | |
| let _ = Some(RefCell::new(String::new()).borrow()).map(|s| s.clone()); | |
| } | |
| let x = Some(String::new()); | |
| let x = x.as_ref(); // We do this to prevent triggering the `useless_asref` lint. | |
| let y = x.cloned(); | |
| //~^ map_clone | |
| let y = x.cloned(); | |
| //~^ map_clone | |
| let y = x.cloned(); | |
| //~^ map_clone | |
| let x: Option<u32> = Some(0); | |
| let x = x.as_ref(); // We do this to prevent triggering the `useless_asref` lint. | |
| let y = x.copied(); | |
| //~^ map_clone | |
| let y = x.copied(); | |
| //~^ map_clone | |
| // 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)); | |
| // 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.cloned(); | |
| //~^ map_clone | |
| let y = x.cloned(); | |
| //~^ map_clone | |
| let x: Result<u32, ()> = Ok(0); | |
| let x = x.as_ref(); // We do this to prevent triggering the `useless_asref` lint. | |
| let y = x.copied(); | |
| //~^ map_clone | |
| let y = x.copied(); | |
| //~^ map_clone | |
| // 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)); | |
| // 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)); | |
| // 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 {})); | |
| } | |
| // 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); | |
| } | |
| } |