@@ -564,9 +564,15 @@ fn align_offset_various_strides_const() {
564
564
#[ cfg( not( bootstrap) ) ]
565
565
fn align_offset_with_provenance_const ( ) {
566
566
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 ) ;
568
570
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 ;
570
576
assert ! ( ptr. align_offset( 1 ) == 0 ) ;
571
577
assert ! ( ptr. align_offset( 2 ) == 0 ) ;
572
578
assert ! ( ptr. align_offset( 4 ) == 0 ) ;
@@ -621,6 +627,44 @@ fn align_offset_with_provenance_const() {
621
627
assert ! ( ptr3. align_offset( 8 ) == usize :: MAX ) ;
622
628
assert ! ( ptr3. wrapping_byte_add( 1 ) . align_offset( 1 ) == 0 ) ;
623
629
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 ) ;
624
668
}
625
669
}
626
670
0 commit comments