#![warn(clippy::map_clone)]
#![allow(clippy::iter_cloned_collect)]
#![expect(
    clippy::clone_on_copy,
    clippy::empty_loop,
    clippy::redundant_closure,
    clippy::useless_asref,
    clippy::useless_vec
)]

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);
    }
}
