Commit 0cf6ae290b

Nico Elbers <nico.b.elbers@gmail.com>
2025-02-18 18:25:46
zon.stringify: Correctly serialize unions with void fields
Closes #22933
1 parent 59dc15f
Changed files (1)
lib
lib/std/zon/stringify.zig
@@ -504,7 +504,6 @@ pub fn Serializer(Writer: type) type {
                 .bool, .null => try std.fmt.format(self.writer, "{}", .{val}),
                 .enum_literal => try self.ident(@tagName(val)),
                 .@"enum" => try self.ident(@tagName(val)),
-                .void => try self.writer.writeAll("{}"),
                 .pointer => |pointer| {
                     // Try to serialize as a string
                     const item: ?type = switch (@typeInfo(pointer.child)) {
@@ -579,15 +578,21 @@ pub fn Serializer(Writer: type) type {
                 },
                 .@"union" => |@"union"| {
                     comptime assert(@"union".tag_type != null);
-                    var container = try self.startStruct(.{ .whitespace_style = .{ .fields = 1 } });
                     switch (val) {
-                        inline else => |pl, tag| try container.fieldArbitraryDepth(
-                            @tagName(tag),
-                            pl,
-                            options,
-                        ),
+                        inline else => |pl, tag| if (@TypeOf(pl) == void)
+                            try self.writer.print(".{s}", .{@tagName(tag)})
+                        else {
+                            var container = try self.startStruct(.{ .whitespace_style = .{ .fields = 1 } });
+
+                            try container.fieldArbitraryDepth(
+                                @tagName(tag),
+                                pl,
+                                options,
+                            );
+
+                            try container.finish();
+                        },
                     }
-                    try container.finish();
                 },
                 .optional => if (val) |inner| {
                     try self.valueArbitraryDepth(inner, options);
@@ -1116,6 +1121,12 @@ test "std.zon stringify whitespace, high level API" {
         \\    3,
         \\} }
     , .{ .inner = .{ 1, 2, 3 } }, .{});
+
+    const UnionWithVoid = union(enum) { a, b: void, c: u8 };
+
+    try expectSerializeEqual(
+        \\.a
+    , UnionWithVoid.a, .{});
 }
 
 test "std.zon stringify whitespace, low level API" {