aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.zig
diff options
context:
space:
mode:
authorjoachimschmidt557 <joachim.schmidt557@outlook.com>2021-07-30 22:48:20 +0200
committerAndrew Kelley <andrew@ziglang.org>2021-07-30 17:53:33 -0400
commit84039a57e4684e8df10e657bb76c6acb3fb89238 (patch)
tree67d0ca6c151b7ab77311bc2a4e156dffa88b6d24 /src/codegen.zig
parent7aaea20e7e5e98bc5b2c4c8ddcf8f6aaa4a9c55d (diff)
downloadzig-84039a57e4684e8df10e657bb76c6acb3fb89238.tar.gz
zig-84039a57e4684e8df10e657bb76c6acb3fb89238.zip
stage2 codegen: Implement genTypedValue for enums
Diffstat (limited to 'src/codegen.zig')
-rw-r--r--src/codegen.zig23
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" => {