diff --git a/src/lib/int.rs b/src/lib/int.rs index fe7689e3e287..4b420d96c27a 100644 --- a/src/lib/int.rs +++ b/src/lib/int.rs @@ -1,3 +1,10 @@ +fn max_value() -> int { + ret min_value() - 1; +} + +fn min_value() -> int { + ret (-1 << (sys::size_of::() * 8u as int - 1)) as int; +} pure fn add(x: int, y: int) -> int { ret x + y; } diff --git a/src/lib/uint.rs b/src/lib/uint.rs index 040d54842e39..84b6bc5b1e07 100644 --- a/src/lib/uint.rs +++ b/src/lib/uint.rs @@ -1,5 +1,19 @@ +/** + * Return the minimal value for an uint. + * + * This is always 0 + */ pure fn min_value() -> uint { ret 0u; } +/** + * Return the maximal value for an uint. + * + * This is 2^wordsize - 1 + */ +pure fn max_value() -> uint { + ret 0u - 1u; +} + fn add(x: uint, y: uint) -> uint { ret x + y; } fn sub(x: uint, y: uint) -> uint { ret x - y; } diff --git a/src/test/stdtest/int.rs b/src/test/stdtest/int.rs index 61d3448a175e..4a87908e5a64 100644 --- a/src/test/stdtest/int.rs +++ b/src/test/stdtest/int.rs @@ -23,3 +23,10 @@ fn test_pow() { assert (int::pow(-3, 3u) == -27); assert (int::pow(4, 9u) == 262144); } + +#[test] +fn test_overflows() { + assert (int::max_value() > 0); + assert (int::min_value() <= 0); + assert (int::min_value() + int::max_value() + 1 == 0); +} \ No newline at end of file diff --git a/src/test/stdtest/uint.rs b/src/test/stdtest/uint.rs index 7361c76b70bb..141b59ace82a 100644 --- a/src/test/stdtest/uint.rs +++ b/src/test/stdtest/uint.rs @@ -47,3 +47,10 @@ fn test_next_power_of_two() { assert (uint::next_power_of_two(38u) == 64u); assert (uint::next_power_of_two(39u) == 64u); } + +#[test] +fn test_overflows() { + assert (uint::max_value() > 0u); + assert (uint::min_value() <= 0u); + assert (uint::min_value() + uint::max_value() + 1u == 0u); +} \ No newline at end of file