From 5f589562646b972e4f177d60c7da37e872991d29 Mon Sep 17 00:00:00 2001 From: Bram Date: Sat, 1 Jun 2024 15:04:02 -0400 Subject: [PATCH] std: Extended type checks for Thread startFn return type --- lib/std/Thread.zig | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/lib/std/Thread.zig b/lib/std/Thread.zig index adb822173e..5bfaef6127 100644 --- a/lib/std/Thread.zig +++ b/lib/std/Thread.zig @@ -398,7 +398,7 @@ fn callFn(comptime f: anytype, args: anytype) switch (Impl) { else => unreachable, } { const default_value = if (Impl == PosixThreadImpl) null else 0; - const bad_fn_ret = "expected return type of startFn to be 'u8', 'noreturn', 'void', or '!void'"; + const bad_fn_ret = "expected return type of startFn to be 'u8', 'noreturn', '!noreturn', 'void', or '!void'"; switch (@typeInfo(@typeInfo(@TypeOf(f)).Fn.return_type.?)) { .NoReturn => { @@ -422,18 +422,21 @@ fn callFn(comptime f: anytype, args: anytype) switch (Impl) { return default_value; }, .ErrorUnion => |info| { - if (info.payload != void) { - @compileError(bad_fn_ret); + switch (info.payload) { + void, noreturn => { + @call(.auto, f, args) catch |err| { + std.debug.print("error: {s}\n", .{@errorName(err)}); + if (@errorReturnTrace()) |trace| { + std.debug.dumpStackTrace(trace.*); + } + }; + + return default_value; + }, + else => { + @compileError(bad_fn_ret); + }, } - - @call(.auto, f, args) catch |err| { - std.debug.print("error: {s}\n", .{@errorName(err)}); - if (@errorReturnTrace()) |trace| { - std.debug.dumpStackTrace(trace.*); - } - }; - - return default_value; }, else => { @compileError(bad_fn_ret);