aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorVexu <git@vexu.eu>2020-05-14 00:16:56 +0300
committerVexu <git@vexu.eu>2020-05-14 00:16:56 +0300
commitc3b76d091337ba60d2ccb3632b525e5a42d1f2c5 (patch)
treedd57941c68786237721c2422c1a4a20680c21a73 /lib
parent1f81887a7863545d8b89bff6cc7d31941da0abf0 (diff)
downloadzig-c3b76d091337ba60d2ccb3632b525e5a42d1f2c5.tar.gz
zig-c3b76d091337ba60d2ccb3632b525e5a42d1f2c5.zip
recover from invalid builtin/async call
Diffstat (limited to 'lib')
-rw-r--r--lib/std/zig/ast.zig1
-rw-r--r--lib/std/zig/parse.zig18
-rw-r--r--lib/std/zig/parser_test.zig9
3 files changed, 20 insertions, 8 deletions
diff --git a/lib/std/zig/ast.zig b/lib/std/zig/ast.zig
index 26bff31bbd..6fb1ce012b 100644
--- a/lib/std/zig/ast.zig
+++ b/lib/std/zig/ast.zig
@@ -926,6 +926,7 @@ pub const Node = struct {
if (i < 1) return node;
i -= 1;
},
+ .Invalid => unreachable,
}
if (self.body_node) |body_node| {
diff --git a/lib/std/zig/parse.zig b/lib/std/zig/parse.zig
index cbd5336ca2..6c664bbda2 100644
--- a/lib/std/zig/parse.zig
+++ b/lib/std/zig/parse.zig
@@ -172,6 +172,7 @@ fn parseContainerMembers(arena: *Allocator, it: *TokenIterator, tree: *Tree) All
.ExpectedPubItem = .{ .token = it.index },
});
// ignore this pub
+ continue;
}
if (parseContainerField(arena, it, tree) catch |err| switch (err) {
@@ -1017,7 +1018,7 @@ fn parsePrimaryExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node
const node = try arena.create(Node.ControlFlowExpression);
node.* = .{
.ltoken = token,
- .kind = Node.ControlFlowExpression.Kind{ .Break = label },
+ .kind = .{ .Break = label },
.rhs = expr_node,
};
return &node.base;
@@ -1053,7 +1054,7 @@ fn parsePrimaryExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node
const node = try arena.create(Node.ControlFlowExpression);
node.* = .{
.ltoken = token,
- .kind = Node.ControlFlowExpression.Kind{ .Continue = label },
+ .kind = .{ .Continue = label },
.rhs = null,
};
return &node.base;
@@ -1077,7 +1078,7 @@ fn parsePrimaryExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node
const node = try arena.create(Node.ControlFlowExpression);
node.* = .{
.ltoken = token,
- .kind = Node.ControlFlowExpression.Kind.Return,
+ .kind = .Return,
.rhs = expr_node,
};
return &node.base;
@@ -1322,7 +1323,8 @@ fn parseSuffixExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
try tree.errors.push(.{
.ExpectedParamList = .{ .token = it.index },
});
- return null;
+ // ignore this, continue parsing
+ return res;
};
const node = try arena.create(Node.SuffixOp);
node.* = .{
@@ -2908,7 +2910,13 @@ fn parseBuiltinCall(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node
try tree.errors.push(.{
.ExpectedParamList = .{ .token = it.index },
});
- return error.ParseError;
+
+ // lets pretend this was an identifier so we can continue parsing
+ const node = try arena.create(Node.Identifier);
+ node.* = .{
+ .token = token,
+ };
+ return &node.base;
};
const node = try arena.create(Node.BuiltinCall);
node.* = .{
diff --git a/lib/std/zig/parser_test.zig b/lib/std/zig/parser_test.zig
index d837769802..34c61b6bb4 100644
--- a/lib/std/zig/parser_test.zig
+++ b/lib/std/zig/parser_test.zig
@@ -67,19 +67,22 @@ test "recovery: continue after invalid decl" {
\\fn foo {
\\ inline;
\\}
- \\test "" {
- \\ a && b;
+ \\pub test "" {
+ \\ async a && b;
\\}
, &[_]Error{
.ExpectedToken,
+ .ExpectedPubItem,
+ .ExpectedParamList,
.InvalidAnd,
});
try testError(
\\threadlocal test "" {
- \\ a && b;
+ \\ @a && b;
\\}
, &[_]Error{
.ExpectedVarDecl,
+ .ExpectedParamList,
.InvalidAnd,
});
}