aboutsummaryrefslogtreecommitdiff
path: root/lib/std/meta.zig
diff options
context:
space:
mode:
authorFelix (xq) Queißner <git@mq32.de>2020-10-02 09:37:01 +0200
committerAndrew Kelley <andrew@ziglang.org>2020-10-17 21:10:01 -0400
commitb014bc77c8c5b89a8c0b5d4a995726ec6b350939 (patch)
tree1f010a6e43b877d89c2890499d4090f27d57ba98 /lib/std/meta.zig
parent2a256d5ea02c8f520c54fd335c38891d6e05a63f (diff)
downloadzig-b014bc77c8c5b89a8c0b5d4a995726ec6b350939.tar.gz
zig-b014bc77c8c5b89a8c0b5d4a995726ec6b350939.zip
Fixes std.meta.Tuple and std.meta.ArgsTuple for zero-sized types (like void).
Diffstat (limited to 'lib/std/meta.zig')
-rw-r--r--lib/std/meta.zig13
1 files 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 }));
}