From 4eacf45c9cf6bd110dc019082c2a4a8fd9668d66 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Mon, 30 Mar 2020 13:01:15 +0200 Subject: [PATCH] also cover next() path of draining iterators --- src/liballoc/tests/vec.rs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/liballoc/tests/vec.rs b/src/liballoc/tests/vec.rs index d43bd11ebd3..05fa7589639 100644 --- a/src/liballoc/tests/vec.rs +++ b/src/liballoc/tests/vec.rs @@ -1352,6 +1352,13 @@ fn test_try_reserve_exact() { #[test] fn test_stable_pointers() { + /// Pull an element from the iterator, then drop it. + /// Useful to cover both the `next` and `drop` paths of an iterator. + fn next_then_drop(mut i: I) { + i.next().unwrap(); + drop(i); + } + // Test that, if we reserved enough space, adding and removing elements does not // invalidate references into the vector (such as `v0`). This test also // runs in Miri, which would detect such problems. @@ -1402,16 +1409,16 @@ fn test_stable_pointers() { // Partial draining v.resize_with(10, || 42); - drop(v.drain(5..)); + next_then_drop(v.drain(5..)); assert_eq!(*v0, 13); // Splicing v.resize_with(10, || 42); - drop(v.splice(5.., vec![1, 2, 3, 4, 5])); // empty tail after range + next_then_drop(v.splice(5.., vec![1, 2, 3, 4, 5])); // empty tail after range assert_eq!(*v0, 13); - drop(v.splice(5..8, vec![1])); // replacement is smaller than original range + next_then_drop(v.splice(5..8, vec![1])); // replacement is smaller than original range assert_eq!(*v0, 13); - drop(v.splice(5..6, vec![1; 10].into_iter().filter(|_| true))); // lower bound not exact + next_then_drop(v.splice(5..6, vec![1; 10].into_iter().filter(|_| true))); // lower bound not exact assert_eq!(*v0, 13); }