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(); }