@@ -601,6 +601,74 @@ impl_nonzero_int_try_from_nonzero_int!(isize => u8, u16, u32, u64, u128, usize);
601601mod verify {
602602 use super :: * ;
603603
604+ // Generate harnesses for `NonZero::<Large>::from(NonZero<Small>)`.
605+ macro_rules! generate_nonzero_int_from_nonzero_int_harness {
606+ ( $Small: ty => $Large: ty, $harness: ident) => {
607+ #[ kani:: proof]
608+ pub fn $harness( ) {
609+ let x: NonZero <$Small> = kani:: any( ) ;
610+ let _ = NonZero :: <$Large>:: from( x) ;
611+ }
612+ } ;
613+ }
614+
615+ // This bundles the calls to `generate_nonzero_int_from_nonzero_int_harness`
616+ // macro into segregated namespaces for better organization and usability.
617+ macro_rules! generate_nonzero_int_from_nonzero_int_harnesses {
618+ ( $ns: ident, $Small: ty => $( $Large: tt) ,+ $( , ) ?) => {
619+ mod $ns {
620+ use super :: * ;
621+
622+ $(
623+ mod $Large {
624+ use super :: * ;
625+
626+ generate_nonzero_int_from_nonzero_int_harness!(
627+ $Small => $Large,
628+ check_nonzero_int_from_nonzero_int
629+ ) ;
630+ }
631+ ) +
632+ }
633+ } ;
634+ }
635+
636+ // non-zero unsigned integer -> non-zero integer, infallible
637+ generate_nonzero_int_from_nonzero_int_harnesses ! (
638+ check_nonzero_int_from_u8,
639+ u8 => u16 , u32 , u64 , u128 , usize , i16 , i32 , i64 , i128 , isize ,
640+ ) ;
641+ generate_nonzero_int_from_nonzero_int_harnesses ! (
642+ check_nonzero_int_from_u16,
643+ u16 => u32 , u64 , u128 , usize , i32 , i64 , i128 ,
644+ ) ;
645+ generate_nonzero_int_from_nonzero_int_harnesses ! (
646+ check_nonzero_int_from_u32,
647+ u32 => u64 , u128 , i64 , i128 ,
648+ ) ;
649+ generate_nonzero_int_from_nonzero_int_harnesses ! (
650+ check_nonzero_int_from_u64,
651+ u64 => u128 , i128 ,
652+ ) ;
653+
654+ // non-zero signed integer -> non-zero signed integer, infallible
655+ generate_nonzero_int_from_nonzero_int_harnesses ! (
656+ check_nonzero_int_from_i8,
657+ i8 => i16 , i32 , i64 , i128 , isize ,
658+ ) ;
659+ generate_nonzero_int_from_nonzero_int_harnesses ! (
660+ check_nonzero_int_from_i16,
661+ i16 => i32 , i64 , i128 , isize ,
662+ ) ;
663+ generate_nonzero_int_from_nonzero_int_harnesses ! (
664+ check_nonzero_int_from_i32,
665+ i32 => i64 , i128 ,
666+ ) ;
667+ generate_nonzero_int_from_nonzero_int_harnesses ! (
668+ check_nonzero_int_from_i64,
669+ i64 => i128 ,
670+ ) ;
671+
604672 // Generates harnesses for `NonZero::<target>::try_from(NonZero<source>)`.
605673 // Since the function may be fallible or infallible depending on `source` and `target`,
606674 // this macro supports generating both cases.
0 commit comments