From 61d251f82e3a9fc589e49f22a23aa2c07d0e13cb Mon Sep 17 00:00:00 2001 From: David Rubin Date: Fri, 27 Dec 2024 04:19:50 -0800 Subject: [PATCH] Value: implement `orderAgainstZeroInner` for errors --- src/Value.zig | 1 + test/behavior/switch_loop.zig | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/src/Value.zig b/src/Value.zig index 25f5b50166d0..8962d6b7639e 100644 --- a/src/Value.zig +++ b/src/Value.zig @@ -1066,6 +1066,7 @@ pub fn orderAgainstZeroInner( .float => |float| switch (float.storage) { inline else => |x| std.math.order(x, 0), }, + .err => .gt, // error values cannot be 0 else => unreachable, }, }; diff --git a/test/behavior/switch_loop.zig b/test/behavior/switch_loop.zig index d35a4e16368d..6bc268e39066 100644 --- a/test/behavior/switch_loop.zig +++ b/test/behavior/switch_loop.zig @@ -74,6 +74,31 @@ test "switch loop on enum" { try comptime S.doTheTest(); } +test "switch loop with error set" { + if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO + + const S = struct { + const E = error{ Foo, Bar, Baz }; + + fn doTheTest() !void { + var start: E = undefined; + start = error.Foo; + const result: u32 = s: switch (start) { + error.Foo => continue :s error.Bar, + error.Bar => continue :s error.Baz, + error.Baz => 123, + }; + try expect(result == 123); + } + }; + try S.doTheTest(); + try comptime S.doTheTest(); +} + test "switch loop on tagged union" { if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO