parser: fix recovery for missing semicolons

This commit is contained in:
Andrew Kelley 2021-02-21 18:04:23 -07:00
parent 1247b7b9ef
commit 878e99d580
2 changed files with 35 additions and 35 deletions

View File

@ -985,7 +985,7 @@ const Parser = struct {
};
const else_token = p.eatToken(.keyword_else) orelse {
if (else_required) {
return p.fail(.expected_semi_or_else);
try p.warn(.expected_semi_or_else);
}
return p.addNode(.{
.tag = .if_simple,
@ -1079,7 +1079,7 @@ const Parser = struct {
};
const else_token = p.eatToken(.keyword_else) orelse {
if (else_required) {
return p.fail(.expected_semi_or_else);
try p.warn(.expected_semi_or_else);
}
return p.addNode(.{
.tag = .for_simple,
@ -1154,7 +1154,7 @@ const Parser = struct {
};
const else_token = p.eatToken(.keyword_else) orelse {
if (else_required) {
return p.fail(.expected_semi_or_else);
try p.warn(.expected_semi_or_else);
}
if (cont_expr == 0) {
return p.addNode(.{

View File

@ -4222,39 +4222,39 @@ test "recovery: invalid global error set access" {
});
}
//test "recovery: invalid asterisk after pointer dereference" {
// try testError(
// \\test "" {
// \\ var sequence = "repeat".*** 10;
// \\}
// , &[_]Error{
// .asterisk_after_ptr_deref,
// });
// try testError(
// \\test "" {
// \\ var sequence = "repeat".** 10&&a;
// \\}
// , &[_]Error{
// .asterisk_after_ptr_deref,
// .invalid_and,
// });
//}
test "recovery: invalid asterisk after pointer dereference" {
try testError(
\\test "" {
\\ var sequence = "repeat".*** 10;
\\}
, &[_]Error{
.asterisk_after_ptr_deref,
});
try testError(
\\test "" {
\\ var sequence = "repeat".** 10&&a;
\\}
, &[_]Error{
.asterisk_after_ptr_deref,
.invalid_and,
});
}
//test "recovery: missing semicolon after if, for, while stmt" {
// try testError(
// \\test "" {
// \\ if (foo) bar
// \\ for (foo) |a| bar
// \\ while (foo) bar
// \\ a && b;
// \\}
// , &[_]Error{
// .expected_semi_or_else,
// .expected_semi_or_else,
// .expected_semi_or_else,
// .invalid_and,
// });
//}
test "recovery: missing semicolon after if, for, while stmt" {
try testError(
\\test "" {
\\ if (foo) bar
\\ for (foo) |a| bar
\\ while (foo) bar
\\ a && b;
\\}
, &[_]Error{
.expected_semi_or_else,
.expected_semi_or_else,
.expected_semi_or_else,
.invalid_and,
});
}
test "recovery: invalid comptime" {
try testError(