motiejus/zig

fork of https://codeberg.org/ziglang/zig
git clone https://git.jakstys.lt/motiejus/zig.git
Log | Tree | Refs | README | LICENSE

commit 5f589562646b972e4f177d60c7da37e872991d29 (tree)
parent f1b6f1aeb38452fce2c1185326556566cacee2ca
Author: Bram <ogus.bram@gmail.com>
Date:   Sat,  1 Jun 2024 15:04:02 -0400

std: Extended type checks for Thread startFn return type

Diffstat:
Mlib/std/Thread.zig | 27+++++++++++++++------------
1 file changed, 15 insertions(+), 12 deletions(-)

diff --git 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); - } - - @call(.auto, f, args) catch |err| { - std.debug.print("error: {s}\n", .{@errorName(err)}); - if (@errorReturnTrace()) |trace| { - std.debug.dumpStackTrace(trace.*); - } - }; + 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; + return default_value; + }, + else => { + @compileError(bad_fn_ret); + }, + } }, else => { @compileError(bad_fn_ret);