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 {
1313 token_ids: []const Token.Id,
1414 token_locs: []const Token.Loc,
1515 errors: []const Error,
16 /// undefined on parse error (when errors field is not empty)
1716 root_node: *Node.Root,
1817
1918 arena: std.heap.ArenaAllocator.State,
lib/std/zig/parse.zig+39-42
......@@ -878,34 +878,32 @@ const Parser = struct {
878878 return node;
879879 }
880880
881 if (try p.parseAssignExpr()) |assign_expr| {
882 for_prefix.body = assign_expr;
883
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 });
881 for_prefix.body = try p.expectNode(parseAssignExpr, .{
882 .ExpectedBlockOrAssignment = .{ .token = p.tok_i },
883 });
890884
891 const else_node = try p.arena.allocator.create(Node.Else);
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 }
885 if (p.eatToken(.Semicolon) != null) return node;
900886
901 try p.errors.append(p.gpa, .{
902 .ExpectedSemiOrElse = .{ .token = p.tok_i },
887 if (p.eatToken(.Keyword_else)) |else_token| {
888 const statement_node = try p.expectNode(parseStatement, .{
889 .ExpectedStatement = .{ .token = p.tok_i },
903890 });
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;
905899 return node;
906900 }
907901
908 return null;
902 try p.errors.append(p.gpa, .{
903 .ExpectedSemiOrElse = .{ .token = p.tok_i },
904 });
905
906 return node;
909907 }
910908
911909 /// WhileStatement
......@@ -939,36 +937,35 @@ const Parser = struct {
939937 return node;
940938 }
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| {
948 const payload = try p.parsePayload();
941 while_prefix.body = try p.expectNode(parseAssignExpr, .{
942 .ExpectedBlockOrAssignment = .{ .token = p.tok_i },
943 });
949944
950 const statement_node = try p.expectNode(parseStatement, .{
951 .ExpectedStatement = .{ .token = p.tok_i },
952 });
945 if (p.eatToken(.Semicolon) != null) return node;
953946
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;
961 return node;
962 }
947 if (p.eatToken(.Keyword_else)) |else_token| {
948 const payload = try p.parsePayload();
963949
964 try p.errors.append(p.gpa, .{
965 .ExpectedSemiOrElse = .{ .token = p.tok_i },
950 const statement_node = try p.expectNode(parseStatement, .{
951 .ExpectedStatement = .{ .token = p.tok_i },
966952 });
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;
968961 return node;
969962 }
970963
971 return null;
964 try p.errors.append(p.gpa, .{
965 .ExpectedSemiOrElse = .{ .token = p.tok_i },
966 });
967
968 return node;
972969 }
973970
974971 /// BlockExprStatement
lib/std/zig/parser_test.zig+13
......@@ -210,6 +210,19 @@ test "recovery: invalid comptime" {
210210 });
211211}
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
213226test "zig fmt: if statment" {
214227 try testCanonical(
215228 \\test "" {