11
11
12
12
#[ cfg( kani) ]
13
13
use crate :: kani;
14
+ #[ cfg( kani) ]
15
+ use crate :: forall;
14
16
use crate :: num:: dec2flt:: common:: { ByteSlice , is_8digits} ;
15
17
16
18
/// A decimal floating-point number, represented as a sequence of decimal digits.
@@ -85,7 +87,7 @@ impl DecimalSeq {
85
87
//
86
88
// Trim is only called in `right_shift` and `left_shift`.
87
89
debug_assert ! ( self . num_digits <= Self :: MAX_DIGITS ) ;
88
- #[ kani :: loop_invariant( self . num_digits <= Self :: MAX_DIGITS ) ]
90
+ #[ safety :: loop_invariant( self . num_digits <= Self :: MAX_DIGITS ) ]
89
91
while self . num_digits != 0 && self . digits [ self . num_digits - 1 ] == 0 {
90
92
self . num_digits -= 1 ;
91
93
}
@@ -101,7 +103,7 @@ impl DecimalSeq {
101
103
let dp = self . decimal_point as usize ;
102
104
let mut n = 0_u64 ;
103
105
104
- #[ kani :: loop_invariant( n < 10u64 . pow( kani:: index as u32 ) ) ]
106
+ #[ safety :: loop_invariant( n < 10u64 . pow( kani:: index as u32 ) ) ]
105
107
for i in 0 ..dp {
106
108
n *= 10 ;
107
109
if i < self . num_digits {
@@ -134,7 +136,7 @@ impl DecimalSeq {
134
136
let mut write_index = self . num_digits + num_new_digits;
135
137
let mut n = 0_u64 ;
136
138
137
- #[ kani :: loop_invariant( read_index <= Self :: MAX_DIGITS &&
139
+ #[ safety :: loop_invariant( read_index <= Self :: MAX_DIGITS &&
138
140
write_index == read_index + num_new_digits &&
139
141
n < 10u64 << ( shift - 1 ) &&
140
142
self . num_digits <= Self :: MAX_DIGITS &&
@@ -155,7 +157,7 @@ impl DecimalSeq {
155
157
n = quotient;
156
158
}
157
159
158
- #[ kani :: loop_invariant( self . num_digits <= Self :: MAX_DIGITS && self . decimal_point <= self . num_digits as i32 ) ]
160
+ #[ safety :: loop_invariant( self . num_digits <= Self :: MAX_DIGITS && self . decimal_point <= self . num_digits as i32 ) ]
159
161
while n > 0 {
160
162
write_index -= 1 ;
161
163
let quotient = n / 10 ;
@@ -183,15 +185,15 @@ impl DecimalSeq {
183
185
let mut read_index = 0 ;
184
186
let mut write_index = 0 ;
185
187
let mut n = 0_u64 ;
186
- #[ kani :: loop_invariant( n == 0 || ( read_index > 0 && read_index <= self . num_digits + 64 - n. leading_zeros( ) as usize ) ) ]
188
+ #[ safety :: loop_invariant( n == 0 || ( read_index > 0 && read_index <= self . num_digits + 64 - n. leading_zeros( ) as usize ) ) ]
187
189
while ( n >> shift) == 0 {
188
190
if read_index < self . num_digits {
189
191
n = ( 10 * n) + self . digits [ read_index] as u64 ;
190
192
read_index += 1 ;
191
193
} else if n == 0 {
192
194
return ;
193
195
} else {
194
- #[ kani :: loop_invariant( n > 0 && read_index <= self . num_digits + 64 - n. leading_zeros( ) as usize && read_index > 0 ) ]
196
+ #[ safety :: loop_invariant( n > 0 && read_index <= self . num_digits + 64 - n. leading_zeros( ) as usize && read_index > 0 ) ]
195
197
while ( n >> shift) == 0 {
196
198
n *= 10 ;
197
199
read_index += 1 ;
@@ -208,7 +210,7 @@ impl DecimalSeq {
208
210
return ;
209
211
}
210
212
let mask = ( 1_u64 << shift) - 1 ;
211
- #[ kani :: loop_invariant( self . num_digits <= Self :: MAX_DIGITS &&
213
+ #[ safety :: loop_invariant( self . num_digits <= Self :: MAX_DIGITS &&
212
214
write_index < read_index &&
213
215
write_index < Self :: MAX_DIGITS - self . num_digits. saturating_sub( read_index)
214
216
) ]
@@ -219,7 +221,7 @@ impl DecimalSeq {
219
221
self . digits [ write_index] = new_digit;
220
222
write_index += 1 ;
221
223
}
222
- #[ kani :: loop_invariant( write_index <= Self :: MAX_DIGITS ) ]
224
+ #[ safety :: loop_invariant( write_index <= Self :: MAX_DIGITS ) ]
223
225
while n > 0 {
224
226
let new_digit = ( n >> shift) as u8 ;
225
227
n = 10 * ( n & mask) ;
@@ -382,7 +384,7 @@ fn number_of_digits_decimal_left_shift(d: &DecimalSeq, mut shift: usize) -> usiz
382
384
let pow5_b = ( 0x7FF & x_b) as usize ;
383
385
let pow5 = & TABLE_POW5 [ pow5_a..] ;
384
386
385
- #[ kani :: loop_invariant( true ) ]
387
+ #[ safety :: loop_invariant( true ) ]
386
388
for ( i, & p5) in pow5. iter ( ) . enumerate ( ) . take ( pow5_b - pow5_a) {
387
389
if i >= d. num_digits {
388
390
return num_new_digits - 1 ;
0 commit comments