diff --git a/lib/std/zig/Parse.zig b/lib/std/zig/Parse.zig index dad8d58ecce0..538a563961a8 100644 --- a/lib/std/zig/Parse.zig +++ b/lib/std/zig/Parse.zig @@ -78,7 +78,7 @@ fn reserveNode(p: *Parse, tag: Ast.Node.Tag) !usize { } fn unreserveNode(p: *Parse, node_index: usize) void { - if (p.nodes.len == node_index) { + if (p.nodes.len == node_index + 1) { p.nodes.resize(p.gpa, p.nodes.len - 1) catch unreachable; } else { // There is zombie node left in the tree, let's make it as inoffensive as possible @@ -3813,3 +3813,21 @@ const Token = std.zig.Token; test { _ = @import("parser_test.zig"); } + +test "unreserving a freshly reserved AST node must not create zombies" { + const gpa = std.testing.allocator; + var parser: Parse = .{ + .gpa = gpa, + .nodes = .{}, + .errors = .{}, + .extra_data = .{}, + .scratch = .{}, + .source = "", + .tok_i = 0, + .tokens = undefined, + }; + defer parser.nodes.deinit(gpa); + const last = try parser.reserveNode(.@"try"); + parser.unreserveNode(last); + try std.testing.expectEqual(parser.nodes.len, 0); +}