#![allow( unused, clippy::needless_if, clippy::suspicious_map, clippy::iter_count, clippy::manual_contains )] use std::collections::{BTreeMap, BTreeSet, BinaryHeap, HashMap, HashSet, LinkedList}; #[warn(clippy::needless_collect)] #[allow(unused_variables, clippy::iter_cloned_collect, clippy::iter_next_slice)] fn main() { let sample = [1; 5]; let len = sample.iter().collect::>().len(); //~^ needless_collect if sample.iter().collect::>().is_empty() { //~^ needless_collect // Empty } sample.iter().cloned().collect::>().contains(&1); //~^ needless_collect // #7164 HashMap's and BTreeMap's `len` usage should not be linted sample.iter().map(|x| (x, x)).collect::>().len(); sample.iter().map(|x| (x, x)).collect::>().len(); sample.iter().map(|x| (x, x)).collect::>().is_empty(); //~^ needless_collect sample.iter().map(|x| (x, x)).collect::>().is_empty(); //~^ needless_collect // Notice the `HashSet`--this should not be linted sample.iter().collect::>().len(); // Neither should this sample.iter().collect::>().len(); sample.iter().collect::>().len(); //~^ needless_collect sample.iter().collect::>().is_empty(); //~^ needless_collect sample.iter().cloned().collect::>().contains(&1); //~^ needless_collect sample.iter().collect::>().contains(&&1); //~^ needless_collect // `BinaryHeap` doesn't have `contains` method sample.iter().collect::>().len(); //~^ needless_collect sample.iter().collect::>().is_empty(); //~^ needless_collect // Don't lint string from str let _ = ["", ""].into_iter().collect::().is_empty(); let _ = sample.iter().collect::>().is_empty(); //~^ needless_collect let _ = sample.iter().collect::>().contains(&&0); //~^ needless_collect struct VecWrapper(Vec); impl core::ops::Deref for VecWrapper { type Target = Vec; fn deref(&self) -> &Self::Target { &self.0 } } impl IntoIterator for VecWrapper { type IntoIter = as IntoIterator>::IntoIter; type Item = as IntoIterator>::Item; fn into_iter(self) -> Self::IntoIter { self.0.into_iter() } } impl FromIterator for VecWrapper { fn from_iter>(iter: I) -> Self { Self(Vec::from_iter(iter)) } } let _ = sample.iter().collect::>().is_empty(); //~^ needless_collect let _ = sample.iter().collect::>().contains(&&0); //~^ needless_collect #[allow(clippy::double_parens)] { Vec::::new().extend((0..10).collect::>()); //~^ needless_collect foo((0..10).collect::>()); //~^ needless_collect bar((0..10).collect::>(), (0..10).collect::>()); //~^ needless_collect baz((0..10), (), ('a'..='z').collect::>()) //~^ needless_collect } let values = [1, 2, 3, 4]; let mut out = vec![]; values.iter().cloned().map(|x| out.push(x)).collect::>(); let _y = values.iter().cloned().map(|x| out.push(x)).collect::>(); // this is fine // Don't write a warning if we call `clone()` on the iterator // https://github.com/rust-lang/rust-clippy/issues/13430 let my_collection: Vec<()> = vec![()].into_iter().map(|()| {}).collect(); let _cloned = my_collection.into_iter().clone(); let my_collection: Vec<()> = vec![()].into_iter().map(|()| {}).collect(); let my_iter = my_collection.into_iter(); let _cloned = my_iter.clone(); // Same for `as_slice()`, for same reason. let my_collection: Vec<()> = vec![()].into_iter().map(|()| {}).collect(); let _sliced = my_collection.into_iter().as_slice(); let my_collection: Vec<()> = vec![()].into_iter().map(|()| {}).collect(); let my_iter = my_collection.into_iter(); let _sliced = my_iter.as_slice(); // Assignment outside of main scope { let x; { let xxx: Vec<()> = vec![()].into_iter().map(|()| {}).collect(); x = xxx.into_iter(); for i in x.as_slice() {} } } } fn foo(_: impl IntoIterator) {} fn bar>(_: Vec, _: I) {} fn baz>(_: I, _: (), _: impl IntoIterator) {} mod issue9191 { use std::cell::Cell; use std::collections::HashSet; use std::hash::Hash; use std::marker::PhantomData; use std::ops::Deref; fn captures_ref_mut(xs: Vec, mut ys: HashSet) { if xs.iter().map(|x| ys.remove(x)).collect::>().contains(&true) { todo!() } } #[derive(Debug, Clone)] struct MyRef<'a>(PhantomData<&'a mut Cell>>, *mut Cell>); impl MyRef<'_> { fn new(target: &mut Cell>) -> Self { MyRef(PhantomData, target) } fn get(&mut self) -> &mut Cell> { unsafe { &mut *self.1 } } } fn captures_phantom(xs: Vec, mut ys: Cell>) { let mut ys_ref = MyRef::new(&mut ys); if xs .iter() .map({ let mut ys_ref = ys_ref.clone(); move |x| ys_ref.get().get_mut().remove(x) }) .collect::>() .contains(&true) { todo!() } } } pub fn issue8055(v: impl IntoIterator) -> Result, usize> { let mut zeros = 0; let res: Vec<_> = v .into_iter() .filter(|i| { if *i == 0 { zeros += 1 }; *i != 0 }) .collect(); if zeros != 0 { return Err(zeros); } Ok(res.into_iter()) } mod issue8055_regression { struct Foo { inner: T, marker: core::marker::PhantomData, } impl Iterator for Foo { type Item = T::Item; fn next(&mut self) -> Option { self.inner.next() } } fn foo() { Foo { inner: [].iter(), marker: core::marker::PhantomData, } .collect::>() .len(); } }