]> git.lizzy.rs Git - rust.git/commitdiff
fix one more unaligned self.ptr, and add tests
authorRalf Jung <post@ralfj.de>
Fri, 23 Dec 2022 14:49:23 +0000 (15:49 +0100)
committerRalf Jung <post@ralfj.de>
Fri, 23 Dec 2022 14:49:23 +0000 (15:49 +0100)
library/alloc/src/vec/into_iter.rs
src/tools/miri/tests/pass/vec.rs

index cd4ea829e378237fcf2f3a7df55ec6f826775e43..b207b3210f1aa22ae6edcf989ab68b7f5b14bff1 100644 (file)
@@ -251,7 +251,7 @@ fn count(self) -> usize {
                 return Err(unsafe { array::IntoIter::new_unchecked(raw_ary, 0..len) });
             }
 
-            self.ptr = self.ptr.wrapping_byte_add(N);
+            self.end = self.end.wrapping_byte_sub(N);
             // Safety: ditto
             return Ok(unsafe { raw_ary.transpose().assume_init() });
         }
index a165c7c2fe79b091c959e7f9076e3267a091da6f..fb1d8e306f293acd0eba42a2b31ddb09eda476bb 100644 (file)
@@ -1,4 +1,6 @@
 //@compile-flags: -Zmiri-strict-provenance
+#![feature(iter_advance_by, iter_next_chunk)]
+
 // Gather all references from a mutable iterator and make sure Miri notices if
 // using them is dangerous.
 fn test_all_refs<'a, T: 'a>(dummy: &mut T, iter: impl Iterator<Item = &'a mut T>) {
@@ -44,6 +46,18 @@ fn vec_into_iter_zst() {
     for _ in vec![[0u64; 0]].into_iter() {}
     let v = vec![[0u64; 0], [0u64; 0]].into_iter().map(|x| x.len()).sum::<usize>();
     assert_eq!(v, 0);
+
+    let mut it = vec![[0u64; 0], [0u64; 0]].into_iter();
+    it.advance_by(1);
+    drop(it);
+
+    let mut it = vec![[0u64; 0], [0u64; 0]].into_iter();
+    it.next_chunk::<1>().unwrap();
+    drop(it);
+
+    let mut it = vec![[0u64; 0], [0u64; 0]].into_iter();
+    it.next_chunk::<4>().unwrap_err();
+    drop(it);
 }
 
 fn vec_into_iter_rev_zst() {