| ... | @@ -4740,6 +4740,29 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { | ... | @@ -4740,6 +4740,29 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { |
| 4740 | } | 4740 | } |
| 4741 | return self.fail("TODO non pointer optionals", .{}); | 4741 | return self.fail("TODO non pointer optionals", .{}); |
| 4742 | }, | 4742 | }, |
| | 4743 | .Enum => { |
| | 4744 | if (typed_value.val.castTag(.enum_field_index)) |field_index| { |
| | 4745 | switch (typed_value.ty.tag()) { |
| | 4746 | .enum_simple => { |
| | 4747 | return MCValue{ .immediate = field_index.data }; |
| | 4748 | }, |
| | 4749 | .enum_full, .enum_nonexhaustive => { |
| | 4750 | const enum_full = typed_value.ty.cast(Type.Payload.EnumFull).?.data; |
| | 4751 | if (enum_full.values.count() != 0) { |
| | 4752 | const tag_val = enum_full.values.keys()[field_index.data]; |
| | 4753 | return self.genTypedValue(.{ .ty = enum_full.tag_ty, .val = tag_val }); |
| | 4754 | } else { |
| | 4755 | return MCValue{ .immediate = field_index.data }; |
| | 4756 | } |
| | 4757 | }, |
| | 4758 | else => unreachable, |
| | 4759 | } |
| | 4760 | } else { |
| | 4761 | var int_tag_buffer: Type.Payload.Bits = undefined; |
| | 4762 | const int_tag_ty = typed_value.ty.intTagType(&int_tag_buffer); |
| | 4763 | return self.genTypedValue(.{ .ty = int_tag_ty, .val = typed_value.val }); |
| | 4764 | } |
| | 4765 | }, |
| 4743 | .ErrorSet => { | 4766 | .ErrorSet => { |
| 4744 | switch (typed_value.val.tag()) { | 4767 | switch (typed_value.val.tag()) { |
| 4745 | .@"error" => { | 4768 | .@"error" => { |