#![warn(clippy::explicit_iter_loop)]
#![expect(clippy::needless_borrow, clippy::unnecessary_mut_passed)]

use core::slice;
use std::collections::*;

fn main() {
    let mut vec = vec![1, 2, 3, 4];

    for _ in &vec {}
    //~^ explicit_iter_loop
    for _ in &mut vec {}
    //~^ explicit_iter_loop

    let rvec = &vec;
    for _ in rvec {}
    //~^ explicit_iter_loop

    let rmvec = &mut vec;
    for _ in rmvec.iter() {}
    for _ in rmvec.iter_mut() {}

    for _ in &vec {} // these are fine
    for _ in &mut vec {} // these are fine

    for _ in &[1, 2, 3] {}
    //~^ explicit_iter_loop

    for _ in (&mut [1, 2, 3]).iter() {}

    for _ in &[0; 32] {}
    //~^ explicit_iter_loop
    for _ in &[0; 33] {}
    //~^ explicit_iter_loop

    let ll: LinkedList<()> = LinkedList::new();
    for _ in &ll {}
    //~^ explicit_iter_loop
    let rll = &ll;
    for _ in rll {}
    //~^ explicit_iter_loop

    let vd: VecDeque<()> = VecDeque::new();
    for _ in &vd {}
    //~^ explicit_iter_loop
    let rvd = &vd;
    for _ in rvd {}
    //~^ explicit_iter_loop

    let bh: BinaryHeap<()> = BinaryHeap::new();
    for _ in &bh {}
    //~^ explicit_iter_loop

    let hm: HashMap<(), ()> = HashMap::new();
    for _ in &hm {}
    //~^ explicit_iter_loop

    let bt: BTreeMap<(), ()> = BTreeMap::new();
    for _ in &bt {}
    //~^ explicit_iter_loop

    let hs: HashSet<()> = HashSet::new();
    for _ in &hs {}
    //~^ explicit_iter_loop

    let bs: BTreeSet<()> = BTreeSet::new();
    for _ in &bs {}
    //~^ explicit_iter_loop

    struct NoIntoIter();
    impl NoIntoIter {
        fn iter(&self) -> slice::Iter<'_, u8> {
            unimplemented!()
        }

        fn iter_mut(&mut self) -> slice::IterMut<'_, u8> {
            unimplemented!()
        }
    }
    let mut x = NoIntoIter();
    for _ in x.iter() {} // no error
    for _ in x.iter_mut() {} // no error

    struct IntoIterDiffTy;
    impl IntoIterator for &'_ IntoIterDiffTy {
        type Item = &'static ();
        type IntoIter = core::slice::Iter<'static, ()>;
        fn into_iter(self) -> Self::IntoIter {
            unimplemented!()
        }
    }
    impl IntoIterDiffTy {
        fn iter(&self) -> core::slice::Iter<'static, i32> {
            unimplemented!()
        }
    }
    let x = IntoIterDiffTy;
    for _ in x.iter() {}

    struct IntoIterDiffSig;
    impl IntoIterator for &'_ IntoIterDiffSig {
        type Item = &'static ();
        type IntoIter = core::slice::Iter<'static, ()>;
        fn into_iter(self) -> Self::IntoIter {
            unimplemented!()
        }
    }
    impl IntoIterDiffSig {
        fn iter(&self, _: u32) -> core::slice::Iter<'static, ()> {
            unimplemented!()
        }
    }
    let x = IntoIterDiffSig;
    for _ in x.iter(0) {}

    struct IntoIterDiffLt<'a>(&'a ());
    impl<'a> IntoIterator for &'a IntoIterDiffLt<'_> {
        type Item = &'a ();
        type IntoIter = core::slice::Iter<'a, ()>;
        fn into_iter(self) -> Self::IntoIter {
            unimplemented!()
        }
    }
    impl<'a> IntoIterDiffLt<'a> {
        fn iter(&self) -> core::slice::Iter<'a, ()> {
            unimplemented!()
        }
    }
    let x = IntoIterDiffLt(&());
    for _ in x.iter() {}

    struct CustomType;
    impl<'a> IntoIterator for &'a CustomType {
        type Item = &'a u32;
        type IntoIter = core::slice::Iter<'a, u32>;
        fn into_iter(self) -> Self::IntoIter {
            unimplemented!()
        }
    }
    impl<'a> IntoIterator for &'a mut CustomType {
        type Item = &'a mut u32;
        type IntoIter = core::slice::IterMut<'a, u32>;
        fn into_iter(self) -> Self::IntoIter {
            unimplemented!()
        }
    }
    impl CustomType {
        fn iter(&self) -> <&'_ Self as IntoIterator>::IntoIter {
            panic!()
        }

        fn iter_mut(&mut self) -> core::slice::IterMut<'_, u32> {
            panic!()
        }
    }
    let mut x = CustomType;
    for _ in &x {}
    //~^ explicit_iter_loop
    for _ in &mut x {}
    //~^ explicit_iter_loop

    let r = &x;
    for _ in r {}
    //~^ explicit_iter_loop
}

#[clippy::msrv = "1.79"]
pub fn issue_13184() {
    // https://github.com/rust-lang/rust-clippy/issues/13184
    // No need to fix, as IntoIterator for Box is valid starting from 1.80
    let mut values: Box<[u32]> = Box::new([1, 2]);
    for _ in values.iter() {}
    for _ in values.iter_mut() {}

    let rvalues = &values;
    for _ in rvalues.iter() {}
}

fn issue14630() {
    macro_rules! mac {
        (iter $e:expr) => {
            $e.into_iter()
        };
    }

    for _ in &dbg!([1, 2]) {}
    //~^ explicit_iter_loop

    for _ in mac!(iter [1, 2]) {}
}
