| ... | @@ -8629,6 +8629,7 @@ fn zirIntFromEnum(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError | ... | @@ -8629,6 +8629,7 @@ fn zirIntFromEnum(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError |
| 8629 | .{src}, | 8629 | .{src}, |
| 8630 | ); | 8630 | ); |
| 8631 | }; | 8631 | }; |
| | 8632 | |
| 8632 | break :blk try sema.unionToTag(block, tag_ty, operand, operand_src); | 8633 | break :blk try sema.unionToTag(block, tag_ty, operand, operand_src); |
| 8633 | }, | 8634 | }, |
| 8634 | else => { | 8635 | else => { |
| ... | @@ -8638,14 +8639,25 @@ fn zirIntFromEnum(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError | ... | @@ -8638,14 +8639,25 @@ fn zirIntFromEnum(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError |
| 8638 | }, | 8639 | }, |
| 8639 | }; | 8640 | }; |
| 8640 | const enum_tag_ty = sema.typeOf(enum_tag); | 8641 | const enum_tag_ty = sema.typeOf(enum_tag); |
| 8641 | | | |
| 8642 | const int_tag_ty = enum_tag_ty.intTagType(mod); | 8642 | const int_tag_ty = enum_tag_ty.intTagType(mod); |
| 8643 | | 8643 | |
| | 8644 | // TODO: use correct solution |
| | 8645 | // https://github.com/ziglang/zig/issues/15909 |
| | 8646 | if (enum_tag_ty.enumFieldCount(mod) == 0 and !enum_tag_ty.isNonexhaustiveEnum(mod)) { |
| | 8647 | return sema.fail(block, operand_src, "cannot use @intFromEnum on empty enum '{}'", .{ |
| | 8648 | enum_tag_ty.fmt(mod), |
| | 8649 | }); |
| | 8650 | } |
| | 8651 | |
| 8644 | if (try sema.typeHasOnePossibleValue(enum_tag_ty)) |opv| { | 8652 | if (try sema.typeHasOnePossibleValue(enum_tag_ty)) |opv| { |
| 8645 | return Air.internedToRef((try mod.getCoerced(opv, int_tag_ty)).toIntern()); | 8653 | return Air.internedToRef((try mod.getCoerced(opv, int_tag_ty)).toIntern()); |
| 8646 | } | 8654 | } |
| 8647 | | 8655 | |
| 8648 | if (try sema.resolveValue(enum_tag)) |enum_tag_val| { | 8656 | if (try sema.resolveValue(enum_tag)) |enum_tag_val| { |
| | 8657 | if (enum_tag_val.isUndef(mod)) { |
| | 8658 | return mod.undefRef(int_tag_ty); |
| | 8659 | } |
| | 8660 | |
| 8649 | const val = try enum_tag_val.intFromEnum(enum_tag_ty, mod); | 8661 | const val = try enum_tag_val.intFromEnum(enum_tag_ty, mod); |
| 8650 | return Air.internedToRef(val.toIntern()); | 8662 | return Air.internedToRef(val.toIntern()); |
| 8651 | } | 8663 | } |
| ... | @@ -20944,6 +20956,7 @@ fn zirTagName(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air | ... | @@ -20944,6 +20956,7 @@ fn zirTagName(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air |
| 20944 | if (enum_ty.enumFieldCount(mod) == 0) { | 20956 | if (enum_ty.enumFieldCount(mod) == 0) { |
| 20945 | // TODO I don't think this is the correct way to handle this but | 20957 | // TODO I don't think this is the correct way to handle this but |
| 20946 | // it prevents a crash. | 20958 | // it prevents a crash. |
| | 20959 | // https://github.com/ziglang/zig/issues/15909 |
| 20947 | return sema.fail(block, operand_src, "cannot get @tagName of empty enum '{}'", .{ | 20960 | return sema.fail(block, operand_src, "cannot get @tagName of empty enum '{}'", .{ |
| 20948 | enum_ty.fmt(mod), | 20961 | enum_ty.fmt(mod), |
| 20949 | }); | 20962 | }); |