diff options
| author | joachimschmidt557 <joachim.schmidt557@outlook.com> | 2021-07-30 22:48:20 +0200 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2021-07-30 17:53:33 -0400 |
| commit | 84039a57e4684e8df10e657bb76c6acb3fb89238 (patch) | |
| tree | 67d0ca6c151b7ab77311bc2a4e156dffa88b6d24 /src/codegen.zig | |
| parent | 7aaea20e7e5e98bc5b2c4c8ddcf8f6aaa4a9c55d (diff) | |
| download | zig-84039a57e4684e8df10e657bb76c6acb3fb89238.tar.gz zig-84039a57e4684e8df10e657bb76c6acb3fb89238.zip | |
stage2 codegen: Implement genTypedValue for enums
Diffstat (limited to 'src/codegen.zig')
| -rw-r--r-- | src/codegen.zig | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/codegen.zig b/src/codegen.zig index 0917f2c847..bc3ff6257c 100644 --- a/src/codegen.zig +++ b/src/codegen.zig @@ -4740,6 +4740,29 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { } return self.fail("TODO non pointer optionals", .{}); }, + .Enum => { + if (typed_value.val.castTag(.enum_field_index)) |field_index| { + switch (typed_value.ty.tag()) { + .enum_simple => { + return MCValue{ .immediate = field_index.data }; + }, + .enum_full, .enum_nonexhaustive => { + const enum_full = typed_value.ty.cast(Type.Payload.EnumFull).?.data; + if (enum_full.values.count() != 0) { + const tag_val = enum_full.values.keys()[field_index.data]; + return self.genTypedValue(.{ .ty = enum_full.tag_ty, .val = tag_val }); + } else { + return MCValue{ .immediate = field_index.data }; + } + }, + else => unreachable, + } + } else { + var int_tag_buffer: Type.Payload.Bits = undefined; + const int_tag_ty = typed_value.ty.intTagType(&int_tag_buffer); + return self.genTypedValue(.{ .ty = int_tag_ty, .val = typed_value.val }); + } + }, .ErrorSet => { switch (typed_value.val.tag()) { .@"error" => { |
