Commit 878e99d580

Andrew Kelley <andrew@ziglang.org>
2021-02-22 02:04:23
parser: fix recovery for missing semicolons
1 parent 1247b7b
Changed files (2)
lib/std/zig/parse.zig
@@ -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(.{
lib/std/zig/parser_test.zig
@@ -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(