#![feature(plugin)] #![plugin(clippy)] #![deny(map_clone)] #![allow(clone_on_copy, unused)] use std::ops::Deref; fn map_clone_iter() { let x = [1,2,3]; x.iter().map(|y| y.clone()); x.iter().map(|&y| y); x.iter().map(|y| *y); x.iter().map(|y| { y.clone() }); x.iter().map(|&y| { y }); x.iter().map(|y| { *y }); x.iter().map(Clone::clone); } fn map_clone_option() { let x = Some(4); x.as_ref().map(|y| y.clone()); x.as_ref().map(|&y| y); x.as_ref().map(|y| *y); } fn not_linted_option() { let x = Some(5); // Not linted: other statements x.as_ref().map(|y| { println!("y: {}", y); y.clone() }); // Not linted: argument bindings let x = Some((6, 7)); x.map(|(y, _)| y.clone()); // Not linted: cloning something else x.map(|y| y.0.clone()); // Not linted: no dereferences x.map(|y| y); // Not linted: multiple dereferences let _: Option<(i32, i32)> = x.as_ref().as_ref().map(|&&x| x); } #[derive(Copy, Clone)] struct Wrapper(T); impl Wrapper { fn map U>(self, f: F) -> Wrapper { Wrapper(f(self.0)) } } fn map_clone_other() { let eight = 8; let x = Wrapper(&eight); // Not linted: not a linted type x.map(|y| y.clone()); x.map(|&y| y); x.map(|y| *y); } #[derive(Copy, Clone)] struct UnusualDeref; static NINE: i32 = 9; impl Deref for UnusualDeref { type Target = i32; fn deref(&self) -> &i32 { &NINE } } fn map_clone_deref() { let x = Some(UnusualDeref); let _: Option = x.as_ref().map(|y| *y); // Not linted: using deref conversion let _: Option = x.map(|y| *y); // Not linted: using regular deref but also deref conversion let _: Option = x.as_ref().map(|y| **y); } // stuff that used to be a false positive fn former_false_positive() { vec![1].iter_mut().map(|x| *x); // #443 } fn main() { }