diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2021-10-02 20:15:03 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2021-10-02 20:15:03 -0700 |
| commit | c4df9bf56f204f63f4e87255933ba453d69d0182 (patch) | |
| tree | 647cec61769d5723385f8ac9b1392b3c935a219b /test/behavior/while.zig | |
| parent | 61a53a587558ff1fe1b0ec98bb424022885edccf (diff) | |
| download | zig-c4df9bf56f204f63f4e87255933ba453d69d0182.tar.gz zig-c4df9bf56f204f63f4e87255933ba453d69d0182.zip | |
AstGen: fix `while` and `for` with unreachable bodies
Companion commit to 61a53a587558ff1fe1b0ec98bb424022885edccf.
This commit also moves over a bunch of behavior test cases to the
passing-for-stage2 section.
Diffstat (limited to 'test/behavior/while.zig')
| -rw-r--r-- | test/behavior/while.zig | 188 |
1 files changed, 9 insertions, 179 deletions
diff --git a/test/behavior/while.zig b/test/behavior/while.zig index e52adfdbcf..a2f34d54c0 100644 --- a/test/behavior/while.zig +++ b/test/behavior/while.zig @@ -23,7 +23,7 @@ test "static eval while" { } const static_eval_while_number = staticWhileLoop1(); fn staticWhileLoop1() i32 { - return whileLoop2(); + return staticWhileLoop2(); } fn staticWhileLoop2() i32 { while (true) { @@ -31,33 +31,6 @@ fn staticWhileLoop2() i32 { } } -test "continue and break" { - try runContinueAndBreakTest(); - try expect(continue_and_break_counter == 8); -} -var continue_and_break_counter: i32 = 0; -fn runContinueAndBreakTest() !void { - var i: i32 = 0; - while (true) { - continue_and_break_counter += 2; - i += 1; - if (i < 4) { - continue; - } - break; - } - try expect(i == 4); -} - -test "return with implicit cast from while loop" { - returnWithImplicitCastFromWhileLoopTest() catch unreachable; -} -fn returnWithImplicitCastFromWhileLoopTest() anyerror!void { - while (true) { - return; - } -} - test "while with continue expression" { var sum: i32 = 0; { @@ -83,43 +56,6 @@ test "while with else" { try expect(got_else == 1); } -test "while with optional as condition" { - numbers_left = 10; - var sum: i32 = 0; - while (getNumberOrNull()) |value| { - sum += value; - } - try expect(sum == 45); -} - -test "while with optional as condition with else" { - numbers_left = 10; - var sum: i32 = 0; - var got_else: i32 = 0; - while (getNumberOrNull()) |value| { - sum += value; - try expect(got_else == 0); - } else { - got_else += 1; - } - try expect(sum == 45); - try expect(got_else == 1); -} - -test "while with error union condition" { - numbers_left = 10; - var sum: i32 = 0; - var got_else: i32 = 0; - while (getNumberOrErr()) |value| { - sum += value; - } else |err| { - try expect(err == error.OutOfNumbers); - got_else += 1; - } - try expect(sum == 45); - try expect(got_else == 1); -} - var numbers_left: i32 = undefined; fn getNumberOrErr() anyerror!i32 { return if (numbers_left == 0) error.OutOfNumbers else x: { @@ -134,61 +70,6 @@ fn getNumberOrNull() ?i32 { }; } -test "while on optional with else result follow else prong" { - const result = while (returnNull()) |value| { - break value; - } else @as(i32, 2); - try expect(result == 2); -} - -test "while on optional with else result follow break prong" { - const result = while (returnOptional(10)) |value| { - break value; - } else @as(i32, 2); - try expect(result == 10); -} - -test "while on error union with else result follow else prong" { - const result = while (returnError()) |value| { - break value; - } else |_| @as(i32, 2); - try expect(result == 2); -} - -test "while on error union with else result follow break prong" { - const result = while (returnSuccess(10)) |value| { - break value; - } else |_| @as(i32, 2); - try expect(result == 10); -} - -test "while on bool with else result follow else prong" { - const result = while (returnFalse()) { - break @as(i32, 10); - } else @as(i32, 2); - try expect(result == 2); -} - -test "while on bool with else result follow break prong" { - const result = while (returnTrue()) { - break @as(i32, 10); - } else @as(i32, 2); - try expect(result == 10); -} - -test "break from outer while loop" { - testBreakOuter(); - comptime testBreakOuter(); -} - -fn testBreakOuter() void { - outer: while (true) { - while (true) { - break :outer; - } - } -} - test "continue outer while loop" { testContinueOuter(); comptime testContinueOuter(); @@ -203,68 +84,17 @@ fn testContinueOuter() void { } } -fn returnNull() ?i32 { - return null; -} -fn returnOptional(x: i32) ?i32 { - return x; -} -fn returnError() anyerror!i32 { - return error.YouWantedAnError; -} -fn returnSuccess(x: i32) anyerror!i32 { - return x; -} -fn returnFalse() bool { - return false; -} -fn returnTrue() bool { - return true; -} - -test "while bool 2 break statements and an else" { - const S = struct { - fn entry(t: bool, f: bool) !void { - var ok = false; - ok = while (t) { - if (f) break false; - if (t) break true; - } else false; - try expect(ok); - } - }; - try S.entry(true, false); - comptime try S.entry(true, false); -} - -test "while optional 2 break statements and an else" { - const S = struct { - fn entry(opt_t: ?bool, f: bool) !void { - var ok = false; - ok = while (opt_t) |t| { - if (f) break false; - if (t) break true; - } else false; - try expect(ok); - } - }; - try S.entry(true, false); - comptime try S.entry(true, false); +test "break from outer while loop" { + testBreakOuter(); + comptime testBreakOuter(); } -test "while error 2 break statements and an else" { - const S = struct { - fn entry(opt_t: anyerror!bool, f: bool) !void { - var ok = false; - ok = while (opt_t) |t| { - if (f) break false; - if (t) break true; - } else |_| false; - try expect(ok); +fn testBreakOuter() void { + outer: while (true) { + while (true) { + break :outer; } - }; - try S.entry(true, false); - comptime try S.entry(true, false); + } } test "while copies its payload" { |
