Skip to content

Commit 6fb97a6

Browse files
committed
test that align_of handles alignment properly for the mid part
1 parent 7b24d2b commit 6fb97a6

File tree

2 files changed

+16
-0
lines changed

2 files changed

+16
-0
lines changed

src/libcore/slice/mod.rs

+2
Original file line numberDiff line numberDiff line change
@@ -1785,6 +1785,7 @@ impl<T> [T] {
17851785
return (self, &[], &[]);
17861786
} else {
17871787
let (left, rest) = self.split_at(offset);
1788+
// now `rest` is definitely aligned, so `from_raw_parts_mut` below is okay
17881789
let (us_len, ts_len) = rest.align_to_offsets::<U>();
17891790
return (left,
17901791
from_raw_parts(rest.as_ptr() as *const U, us_len),
@@ -1837,6 +1838,7 @@ impl<T> [T] {
18371838
return (self, &mut [], &mut []);
18381839
} else {
18391840
let (left, rest) = self.split_at_mut(offset);
1841+
// now `rest` is definitely aligned, so `from_raw_parts_mut` below is okay
18401842
let (us_len, ts_len) = rest.align_to_offsets::<U>();
18411843
let mut_ptr = rest.as_mut_ptr();
18421844
return (left,

src/libcore/tests/slice.rs

+14
Original file line numberDiff line numberDiff line change
@@ -986,3 +986,17 @@ fn test_align_to_non_trivial() {
986986
assert_eq!(aligned.len(), 4);
987987
assert_eq!(prefix.len() + suffix.len(), 2);
988988
}
989+
990+
#[test]
991+
fn test_align_to_empty_mid() {
992+
use core::mem;
993+
994+
// Make sure that we do not create empty unaligned slices for the mid part, even when the
995+
// overall slice is too short to contain an aligned address.
996+
let bytes = [1, 2, 3, 4, 5, 6, 7];
997+
type Chunk = u32;
998+
for offset in 0..4 {
999+
let (_, mid, _) = unsafe { bytes[offset..offset+1].align_to::<Chunk>() };
1000+
assert_eq!(mid.as_ptr() as usize % mem::align_of::<Chunk>(), 0);
1001+
}
1002+
}

0 commit comments

Comments
 (0)