@@ -1651,6 +1651,21 @@ mod verify {
16511651 }
16521652 }
16531653
1654+ // Verify `unchecked_{shl, shr}`
1655+ macro_rules! generate_unchecked_shift_harness {
1656+ ( $type: ty, $method: ident, $harness_name: ident) => {
1657+ #[ kani:: proof_for_contract( $type:: $method) ]
1658+ pub fn $harness_name( ) {
1659+ let num1: $type = kani:: any:: <$type>( ) ;
1660+ let num2: u32 = kani:: any:: <u32 >( ) ;
1661+
1662+ unsafe {
1663+ num1. $method( num2) ;
1664+ }
1665+ }
1666+ } ;
1667+ }
1668+
16541669 macro_rules! generate_unchecked_neg_harness {
16551670 ( $type: ty, $harness_name: ident) => {
16561671 #[ kani:: proof_for_contract( $type:: unchecked_neg) ]
@@ -1950,6 +1965,54 @@ mod verify {
19501965 usize :: MAX
19511966 ) ;
19521967
1968+ // unchecked_shr proofs
1969+ //
1970+ // Target types:
1971+ // i{8,16,32,64,128,size} and u{8,16,32,64,128,size} -- 12 types in total
1972+ //
1973+ // Target contracts:
1974+ // #[requires(rhs < <$ActualT>::BITS)]
1975+ //
1976+ // Target function:
1977+ // pub const unsafe fn unchecked_shr(self, rhs: u32) -> Self
1978+ generate_unchecked_shift_harness ! ( i8 , unchecked_shr, checked_unchecked_shr_i8) ;
1979+ generate_unchecked_shift_harness ! ( i16 , unchecked_shr, checked_unchecked_shr_i16) ;
1980+ generate_unchecked_shift_harness ! ( i32 , unchecked_shr, checked_unchecked_shr_i32) ;
1981+ generate_unchecked_shift_harness ! ( i64 , unchecked_shr, checked_unchecked_shr_i64) ;
1982+ generate_unchecked_shift_harness ! ( i128 , unchecked_shr, checked_unchecked_shr_i128) ;
1983+ generate_unchecked_shift_harness ! ( isize , unchecked_shr, checked_unchecked_shr_isize) ;
1984+ generate_unchecked_shift_harness ! ( u8 , unchecked_shr, checked_unchecked_shr_u8) ;
1985+ generate_unchecked_shift_harness ! ( u16 , unchecked_shr, checked_unchecked_shr_u16) ;
1986+ generate_unchecked_shift_harness ! ( u32 , unchecked_shr, checked_unchecked_shr_u32) ;
1987+ generate_unchecked_shift_harness ! ( u64 , unchecked_shr, checked_unchecked_shr_u64) ;
1988+ generate_unchecked_shift_harness ! ( u128 , unchecked_shr, checked_unchecked_shr_u128) ;
1989+ generate_unchecked_shift_harness ! ( usize , unchecked_shr, checked_unchecked_shr_usize) ;
1990+
1991+ // `unchecked_shl` proofs
1992+ //
1993+ // Target types:
1994+ // i{8,16,32,64,128,size} and u{8,16,32,64,128,size} -- 12 types in total
1995+ //
1996+ // Target contracts:
1997+ // #[requires(shift < Self::BITS)]
1998+ //
1999+ // Target function:
2000+ // pub const unsafe fn unchecked_shl(self, shift: u32) -> Self
2001+ //
2002+ // This function performs an unchecked bitwise left shift operation.
2003+ generate_unchecked_shift_harness ! ( i8 , unchecked_shl, checked_unchecked_shl_i8) ;
2004+ generate_unchecked_shift_harness ! ( i16 , unchecked_shl, checked_unchecked_shl_i16) ;
2005+ generate_unchecked_shift_harness ! ( i32 , unchecked_shl, checked_unchecked_shl_i32) ;
2006+ generate_unchecked_shift_harness ! ( i64 , unchecked_shl, checked_unchecked_shl_i64) ;
2007+ generate_unchecked_shift_harness ! ( i128 , unchecked_shl, checked_unchecked_shl_i128) ;
2008+ generate_unchecked_shift_harness ! ( isize , unchecked_shl, checked_unchecked_shl_isize) ;
2009+ generate_unchecked_shift_harness ! ( u8 , unchecked_shl, checked_unchecked_shl_u8) ;
2010+ generate_unchecked_shift_harness ! ( u16 , unchecked_shl, checked_unchecked_shl_u16) ;
2011+ generate_unchecked_shift_harness ! ( u32 , unchecked_shl, checked_unchecked_shl_u32) ;
2012+ generate_unchecked_shift_harness ! ( u64 , unchecked_shl, checked_unchecked_shl_u64) ;
2013+ generate_unchecked_shift_harness ! ( u128 , unchecked_shl, checked_unchecked_shl_u128) ;
2014+ generate_unchecked_shift_harness ! ( usize , unchecked_shl, checked_unchecked_shl_usize) ;
2015+
19532016 // `unchecked_sub` proofs
19542017 //
19552018 // Target types:
0 commit comments