diff options
-rw-r--r-- | lib/system.nim | 8 | ||||
-rw-r--r-- | tests/misc/tunsignedcmp.nim | 22 |
2 files changed, 28 insertions, 2 deletions
diff --git a/lib/system.nim b/lib/system.nim index a0330be76..6815932e2 100644 --- a/lib/system.nim +++ b/lib/system.nim @@ -2005,7 +2005,13 @@ iterator countdown*[T](a, b: T, step = 1): T {.inline.} = ## step count. `T` may be any ordinal type, `step` may only ## be positive. **Note**: This fails to count to ``low(int)`` if T = int for ## efficiency reasons. - when T is IntLikeForCount: + when T is (uint|uint64): + var res = a + while res >= b: + yield res + if res == b: break + dec(res, step) + elif T is IntLikeForCount: var res = int(a) while res >= int(b): yield T(res) diff --git a/tests/misc/tunsignedcmp.nim b/tests/misc/tunsignedcmp.nim index 9ffc0d119..4fa4a7705 100644 --- a/tests/misc/tunsignedcmp.nim +++ b/tests/misc/tunsignedcmp.nim @@ -1,7 +1,15 @@ discard """ output: '''true true -true''' +true +5 +4 +3 +2 +1 +0 +it should stop now +''' """ # bug 1420 @@ -11,3 +19,15 @@ echo x > y # works echo((40'i32) > (30'i32)) echo((40'u32) > (30'u32)) # Error: ordinal type expected + +# bug #4220 + +const count: uint = 5 +var stop_me = false + +for i in countdown(count, 0): + echo i + if stop_me: break + if i == 0: + echo "it should stop now" + stop_me = true |