diff options
| author | The 8472 <git@infinite-source.de> | 2025-01-04 19:26:58 +0100 |
|---|---|---|
| committer | The 8472 <git@infinite-source.de> | 2025-01-04 19:26:58 +0100 |
| commit | 3d871b3ced0af12a84e3d17060399ca1af8d7bc1 (patch) | |
| tree | f7b574453806a5bbb9918e213edcd124cd38f39b /library/alloc/tests | |
| parent | fd127a3a84e3874979aa6f52acfb184e3ecce210 (diff) | |
do not in-place-iterate over flatmap/flatten
The implementation is unsound when a partially consumed iterator has some elements buffered in the front/back parts and cloning the Iterator removes the capacity from the backing vec::IntoIter.
Diffstat (limited to 'library/alloc/tests')
| -rw-r--r-- | library/alloc/tests/vec.rs | 25 |
1 files changed, 6 insertions, 19 deletions
diff --git a/library/alloc/tests/vec.rs b/library/alloc/tests/vec.rs index 84679827ba1..474ea7fe56b 100644 --- a/library/alloc/tests/vec.rs +++ b/library/alloc/tests/vec.rs @@ -1204,22 +1204,16 @@ fn test_from_iter_specialization_with_iterator_adapters() { #[test] fn test_in_place_specialization_step_up_down() { fn assert_in_place_trait<T: InPlaceIterable>(_: &T) {} - let src = vec![[0u8; 4]; 256]; + + let src = vec![0u8; 1024]; let srcptr = src.as_ptr(); - let src_cap = src.capacity(); - let iter = src.into_iter().flatten(); + let src_bytes = src.capacity(); + let iter = src.into_iter().array_chunks::<4>(); assert_in_place_trait(&iter); let sink = iter.collect::<Vec<_>>(); let sinkptr = sink.as_ptr(); - assert_eq!(srcptr as *const u8, sinkptr); - assert_eq!(src_cap * 4, sink.capacity()); - - let iter = sink.into_iter().array_chunks::<4>(); - assert_in_place_trait(&iter); - let sink = iter.collect::<Vec<_>>(); - let sinkptr = sink.as_ptr(); - assert_eq!(srcptr, sinkptr); - assert_eq!(src_cap, sink.capacity()); + assert_eq!(srcptr.addr(), sinkptr.addr()); + assert_eq!(src_bytes, sink.capacity() * 4); let mut src: Vec<u8> = Vec::with_capacity(17); let src_bytes = src.capacity(); @@ -1236,13 +1230,6 @@ fn test_in_place_specialization_step_up_down() { let sink: Vec<[u8; 2]> = iter.collect(); assert_eq!(sink.len(), 8); assert!(sink.capacity() <= 25); - - let src = vec![[0u8; 4]; 256]; - let srcptr = src.as_ptr(); - let iter = src.into_iter().flat_map(|a| a.into_iter().map(|b| b.wrapping_add(1))); - assert_in_place_trait(&iter); - let sink = iter.collect::<Vec<_>>(); - assert_eq!(srcptr as *const u8, sink.as_ptr()); } #[test] |
