@@ -564,9 +564,15 @@ fn align_offset_various_strides_const() {
564564#[ cfg( not( bootstrap) ) ]
565565fn 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