clippy 0.0.208

A bunch of helpful lints to avoid common pitfalls in Rust



#![warn(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>(T);
impl<T> Wrapper<T> {
    fn map<U, F: FnOnce(T) -> U>(self, f: F) -> Wrapper<U> {
        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<UnusualDeref> = x.as_ref().map(|y| *y);


    // Not linted: using deref conversion
    let _: Option<i32> = x.map(|y| *y);

    // Not linted: using regular deref but also deref conversion
    let _: Option<i32> = 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() { }