]> git.lizzy.rs Git - rust.git/commitdiff
test that align_of handles alignment properly for the mid part
authorRalf Jung <post@ralfj.de>
Thu, 2 Aug 2018 14:51:54 +0000 (16:51 +0200)
committerRalf Jung <post@ralfj.de>
Thu, 2 Aug 2018 15:32:24 +0000 (17:32 +0200)
src/libcore/slice/mod.rs
src/libcore/tests/slice.rs

index eeb171ebb9b46c8f4f21d37211ec4d29e7ada2da..f9de78c6cdfea07914c065ae85181028a56c82c2 100644 (file)
@@ -1785,6 +1785,7 @@ pub unsafe fn align_to<U>(&self) -> (&[T], &[U], &[T]) {
             return (self, &[], &[]);
         } else {
             let (left, rest) = self.split_at(offset);
+            // now `rest` is definitely aligned, so `from_raw_parts_mut` below is okay
             let (us_len, ts_len) = rest.align_to_offsets::<U>();
             return (left,
                     from_raw_parts(rest.as_ptr() as *const U, us_len),
@@ -1837,6 +1838,7 @@ pub unsafe fn align_to_mut<U>(&mut self) -> (&mut [T], &mut [U], &mut [T]) {
             return (self, &mut [], &mut []);
         } else {
             let (left, rest) = self.split_at_mut(offset);
+            // now `rest` is definitely aligned, so `from_raw_parts_mut` below is okay
             let (us_len, ts_len) = rest.align_to_offsets::<U>();
             let mut_ptr = rest.as_mut_ptr();
             return (left,
index 7968521f7b461ee841d5747a524cf2777c67413b..b087ec81f59c67004ef049027eb2aafad792368a 100644 (file)
@@ -986,3 +986,17 @@ fn test_align_to_non_trivial() {
     assert_eq!(aligned.len(), 4);
     assert_eq!(prefix.len() + suffix.len(), 2);
 }
+
+#[test]
+fn test_align_to_empty_mid() {
+    use core::mem;
+
+    // Make sure that we do not create empty unaligned slices for the mid part, even when the
+    // overall slice is too short to contain an aligned address.
+    let bytes = [1, 2, 3, 4, 5, 6, 7];
+    type Chunk = u32;
+    for offset in 0..4 {
+        let (_, mid, _) = unsafe { bytes[offset..offset+1].align_to::<Chunk>() };
+        assert_eq!(mid.as_ptr() as usize % mem::align_of::<Chunk>(), 0);
+    }
+}