@@ -865,3 +865,137 @@ pub(crate) const fn has_efficient_in_place_swap<T>() -> bool {
865865 // Heuristic that holds true on all tested 64-bit capable architectures.
866866 size_of :: < T > ( ) <= 8 // size_of::<u64>()
867867}
868+
869+ #[ cfg( kani) ]
870+ #[ unstable( feature = "kani" , issue = "none" ) ]
871+ mod verify {
872+ use super :: * ;
873+ use crate :: kani;
874+
875+ // --- has_efficient_in_place_swap: const fn, no unsafe ---
876+
877+ #[ kani:: proof]
878+ fn verify_has_efficient_in_place_swap_u8 ( ) {
879+ assert ! ( has_efficient_in_place_swap:: <u8 >( ) ) ;
880+ }
881+
882+ #[ kani:: proof]
883+ fn verify_has_efficient_in_place_swap_u64 ( ) {
884+ assert ! ( has_efficient_in_place_swap:: <u64 >( ) ) ;
885+ }
886+
887+ #[ kani:: proof]
888+ fn verify_has_efficient_in_place_swap_u128 ( ) {
889+ assert ! ( !has_efficient_in_place_swap:: <u128 >( ) ) ;
890+ }
891+
892+ // --- swap_if_less: unsafe, no loops ---
893+
894+ #[ kani:: proof]
895+ fn verify_swap_if_less ( ) {
896+ let mut arr: [ i32 ; 4 ] = kani:: any ( ) ;
897+ let a: usize = kani:: any ( ) ;
898+ let b: usize = kani:: any ( ) ;
899+ kani:: assume ( a < 4 && b < 4 ) ;
900+ let orig_a = arr[ a] ;
901+ let orig_b = arr[ b] ;
902+ unsafe {
903+ swap_if_less (
904+ arr. as_mut_ptr ( ) ,
905+ a,
906+ b,
907+ & mut |x, y| * x < * y,
908+ ) ;
909+ }
910+ // After swap_if_less, arr[a] <= arr[b]
911+ assert ! ( arr[ a] <= arr[ b] ) ;
912+ }
913+
914+ // --- sort4_stable: unsafe, no loops (fixed network) ---
915+
916+ #[ kani:: proof]
917+ fn verify_sort4_stable ( ) {
918+ let src: [ i32 ; 4 ] = kani:: any ( ) ;
919+ let mut dst: [ MaybeUninit < i32 > ; 4 ] = [
920+ MaybeUninit :: uninit ( ) ,
921+ MaybeUninit :: uninit ( ) ,
922+ MaybeUninit :: uninit ( ) ,
923+ MaybeUninit :: uninit ( ) ,
924+ ] ;
925+ unsafe {
926+ sort4_stable (
927+ src. as_ptr ( ) ,
928+ dst. as_mut_ptr ( ) as * mut i32 ,
929+ & mut |x, y| * x < * y,
930+ ) ;
931+ }
932+ let d0 = unsafe { dst[ 0 ] . assume_init ( ) } ;
933+ let d1 = unsafe { dst[ 1 ] . assume_init ( ) } ;
934+ let d2 = unsafe { dst[ 2 ] . assume_init ( ) } ;
935+ let d3 = unsafe { dst[ 3 ] . assume_init ( ) } ;
936+ assert ! ( d0 <= d1 && d1 <= d2 && d2 <= d3) ;
937+ }
938+
939+ // --- insertion_sort_shift_left: loop, needs unwind ---
940+
941+ #[ kani:: proof]
942+ #[ kani:: unwind( 6 ) ]
943+ fn verify_insertion_sort_shift_left ( ) {
944+ let mut arr: [ i32 ; 4 ] = kani:: any ( ) ;
945+ insertion_sort_shift_left (
946+ & mut arr,
947+ 1 ,
948+ & mut |a, b| * a < * b,
949+ ) ;
950+ assert ! ( arr[ 0 ] <= arr[ 1 ] ) ;
951+ assert ! ( arr[ 1 ] <= arr[ 2 ] ) ;
952+ assert ! ( arr[ 2 ] <= arr[ 3 ] ) ;
953+ }
954+
955+ // --- StableSmallSortTypeImpl::small_sort ---
956+
957+ #[ kani:: proof]
958+ #[ kani:: unwind( 6 ) ]
959+ fn verify_stable_small_sort ( ) {
960+ let mut arr: [ i32 ; 4 ] = kani:: any ( ) ;
961+ let mut scratch = [ MaybeUninit :: < i32 > :: uninit ( ) ; 20 ] ;
962+ <i32 as StableSmallSortTypeImpl >:: small_sort (
963+ & mut arr,
964+ & mut scratch,
965+ & mut |a, b| * a < * b,
966+ ) ;
967+ assert ! ( arr[ 0 ] <= arr[ 1 ] ) ;
968+ assert ! ( arr[ 1 ] <= arr[ 2 ] ) ;
969+ assert ! ( arr[ 2 ] <= arr[ 3 ] ) ;
970+ }
971+
972+ // --- UnstableSmallSortTypeImpl::small_sort ---
973+
974+ #[ kani:: proof]
975+ #[ kani:: unwind( 6 ) ]
976+ fn verify_unstable_small_sort ( ) {
977+ let mut arr: [ i32 ; 4 ] = kani:: any ( ) ;
978+ <i32 as UnstableSmallSortTypeImpl >:: small_sort (
979+ & mut arr,
980+ & mut |a, b| * a < * b,
981+ ) ;
982+ assert ! ( arr[ 0 ] <= arr[ 1 ] ) ;
983+ assert ! ( arr[ 1 ] <= arr[ 2 ] ) ;
984+ assert ! ( arr[ 2 ] <= arr[ 3 ] ) ;
985+ }
986+
987+ // --- UnstableSmallSortFreezeTypeImpl::small_sort ---
988+
989+ #[ kani:: proof]
990+ #[ kani:: unwind( 6 ) ]
991+ fn verify_unstable_freeze_small_sort ( ) {
992+ let mut arr: [ i32 ; 4 ] = kani:: any ( ) ;
993+ <i32 as UnstableSmallSortFreezeTypeImpl >:: small_sort (
994+ & mut arr,
995+ & mut |a, b| * a < * b,
996+ ) ;
997+ assert ! ( arr[ 0 ] <= arr[ 1 ] ) ;
998+ assert ! ( arr[ 1 ] <= arr[ 2 ] ) ;
999+ assert ! ( arr[ 2 ] <= arr[ 3 ] ) ;
1000+ }
1001+ }
0 commit comments