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 {...@@ -1072,11 +1072,13 @@ pub const Value = extern union {
1072 .enum_simple => Module.EnumFull.ValueMap{},1072 .enum_simple => Module.EnumFull.ValueMap{},
1073 else => unreachable,1073 else => unreachable,
1074 };1074 };
1075 break :field_index if (values.entries.len == 0)1075 if (values.entries.len == 0) {
1076 // auto-numbered enum1076 // auto-numbered enum
1077 @intCast(u32, val.toUnsignedInt(mod.getTarget()))1077 break :field_index @intCast(u32, val.toUnsignedInt(mod.getTarget()));
1078 else1078 }
1079 @intCast(u32, values.getIndexContext(val, .{ .ty = ty, .mod = mod }).?);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 }).?);
1080 },1082 },
1081 };1083 };
10821084
test/behavior/call.zig+25
...@@ -344,3 +344,28 @@ test "inline call doesn't re-evaluate non generic struct" {...@@ -344,3 +344,28 @@ test "inline call doesn't re-evaluate non generic struct" {
344 try @call(.always_inline, S.foo, ArgTuple{.{ .a = 123, .b = 45 }});344 try @call(.always_inline, S.foo, ArgTuple{.{ .a = 123, .b = 45 }});
345 comptime try @call(.always_inline, S.foo, ArgTuple{.{ .a = 123, .b = 45 }});345 comptime try @call(.always_inline, S.foo, ArgTuple{.{ .a = 123, .b = 45 }});
346}346}
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}