From fb2569461182d62d297a69b1388c8328b9a56932 Mon Sep 17 00:00:00 2001 From: Isaac Freund Date: Mon, 15 Jun 2026 12:23:40 +0200 Subject: [PATCH] grammar: fix doc comment parsing /// should not be parsed as a division operator followed by a comment if it appears in a context where a division operator is accepted. Add the missing negative lookahead to the SLASH token. --- doc/langref/grammar.peg | 2 +- lib/std/zig/parser_fuzz.zig | 4 ++++ lib/std/zig/parser_generated_oracle.zig | 1 + 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/doc/langref/grammar.peg b/doc/langref/grammar.peg index 5d34b8a4868b52ee0c10bd8862da6a3b83de1d50..46e6859b6fa40ae3e63bc849fabe55d4cd97e02a 100644 --- a/doc/langref/grammar.peg +++ b/doc/langref/grammar.peg @@ -537,7 +537,7 @@ RBRACE <- skip '}' RBRACKET <- skip ']' RPAREN <- skip ')' SEMICOLON <- skip ';' -SLASH <- skip '/' ![=] +SLASH <- skip '/' ![=/] SLASHEQUAL <- skip '/=' TILDE <- skip '~' diff --git a/lib/std/zig/parser_fuzz.zig b/lib/std/zig/parser_fuzz.zig index 32ed24c6afc5d2537f429d1f3709f3f9f6ba3617..6086ed4d319c323c47718ea9a504c6419dae5499 100644 --- a/lib/std/zig/parser_fuzz.zig +++ b/lib/std/zig/parser_fuzz.zig @@ -25,6 +25,10 @@ test "operator whitespace" { \\} ); } +// Found using AFL++ +test "doc comment or division operator" { + try checkAgainstOracle("0=0///\n0"); +} fn checkAgainstOracle(source: [:0]const u8) !void { var fba_buf: [1 << 18]u8 = undefined; diff --git a/lib/std/zig/parser_generated_oracle.zig b/lib/std/zig/parser_generated_oracle.zig index bd7b581760b380e9ed08696a2896093c1bf8fa26..69f23ec3139b3a0da3ff06a82c2b1d910fcf47b4 100644 --- a/lib/std/zig/parser_generated_oracle.zig +++ b/lib/std/zig/parser_generated_oracle.zig @@ -3927,6 +3927,7 @@ const Parser = struct { const pos_1 = p.i; const match_1 = (p.i < p.source.len and switch (p.source[p.i]) { '='...'=', + '/'...'/', => blk_2: { p.i += 1; break :blk_2 true; -- 2.54.0