break and continue in loops
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
# Milestone 18: `break` and `continue`.
|
||||
#
|
||||
# `break` exits the innermost loop; `continue` skips to that loop's next
|
||||
# iteration (running the update / index increment first). Both target the
|
||||
# innermost enclosing loop. Each section returns a distinct code on failure so
|
||||
# a regression points at the broken behaviour; success falls through to 42.
|
||||
|
||||
main :: func() i32 {
|
||||
# 1. `break` out of a `while` once i reaches 5.
|
||||
i i32 = 0
|
||||
a i32 = 0
|
||||
while i < 100 : i += 1 {
|
||||
if (i == 5) break
|
||||
a += 1
|
||||
}
|
||||
if (a != 5) return 101
|
||||
|
||||
# 2. `continue` past n == 3 while summing 0..9 (45 - 3 = 42).
|
||||
b i32 = 0
|
||||
for 0..10 |n| {
|
||||
if (n == 3) continue
|
||||
b = b + n
|
||||
}
|
||||
if (b != 42) return 102
|
||||
|
||||
# 3. Nested loops: the inner `break` exits only the inner loop, so the outer
|
||||
# loop still runs all three iterations (each contributing one y == 0 pass).
|
||||
c i32 = 0
|
||||
for 0..3 |x| {
|
||||
for 0..3 |y| {
|
||||
if (y == 1) break
|
||||
c += 1
|
||||
}
|
||||
_ = x
|
||||
}
|
||||
if (c != 3) return 103
|
||||
|
||||
# 4. `continue` on the final element of an inclusive range bounded by the
|
||||
# element type's maximum must exit cleanly, not overflow the increment.
|
||||
hi u8 :: 255
|
||||
d i32 = 0
|
||||
for 0..=hi |v| {
|
||||
if (v == 255) continue
|
||||
d += 1
|
||||
}
|
||||
if (d != 255) return 104
|
||||
|
||||
# 5. `while true` is exitable via `break` (so it is not an infinite loop and
|
||||
# the code after it is reachable).
|
||||
e i32 = 0
|
||||
while true {
|
||||
e += 1
|
||||
if (e == 7) break
|
||||
}
|
||||
if (e != 7) return 105
|
||||
|
||||
return 42
|
||||
}
|
||||
Reference in New Issue
Block a user