aboutsummaryrefslogtreecommitdiff
path: root/lib/std/Thread.zig
diff options
context:
space:
mode:
authorBram <ogus.bram@gmail.com>2024-06-01 15:04:02 -0400
committerMatthew Lugg <mlugg@mlugg.co.uk>2024-06-23 04:35:00 +0100
commit5f589562646b972e4f177d60c7da37e872991d29 (patch)
treecf33366a36e188ba2345894c43ee362918aff428 /lib/std/Thread.zig
parentf1b6f1aeb38452fce2c1185326556566cacee2ca (diff)
downloadzig-5f589562646b972e4f177d60c7da37e872991d29.tar.gz
zig-5f589562646b972e4f177d60c7da37e872991d29.zip
std: Extended type checks for Thread startFn return type
Diffstat (limited to 'lib/std/Thread.zig')
-rw-r--r--lib/std/Thread.zig27
1 files 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);
- }
-
- @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);