aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorVexu <git@vexu.eu>2020-05-15 23:38:40 +0300
committerVexu <git@vexu.eu>2020-05-15 23:50:47 +0300
commitb2f16d4484d2506d6a1e8a7d9f516f780d7fbd22 (patch)
treed268fccb56981f6f060d46f73680af77e57e1af9 /lib
parenta00fd6e25469a9929defea95425a1c312a68cf0e (diff)
downloadzig-b2f16d4484d2506d6a1e8a7d9f516f780d7fbd22.tar.gz
zig-b2f16d4484d2506d6a1e8a7d9f516f780d7fbd22.zip
fix infinite loop with mismatced bracket
Diffstat (limited to 'lib')
-rw-r--r--lib/std/zig/parse.zig9
-rw-r--r--lib/std/zig/parser_test.zig10
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,