about summary refs log tree commit diff
diff options
context:
space:
mode:
authorThe 8472 <git@infinite-source.de>2024-06-25 23:22:27 +0200
committerThe 8472 <git@infinite-source.de>2024-06-25 23:22:27 +0200
commit0d7aef9738b25ed4f84d11deb0add8d5345613b0 (patch)
tree30064cf6b74db7a608029800d195ecae5a6abe42
parent2be2d77c501730caedae8db2f0a0f02db57ae505 (diff)
downloadrust-0d7aef9738b25ed4f84d11deb0add8d5345613b0.tar.gz
rust-0d7aef9738b25ed4f84d11deb0add8d5345613b0.zip
regression test for leaks in the the Filter::next_chunk implementation
previously next_chunk would forget items rejected by the filter
-rw-r--r--library/core/tests/iter/adapters/filter.rs13
1 files changed, 13 insertions, 0 deletions
diff --git a/library/core/tests/iter/adapters/filter.rs b/library/core/tests/iter/adapters/filter.rs
index a2050d89d85..167851e3333 100644
--- a/library/core/tests/iter/adapters/filter.rs
+++ b/library/core/tests/iter/adapters/filter.rs
@@ -1,4 +1,5 @@
 use core::iter::*;
+use std::rc::Rc;
 
 #[test]
 fn test_iterator_filter_count() {
@@ -50,3 +51,15 @@ fn test_double_ended_filter() {
     assert_eq!(it.next().unwrap(), &2);
     assert_eq!(it.next_back(), None);
 }
+
+#[test]
+fn test_next_chunk_does_not_leak() {
+    let drop_witness: [_; 5] = std::array::from_fn(|_| Rc::new(()));
+
+    let v = (0..5).map(|i| drop_witness[i].clone()).collect::<Vec<_>>();
+    let _ = v.into_iter().filter(|_| false).next_chunk::<1>();
+
+    for ref w in drop_witness {
+        assert_eq!(Rc::strong_count(w), 1);
+    }
+}