1+ use safety:: { ensures, requires} ;
2+ #[ cfg( kani) ]
3+ use crate :: kani;
4+ #[ allow( unused_imports) ]
5+ use crate :: ub_checks:: * ;
6+
17use crate :: iter:: { FusedIterator , TrustedLen } ;
28use crate :: num:: NonZero ;
39use crate :: ops:: { NeverShortCircuit , Try } ;
@@ -20,6 +26,7 @@ impl IndexRange {
2026 /// - `start <= end`
2127 #[ inline]
2228 #[ track_caller]
29+ #[ requires( start <= end) ]
2330 pub ( crate ) const unsafe fn new_unchecked ( start : usize , end : usize ) -> Self {
2431 ub_checks:: assert_unsafe_precondition!(
2532 check_library_ub,
@@ -54,6 +61,8 @@ impl IndexRange {
5461 /// # Safety
5562 /// - Can only be called when `start < end`, aka when `len > 0`.
5663 #[ inline]
64+ #[ requires( self . start < self . end) ]
65+ #[ cfg_attr( kani, kani:: modifies( self ) ) ]
5766 unsafe fn next_unchecked ( & mut self ) -> usize {
5867 debug_assert ! ( self . start < self . end) ;
5968
@@ -66,6 +75,8 @@ impl IndexRange {
6675 /// # Safety
6776 /// - Can only be called when `start < end`, aka when `len > 0`.
6877 #[ inline]
78+ #[ requires( self . start < self . end) ]
79+ #[ cfg_attr( kani, kani:: modifies( self ) ) ]
6980 unsafe fn next_back_unchecked ( & mut self ) -> usize {
7081 debug_assert ! ( self . start < self . end) ;
7182
@@ -225,3 +236,34 @@ impl ExactSizeIterator for IndexRange {
225236unsafe impl TrustedLen for IndexRange { }
226237
227238impl FusedIterator for IndexRange { }
239+ #[ cfg( kani) ]
240+ mod verify {
241+ use super :: * ;
242+ #[ kani:: proof_for_contract( IndexRange :: new_unchecked) ]
243+ fn proof_for_index_range_new_unchecked ( ) {
244+ let start = kani:: any :: < usize > ( ) ;
245+ let end = kani:: any :: < usize > ( ) ;
246+
247+ unsafe { IndexRange :: new_unchecked ( start, end) } ;
248+ }
249+
250+ #[ kani:: proof_for_contract( IndexRange :: next_unchecked) ]
251+ fn proof_for_index_range_next_unchecked ( ) {
252+ let start = kani:: any :: < usize > ( ) ;
253+ let end = kani:: any :: < usize > ( ) ;
254+
255+ let mut range = unsafe { IndexRange :: new_unchecked ( start, end) } ;
256+
257+ unsafe { range. next_unchecked ( ) } ;
258+ }
259+
260+ #[ kani:: proof_for_contract( IndexRange :: next_back_unchecked) ]
261+ fn proof_for_index_range_next_back_unchecked ( ) {
262+ let start = kani:: any :: < usize > ( ) ;
263+ let end = kani:: any :: < usize > ( ) ;
264+
265+ let mut range = unsafe { IndexRange :: new_unchecked ( start, end) } ;
266+
267+ unsafe { range. next_back_unchecked ( ) } ;
268+ }
269+ }
0 commit comments