diff --git a/components/servo_arc/lib.rs b/components/servo_arc/lib.rs index 3cc2b0e7fcc..40a8ff3d193 100644 --- a/components/servo_arc/lib.rs +++ b/components/servo_arc/lib.rs @@ -602,7 +602,7 @@ impl Arc> { F: FnOnce(Layout) -> *mut u8, I: Iterator + ExactSizeIterator, { - use std::mem::size_of; + use std::mem::{align_of, size_of}; assert_ne!(size_of::(), 0, "Need to think about ZST"); // Compute the required size for the allocation. @@ -678,8 +678,9 @@ impl Arc> { ); current = current.offset(1); } - // We should have consumed the buffer exactly. - debug_assert_eq!(current as *mut u8, buffer.offset(size as isize)); + // We should have consumed the buffer exactly, maybe accounting + // for some padding from the alignment. + debug_assert!((buffer.offset(size as isize) as usize - current as *mut u8 as usize) < align_of::()); } assert!( items.next().is_none(), @@ -1334,6 +1335,23 @@ mod tests { assert!(x.slice.is_empty()); } + #[test] + fn thin_assert_padding() { + #[derive(Clone, Default)] + #[repr(C)] + struct Padded { + i: u16, + } + + // The header will have more alignment than `Padded` + let header = HeaderWithLength::new(0i32, 2); + let items = vec![Padded { i: 0xdead }, Padded { i: 0xbeef }]; + let a = ThinArc::from_header_and_iter(header, items.into_iter()); + assert_eq!(a.slice.len(), 2); + assert_eq!(a.slice[0].i, 0xdead); + assert_eq!(a.slice[1].i, 0xbeef); + } + #[test] fn slices_and_thin() { let mut canary = atomic::AtomicUsize::new(0);