diff options
| author | Vexu <git@vexu.eu> | 2020-05-15 23:38:40 +0300 |
|---|---|---|
| committer | Vexu <git@vexu.eu> | 2020-05-15 23:50:47 +0300 |
| commit | b2f16d4484d2506d6a1e8a7d9f516f780d7fbd22 (patch) | |
| tree | d268fccb56981f6f060d46f73680af77e57e1af9 /lib | |
| parent | a00fd6e25469a9929defea95425a1c312a68cf0e (diff) | |
| download | zig-b2f16d4484d2506d6a1e8a7d9f516f780d7fbd22.tar.gz zig-b2f16d4484d2506d6a1e8a7d9f516f780d7fbd22.zip | |
fix infinite loop with mismatced bracket
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/std/zig/parse.zig | 9 | ||||
| -rw-r--r-- | lib/std/zig/parser_test.zig | 10 |
2 files changed, 16 insertions, 3 deletions
diff --git a/lib/std/zig/parse.zig b/lib/std/zig/parse.zig index 6e41771ecc..c3714415f3 100644 --- a/lib/std/zig/parse.zig +++ b/lib/std/zig/parse.zig @@ -69,8 +69,8 @@ fn parseRoot(arena: *Allocator, it: *TokenIterator, tree: *Tree) Allocator.Error /// <- TestDecl ContainerMembers /// / TopLevelComptime ContainerMembers /// / KEYWORD_pub? TopLevelDecl ContainerMembers -/// / KEYWORD_pub? ContainerField COMMA ContainerMembers -/// / KEYWORD_pub? ContainerField +/// / ContainerField COMMA ContainerMembers +/// / ContainerField /// / fn parseContainerMembers(arena: *Allocator, it: *TokenIterator, tree: *Tree, top_level: bool) !Node.Root.DeclList { var list = Node.Root.DeclList.init(arena); @@ -284,7 +284,10 @@ fn findNextContainerMember(it: *TokenIterator) void { } }, .LParen, .LBracket, .LBrace => level += 1, - .RParen, .RBracket, .RBrace => { + .RParen, .RBracket => { + if (level != 0) level -= 1; + }, + .RBrace => { if (level == 0) { // end of container, exit putBackToken(it, tok.index); diff --git a/lib/std/zig/parser_test.zig b/lib/std/zig/parser_test.zig index 616c1a5ea4..3dab9ac8cb 100644 --- a/lib/std/zig/parser_test.zig +++ b/lib/std/zig/parser_test.zig @@ -162,6 +162,16 @@ test "recovery: extra '}' at top level" { }); } +test "recovery: mismatched bracket at top level" { + try testError( + \\const S = struct { + \\ arr: 128]?G + \\}; + , &[_]Error{ + .ExpectedToken, + }); +} + test "zig fmt: top-level fields" { try testCanonical( \\a: did_you_know, |
