authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2020-05-13 23:35:58+03:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2020-05-13 23:35:58+03:00
log1f81887a7863545d8b89bff6cc7d31941da0abf0
tree0afe1df9c8a090d24dceab7486b1ad2fd8abff4b
parentad71d959d7d1b5f3a771dc2c1eaf37dbd7cd0852
signaturelock-open Commit is signed but in an unrecognized format.

recover after invalid inline/extern


3 files changed, 29 insertions(+), 7 deletions(-)

lib/std/zig/ast.zig+4
...@@ -129,6 +129,7 @@ pub const Error = union(enum) {...@@ -129,6 +129,7 @@ pub const Error = union(enum) {
129 ExpectedStatement: ExpectedStatement,129 ExpectedStatement: ExpectedStatement,
130 ExpectedVarDeclOrFn: ExpectedVarDeclOrFn,130 ExpectedVarDeclOrFn: ExpectedVarDeclOrFn,
131 ExpectedVarDecl: ExpectedVarDecl,131 ExpectedVarDecl: ExpectedVarDecl,
132 ExpectedFn: ExpectedFn,
132 ExpectedReturnType: ExpectedReturnType,133 ExpectedReturnType: ExpectedReturnType,
133 ExpectedAggregateKw: ExpectedAggregateKw,134 ExpectedAggregateKw: ExpectedAggregateKw,
134 UnattachedDocComment: UnattachedDocComment,135 UnattachedDocComment: UnattachedDocComment,
...@@ -179,6 +180,7 @@ pub const Error = union(enum) {...@@ -179,6 +180,7 @@ pub const Error = union(enum) {
179 .ExpectedStatement => |*x| return x.render(tokens, stream),180 .ExpectedStatement => |*x| return x.render(tokens, stream),
180 .ExpectedVarDeclOrFn => |*x| return x.render(tokens, stream),181 .ExpectedVarDeclOrFn => |*x| return x.render(tokens, stream),
181 .ExpectedVarDecl => |*x| return x.render(tokens, stream),182 .ExpectedVarDecl => |*x| return x.render(tokens, stream),
183 .ExpectedFn => |*x| return x.render(tokens, stream),
182 .ExpectedReturnType => |*x| return x.render(tokens, stream),184 .ExpectedReturnType => |*x| return x.render(tokens, stream),
183 .ExpectedAggregateKw => |*x| return x.render(tokens, stream),185 .ExpectedAggregateKw => |*x| return x.render(tokens, stream),
184 .UnattachedDocComment => |*x| return x.render(tokens, stream),186 .UnattachedDocComment => |*x| return x.render(tokens, stream),
...@@ -231,6 +233,7 @@ pub const Error = union(enum) {...@@ -231,6 +233,7 @@ pub const Error = union(enum) {
231 .ExpectedStatement => |x| return x.token,233 .ExpectedStatement => |x| return x.token,
232 .ExpectedVarDeclOrFn => |x| return x.token,234 .ExpectedVarDeclOrFn => |x| return x.token,
233 .ExpectedVarDecl => |x| return x.token,235 .ExpectedVarDecl => |x| return x.token,
236 .ExpectedFn => |x| return x.token,
234 .ExpectedReturnType => |x| return x.token,237 .ExpectedReturnType => |x| return x.token,
235 .ExpectedAggregateKw => |x| return x.token,238 .ExpectedAggregateKw => |x| return x.token,
236 .UnattachedDocComment => |x| return x.token,239 .UnattachedDocComment => |x| return x.token,
...@@ -280,6 +283,7 @@ pub const Error = union(enum) {...@@ -280,6 +283,7 @@ pub const Error = union(enum) {
280 pub const ExpectedStatement = SingleTokenError("Expected statement, found '{}'");283 pub const ExpectedStatement = SingleTokenError("Expected statement, found '{}'");
281 pub const ExpectedVarDeclOrFn = SingleTokenError("Expected variable declaration or function, found '{}'");284 pub const ExpectedVarDeclOrFn = SingleTokenError("Expected variable declaration or function, found '{}'");
282 pub const ExpectedVarDecl = SingleTokenError("Expected variable declaration, found '{}'");285 pub const ExpectedVarDecl = SingleTokenError("Expected variable declaration, found '{}'");
286 pub const ExpectedFn = SingleTokenError("Expected function, found '{}'");
283 pub const ExpectedReturnType = SingleTokenError("Expected 'var' or return type expression, found '{}'");287 pub const ExpectedReturnType = SingleTokenError("Expected 'var' or return type expression, found '{}'");
284 pub const ExpectedAggregateKw = SingleTokenError("Expected '" ++ Token.Id.Keyword_struct.symbol() ++ "', '" ++ Token.Id.Keyword_union.symbol() ++ "', or '" ++ Token.Id.Keyword_enum.symbol() ++ "', found '{}'");288 pub const ExpectedAggregateKw = SingleTokenError("Expected '" ++ Token.Id.Keyword_struct.symbol() ++ "', '" ++ Token.Id.Keyword_union.symbol() ++ "', or '" ++ Token.Id.Keyword_enum.symbol() ++ "', found '{}'");
285 pub const ExpectedEqOrSemi = SingleTokenError("Expected '=' or ';', found '{}'");289 pub const ExpectedEqOrSemi = SingleTokenError("Expected '=' or ';', found '{}'");
lib/std/zig/parse.zig+10-7
...@@ -360,15 +360,17 @@ fn parseTopLevelDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) Error!?...@@ -360,15 +360,17 @@ fn parseTopLevelDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) Error!?
360 try tree.errors.push(.{360 try tree.errors.push(.{
361 .ExpectedSemiOrLBrace = .{ .token = it.index },361 .ExpectedSemiOrLBrace = .{ .token = it.index },
362 });362 });
363 return null;363 return error.ParseError;
364 }364 }
365365
366 if (extern_export_inline_token) |token| {366 if (extern_export_inline_token) |token| {
367 if (tree.tokens.at(token).id == .Keyword_inline or367 if (tree.tokens.at(token).id == .Keyword_inline or
368 tree.tokens.at(token).id == .Keyword_noinline)368 tree.tokens.at(token).id == .Keyword_noinline)
369 {369 {
370 putBackToken(it, token);370 try tree.errors.push(.{
371 return null;371 .ExpectedFn = .{ .token = it.index },
372 });
373 return error.ParseError;
372 }374 }
373 }375 }
374376
...@@ -399,10 +401,11 @@ fn parseTopLevelDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) Error!?...@@ -399,10 +401,11 @@ fn parseTopLevelDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) Error!?
399 }401 }
400402
401 if (extern_export_inline_token) |token| {403 if (extern_export_inline_token) |token| {
402 if (lib_name) |string_literal_node|404 try tree.errors.push(.{
403 putBackToken(it, string_literal_node.cast(Node.StringLiteral).?.token);405 .ExpectedVarDeclOrFn = .{ .token = it.index },
404 putBackToken(it, token);406 });
405 return null;407 // ignore this and try again;
408 return error.ParseError;
406 }409 }
407410
408 return parseUse(arena, it, tree) catch |err| switch (err) {411 return parseUse(arena, it, tree) catch |err| switch (err) {
lib/std/zig/parser_test.zig+15
...@@ -84,6 +84,21 @@ test "recovery: continue after invalid decl" {...@@ -84,6 +84,21 @@ test "recovery: continue after invalid decl" {
84 });84 });
85}85}
8686
87test "recovery: invalid extern/inline" {
88 try testError(
89 \\inline test "" { a && b; }
90 , &[_]Error{
91 .ExpectedFn,
92 .InvalidAnd,
93 });
94 try testError(
95 \\extern "" test "" { a && b; }
96 , &[_]Error{
97 .ExpectedVarDeclOrFn,
98 .InvalidAnd,
99 });
100}
101
87test "zig fmt: top-level fields" {102test "zig fmt: top-level fields" {
88 try testCanonical(103 try testCanonical(
89 \\a: did_you_know,104 \\a: did_you_know,