| ... | ... | @@ -657,6 +657,20 @@ test "std.meta.tags" { |
| 657 | 657 | pub fn FieldEnum(comptime T: type) type { |
| 658 | 658 | const field_infos = fields(T); |
| 659 | 659 | |
| 660 | if (field_infos.len == 0) { |
| 661 | // TODO simplify when stage1 is removed |
| 662 | if (@import("builtin").zig_backend == .stage1) @compileError("stage1 doesn't allow empty enums"); |
| 663 | return @Type(.{ |
| 664 | .Enum = .{ |
| 665 | .layout = .Auto, |
| 666 | .tag_type = u0, |
| 667 | .fields = &.{}, |
| 668 | .decls = &.{}, |
| 669 | .is_exhaustive = true, |
| 670 | }, |
| 671 | }); |
| 672 | } |
| 673 | |
| 660 | 674 | if (@typeInfo(T) == .Union) { |
| 661 | 675 | if (@typeInfo(T).Union.tag_type) |tag_type| { |
| 662 | 676 | for (std.enums.values(tag_type)) |v, i| { |
| ... | ... | @@ -728,6 +742,9 @@ fn expectEqualEnum(expected: anytype, actual: @TypeOf(expected)) !void { |
| 728 | 742 | } |
| 729 | 743 | |
| 730 | 744 | test "std.meta.FieldEnum" { |
| 745 | if (comptime @import("builtin").zig_backend != .stage1) { |
| 746 | try expectEqualEnum(enum {}, FieldEnum(struct {})); |
| 747 | } |
| 731 | 748 | try expectEqualEnum(enum { a }, FieldEnum(struct { a: u8 })); |
| 732 | 749 | try expectEqualEnum(enum { a, b, c }, FieldEnum(struct { a: u8, b: void, c: f32 })); |
| 733 | 750 | try expectEqualEnum(enum { a, b, c }, FieldEnum(union { a: u8, b: void, c: f32 })); |