| author | |
| committer | |
| log | 04cb341cbfadcc9ed22202e0e48282e92bfd3f69 |
| tree | 0d152118ad8faceb3da8940a8504ff3b91d9a647 |
| parent | 78a196d04fb2c3a978fabec4c8c236f09add591e |
| signature |
4 files changed, 11 insertions(+), 22 deletions(-)
doc/langref/grammar.peg+3-4| ... | ... | @@ -378,14 +378,14 @@ SuffixOp |
| 378 | 378 | <- LBRACKET Expr (DOT2 (Expr / !ExprPrefix) (COLON Expr)?)? RBRACKET |
| 379 | 379 | / DOT IDENTIFIER |
| 380 | 380 | / DOTASTERISK |
| 381 | / DOTQUESTIONMARK | |
| 381 | / DOT QUESTIONMARK | |
| 382 | 382 | / FnCallArguments |
| 383 | 383 | |
| 384 | 384 | SuffixOpPrefix |
| 385 | 385 | <- LBRACKET |
| 386 | 386 | / DOT IDENTIFIER |
| 387 | 387 | / DOTASTERISK |
| 388 | / DOTQUESTIONMARK | |
| 388 | / DOT QUESTIONMARK | |
| 389 | 389 | / LPAREN |
| 390 | 390 | |
| 391 | 391 | FnCallArguments <- LPAREN ExprList RPAREN |
| ... | ... | @@ -554,11 +554,10 @@ CARET <- skip '^' ![=] |
| 554 | 554 | CARETEQUAL <- skip '^=' |
| 555 | 555 | COLON <- skip ':' |
| 556 | 556 | COMMA <- skip ',' |
| 557 | DOT <- skip '.' ![*.?] | |
| 557 | DOT <- skip '.' ![*.] | |
| 558 | 558 | DOT2 <- skip '..' ![.] |
| 559 | 559 | DOT3 <- skip '...' |
| 560 | 560 | DOTASTERISK <- skip '.*' |
| 561 | DOTQUESTIONMARK <- skip '.?' | |
| 562 | 561 | EQUAL <- skip '=' ![>=] |
| 563 | 562 | EQUALEQUAL <- skip '==' |
| 564 | 563 | EQUALRARROW <- skip '=>' |
lib/std/zig/Parse.zig+1-1| ... | ... | @@ -3069,7 +3069,7 @@ fn parsePtrModifiers(p: *Parse) !PtrModifiers { |
| 3069 | 3069 | /// <- LBRACKET Expr (DOT2 Expr? (COLON Expr)?)? RBRACKET |
| 3070 | 3070 | /// / DOT IDENTIFIER |
| 3071 | 3071 | /// / DOTASTERISK |
| 3072 | /// / DOTQUESTIONMARK | |
| 3072 | /// / DOT QUESTIONMARK | |
| 3073 | 3073 | /// / FnCallArguments |
| 3074 | 3074 | /// |
| 3075 | 3075 | /// FnCallArguments <- LPAREN ExprList RPAREN |
lib/std/zig/parser_fuzz.zig+5| ... | ... | @@ -93,6 +93,11 @@ test "string lit" { |
| 93 | 93 | ); |
| 94 | 94 | } |
| 95 | 95 | |
| 96 | // Found using AFL++ | |
| 97 | test "dot question" { | |
| 98 | try checkAgainstOracle("0. ?"); | |
| 99 | } | |
| 100 | ||
| 96 | 101 | fn checkAgainstOracle(source: [:0]const u8) !void { |
| 97 | 102 | var fba_buf: [1 << 18]u8 = undefined; |
| 98 | 103 | var fba: std.heap.FixedBufferAllocator = .init(&fba_buf); |
lib/std/zig/parser_generated_oracle.zig+2-17| ... | ... | @@ -1805,7 +1805,7 @@ const Parser = struct { |
| 1805 | 1805 | p.i = pos_0; |
| 1806 | 1806 | if (p.parseDOTASTERISK()) break :blk_0 true; |
| 1807 | 1807 | p.i = pos_0; |
| 1808 | if (p.parseDOTQUESTIONMARK()) break :blk_0 true; | |
| 1808 | if (p.parseDOT() and p.parseQUESTIONMARK()) break :blk_0 true; | |
| 1809 | 1809 | p.i = pos_0; |
| 1810 | 1810 | if (p.parseFnCallArguments()) break :blk_0 true; |
| 1811 | 1811 | p.i = pos_0; |
| ... | ... | @@ -1821,7 +1821,7 @@ const Parser = struct { |
| 1821 | 1821 | p.i = pos_0; |
| 1822 | 1822 | if (p.parseDOTASTERISK()) break :blk_0 true; |
| 1823 | 1823 | p.i = pos_0; |
| 1824 | if (p.parseDOTQUESTIONMARK()) break :blk_0 true; | |
| 1824 | if (p.parseDOT() and p.parseQUESTIONMARK()) break :blk_0 true; | |
| 1825 | 1825 | p.i = pos_0; |
| 1826 | 1826 | if (p.parseLPAREN()) break :blk_0 true; |
| 1827 | 1827 | p.i = pos_0; |
| ... | ... | @@ -3211,7 +3211,6 @@ const Parser = struct { |
| 3211 | 3211 | const match_1 = (p.i < p.source.len and switch (p.source[p.i]) { |
| 3212 | 3212 | '*'...'*', |
| 3213 | 3213 | '.'...'.', |
| 3214 | '?'...'?', | |
| 3215 | 3214 | => blk_2: { |
| 3216 | 3215 | p.i += 1; |
| 3217 | 3216 | break :blk_2 true; |
| ... | ... | @@ -3279,20 +3278,6 @@ const Parser = struct { |
| 3279 | 3278 | break :blk_0 false; |
| 3280 | 3279 | }; |
| 3281 | 3280 | } |
| 3282 | pub fn parseDOTQUESTIONMARK(p: *Parser) bool { | |
| 3283 | return blk_0: { | |
| 3284 | const pos_0 = p.i; | |
| 3285 | if (p.parseskip() and blk_1: { | |
| 3286 | if (std.mem.startsWith(u8, p.source[p.i..], ".?")) { | |
| 3287 | p.i += 2; | |
| 3288 | break :blk_1 true; | |
| 3289 | } | |
| 3290 | break :blk_1 false; | |
| 3291 | }) break :blk_0 true; | |
| 3292 | p.i = pos_0; | |
| 3293 | break :blk_0 false; | |
| 3294 | }; | |
| 3295 | } | |
| 3296 | 3281 | pub fn parseEQUAL(p: *Parser) bool { |
| 3297 | 3282 | return blk_0: { |
| 3298 | 3283 | const pos_0 = p.i; |