Merge pull request #5358 from Vexu/parser

Fix infinite loop with invalid comptime
This commit is contained in:
Vexu 2020-05-16 20:49:37 +03:00 committed by GitHub
commit eda03354dc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 18 additions and 0 deletions

View File

@ -165,6 +165,7 @@ pub const Error = union(enum) {
ExpectedLoopExpr: ExpectedLoopExpr,
ExpectedDerefOrUnwrap: ExpectedDerefOrUnwrap,
ExpectedSuffixOp: ExpectedSuffixOp,
ExpectedBlockOrField: ExpectedBlockOrField,
DeclBetweenFields: DeclBetweenFields,
InvalidAnd: InvalidAnd,
@ -215,6 +216,7 @@ pub const Error = union(enum) {
.ExpectedLoopExpr => |*x| return x.render(tokens, stream),
.ExpectedDerefOrUnwrap => |*x| return x.render(tokens, stream),
.ExpectedSuffixOp => |*x| return x.render(tokens, stream),
.ExpectedBlockOrField => |*x| return x.render(tokens, stream),
.DeclBetweenFields => |*x| return x.render(tokens, stream),
.InvalidAnd => |*x| return x.render(tokens, stream),
}
@ -267,6 +269,7 @@ pub const Error = union(enum) {
.ExpectedLoopExpr => |x| return x.token,
.ExpectedDerefOrUnwrap => |x| return x.token,
.ExpectedSuffixOp => |x| return x.token,
.ExpectedBlockOrField => |x| return x.token,
.DeclBetweenFields => |x| return x.token,
.InvalidAnd => |x| return x.token,
}
@ -306,6 +309,7 @@ pub const Error = union(enum) {
pub const ExpectedLoopExpr = SingleTokenError("Expected loop expression, found '{}'");
pub const ExpectedDerefOrUnwrap = SingleTokenError("Expected pointer dereference or optional unwrap, found '{}'");
pub const ExpectedSuffixOp = SingleTokenError("Expected pointer dereference, optional unwrap, or field access, found '{}'");
pub const ExpectedBlockOrField = SingleTokenError("Expected block or field, found '{}'");
pub const ExpectedParamType = SimpleError("Expected parameter type");
pub const ExpectedPubItem = SimpleError("Expected function or variable declaration after pub");

View File

@ -231,6 +231,12 @@ fn parseContainerMembers(arena: *Allocator, it: *TokenIterator, tree: *Tree, top
const next = it.peek().?.id;
switch (next) {
.Eof => break,
.Keyword_comptime => {
_ = nextToken(it);
try tree.errors.push(.{
.ExpectedBlockOrField = .{ .token = it.index },
});
},
else => {
const index = it.index;
if (next == .RBrace) {

View File

@ -200,6 +200,14 @@ test "recovery: missing semicolon after if, for, while stmt" {
});
}
test "recovery: invalid comptime" {
try testError(
\\comptime
, &[_]Error{
.ExpectedBlockOrField,
});
}
test "zig fmt: top-level fields" {
try testCanonical(
\\a: did_you_know,