commit 434fce2146a9f1dc096fdae6827e0855799351ca (tree)
parent 041212a41cfaf029dc3eb9740467b721c76f406c
Author: Andrew Kelley <andrew@ziglang.org>
Date: Thu, 4 Mar 2021 20:54:09 -0700
zig fmt: recovery: missing while rbrace
Previously, this test case resulted in zig fmt entering an endless loop.
Diffstat:
2 files changed, 16 insertions(+), 3 deletions(-)
diff --git a/lib/std/zig/parse.zig b/lib/std/zig/parse.zig
@@ -937,14 +937,17 @@ const Parser = struct {
/// If a parse error occurs, reports an error, but then finds the next statement
/// and returns that one instead. If a parse error occurs but there is no following
/// statement, returns 0.
- fn expectStatementRecoverable(p: *Parser) error{OutOfMemory}!Node.Index {
+ fn expectStatementRecoverable(p: *Parser) Error!Node.Index {
while (true) {
return p.expectStatement() catch |err| switch (err) {
error.OutOfMemory => return error.OutOfMemory,
error.ParseError => {
p.findNextStmt(); // Try to skip to the next statement.
- if (p.token_tags[p.tok_i] == .r_brace) return null_node;
- continue;
+ switch (p.token_tags[p.tok_i]) {
+ .r_brace => return null_node,
+ .eof => return error.ParseError,
+ else => continue,
+ }
},
};
}
diff --git a/lib/std/zig/parser_test.zig b/lib/std/zig/parser_test.zig
@@ -4580,6 +4580,16 @@ test "recovery: missing comma in params" {
});
}
+test "recovery: missing while rbrace" {
+ try testError(
+ \\fn a() b {
+ \\ while (d) {
+ \\}
+ , &[_]Error{
+ .expected_statement,
+ });
+}
+
const std = @import("std");
const mem = std.mem;
const warn = std.debug.warn;