diff --git a/lib/std/fmt.zig b/lib/std/fmt.zig index db4232ec0e..f3c43c5590 100644 --- a/lib/std/fmt.zig +++ b/lib/std/fmt.zig @@ -362,12 +362,21 @@ pub fn formatType( if (enumInfo.is_exhaustive) { try out_stream.writeAll("."); try out_stream.writeAll(@tagName(value)); - } else { - // TODO: when @tagName works on exhaustive enums print known enum strings - try out_stream.writeAll("("); - try formatType(@enumToInt(value), fmt, options, out_stream, max_depth); - try out_stream.writeAll(")"); + return; } + + // Use @tagName only if value is one of known fields + inline for (enumInfo.fields) |enumField| { + if (@enumToInt(value) == enumField.value) { + try out_stream.writeAll("."); + try out_stream.writeAll(@tagName(value)); + return; + } + } + + try out_stream.writeAll("("); + try formatType(@enumToInt(value), fmt, options, out_stream, max_depth); + try out_stream.writeAll(")"); }, .Union => { try out_stream.writeAll(@typeName(T)); @@ -1308,6 +1317,8 @@ test "enum" { const value = Enum.Two; try testFmt("enum: Enum.Two\n", "enum: {}\n", .{value}); try testFmt("enum: Enum.Two\n", "enum: {}\n", .{&value}); + try testFmt("enum: Enum.One\n", "enum: {x}\n", .{Enum.One}); + try testFmt("enum: Enum.Two\n", "enum: {X}\n", .{Enum.Two}); } test "non-exhaustive enum" { @@ -1316,11 +1327,12 @@ test "non-exhaustive enum" { Two = 0xbeef, _, }; - try testFmt("enum: Enum(15)\n", "enum: {}\n", .{Enum.One}); - try testFmt("enum: Enum(48879)\n", "enum: {}\n", .{Enum.Two}); + try testFmt("enum: Enum.One\n", "enum: {}\n", .{Enum.One}); + try testFmt("enum: Enum.Two\n", "enum: {}\n", .{Enum.Two}); try testFmt("enum: Enum(4660)\n", "enum: {}\n", .{@intToEnum(Enum, 0x1234)}); - try testFmt("enum: Enum(f)\n", "enum: {x}\n", .{Enum.One}); - try testFmt("enum: Enum(beef)\n", "enum: {x}\n", .{Enum.Two}); + try testFmt("enum: Enum.One\n", "enum: {x}\n", .{Enum.One}); + try testFmt("enum: Enum.Two\n", "enum: {x}\n", .{Enum.Two}); + try testFmt("enum: Enum.Two\n", "enum: {X}\n", .{Enum.Two}); try testFmt("enum: Enum(1234)\n", "enum: {x}\n", .{@intToEnum(Enum, 0x1234)}); }