authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2020-05-20 11:34:31+03:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2020-05-25 23:25:06+03:00
loge07b467c7cdca192ff18d5c5550ff07c91a665c5
tree77f16128aa0860dabc3015459fe6d9dd1534810e
parent69ff89fd1207bc95adf7a349319973c6070ce540
signature Commit is signed but in an unrecognized format.

fix missing compile error on while/for missing block


3 files changed, 52 insertions(+), 43 deletions(-)

lib/std/zig/ast.zig-1
...@@ -13,7 +13,6 @@ pub const Tree = struct {...@@ -13,7 +13,6 @@ pub const Tree = struct {
13 token_ids: []const Token.Id,13 token_ids: []const Token.Id,
14 token_locs: []const Token.Loc,14 token_locs: []const Token.Loc,
15 errors: []const Error,15 errors: []const Error,
16 /// undefined on parse error (when errors field is not empty)
17 root_node: *Node.Root,16 root_node: *Node.Root,
1817
19 arena: std.heap.ArenaAllocator.State,18 arena: std.heap.ArenaAllocator.State,
lib/std/zig/parse.zig+39-42
...@@ -878,34 +878,32 @@ const Parser = struct {...@@ -878,34 +878,32 @@ const Parser = struct {
878 return node;878 return node;
879 }879 }
880880
881 if (try p.parseAssignExpr()) |assign_expr| {881 for_prefix.body = try p.expectNode(parseAssignExpr, .{
882 for_prefix.body = assign_expr;882 .ExpectedBlockOrAssignment = .{ .token = p.tok_i },
883883 });
884 if (p.eatToken(.Semicolon) != null) return node;
885
886 if (p.eatToken(.Keyword_else)) |else_token| {
887 const statement_node = try p.expectNode(parseStatement, .{
888 .ExpectedStatement = .{ .token = p.tok_i },
889 });
890884
891 const else_node = try p.arena.allocator.create(Node.Else);885 if (p.eatToken(.Semicolon) != null) return node;
892 else_node.* = .{
893 .else_token = else_token,
894 .payload = null,
895 .body = statement_node,
896 };
897 for_prefix.@"else" = else_node;
898 return node;
899 }
900886
901 try p.errors.append(p.gpa, .{887 if (p.eatToken(.Keyword_else)) |else_token| {
902 .ExpectedSemiOrElse = .{ .token = p.tok_i },888 const statement_node = try p.expectNode(parseStatement, .{
889 .ExpectedStatement = .{ .token = p.tok_i },
903 });890 });
904891
892 const else_node = try p.arena.allocator.create(Node.Else);
893 else_node.* = .{
894 .else_token = else_token,
895 .payload = null,
896 .body = statement_node,
897 };
898 for_prefix.@"else" = else_node;
905 return node;899 return node;
906 }900 }
907901
908 return null;902 try p.errors.append(p.gpa, .{
903 .ExpectedSemiOrElse = .{ .token = p.tok_i },
904 });
905
906 return node;
909 }907 }
910908
911 /// WhileStatement909 /// WhileStatement
...@@ -939,36 +937,35 @@ const Parser = struct {...@@ -939,36 +937,35 @@ const Parser = struct {
939 return node;937 return node;
940 }938 }
941939
942 if (try p.parseAssignExpr()) |assign_expr_node| {
943 while_prefix.body = assign_expr_node;
944
945 if (p.eatToken(.Semicolon) != null) return node;
946940
947 if (p.eatToken(.Keyword_else)) |else_token| {941 while_prefix.body = try p.expectNode(parseAssignExpr, .{
948 const payload = try p.parsePayload();942 .ExpectedBlockOrAssignment = .{ .token = p.tok_i },
943 });
949944
950 const statement_node = try p.expectNode(parseStatement, .{945 if (p.eatToken(.Semicolon) != null) return node;
951 .ExpectedStatement = .{ .token = p.tok_i },
952 });
953946
954 const else_node = try p.arena.allocator.create(Node.Else);947 if (p.eatToken(.Keyword_else)) |else_token| {
955 else_node.* = .{948 const payload = try p.parsePayload();
956 .else_token = else_token,
957 .payload = payload,
958 .body = statement_node,
959 };
960 while_prefix.@"else" = else_node;
961 return node;
962 }
963949
964 try p.errors.append(p.gpa, .{950 const statement_node = try p.expectNode(parseStatement, .{
965 .ExpectedSemiOrElse = .{ .token = p.tok_i },951 .ExpectedStatement = .{ .token = p.tok_i },
966 });952 });
967953
954 const else_node = try p.arena.allocator.create(Node.Else);
955 else_node.* = .{
956 .else_token = else_token,
957 .payload = payload,
958 .body = statement_node,
959 };
960 while_prefix.@"else" = else_node;
968 return node;961 return node;
969 }962 }
970963
971 return null;964 try p.errors.append(p.gpa, .{
965 .ExpectedSemiOrElse = .{ .token = p.tok_i },
966 });
967
968 return node;
972 }969 }
973970
974 /// BlockExprStatement971 /// BlockExprStatement
lib/std/zig/parser_test.zig+13
...@@ -210,6 +210,19 @@ test "recovery: invalid comptime" {...@@ -210,6 +210,19 @@ test "recovery: invalid comptime" {
210 });210 });
211}211}
212212
213test "recovery: missing block after for/while loops" {
214 try testError(
215 \\test "" { while (foo) }
216 , &[_]Error{
217 .ExpectedBlockOrAssignment,
218 });
219 try testError(
220 \\test "" { for (foo) |bar| }
221 , &[_]Error{
222 .ExpectedBlockOrAssignment,
223 });
224}
225
213test "zig fmt: if statment" {226test "zig fmt: if statment" {
214 try testCanonical(227 try testCanonical(
215 \\test "" {228 \\test "" {