@@ -359,22 +359,6 @@ fn align_offset_zst() {
359
359
}
360
360
}
361
361
362
- #[ test]
363
- fn align_offset_zst_const ( ) {
364
- const {
365
- // For pointers of stride = 0, the pointer is already aligned or it cannot be aligned at
366
- // all, because no amount of elements will align the pointer.
367
- let mut p = 1 ;
368
- while p < 1024 {
369
- assert ! ( ptr:: without_provenance:: <( ) >( p) . align_offset( p) == 0 ) ;
370
- if p != 1 {
371
- assert ! ( ptr:: without_provenance:: <( ) >( p + 1 ) . align_offset( p) == !0 ) ;
372
- }
373
- p = ( p + 1 ) . next_power_of_two ( ) ;
374
- }
375
- }
376
- }
377
-
378
362
#[ test]
379
363
fn align_offset_stride_one ( ) {
380
364
// For pointers of stride = 1, the pointer can always be aligned. The offset is equal to
@@ -396,25 +380,6 @@ fn align_offset_stride_one() {
396
380
}
397
381
}
398
382
399
- #[ test]
400
- fn align_offset_stride_one_const ( ) {
401
- const {
402
- // For pointers of stride = 1, the pointer can always be aligned. The offset is equal to
403
- // number of bytes.
404
- let mut align = 1 ;
405
- while align < 1024 {
406
- let mut ptr = 1 ;
407
- while ptr < 2 * align {
408
- let expected = ptr % align;
409
- let offset = if expected == 0 { 0 } else { align - expected } ;
410
- assert ! ( ptr:: without_provenance:: <u8 >( ptr) . align_offset( align) == offset) ;
411
- ptr += 1 ;
412
- }
413
- align = ( align + 1 ) . next_power_of_two ( ) ;
414
- }
415
- }
416
- }
417
-
418
383
#[ test]
419
384
fn align_offset_various_strides ( ) {
420
385
unsafe fn test_stride < T > ( ptr : * const T , align : usize ) -> bool {
@@ -495,192 +460,6 @@ fn align_offset_various_strides() {
495
460
assert ! ( !x) ;
496
461
}
497
462
498
- #[ test]
499
- fn align_offset_various_strides_const ( ) {
500
- const unsafe fn test_stride < T > ( ptr : * const T , numptr : usize , align : usize ) {
501
- let mut expected = usize:: MAX ;
502
- // Naive but definitely correct way to find the *first* aligned element of stride::<T>.
503
- let mut el = 0 ;
504
- while el < align {
505
- if ( numptr + el * :: std:: mem:: size_of :: < T > ( ) ) % align == 0 {
506
- expected = el;
507
- break ;
508
- }
509
- el += 1 ;
510
- }
511
- let got = ptr. align_offset ( align) ;
512
- assert ! ( got == expected) ;
513
- }
514
-
515
- const {
516
- // For pointers of stride != 1, we verify the algorithm against the naivest possible
517
- // implementation
518
- let mut align = 1 ;
519
- let limit = 32 ;
520
- while align < limit {
521
- let mut ptr = 1 ;
522
- while ptr < 4 * align {
523
- unsafe {
524
- #[ repr( packed) ]
525
- struct A3 ( #[ allow( dead_code) ] u16 , #[ allow( dead_code) ] u8 ) ;
526
- test_stride :: < A3 > ( ptr:: without_provenance :: < A3 > ( ptr) , ptr, align) ;
527
-
528
- struct A4 ( #[ allow( dead_code) ] u32 ) ;
529
- test_stride :: < A4 > ( ptr:: without_provenance :: < A4 > ( ptr) , ptr, align) ;
530
-
531
- #[ repr( packed) ]
532
- struct A5 ( #[ allow( dead_code) ] u32 , #[ allow( dead_code) ] u8 ) ;
533
- test_stride :: < A5 > ( ptr:: without_provenance :: < A5 > ( ptr) , ptr, align) ;
534
-
535
- #[ repr( packed) ]
536
- struct A6 ( #[ allow( dead_code) ] u32 , #[ allow( dead_code) ] u16 ) ;
537
- test_stride :: < A6 > ( ptr:: without_provenance :: < A6 > ( ptr) , ptr, align) ;
538
-
539
- #[ repr( packed) ]
540
- struct A7 (
541
- #[ allow( dead_code) ] u32 ,
542
- #[ allow( dead_code) ] u16 ,
543
- #[ allow( dead_code) ] u8 ,
544
- ) ;
545
- test_stride :: < A7 > ( ptr:: without_provenance :: < A7 > ( ptr) , ptr, align) ;
546
-
547
- #[ repr( packed) ]
548
- struct A8 ( #[ allow( dead_code) ] u32 , #[ allow( dead_code) ] u32 ) ;
549
- test_stride :: < A8 > ( ptr:: without_provenance :: < A8 > ( ptr) , ptr, align) ;
550
-
551
- #[ repr( packed) ]
552
- struct A9 (
553
- #[ allow( dead_code) ] u32 ,
554
- #[ allow( dead_code) ] u32 ,
555
- #[ allow( dead_code) ] u8 ,
556
- ) ;
557
- test_stride :: < A9 > ( ptr:: without_provenance :: < A9 > ( ptr) , ptr, align) ;
558
-
559
- #[ repr( packed) ]
560
- struct A10 (
561
- #[ allow( dead_code) ] u32 ,
562
- #[ allow( dead_code) ] u32 ,
563
- #[ allow( dead_code) ] u16 ,
564
- ) ;
565
- test_stride :: < A10 > ( ptr:: without_provenance :: < A10 > ( ptr) , ptr, align) ;
566
-
567
- test_stride :: < u32 > ( ptr:: without_provenance :: < u32 > ( ptr) , ptr, align) ;
568
- test_stride :: < u128 > ( ptr:: without_provenance :: < u128 > ( ptr) , ptr, align) ;
569
- }
570
- ptr += 1 ;
571
- }
572
- align = ( align + 1 ) . next_power_of_two ( ) ;
573
- }
574
- }
575
- }
576
-
577
- #[ test]
578
- fn align_offset_with_provenance_const ( ) {
579
- const {
580
- // On some platforms (e.g. msp430-none-elf), the alignment of `i32` is less than 4.
581
- #[ repr( align( 4 ) ) ]
582
- struct AlignedI32 ( i32 ) ;
583
-
584
- let data = AlignedI32 ( 42 ) ;
585
-
586
- // `stride % align == 0` (usual case)
587
-
588
- let ptr: * const i32 = & data. 0 ;
589
- assert ! ( ptr. align_offset( 1 ) == 0 ) ;
590
- assert ! ( ptr. align_offset( 2 ) == 0 ) ;
591
- assert ! ( ptr. align_offset( 4 ) == 0 ) ;
592
- assert ! ( ptr. align_offset( 8 ) == usize :: MAX ) ;
593
- assert ! ( ptr. wrapping_byte_add( 1 ) . align_offset( 1 ) == 0 ) ;
594
- assert ! ( ptr. wrapping_byte_add( 1 ) . align_offset( 2 ) == usize :: MAX ) ;
595
- assert ! ( ptr. wrapping_byte_add( 2 ) . align_offset( 1 ) == 0 ) ;
596
- assert ! ( ptr. wrapping_byte_add( 2 ) . align_offset( 2 ) == 0 ) ;
597
- assert ! ( ptr. wrapping_byte_add( 2 ) . align_offset( 4 ) == usize :: MAX ) ;
598
- assert ! ( ptr. wrapping_byte_add( 3 ) . align_offset( 1 ) == 0 ) ;
599
- assert ! ( ptr. wrapping_byte_add( 3 ) . align_offset( 2 ) == usize :: MAX ) ;
600
-
601
- assert ! ( ptr. wrapping_add( 42 ) . align_offset( 4 ) == 0 ) ;
602
- assert ! ( ptr. wrapping_add( 42 ) . align_offset( 8 ) == usize :: MAX ) ;
603
-
604
- let ptr1: * const i8 = ptr. cast ( ) ;
605
- assert ! ( ptr1. align_offset( 1 ) == 0 ) ;
606
- assert ! ( ptr1. align_offset( 2 ) == 0 ) ;
607
- assert ! ( ptr1. align_offset( 4 ) == 0 ) ;
608
- assert ! ( ptr1. align_offset( 8 ) == usize :: MAX ) ;
609
- assert ! ( ptr1. wrapping_byte_add( 1 ) . align_offset( 1 ) == 0 ) ;
610
- assert ! ( ptr1. wrapping_byte_add( 1 ) . align_offset( 2 ) == 1 ) ;
611
- assert ! ( ptr1. wrapping_byte_add( 1 ) . align_offset( 4 ) == 3 ) ;
612
- assert ! ( ptr1. wrapping_byte_add( 1 ) . align_offset( 8 ) == usize :: MAX ) ;
613
- assert ! ( ptr1. wrapping_byte_add( 2 ) . align_offset( 1 ) == 0 ) ;
614
- assert ! ( ptr1. wrapping_byte_add( 2 ) . align_offset( 2 ) == 0 ) ;
615
- assert ! ( ptr1. wrapping_byte_add( 2 ) . align_offset( 4 ) == 2 ) ;
616
- assert ! ( ptr1. wrapping_byte_add( 2 ) . align_offset( 8 ) == usize :: MAX ) ;
617
- assert ! ( ptr1. wrapping_byte_add( 3 ) . align_offset( 1 ) == 0 ) ;
618
- assert ! ( ptr1. wrapping_byte_add( 3 ) . align_offset( 2 ) == 1 ) ;
619
- assert ! ( ptr1. wrapping_byte_add( 3 ) . align_offset( 4 ) == 1 ) ;
620
- assert ! ( ptr1. wrapping_byte_add( 3 ) . align_offset( 8 ) == usize :: MAX ) ;
621
-
622
- let ptr2: * const i16 = ptr. cast ( ) ;
623
- assert ! ( ptr2. align_offset( 1 ) == 0 ) ;
624
- assert ! ( ptr2. align_offset( 2 ) == 0 ) ;
625
- assert ! ( ptr2. align_offset( 4 ) == 0 ) ;
626
- assert ! ( ptr2. align_offset( 8 ) == usize :: MAX ) ;
627
- assert ! ( ptr2. wrapping_byte_add( 1 ) . align_offset( 1 ) == 0 ) ;
628
- assert ! ( ptr2. wrapping_byte_add( 1 ) . align_offset( 2 ) == usize :: MAX ) ;
629
- assert ! ( ptr2. wrapping_byte_add( 2 ) . align_offset( 1 ) == 0 ) ;
630
- assert ! ( ptr2. wrapping_byte_add( 2 ) . align_offset( 2 ) == 0 ) ;
631
- assert ! ( ptr2. wrapping_byte_add( 2 ) . align_offset( 4 ) == 1 ) ;
632
- assert ! ( ptr2. wrapping_byte_add( 2 ) . align_offset( 8 ) == usize :: MAX ) ;
633
- assert ! ( ptr2. wrapping_byte_add( 3 ) . align_offset( 1 ) == 0 ) ;
634
- assert ! ( ptr2. wrapping_byte_add( 3 ) . align_offset( 2 ) == usize :: MAX ) ;
635
-
636
- let ptr3: * const i64 = ptr. cast ( ) ;
637
- assert ! ( ptr3. align_offset( 1 ) == 0 ) ;
638
- assert ! ( ptr3. align_offset( 2 ) == 0 ) ;
639
- assert ! ( ptr3. align_offset( 4 ) == 0 ) ;
640
- assert ! ( ptr3. align_offset( 8 ) == usize :: MAX ) ;
641
- assert ! ( ptr3. wrapping_byte_add( 1 ) . align_offset( 1 ) == 0 ) ;
642
- assert ! ( ptr3. wrapping_byte_add( 1 ) . align_offset( 2 ) == usize :: MAX ) ;
643
-
644
- // `stride % align != 0` (edge case)
645
-
646
- let ptr4: * const [ u8 ; 3 ] = ptr. cast ( ) ;
647
- assert ! ( ptr4. align_offset( 1 ) == 0 ) ;
648
- assert ! ( ptr4. align_offset( 2 ) == 0 ) ;
649
- assert ! ( ptr4. align_offset( 4 ) == 0 ) ;
650
- assert ! ( ptr4. align_offset( 8 ) == usize :: MAX ) ;
651
- assert ! ( ptr4. wrapping_byte_add( 1 ) . align_offset( 1 ) == 0 ) ;
652
- assert ! ( ptr4. wrapping_byte_add( 1 ) . align_offset( 2 ) == 1 ) ;
653
- assert ! ( ptr4. wrapping_byte_add( 1 ) . align_offset( 4 ) == 1 ) ;
654
- assert ! ( ptr4. wrapping_byte_add( 1 ) . align_offset( 8 ) == usize :: MAX ) ;
655
- assert ! ( ptr4. wrapping_byte_add( 2 ) . align_offset( 1 ) == 0 ) ;
656
- assert ! ( ptr4. wrapping_byte_add( 2 ) . align_offset( 2 ) == 0 ) ;
657
- assert ! ( ptr4. wrapping_byte_add( 2 ) . align_offset( 4 ) == 2 ) ;
658
- assert ! ( ptr4. wrapping_byte_add( 2 ) . align_offset( 8 ) == usize :: MAX ) ;
659
- assert ! ( ptr4. wrapping_byte_add( 3 ) . align_offset( 1 ) == 0 ) ;
660
- assert ! ( ptr4. wrapping_byte_add( 3 ) . align_offset( 2 ) == 1 ) ;
661
- assert ! ( ptr4. wrapping_byte_add( 3 ) . align_offset( 4 ) == 3 ) ;
662
- assert ! ( ptr4. wrapping_byte_add( 3 ) . align_offset( 8 ) == usize :: MAX ) ;
663
-
664
- let ptr5: * const [ u8 ; 5 ] = ptr. cast ( ) ;
665
- assert ! ( ptr5. align_offset( 1 ) == 0 ) ;
666
- assert ! ( ptr5. align_offset( 2 ) == 0 ) ;
667
- assert ! ( ptr5. align_offset( 4 ) == 0 ) ;
668
- assert ! ( ptr5. align_offset( 8 ) == usize :: MAX ) ;
669
- assert ! ( ptr5. wrapping_byte_add( 1 ) . align_offset( 1 ) == 0 ) ;
670
- assert ! ( ptr5. wrapping_byte_add( 1 ) . align_offset( 2 ) == 1 ) ;
671
- assert ! ( ptr5. wrapping_byte_add( 1 ) . align_offset( 4 ) == 3 ) ;
672
- assert ! ( ptr5. wrapping_byte_add( 1 ) . align_offset( 8 ) == usize :: MAX ) ;
673
- assert ! ( ptr5. wrapping_byte_add( 2 ) . align_offset( 1 ) == 0 ) ;
674
- assert ! ( ptr5. wrapping_byte_add( 2 ) . align_offset( 2 ) == 0 ) ;
675
- assert ! ( ptr5. wrapping_byte_add( 2 ) . align_offset( 4 ) == 2 ) ;
676
- assert ! ( ptr5. wrapping_byte_add( 2 ) . align_offset( 8 ) == usize :: MAX ) ;
677
- assert ! ( ptr5. wrapping_byte_add( 3 ) . align_offset( 1 ) == 0 ) ;
678
- assert ! ( ptr5. wrapping_byte_add( 3 ) . align_offset( 2 ) == 1 ) ;
679
- assert ! ( ptr5. wrapping_byte_add( 3 ) . align_offset( 4 ) == 1 ) ;
680
- assert ! ( ptr5. wrapping_byte_add( 3 ) . align_offset( 8 ) == usize :: MAX ) ;
681
- }
682
- }
683
-
684
463
#[ test]
685
464
fn align_offset_issue_103361 ( ) {
686
465
#[ cfg( target_pointer_width = "64" ) ]
@@ -693,23 +472,6 @@ fn align_offset_issue_103361() {
693
472
let _ = ptr:: without_provenance :: < HugeSize > ( SIZE ) . align_offset ( SIZE ) ;
694
473
}
695
474
696
- #[ test]
697
- fn align_offset_issue_103361_const ( ) {
698
- #[ cfg( target_pointer_width = "64" ) ]
699
- const SIZE : usize = 1 << 47 ;
700
- #[ cfg( target_pointer_width = "32" ) ]
701
- const SIZE : usize = 1 << 30 ;
702
- #[ cfg( target_pointer_width = "16" ) ]
703
- const SIZE : usize = 1 << 13 ;
704
- struct HugeSize ( #[ allow( dead_code) ] [ u8 ; SIZE - 1 ] ) ;
705
-
706
- const {
707
- assert ! ( ptr:: without_provenance:: <HugeSize >( SIZE - 1 ) . align_offset( SIZE ) == SIZE - 1 ) ;
708
- assert ! ( ptr:: without_provenance:: <HugeSize >( SIZE ) . align_offset( SIZE ) == 0 ) ;
709
- assert ! ( ptr:: without_provenance:: <HugeSize >( SIZE + 1 ) . align_offset( SIZE ) == 1 ) ;
710
- }
711
- }
712
-
713
475
#[ test]
714
476
fn is_aligned ( ) {
715
477
let data = 42 ;
@@ -726,25 +488,6 @@ fn is_aligned() {
726
488
assert_ne ! ( ptr. is_aligned_to( 8 ) , ptr. wrapping_add( 1 ) . is_aligned_to( 8 ) ) ;
727
489
}
728
490
729
- #[ test]
730
- fn is_aligned_const ( ) {
731
- const {
732
- let data = 42 ;
733
- let ptr: * const i32 = & data;
734
- assert ! ( ptr. is_aligned( ) ) ;
735
- assert ! ( ptr. is_aligned_to( 1 ) ) ;
736
- assert ! ( ptr. is_aligned_to( 2 ) ) ;
737
- assert ! ( ptr. is_aligned_to( 4 ) ) ;
738
- assert ! ( ptr. wrapping_byte_add( 2 ) . is_aligned_to( 1 ) ) ;
739
- assert ! ( ptr. wrapping_byte_add( 2 ) . is_aligned_to( 2 ) ) ;
740
- assert ! ( !ptr. wrapping_byte_add( 2 ) . is_aligned_to( 4 ) ) ;
741
-
742
- // At comptime neither `ptr` nor `ptr+1` is aligned to 8.
743
- assert ! ( !ptr. is_aligned_to( 8 ) ) ;
744
- assert ! ( !ptr. wrapping_add( 1 ) . is_aligned_to( 8 ) ) ;
745
- }
746
- }
747
-
748
491
#[ test]
749
492
fn offset_from ( ) {
750
493
let mut a = [ 0 ; 5 ] ;
0 commit comments