@@ -87,7 +87,7 @@ impl DecimalSeq {
87
87
//
88
88
// Trim is only called in `right_shift` and `left_shift`.
89
89
debug_assert ! ( self . num_digits <= Self :: MAX_DIGITS ) ;
90
- #[ safety :: loop_invariant( self . num_digits <= Self :: MAX_DIGITS ) ]
90
+ #[ cfg_attr ( kani , kani :: loop_invariant( self . num_digits <= Self :: MAX_DIGITS ) ) ]
91
91
while self . num_digits != 0 && self . digits [ self . num_digits - 1 ] == 0 {
92
92
self . num_digits -= 1 ;
93
93
}
@@ -103,7 +103,7 @@ impl DecimalSeq {
103
103
let dp = self . decimal_point as usize ;
104
104
let mut n = 0_u64 ;
105
105
106
- #[ safety :: loop_invariant( n < 10u64 . pow( kani:: index as u32 ) ) ]
106
+ #[ cfg_attr ( kani , kani :: loop_invariant( n < 10u64 . pow( kani:: index as u32 ) ) ) ]
107
107
for i in 0 ..dp {
108
108
n *= 10 ;
109
109
if i < self . num_digits {
@@ -136,14 +136,14 @@ impl DecimalSeq {
136
136
let mut write_index = self . num_digits + num_new_digits;
137
137
let mut n = 0_u64 ;
138
138
139
- #[ safety :: loop_invariant( read_index <= Self :: MAX_DIGITS &&
139
+ #[ cfg_attr ( kani , kani :: loop_invariant( read_index <= Self :: MAX_DIGITS &&
140
140
write_index == read_index + num_new_digits &&
141
141
n < 10u64 << ( shift - 1 ) &&
142
142
( n == 0 || write_index > 0 ) &&
143
143
self . num_digits <= Self :: MAX_DIGITS &&
144
144
self . decimal_point <= self . num_digits as i32 &&
145
145
forall!( |i in ( 0 , DecimalSeq :: MAX_DIGITS ) | self . digits[ i] <= 9 )
146
- ) ]
146
+ ) ) ]
147
147
while read_index != 0 {
148
148
read_index -= 1 ;
149
149
write_index -= 1 ;
@@ -158,7 +158,7 @@ impl DecimalSeq {
158
158
n = quotient;
159
159
}
160
160
161
- #[ safety :: loop_invariant( self . num_digits <= Self :: MAX_DIGITS && self . decimal_point <= self . num_digits as i32 && ( write_index > 0 || prev( write_index) == 1 ) ) ]
161
+ #[ cfg_attr ( kani , kani :: loop_invariant( self . num_digits <= Self :: MAX_DIGITS && self . decimal_point <= self . num_digits as i32 && ( write_index > 0 || prev( write_index) == 1 ) ) ) ]
162
162
while n > 0 {
163
163
//true but hard to write proof with kani currently
164
164
// kani::assume(write_index > 0);
@@ -188,15 +188,15 @@ impl DecimalSeq {
188
188
let mut read_index = 0 ;
189
189
let mut write_index = 0 ;
190
190
let mut n = 0_u64 ;
191
- #[ safety :: loop_invariant( n == 0 || ( read_index > 0 && read_index <= self . num_digits + 64 - n. leading_zeros( ) as usize ) ) ]
191
+ #[ cfg_attr ( kani , kani :: loop_invariant( n == 0 || ( read_index > 0 && read_index <= self . num_digits + 64 - n. leading_zeros( ) as usize ) ) ) ]
192
192
while ( n >> shift) == 0 {
193
193
if read_index < self . num_digits {
194
194
n = ( 10 * n) + self . digits [ read_index] as u64 ;
195
195
read_index += 1 ;
196
196
} else if n == 0 {
197
197
return ;
198
198
} else {
199
- #[ safety :: loop_invariant( n > 0 && read_index <= self . num_digits + 64 - n. leading_zeros( ) as usize && read_index > 0 ) ]
199
+ #[ cfg_attr ( kani , kani :: loop_invariant( n > 0 && read_index <= self . num_digits + 64 - n. leading_zeros( ) as usize && read_index > 0 ) ) ]
200
200
while ( n >> shift) == 0 {
201
201
n *= 10 ;
202
202
read_index += 1 ;
@@ -213,18 +213,18 @@ impl DecimalSeq {
213
213
return ;
214
214
}
215
215
let mask = ( 1_u64 << shift) - 1 ;
216
- #[ safety :: loop_invariant( self . num_digits <= Self :: MAX_DIGITS &&
216
+ #[ cfg_attr ( kani , kani :: loop_invariant( self . num_digits <= Self :: MAX_DIGITS &&
217
217
write_index < read_index &&
218
218
write_index < Self :: MAX_DIGITS - self . num_digits. saturating_sub( read_index)
219
- ) ]
219
+ ) ) ]
220
220
while read_index < self . num_digits {
221
221
let new_digit = ( n >> shift) as u8 ;
222
222
n = ( 10 * ( n & mask) ) + self . digits [ read_index] as u64 ;
223
223
read_index += 1 ;
224
224
self . digits [ write_index] = new_digit;
225
225
write_index += 1 ;
226
226
}
227
- #[ safety :: loop_invariant( write_index <= Self :: MAX_DIGITS ) ]
227
+ #[ cfg_attr ( kani , kani :: loop_invariant( write_index <= Self :: MAX_DIGITS ) ) ]
228
228
while n > 0 {
229
229
let new_digit = ( n >> shift) as u8 ;
230
230
n = 10 * ( n & mask) ;
@@ -387,7 +387,7 @@ fn number_of_digits_decimal_left_shift(d: &DecimalSeq, mut shift: usize) -> usiz
387
387
let pow5_b = ( 0x7FF & x_b) as usize ;
388
388
let pow5 = & TABLE_POW5 [ pow5_a..] ;
389
389
390
- #[ safety :: loop_invariant( true ) ]
390
+ #[ cfg_attr ( kani , kani :: loop_invariant( true ) ) ]
391
391
for ( i, & p5) in pow5. iter ( ) . enumerate ( ) . take ( pow5_b - pow5_a) {
392
392
if i >= d. num_digits {
393
393
return num_new_digits - 1 ;
0 commit comments