Skip to content

Commit 08d9cda

Browse files
authored
Add spec for unsigned saturating_mul (#2809)
1 parent 83358a6 commit 08d9cda

2 files changed

Lines changed: 28 additions & 0 deletions

File tree

source/rust_verify_test/tests/std.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,23 @@ test_verify_one_file! {
182182
} => Ok(())
183183
}
184184

185+
test_verify_one_file! {
186+
#[test] unsigned_saturating_mul verus_code! {
187+
use vstd::*;
188+
189+
fn test() {
190+
let i = 10u64.saturating_mul(20);
191+
assert(i == 200);
192+
193+
let i = 0u64.saturating_mul(u64::MAX);
194+
assert(i == 0);
195+
196+
let i = u64::MAX.saturating_mul(2);
197+
assert(i == u64::MAX);
198+
}
199+
} => Ok(())
200+
}
201+
185202
test_verify_one_file! {
186203
#[test] signed_wrapping_mul verus_code! {
187204
use vstd::*;

source/vstd/std_specs/num.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,17 @@ macro_rules! num_specs {
259259
}
260260
);
261261

262+
#[verifier::allow_in_spec]
263+
#[cfg(not(verus_verify_core))]
264+
pub assume_specification[<$uN>::saturating_mul](x: $uN, y: $uN) -> $uN
265+
returns (
266+
if x * y > <$uN>::MAX {
267+
<$uN>::MAX
268+
} else {
269+
(x * y) as $uN
270+
}
271+
);
272+
262273
#[verifier::allow_in_spec]
263274
#[cfg(not(verus_verify_core))]
264275
pub assume_specification[<$uN>::is_multiple_of](x: $uN, y: $uN) -> bool

0 commit comments

Comments
 (0)