| #![deny(clippy::explicit_iter_loop)] | |
| #![allow( | |
| clippy::linkedlist, | |
| clippy::similar_names, | |
| clippy::needless_borrow, | |
| clippy::deref_addrof, | |
| clippy::unnecessary_mut_passed, | |
| dead_code, | |
| non_local_definitions | |
| )] | |
| 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 = ≪ | |
| 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]) {} | |
| } |