Skip to content

Commit c9c017d

Browse files
author
Lukas Markeffsky
committed
update provenance test
* fix allocation alignment for 16bit platforms * add edge case where `stride % align != 0` on pointers with provenance
1 parent 53c2ee8 commit c9c017d

File tree

1 file changed

+46
-2
lines changed

1 file changed

+46
-2
lines changed

library/core/tests/ptr.rs

+46-2
Original file line numberDiff line numberDiff line change
@@ -564,9 +564,15 @@ fn align_offset_various_strides_const() {
564564
#[cfg(not(bootstrap))]
565565
fn align_offset_with_provenance_const() {
566566
const {
567-
let data = 42;
567+
// On some platforms (e.g. msp430-none-elf), the alignment of `i32` is less than 4.
568+
#[repr(align(4))]
569+
struct AlignedI32(i32);
568570

569-
let ptr: *const i32 = &data;
571+
let data = AlignedI32(42);
572+
573+
// `stride % align == 0` (usual case)
574+
575+
let ptr: *const i32 = &data.0;
570576
assert!(ptr.align_offset(1) == 0);
571577
assert!(ptr.align_offset(2) == 0);
572578
assert!(ptr.align_offset(4) == 0);
@@ -621,6 +627,44 @@ fn align_offset_with_provenance_const() {
621627
assert!(ptr3.align_offset(8) == usize::MAX);
622628
assert!(ptr3.wrapping_byte_add(1).align_offset(1) == 0);
623629
assert!(ptr3.wrapping_byte_add(1).align_offset(2) == usize::MAX);
630+
631+
// `stride % align != 0` (edge case)
632+
633+
let ptr4: *const [u8; 3] = ptr.cast();
634+
assert!(ptr4.align_offset(1) == 0);
635+
assert!(ptr4.align_offset(2) == 0);
636+
assert!(ptr4.align_offset(4) == 0);
637+
assert!(ptr4.align_offset(8) == usize::MAX);
638+
assert!(ptr4.wrapping_byte_add(1).align_offset(1) == 0);
639+
assert!(ptr4.wrapping_byte_add(1).align_offset(2) == 1);
640+
assert!(ptr4.wrapping_byte_add(1).align_offset(4) == 1);
641+
assert!(ptr4.wrapping_byte_add(1).align_offset(8) == usize::MAX);
642+
assert!(ptr4.wrapping_byte_add(2).align_offset(1) == 0);
643+
assert!(ptr4.wrapping_byte_add(2).align_offset(2) == 0);
644+
assert!(ptr4.wrapping_byte_add(2).align_offset(4) == 2);
645+
assert!(ptr4.wrapping_byte_add(2).align_offset(8) == usize::MAX);
646+
assert!(ptr4.wrapping_byte_add(3).align_offset(1) == 0);
647+
assert!(ptr4.wrapping_byte_add(3).align_offset(2) == 1);
648+
assert!(ptr4.wrapping_byte_add(3).align_offset(4) == 3);
649+
assert!(ptr4.wrapping_byte_add(3).align_offset(8) == usize::MAX);
650+
651+
let ptr5: *const [u8; 5] = ptr.cast();
652+
assert!(ptr5.align_offset(1) == 0);
653+
assert!(ptr5.align_offset(2) == 0);
654+
assert!(ptr5.align_offset(4) == 0);
655+
assert!(ptr5.align_offset(8) == usize::MAX);
656+
assert!(ptr5.wrapping_byte_add(1).align_offset(1) == 0);
657+
assert!(ptr5.wrapping_byte_add(1).align_offset(2) == 1);
658+
assert!(ptr5.wrapping_byte_add(1).align_offset(4) == 3);
659+
assert!(ptr5.wrapping_byte_add(1).align_offset(8) == usize::MAX);
660+
assert!(ptr5.wrapping_byte_add(2).align_offset(1) == 0);
661+
assert!(ptr5.wrapping_byte_add(2).align_offset(2) == 0);
662+
assert!(ptr5.wrapping_byte_add(2).align_offset(4) == 2);
663+
assert!(ptr5.wrapping_byte_add(2).align_offset(8) == usize::MAX);
664+
assert!(ptr5.wrapping_byte_add(3).align_offset(1) == 0);
665+
assert!(ptr5.wrapping_byte_add(3).align_offset(2) == 1);
666+
assert!(ptr5.wrapping_byte_add(3).align_offset(4) == 1);
667+
assert!(ptr5.wrapping_byte_add(3).align_offset(8) == usize::MAX);
624668
}
625669
}
626670

0 commit comments

Comments
 (0)