@@ -4327,6 +4327,12 @@ mod verify {
43274327 transmute_unchecked_should_fail ! ( transmute_unchecked_i32_to_char, i32 , char ) ;
43284328 transmute_unchecked_should_fail ! ( transmute_unchecked_u32_to_char, u32 , char ) ;
43294329 transmute_unchecked_should_fail ! ( transmute_unchecked_f32_to_char, f32 , char ) ;
4330+ //transmute to type with potentially invalid bit patterns, but filtering out invalid inputs
4331+ transmute_unchecked_should_succeed ! ( transmute_unchecked_valid_i8_to_bool, i8 , bool ) ;
4332+ transmute_unchecked_should_succeed ! ( transmute_unchecked_valid_u8_to_bool, u8 , bool ) ;
4333+ transmute_unchecked_should_succeed ! ( transmute_unchecked_valid_i32_to_char, i32 , char ) ;
4334+ transmute_unchecked_should_succeed ! ( transmute_unchecked_valid_u32_to_char, u32 , char ) ;
4335+ transmute_unchecked_should_succeed ! ( transmute_unchecked_valid_f32_to_char, f32 , char ) ;
43304336
43314337 //Note: the following harness fails when it in theory should not
43324338 //The problem is that ub_checks::can_dereference(), used in a validity precondition
@@ -4374,9 +4380,10 @@ mod verify {
43744380 //we then assert that the resulting value is equal to the initial value
43754381 macro_rules! transmute_unchecked_two_ways {
43764382 ( $harness: ident, $src: ty, $dst: ty) => {
4377- #[ kani:: proof_for_contract ( transmute_unchecked_wrapper ) ]
4383+ #[ kani:: proof ]
43784384 fn $harness( ) {
43794385 let src: $src = kani:: any( ) ;
4386+ kani:: assume( ub_checks:: can_dereference( & src as * const $src as * const $dst) ) ;
43804387 let dst: $dst = unsafe { transmute_unchecked_wrapper( src) } ;
43814388 let src2: $src = unsafe { * ( & dst as * const $dst as * const $src) } ;
43824389 assert_eq!( src, src2) ;
@@ -4392,6 +4399,7 @@ mod verify {
43924399 #[ kani:: proof]
43934400 fn $harness( ) {
43944401 let src: $src = kani:: any( ) ;
4402+ kani:: assume( ub_checks:: can_dereference( & src as * const $src as * const $dst) ) ;
43954403 let dst: $dst = unsafe { transmute_unchecked_wrapper( src) } ;
43964404 let src2: $src = unsafe { * ( & dst as * const $dst as * const $src) } ;
43974405 if src. is_nan( ) {
0 commit comments