From 47a26157160de871f965fc2a87108caab93ebbc6 Mon Sep 17 00:00:00 2001 From: Koxiaet Date: Thu, 22 Oct 2020 09:48:53 +0100 Subject: [PATCH 1/4] Warn using last and count to exhaust an iterator --- library/core/src/iter/traits/iterator.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/library/core/src/iter/traits/iterator.rs b/library/core/src/iter/traits/iterator.rs index 18b4adc23e8ef..655de7b8bbaeb 100644 --- a/library/core/src/iter/traits/iterator.rs +++ b/library/core/src/iter/traits/iterator.rs @@ -240,6 +240,7 @@ pub trait Iterator { /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] + #[must_use = "if you really need to exhaust the iterator, consider `.for_each(drop)` instead"] fn count(self) -> usize where Self: Sized, @@ -272,6 +273,7 @@ pub trait Iterator { /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] + #[must_use = "if you really need to exhaust the iterator, consider `.for_each(drop)` instead"] fn last(self) -> Option where Self: Sized, From f370ed3ff28506b311b7233e4fad00b23041513e Mon Sep 17 00:00:00 2001 From: Koxiaet Date: Thu, 22 Oct 2020 10:07:26 +0100 Subject: [PATCH 2/4] Fix tests that use count to exhaust an iterator --- library/core/tests/iter.rs | 4 ++-- library/std/src/fs/tests.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/library/core/tests/iter.rs b/library/core/tests/iter.rs index 75ca897cadc91..07998be508de7 100644 --- a/library/core/tests/iter.rs +++ b/library/core/tests/iter.rs @@ -556,7 +556,7 @@ fn test_zip_map_rev_sideffectful() { { let mut it = xs.iter_mut().map(|x| *x += 1).zip(ys.iter_mut().map(|y| *y += 1)); - (&mut it).take(5).count(); + (&mut it).take(5).for_each(drop); it.next_back(); } assert_eq!(&xs, &[1, 1, 1, 1, 1, 1]); @@ -571,7 +571,7 @@ fn test_zip_nested_sideffectful() { { // test that it has the side effect nested inside enumerate let it = xs.iter_mut().map(|x| *x = 1).enumerate().zip(&ys); - it.count(); + it.for_each(drop); } assert_eq!(&xs, &[1, 1, 1, 1, 1, 0]); } diff --git a/library/std/src/fs/tests.rs b/library/std/src/fs/tests.rs index 65a29076fefa8..420f948d8ded7 100644 --- a/library/std/src/fs/tests.rs +++ b/library/std/src/fs/tests.rs @@ -534,7 +534,7 @@ fn concurrent_recursive_mkdir() { } // No `Display` on result of `join()` - join.drain(..).map(|join| join.join().unwrap()).count(); + join.drain(..).map(|join| join.join().unwrap()).for_each(drop); } } From df476be4b355a1a7f16a7b55f394941d66f0f567 Mon Sep 17 00:00:00 2001 From: Koxiaet Date: Thu, 22 Oct 2020 10:37:28 +0100 Subject: [PATCH 3/4] Fix UI tests that don't use `for_each(drop)` --- src/test/ui/issues/issue-30081.rs | 2 +- src/test/ui/issues/issue-36053.rs | 2 +- src/test/ui/nll/issue-50343.rs | 4 ++-- src/test/ui/nll/unused-mut-issue-50343.fixed | 2 +- src/test/ui/nll/unused-mut-issue-50343.rs | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/test/ui/issues/issue-30081.rs b/src/test/ui/issues/issue-30081.rs index e7fca96ed9ec0..4221dbe462ddb 100644 --- a/src/test/ui/issues/issue-30081.rs +++ b/src/test/ui/issues/issue-30081.rs @@ -11,5 +11,5 @@ fn main() { instrs.into_iter() .map(|(_, instr)| instr) .map(|instr| match *instr { _other => {} }) - .last(); + .for_each(drop); } diff --git a/src/test/ui/issues/issue-36053.rs b/src/test/ui/issues/issue-36053.rs index a61c02c0a12c9..7f1328104267e 100644 --- a/src/test/ui/issues/issue-36053.rs +++ b/src/test/ui/issues/issue-36053.rs @@ -18,5 +18,5 @@ impl<'a> Iterator for Thing<'a> { impl<'a> FusedIterator for Thing<'a> {} fn main() { - Thing("test").fuse().filter(|_| true).count(); + Thing("test").fuse().filter(|_| true).for_each(drop); } diff --git a/src/test/ui/nll/issue-50343.rs b/src/test/ui/nll/issue-50343.rs index dd0afbbdfc6fa..862c011771b86 100644 --- a/src/test/ui/nll/issue-50343.rs +++ b/src/test/ui/nll/issue-50343.rs @@ -3,6 +3,6 @@ #![deny(unused_mut)] fn main() { - vec![42].iter().map(drop).count(); - vec![(42, 22)].iter().map(|(_x, _y)| ()).count(); + vec![42].iter().map(drop).for_each(drop); + vec![(42, 22)].iter().map(|(_x, _y)| ()).for_each(drop); } diff --git a/src/test/ui/nll/unused-mut-issue-50343.fixed b/src/test/ui/nll/unused-mut-issue-50343.fixed index 5632de1cd34de..ea652c2061025 100644 --- a/src/test/ui/nll/unused-mut-issue-50343.fixed +++ b/src/test/ui/nll/unused-mut-issue-50343.fixed @@ -4,6 +4,6 @@ #![allow(unused_variables)] // for rustfix fn main() { - vec![(42, 22)].iter().map(|(x, _y)| ()).count(); + vec![(42, 22)].iter().map(|(x, _y)| ()).for_each(drop); //~^ ERROR: variable does not need to be mutable } diff --git a/src/test/ui/nll/unused-mut-issue-50343.rs b/src/test/ui/nll/unused-mut-issue-50343.rs index c849ac8c79e43..1ff5e36c53136 100644 --- a/src/test/ui/nll/unused-mut-issue-50343.rs +++ b/src/test/ui/nll/unused-mut-issue-50343.rs @@ -4,6 +4,6 @@ #![allow(unused_variables)] // for rustfix fn main() { - vec![(42, 22)].iter().map(|(mut x, _y)| ()).count(); + vec![(42, 22)].iter().map(|(mut x, _y)| ()).for_each(drop); //~^ ERROR: variable does not need to be mutable } From d5d7113762b2b363eabb4d659812fd3bc37f9c22 Mon Sep 17 00:00:00 2001 From: Koxiaet Date: Thu, 22 Oct 2020 15:41:02 +0100 Subject: [PATCH 4/4] Update stderr of issue 50343 test --- src/test/ui/nll/unused-mut-issue-50343.stderr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/ui/nll/unused-mut-issue-50343.stderr b/src/test/ui/nll/unused-mut-issue-50343.stderr index cb02d76205c7f..3eed70dfa2067 100644 --- a/src/test/ui/nll/unused-mut-issue-50343.stderr +++ b/src/test/ui/nll/unused-mut-issue-50343.stderr @@ -1,7 +1,7 @@ error: variable does not need to be mutable --> $DIR/unused-mut-issue-50343.rs:7:33 | -LL | vec![(42, 22)].iter().map(|(mut x, _y)| ()).count(); +LL | vec![(42, 22)].iter().map(|(mut x, _y)| ()).for_each(drop); | ----^ | | | help: remove this `mut`