authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-12-19 15:07:11+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-12-19 15:08:49+02:00
log22d46e1d7753ea2a9accc180e8613206120739c5
treea416ddd2e321e1012a624dd81a13b36804a34bf9
parent2926d95e6a7c4d83eb197f78de40718e97bc1f1b

value: use int tag type when querying for tag value

Closes #13757

2 files changed, 31 insertions(+), 4 deletions(-)

src/value.zig+6-4
......@@ -1072,11 +1072,13 @@ pub const Value = extern union {
10721072 .enum_simple => Module.EnumFull.ValueMap{},
10731073 else => unreachable,
10741074 };
1075 break :field_index if (values.entries.len == 0)
1075 if (values.entries.len == 0) {
10761076 // auto-numbered enum
1077 @intCast(u32, val.toUnsignedInt(mod.getTarget()))
1078 else
1079 @intCast(u32, values.getIndexContext(val, .{ .ty = ty, .mod = mod }).?);
1077 break :field_index @intCast(u32, val.toUnsignedInt(mod.getTarget()));
1078 }
1079 var buffer: Type.Payload.Bits = undefined;
1080 const int_tag_ty = ty.intTagType(&buffer);
1081 break :field_index @intCast(u32, values.getIndexContext(val, .{ .ty = int_tag_ty, .mod = mod }).?);
10801082 },
10811083 };
10821084
test/behavior/call.zig+25
......@@ -344,3 +344,28 @@ test "inline call doesn't re-evaluate non generic struct" {
344344 try @call(.always_inline, S.foo, ArgTuple{.{ .a = 123, .b = 45 }});
345345 comptime try @call(.always_inline, S.foo, ArgTuple{.{ .a = 123, .b = 45 }});
346346}
347
348test "Enum constructed by @Type passed as generic argument" {
349 const S = struct {
350 const E = std.meta.FieldEnum(struct {
351 prev_pos: bool,
352 pos: bool,
353 vel: bool,
354 damp_vel: bool,
355 acc: bool,
356 rgba: bool,
357 prev_scale: bool,
358 scale: bool,
359 prev_rotation: bool,
360 rotation: bool,
361 angular_vel: bool,
362 alive: bool,
363 });
364 fn foo(comptime a: E, b: u32) !void {
365 try expect(@enumToInt(a) == b);
366 }
367 };
368 inline for (@typeInfo(S.E).Enum.fields) |_, i| {
369 try S.foo(@intToEnum(S.E, i), i);
370 }
371}