authorgravatar for david@vortan.devDavid Rubin <david@vortan.dev> 2024-12-27 04:19:50-08:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-12-29 13:36:52-05:00
logb99dbb6fb50e7b10f05287470df577b2726754fa
tree08b51df86ab4e0514a36cf5e601654960e6c645c
parent01081cc8e8b79104f7992d60dbd1bc8682e8fedf

Value: implement `orderAgainstZeroInner` for errors


2 files changed, 26 insertions(+), 0 deletions(-)

src/Value.zig+1
...@@ -1066,6 +1066,7 @@ pub fn orderAgainstZeroInner(...@@ -1066,6 +1066,7 @@ pub fn orderAgainstZeroInner(
1066 .float => |float| switch (float.storage) {1066 .float => |float| switch (float.storage) {
1067 inline else => |x| std.math.order(x, 0),1067 inline else => |x| std.math.order(x, 0),
1068 },1068 },
1069 .err => .gt, // error values cannot be 0
1069 else => unreachable,1070 else => unreachable,
1070 },1071 },
1071 };1072 };
test/behavior/switch_loop.zig+25
...@@ -74,6 +74,31 @@ test "switch loop on enum" {...@@ -74,6 +74,31 @@ test "switch loop on enum" {
74 try comptime S.doTheTest();74 try comptime S.doTheTest();
75}75}
7676
77test "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
77test "switch loop on tagged union" {102test "switch loop on tagged union" {
78 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO103 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
79 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO104 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO