Zig Version
0.17.0-dev.269+ebff43698
Steps to Reproduce and Observed Behavior
Reproducible Code
const std = @import("std");
pub fn main(init: std.process.Init) !void {
const gpa = init.gpa;
const zon_file: [:0]const u8 =
\\ .{
\\ .{
\\ .action = .up,
\\ .primary = .w,
\\ .secondary = .this_key_doesnt_exist,
\\ },
\\ .{
\\ .action = .down,
\\ .primary = .s,
\\ .secondary = .null,
\\ }
\\}
;
const Action = enum(u8) {
up,
down,
};
const KeyboardKey = enum(u8) {
null,
s,
w,
};
const Binding = struct {
action: Action,
primary: KeyboardKey,
secondary: KeyboardKey,
};
const key_bindings: ?[]const Binding = std.zon.parse.fromSliceAlloc(
[]const Binding,
gpa,
zon_file,
null,
.{},
) catch |err| switch (err) {
error.ParseZon => null, // use default key bindings
else => return err,
};
defer if (key_bindings) |bind| gpa.free(bind);
std.debug.print("{any}\n", .{key_bindings});
}
Output:
null
error(DebugAllocator): memory address 0x7f6a27f00280 leaked:
/home/me/zig/lib/std/array_list.zig:658:52: 0x120c304 in toOwnedSlice (std.zig)
const new_memory = try gpa.alignedAlloc(T, alignment, self.items.len);
^
/home/me/zig/lib/std/zon/parse.zig:1131:52: 0x120b0c0 in failUnexpected__anon_37215 (std.zig)
.msg = try buf.toOwnedSlice(gpa),
^
/home/me/zig/lib/std/zon/parse.zig:682:40: 0x120a13f in parseEnumLiteral__anon_37043 (std.zig)
self.failUnexpected(T, "enum literal", node, null, field_name_str);
^
/home/me/zig/lib/std/zon/parse.zig:519:53: 0x120a3d7 in parseExprInner__anon_37017 (std.zig)
.@"enum" => return self.parseEnumLiteral(T, node),
^
/home/me/zig/lib/std/zon/parse.zig:493:35: 0x120911c in parseExpr__anon_36881 (std.zig)
return self.parseExprInner(T, node) catch |err| switch (err) {
^
/home/me/zig/lib/std/zon/parse.zig:862:77: 0x1205301 in parseStruct__anon_36703 (std.zig)
@field(result, field_infos[j].name) = try self.parseExpr(
^
(additional stack frames may have been skipped...)
Expected Behavior
no memory leak
### Zig Version
0.17.0-dev.269+ebff43698
### Steps to Reproduce and Observed Behavior
### Reproducible Code
```
const std = @import("std");
pub fn main(init: std.process.Init) !void {
const gpa = init.gpa;
const zon_file: [:0]const u8 =
\\ .{
\\ .{
\\ .action = .up,
\\ .primary = .w,
\\ .secondary = .this_key_doesnt_exist,
\\ },
\\ .{
\\ .action = .down,
\\ .primary = .s,
\\ .secondary = .null,
\\ }
\\}
;
const Action = enum(u8) {
up,
down,
};
const KeyboardKey = enum(u8) {
null,
s,
w,
};
const Binding = struct {
action: Action,
primary: KeyboardKey,
secondary: KeyboardKey,
};
const key_bindings: ?[]const Binding = std.zon.parse.fromSliceAlloc(
[]const Binding,
gpa,
zon_file,
null,
.{},
) catch |err| switch (err) {
error.ParseZon => null, // use default key bindings
else => return err,
};
defer if (key_bindings) |bind| gpa.free(bind);
std.debug.print("{any}\n", .{key_bindings});
}
```
### Output:
```
null
error(DebugAllocator): memory address 0x7f6a27f00280 leaked:
/home/me/zig/lib/std/array_list.zig:658:52: 0x120c304 in toOwnedSlice (std.zig)
const new_memory = try gpa.alignedAlloc(T, alignment, self.items.len);
^
/home/me/zig/lib/std/zon/parse.zig:1131:52: 0x120b0c0 in failUnexpected__anon_37215 (std.zig)
.msg = try buf.toOwnedSlice(gpa),
^
/home/me/zig/lib/std/zon/parse.zig:682:40: 0x120a13f in parseEnumLiteral__anon_37043 (std.zig)
self.failUnexpected(T, "enum literal", node, null, field_name_str);
^
/home/me/zig/lib/std/zon/parse.zig:519:53: 0x120a3d7 in parseExprInner__anon_37017 (std.zig)
.@"enum" => return self.parseEnumLiteral(T, node),
^
/home/me/zig/lib/std/zon/parse.zig:493:35: 0x120911c in parseExpr__anon_36881 (std.zig)
return self.parseExprInner(T, node) catch |err| switch (err) {
^
/home/me/zig/lib/std/zon/parse.zig:862:77: 0x1205301 in parseStruct__anon_36703 (std.zig)
@field(result, field_infos[j].name) = try self.parseExpr(
^
(additional stack frames may have been skipped...)
```
### Expected Behavior
no memory leak