authorgravatar for nuno.pinto@live.comestevesnp <nuno.pinto@live.com> 2026-02-25 16:14:44+00:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-02-26 20:49:05+01:00
log0b6b65b387cdb145440a33922ab6c3fd10e6071f
treee246b4843332f13d7fa6581a5a9dd8ffef2ca3b6
parent2d867223be4139ac55b1be1f5c19eee8a393c62a

fix: Allow async and concurrent from Io.Select to accept non-void error unions


2 files changed, 18 insertions(+), 2 deletions(-)

lib/std/Io.zig+2-2
......@@ -1238,7 +1238,7 @@ pub fn Select(comptime U: type) type {
12381238 error.Closed => unreachable,
12391239 };
12401240 if (@typeInfo(@TypeOf(raw_result)) == .error_union)
1241 raw_result catch |err| if (err == error.Canceled) return error.Canceled;
1241 _ = raw_result catch |err| if (err == error.Canceled) return error.Canceled;
12421242 }
12431243 };
12441244 const context: Context = .{ .select = s, .args = args };
......@@ -1277,7 +1277,7 @@ pub fn Select(comptime U: type) type {
12771277 error.Closed => unreachable,
12781278 };
12791279 if (@typeInfo(@TypeOf(raw_result)) == .error_union)
1280 raw_result catch |err| if (err == error.Canceled) return error.Canceled;
1280 _ = raw_result catch |err| if (err == error.Canceled) return error.Canceled;
12811281 }
12821282 };
12831283 const context: Context = .{ .select = s, .args = args };
lib/std/Io/test.zig+16
......@@ -820,6 +820,10 @@ test "Select" {
820820 fn bar(io: Io) Io.Cancelable!void {
821821 try io.sleep(.fromSeconds(300), .awake);
822822 }
823
824 fn baz() error{Ignored}!u8 {
825 return 42;
826 }
823827 };
824828
825829 const io = testing.io;
......@@ -827,6 +831,7 @@ test "Select" {
827831 const U = union(enum) {
828832 foo: bool,
829833 bar: Io.Cancelable!void,
834 baz: error{Ignored}!u8,
830835 };
831836 var buffer: [4]U = undefined;
832837 var select: Io.Select(U) = .init(io, &buffer);
......@@ -840,6 +845,7 @@ test "Select" {
840845 switch (try select.await()) {
841846 .foo => {},
842847 .bar => return error.TestFailed, // should be sleeping
848 .baz => return error.TestFailed, // not called yet
843849 }
844850 select.async(.foo, S.foo, .{});
845851 select.async(.foo, S.foo, .{});
......@@ -847,4 +853,14 @@ test "Select" {
847853 var finished_buffer: [3]U = undefined;
848854 const finished = finished_buffer[0..try select.awaitMany(&finished_buffer, 2)];
849855 try testing.expectEqualSlices(U, &.{ .{ .foo = true }, .{ .foo = true } }, finished);
856
857 select.async(.baz, S.baz, .{});
858
859 const result = switch (try select.await()) {
860 .baz => |n| try n,
861 .foo => return error.TestFailed, // not called
862 .bar => return error.TestFailed, // should be sleeping
863 };
864
865 try testing.expectEqual(42, result);
850866}