mirror of
https://github.com/ziglang/zig.git
synced 2025-12-17 03:33:06 +00:00
fix missing compile error on while/for missing block
This commit is contained in:
parent
69ff89fd12
commit
e07b467c7c
@ -13,7 +13,6 @@ pub const Tree = struct {
|
|||||||
token_ids: []const Token.Id,
|
token_ids: []const Token.Id,
|
||||||
token_locs: []const Token.Loc,
|
token_locs: []const Token.Loc,
|
||||||
errors: []const Error,
|
errors: []const Error,
|
||||||
/// undefined on parse error (when errors field is not empty)
|
|
||||||
root_node: *Node.Root,
|
root_node: *Node.Root,
|
||||||
|
|
||||||
arena: std.heap.ArenaAllocator.State,
|
arena: std.heap.ArenaAllocator.State,
|
||||||
|
|||||||
@ -878,34 +878,32 @@ const Parser = struct {
|
|||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (try p.parseAssignExpr()) |assign_expr| {
|
for_prefix.body = try p.expectNode(parseAssignExpr, .{
|
||||||
for_prefix.body = assign_expr;
|
.ExpectedBlockOrAssignment = .{ .token = p.tok_i },
|
||||||
|
});
|
||||||
|
|
||||||
if (p.eatToken(.Semicolon) != null) return node;
|
if (p.eatToken(.Semicolon) != null) return node;
|
||||||
|
|
||||||
if (p.eatToken(.Keyword_else)) |else_token| {
|
if (p.eatToken(.Keyword_else)) |else_token| {
|
||||||
const statement_node = try p.expectNode(parseStatement, .{
|
const statement_node = try p.expectNode(parseStatement, .{
|
||||||
.ExpectedStatement = .{ .token = p.tok_i },
|
.ExpectedStatement = .{ .token = p.tok_i },
|
||||||
});
|
|
||||||
|
|
||||||
const else_node = try p.arena.allocator.create(Node.Else);
|
|
||||||
else_node.* = .{
|
|
||||||
.else_token = else_token,
|
|
||||||
.payload = null,
|
|
||||||
.body = statement_node,
|
|
||||||
};
|
|
||||||
for_prefix.@"else" = else_node;
|
|
||||||
return node;
|
|
||||||
}
|
|
||||||
|
|
||||||
try p.errors.append(p.gpa, .{
|
|
||||||
.ExpectedSemiOrElse = .{ .token = p.tok_i },
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const else_node = try p.arena.allocator.create(Node.Else);
|
||||||
|
else_node.* = .{
|
||||||
|
.else_token = else_token,
|
||||||
|
.payload = null,
|
||||||
|
.body = statement_node,
|
||||||
|
};
|
||||||
|
for_prefix.@"else" = else_node;
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
try p.errors.append(p.gpa, .{
|
||||||
|
.ExpectedSemiOrElse = .{ .token = p.tok_i },
|
||||||
|
});
|
||||||
|
|
||||||
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// WhileStatement
|
/// WhileStatement
|
||||||
@ -939,36 +937,35 @@ const Parser = struct {
|
|||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (try p.parseAssignExpr()) |assign_expr_node| {
|
|
||||||
while_prefix.body = assign_expr_node;
|
|
||||||
|
|
||||||
if (p.eatToken(.Semicolon) != null) return node;
|
while_prefix.body = try p.expectNode(parseAssignExpr, .{
|
||||||
|
.ExpectedBlockOrAssignment = .{ .token = p.tok_i },
|
||||||
|
});
|
||||||
|
|
||||||
if (p.eatToken(.Keyword_else)) |else_token| {
|
if (p.eatToken(.Semicolon) != null) return node;
|
||||||
const payload = try p.parsePayload();
|
|
||||||
|
|
||||||
const statement_node = try p.expectNode(parseStatement, .{
|
if (p.eatToken(.Keyword_else)) |else_token| {
|
||||||
.ExpectedStatement = .{ .token = p.tok_i },
|
const payload = try p.parsePayload();
|
||||||
});
|
|
||||||
|
|
||||||
const else_node = try p.arena.allocator.create(Node.Else);
|
const statement_node = try p.expectNode(parseStatement, .{
|
||||||
else_node.* = .{
|
.ExpectedStatement = .{ .token = p.tok_i },
|
||||||
.else_token = else_token,
|
|
||||||
.payload = payload,
|
|
||||||
.body = statement_node,
|
|
||||||
};
|
|
||||||
while_prefix.@"else" = else_node;
|
|
||||||
return node;
|
|
||||||
}
|
|
||||||
|
|
||||||
try p.errors.append(p.gpa, .{
|
|
||||||
.ExpectedSemiOrElse = .{ .token = p.tok_i },
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const else_node = try p.arena.allocator.create(Node.Else);
|
||||||
|
else_node.* = .{
|
||||||
|
.else_token = else_token,
|
||||||
|
.payload = payload,
|
||||||
|
.body = statement_node,
|
||||||
|
};
|
||||||
|
while_prefix.@"else" = else_node;
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
try p.errors.append(p.gpa, .{
|
||||||
|
.ExpectedSemiOrElse = .{ .token = p.tok_i },
|
||||||
|
});
|
||||||
|
|
||||||
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// BlockExprStatement
|
/// BlockExprStatement
|
||||||
|
|||||||
@ -210,6 +210,19 @@ test "recovery: invalid comptime" {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test "recovery: missing block after for/while loops" {
|
||||||
|
try testError(
|
||||||
|
\\test "" { while (foo) }
|
||||||
|
, &[_]Error{
|
||||||
|
.ExpectedBlockOrAssignment,
|
||||||
|
});
|
||||||
|
try testError(
|
||||||
|
\\test "" { for (foo) |bar| }
|
||||||
|
, &[_]Error{
|
||||||
|
.ExpectedBlockOrAssignment,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
test "zig fmt: if statment" {
|
test "zig fmt: if statment" {
|
||||||
try testCanonical(
|
try testCanonical(
|
||||||
\\test "" {
|
\\test "" {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user