authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-05-08 20:04:40-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-05-15 03:07:51-04:00
log81664f17d5ec4382057bc3d2c8774d8804791a04
tree944f5df8addce217e221c0c867b3b9781cce6048
parente36e9323f4c4ce66013ba4774ff0145fc9cad34d

codegen: implement global enum_numbered


2 files changed, 9 insertions(+), 7 deletions(-)

src/codegen.zig+9-5
......@@ -1189,12 +1189,16 @@ pub fn genTypedValue(
11891189 .enum_simple => {
11901190 return GenResult.mcv(.{ .immediate = field_index.data });
11911191 },
1192 .enum_full, .enum_nonexhaustive => {
1193 const enum_full = typed_value.ty.cast(Type.Payload.EnumFull).?.data;
1194 if (enum_full.values.count() != 0) {
1195 const tag_val = enum_full.values.keys()[field_index.data];
1192 .enum_numbered, .enum_full, .enum_nonexhaustive => {
1193 const enum_values = if (typed_value.ty.castTag(.enum_numbered)) |pl|
1194 pl.data.values
1195 else
1196 typed_value.ty.cast(Type.Payload.EnumFull).?.data.values;
1197 if (enum_values.count() != 0) {
1198 const tag_val = enum_values.keys()[field_index.data];
1199 var buf: Type.Payload.Bits = undefined;
11961200 return genTypedValue(bin_file, src_loc, .{
1197 .ty = enum_full.tag_ty,
1201 .ty = typed_value.ty.intTagType(&buf),
11981202 .val = tag_val,
11991203 }, owner_decl_index);
12001204 } else {
test/behavior/union.zig-2
......@@ -362,7 +362,6 @@ const MultipleChoice = union(enum(u32)) {
362362 D = 1000,
363363};
364364test "simple union(enum(u32))" {
365 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
366365 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
367366 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
368367 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
......@@ -641,7 +640,6 @@ test "tagged union with all void fields but a meaningful tag" {
641640}
642641
643642test "union(enum(u32)) with specified and unspecified tag values" {
644 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
645643 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
646644 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
647645 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO