Skip to content

Commit 61d251f

Browse files
committed
Value: implement orderAgainstZeroInner for errors
1 parent 30169d1 commit 61d251f

File tree

2 files changed

+26
-0
lines changed

2 files changed

+26
-0
lines changed

src/Value.zig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1066,6 +1066,7 @@ pub fn orderAgainstZeroInner(
10661066
.float => |float| switch (float.storage) {
10671067
inline else => |x| std.math.order(x, 0),
10681068
},
1069+
.err => .gt, // error values cannot be 0
10691070
else => unreachable,
10701071
},
10711072
};

test/behavior/switch_loop.zig

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,31 @@ test "switch loop on enum" {
7474
try comptime S.doTheTest();
7575
}
7676

77+
test "switch loop with error set" {
78+
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
79+
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
80+
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
81+
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
82+
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
83+
84+
const S = struct {
85+
const E = error{ Foo, Bar, Baz };
86+
87+
fn doTheTest() !void {
88+
var start: E = undefined;
89+
start = error.Foo;
90+
const result: u32 = s: switch (start) {
91+
error.Foo => continue :s error.Bar,
92+
error.Bar => continue :s error.Baz,
93+
error.Baz => 123,
94+
};
95+
try expect(result == 123);
96+
}
97+
};
98+
try S.doTheTest();
99+
try comptime S.doTheTest();
100+
}
101+
77102
test "switch loop on tagged union" {
78103
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
79104
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO

0 commit comments

Comments
 (0)