mirror of
https://github.com/ziglang/zig.git
synced 2025-12-19 12:43:13 +00:00
64 lines
1.4 KiB
Zig
64 lines
1.4 KiB
Zig
const std = @import("std");
|
|
const expect = std.testing.expect;
|
|
const expectEqual = std.testing.expectEqual;
|
|
const expectError = std.testing.expectError;
|
|
|
|
test "break and continue inside loop inside defer expression" {
|
|
testBreakContInDefer(10);
|
|
comptime testBreakContInDefer(10);
|
|
}
|
|
|
|
fn testBreakContInDefer(x: usize) void {
|
|
defer {
|
|
var i: usize = 0;
|
|
while (i < x) : (i += 1) {
|
|
if (i < 5) continue;
|
|
if (i == 5) break;
|
|
}
|
|
expect(i == 5) catch @panic("test failure");
|
|
}
|
|
}
|
|
|
|
test "defer and labeled break" {
|
|
var i = @as(usize, 0);
|
|
|
|
blk: {
|
|
defer i += 1;
|
|
break :blk;
|
|
}
|
|
|
|
try expect(i == 1);
|
|
}
|
|
|
|
test "errdefer does not apply to fn inside fn" {
|
|
if (testNestedFnErrDefer()) |_| @panic("expected error") else |e| try expect(e == error.Bad);
|
|
}
|
|
|
|
fn testNestedFnErrDefer() anyerror!void {
|
|
var a: i32 = 0;
|
|
errdefer a += 1;
|
|
const S = struct {
|
|
fn baz() anyerror {
|
|
return error.Bad;
|
|
}
|
|
};
|
|
return S.baz();
|
|
}
|
|
|
|
test "return variable while defer expression in scope to modify it" {
|
|
const S = struct {
|
|
fn doTheTest() !void {
|
|
try expect(notNull().? == 1);
|
|
}
|
|
|
|
fn notNull() ?u8 {
|
|
var res: ?u8 = 1;
|
|
defer res = null;
|
|
return res;
|
|
}
|
|
};
|
|
|
|
try S.doTheTest();
|
|
comptime try S.doTheTest();
|
|
}
|