@@ -452,6 +452,12 @@ where
452452 #[ unstable( feature = "nonzero_from_mut" , issue = "106290" ) ]
453453 #[ must_use]
454454 #[ inline]
455+ #[ requires( {
456+ let size = core:: mem:: size_of:: <T >( ) ;
457+ let ptr = n as * const T as * const u8 ;
458+ let slice = unsafe { core:: slice:: from_raw_parts( ptr, size) } ;
459+ !slice. iter( ) . all( |& byte| byte == 0 )
460+ } ) ]
455461 pub unsafe fn from_mut_unchecked ( n : & mut T ) -> & mut Self {
456462 match Self :: from_mut ( n) {
457463 Some ( n) => n,
@@ -2415,6 +2421,32 @@ mod verify {
24152421 nonzero_check ! ( u128 , core:: num:: NonZeroU128 , nonzero_check_new_unchecked_for_u128) ;
24162422 nonzero_check ! ( usize , core:: num:: NonZeroUsize , nonzero_check_new_unchecked_for_usize) ;
24172423
2424+ macro_rules! nonzero_check_from_mut_unchecked {
2425+ ( $t: ty, $nonzero_type: ty, $harness_name: ident) => {
2426+ #[ kani:: proof_for_contract( <T >:: from_mut_unchecked) ]
2427+ pub fn $harness_name( ) {
2428+ let mut x: $t = kani:: any( ) ;
2429+ unsafe {
2430+ <$nonzero_type>:: from_mut_unchecked( & mut x) ;
2431+ }
2432+ }
2433+ } ;
2434+ }
2435+
2436+ // Generate harnesses for multiple types
2437+ nonzero_check_from_mut_unchecked ! ( i8 , core:: num:: NonZeroI8 , nonzero_check_from_mut_unchecked_i8) ;
2438+ nonzero_check_from_mut_unchecked ! ( i16 , core:: num:: NonZeroI16 , nonzero_check_from_mut_unchecked_i16) ;
2439+ nonzero_check_from_mut_unchecked ! ( i32 , core:: num:: NonZeroI32 , nonzero_check_from_mut_unchecked_i32) ;
2440+ nonzero_check_from_mut_unchecked ! ( i64 , core:: num:: NonZeroI64 , nonzero_check_from_mut_unchecked_i64) ;
2441+ nonzero_check_from_mut_unchecked ! ( i128 , core:: num:: NonZeroI128 , nonzero_check_from_mut_unchecked_i128) ;
2442+ nonzero_check_from_mut_unchecked ! ( isize , core:: num:: NonZeroIsize , nonzero_check_from_mut_unchecked_isize) ;
2443+ nonzero_check_from_mut_unchecked ! ( u8 , core:: num:: NonZeroU8 , nonzero_check_from_mut_unchecked_u8) ;
2444+ nonzero_check_from_mut_unchecked ! ( u16 , core:: num:: NonZeroU16 , nonzero_check_from_mut_unchecked_u16) ;
2445+ nonzero_check_from_mut_unchecked ! ( u32 , core:: num:: NonZeroU32 , nonzero_check_from_mut_unchecked_u32) ;
2446+ nonzero_check_from_mut_unchecked ! ( u64 , core:: num:: NonZeroU64 , nonzero_check_from_mut_unchecked_u64) ;
2447+ nonzero_check_from_mut_unchecked ! ( u128 , core:: num:: NonZeroU128 , nonzero_check_from_mut_unchecked_u128) ;
2448+ nonzero_check_from_mut_unchecked ! ( usize , core:: num:: NonZeroUsize , nonzero_check_from_mut_unchecked_usize) ;
2449+
24182450 macro_rules! nonzero_check_cmp {
24192451 ( $nonzero_type: ty, $nonzero_check_cmp_for: ident) => {
24202452 #[ kani:: proof]
0 commit comments