@@ -510,49 +510,53 @@ fn align_offset_various_strides_const() {
510
510
assert ! ( got == expected) ;
511
511
}
512
512
513
- // For pointers of stride != 1, we verify the algorithm against the naivest possible
514
- // implementation
515
- let mut align = 1 ;
516
- let limit = 1024 ;
517
- while align < limit {
518
- for ptr in 1usize ..4 * align {
519
- unsafe {
520
- #[ repr( packed) ]
521
- struct A3 ( u16 , u8 ) ;
522
- test_stride :: < A3 > ( ptr:: invalid :: < A3 > ( ptr) , ptr, align) ;
523
-
524
- struct A4 ( u32 ) ;
525
- test_stride :: < A4 > ( ptr:: invalid :: < A4 > ( ptr) , ptr, align) ;
526
-
527
- #[ repr( packed) ]
528
- struct A5 ( u32 , u8 ) ;
529
- test_stride :: < A5 > ( ptr:: invalid :: < A5 > ( ptr) , ptr, align) ;
530
-
531
- #[ repr( packed) ]
532
- struct A6 ( u32 , u16 ) ;
533
- test_stride :: < A6 > ( ptr:: invalid :: < A6 > ( ptr) , ptr, align) ;
534
-
535
- #[ repr( packed) ]
536
- struct A7 ( u32 , u16 , u8 ) ;
537
- test_stride :: < A7 > ( ptr:: invalid :: < A7 > ( ptr) , ptr, align) ;
538
-
539
- #[ repr( packed) ]
540
- struct A8 ( u32 , u32 ) ;
541
- test_stride :: < A8 > ( ptr:: invalid :: < A8 > ( ptr) , ptr, align) ;
542
-
543
- #[ repr( packed) ]
544
- struct A9 ( u32 , u32 , u8 ) ;
545
- test_stride :: < A9 > ( ptr:: invalid :: < A9 > ( ptr) , ptr, align) ;
546
-
547
- #[ repr( packed) ]
548
- struct A10 ( u32 , u32 , u16 ) ;
549
- test_stride :: < A10 > ( ptr:: invalid :: < A10 > ( ptr) , ptr, align) ;
550
-
551
- test_stride :: < u32 > ( ptr:: invalid :: < u32 > ( ptr) , ptr, align) ;
552
- test_stride :: < u128 > ( ptr:: invalid :: < u128 > ( ptr) , ptr, align) ;
513
+ const {
514
+ // For pointers of stride != 1, we verify the algorithm against the naivest possible
515
+ // implementation
516
+ let mut align = 1 ;
517
+ let limit = 32 ;
518
+ while align < limit {
519
+ let mut ptr = 1 ;
520
+ while ptr < 4 * align {
521
+ unsafe {
522
+ #[ repr( packed) ]
523
+ struct A3 ( u16 , u8 ) ;
524
+ test_stride :: < A3 > ( ptr:: invalid :: < A3 > ( ptr) , ptr, align) ;
525
+
526
+ struct A4 ( u32 ) ;
527
+ test_stride :: < A4 > ( ptr:: invalid :: < A4 > ( ptr) , ptr, align) ;
528
+
529
+ #[ repr( packed) ]
530
+ struct A5 ( u32 , u8 ) ;
531
+ test_stride :: < A5 > ( ptr:: invalid :: < A5 > ( ptr) , ptr, align) ;
532
+
533
+ #[ repr( packed) ]
534
+ struct A6 ( u32 , u16 ) ;
535
+ test_stride :: < A6 > ( ptr:: invalid :: < A6 > ( ptr) , ptr, align) ;
536
+
537
+ #[ repr( packed) ]
538
+ struct A7 ( u32 , u16 , u8 ) ;
539
+ test_stride :: < A7 > ( ptr:: invalid :: < A7 > ( ptr) , ptr, align) ;
540
+
541
+ #[ repr( packed) ]
542
+ struct A8 ( u32 , u32 ) ;
543
+ test_stride :: < A8 > ( ptr:: invalid :: < A8 > ( ptr) , ptr, align) ;
544
+
545
+ #[ repr( packed) ]
546
+ struct A9 ( u32 , u32 , u8 ) ;
547
+ test_stride :: < A9 > ( ptr:: invalid :: < A9 > ( ptr) , ptr, align) ;
548
+
549
+ #[ repr( packed) ]
550
+ struct A10 ( u32 , u32 , u16 ) ;
551
+ test_stride :: < A10 > ( ptr:: invalid :: < A10 > ( ptr) , ptr, align) ;
552
+
553
+ test_stride :: < u32 > ( ptr:: invalid :: < u32 > ( ptr) , ptr, align) ;
554
+ test_stride :: < u128 > ( ptr:: invalid :: < u128 > ( ptr) , ptr, align) ;
555
+ }
556
+ ptr += 1 ;
553
557
}
558
+ align = ( align + 1 ) . next_power_of_two ( ) ;
554
559
}
555
- align = ( align + 1 ) . next_power_of_two ( ) ;
556
560
}
557
561
}
558
562
@@ -632,6 +636,24 @@ fn align_offset_issue_103361() {
632
636
let _ = ( SIZE as * const HugeSize ) . align_offset ( SIZE ) ;
633
637
}
634
638
639
+ #[ test]
640
+ #[ cfg( not( bootstrap) ) ]
641
+ fn align_offset_issue_103361_const ( ) {
642
+ #[ cfg( target_pointer_width = "64" ) ]
643
+ const SIZE : usize = 1 << 47 ;
644
+ #[ cfg( target_pointer_width = "32" ) ]
645
+ const SIZE : usize = 1 << 30 ;
646
+ #[ cfg( target_pointer_width = "16" ) ]
647
+ const SIZE : usize = 1 << 13 ;
648
+ struct HugeSize ( [ u8 ; SIZE - 1 ] ) ;
649
+
650
+ const {
651
+ assert ! ( ptr:: invalid:: <HugeSize >( SIZE - 1 ) . align_offset( SIZE ) == SIZE - 1 ) ;
652
+ assert ! ( ptr:: invalid:: <HugeSize >( SIZE ) . align_offset( SIZE ) == 0 ) ;
653
+ assert ! ( ptr:: invalid:: <HugeSize >( SIZE + 1 ) . align_offset( SIZE ) == 1 ) ;
654
+ }
655
+ }
656
+
635
657
#[ test]
636
658
fn is_aligned ( ) {
637
659
let data = 42 ;
0 commit comments