From b014bc77c8c5b89a8c0b5d4a995726ec6b350939 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20=28xq=29=20Quei=C3=9Fner?= Date: Fri, 2 Oct 2020 09:37:01 +0200 Subject: [PATCH] Fixes std.meta.Tuple and std.meta.ArgsTuple for zero-sized types (like void). --- lib/std/meta.zig | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/std/meta.zig b/lib/std/meta.zig index f02055a7ab..508e0590d6 100644 --- a/lib/std/meta.zig +++ b/lib/std/meta.zig @@ -846,14 +846,15 @@ pub fn ArgsTuple(comptime Function: type) type { var argument_field_list: [function_info.args.len]std.builtin.TypeInfo.StructField = undefined; inline for (function_info.args) |arg, i| { + const T = arg.arg_type.?; @setEvalBranchQuota(10_000); var num_buf: [128]u8 = undefined; argument_field_list[i] = std.builtin.TypeInfo.StructField{ .name = std.fmt.bufPrint(&num_buf, "{d}", .{i}) catch unreachable, - .field_type = arg.arg_type.?, - .default_value = @as(?(arg.arg_type.?), null), + .field_type = T, + .default_value = @as(?T, null), .is_comptime = false, - .alignment = @alignOf(arg.arg_type.?), + .alignment = if (@sizeOf(T) > 0) @alignOf(T) else 0, }; } @@ -884,7 +885,7 @@ pub fn Tuple(comptime types: []const type) type { .field_type = T, .default_value = @as(?T, null), .is_comptime = false, - .alignment = @alignOf(T), + .alignment = if (@sizeOf(T) > 0) @alignOf(T) else 0, }; } @@ -927,12 +928,12 @@ test "ArgsTuple" { TupleTester.assertTuple(.{}, ArgsTuple(fn () void)); TupleTester.assertTuple(.{u32}, ArgsTuple(fn (a: u32) []const u8)); TupleTester.assertTuple(.{ u32, f16 }, ArgsTuple(fn (a: u32, b: f16) noreturn)); - TupleTester.assertTuple(.{ u32, f16, []const u8 }, ArgsTuple(fn (a: u32, b: f16, c: []const u8) noreturn)); + TupleTester.assertTuple(.{ u32, f16, []const u8, void }, ArgsTuple(fn (a: u32, b: f16, c: []const u8, void) noreturn)); } test "Tuple" { TupleTester.assertTuple(.{}, Tuple(&[_]type{})); TupleTester.assertTuple(.{u32}, Tuple(&[_]type{u32})); TupleTester.assertTuple(.{ u32, f16 }, Tuple(&[_]type{ u32, f16 })); - TupleTester.assertTuple(.{ u32, f16, []const u8 }, Tuple(&[_]type{ u32, f16, []const u8 })); + TupleTester.assertTuple(.{ u32, f16, []const u8, void }, Tuple(&[_]type{ u32, f16, []const u8, void })); }