| 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,14 +378,14 @@ SuffixOp |
| 378 | <- LBRACKET Expr (DOT2 (Expr / !ExprPrefix) (COLON Expr)?)? RBRACKET | 378 | <- LBRACKET Expr (DOT2 (Expr / !ExprPrefix) (COLON Expr)?)? RBRACKET |
| 379 | / DOT IDENTIFIER | 379 | / DOT IDENTIFIER |
| 380 | / DOTASTERISK | 380 | / DOTASTERISK |
| 381 | / DOTQUESTIONMARK | 381 | / DOT QUESTIONMARK |
| 382 | / FnCallArguments | 382 | / FnCallArguments |
| 383 | 383 | ||
| 384 | SuffixOpPrefix | 384 | SuffixOpPrefix |
| 385 | <- LBRACKET | 385 | <- LBRACKET |
| 386 | / DOT IDENTIFIER | 386 | / DOT IDENTIFIER |
| 387 | / DOTASTERISK | 387 | / DOTASTERISK |
| 388 | / DOTQUESTIONMARK | 388 | / DOT QUESTIONMARK |
| 389 | / LPAREN | 389 | / LPAREN |
| 390 | 390 | ||
| 391 | FnCallArguments <- LPAREN ExprList RPAREN | 391 | FnCallArguments <- LPAREN ExprList RPAREN |
| ... | @@ -554,11 +554,10 @@ CARET <- skip '^' ![=] | ... | @@ -554,11 +554,10 @@ CARET <- skip '^' ![=] |
| 554 | CARETEQUAL <- skip '^=' | 554 | CARETEQUAL <- skip '^=' |
| 555 | COLON <- skip ':' | 555 | COLON <- skip ':' |
| 556 | COMMA <- skip ',' | 556 | COMMA <- skip ',' |
| 557 | DOT <- skip '.' ![*.?] | 557 | DOT <- skip '.' ![*.] |
| 558 | DOT2 <- skip '..' ![.] | 558 | DOT2 <- skip '..' ![.] |
| 559 | DOT3 <- skip '...' | 559 | DOT3 <- skip '...' |
| 560 | DOTASTERISK <- skip '.*' | 560 | DOTASTERISK <- skip '.*' |
| 561 | DOTQUESTIONMARK <- skip '.?' | ||
| 562 | EQUAL <- skip '=' ![>=] | 561 | EQUAL <- skip '=' ![>=] |
| 563 | EQUALEQUAL <- skip '==' | 562 | EQUALEQUAL <- skip '==' |
| 564 | EQUALRARROW <- skip '=>' | 563 | EQUALRARROW <- skip '=>' |
lib/std/zig/Parse.zig+1-1| ... | @@ -3069,7 +3069,7 @@ fn parsePtrModifiers(p: *Parse) !PtrModifiers { | ... | @@ -3069,7 +3069,7 @@ fn parsePtrModifiers(p: *Parse) !PtrModifiers { |
| 3069 | /// <- LBRACKET Expr (DOT2 Expr? (COLON Expr)?)? RBRACKET | 3069 | /// <- LBRACKET Expr (DOT2 Expr? (COLON Expr)?)? RBRACKET |
| 3070 | /// / DOT IDENTIFIER | 3070 | /// / DOT IDENTIFIER |
| 3071 | /// / DOTASTERISK | 3071 | /// / DOTASTERISK |
| 3072 | /// / DOTQUESTIONMARK | 3072 | /// / DOT QUESTIONMARK |
| 3073 | /// / FnCallArguments | 3073 | /// / FnCallArguments |
| 3074 | /// | 3074 | /// |
| 3075 | /// FnCallArguments <- LPAREN ExprList RPAREN | 3075 | /// FnCallArguments <- LPAREN ExprList RPAREN |
lib/std/zig/parser_fuzz.zig+5| ... | @@ -93,6 +93,11 @@ test "string lit" { | ... | @@ -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 | fn checkAgainstOracle(source: [:0]const u8) !void { | 101 | fn checkAgainstOracle(source: [:0]const u8) !void { |
| 97 | var fba_buf: [1 << 18]u8 = undefined; | 102 | var fba_buf: [1 << 18]u8 = undefined; |
| 98 | var fba: std.heap.FixedBufferAllocator = .init(&fba_buf); | 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,7 +1805,7 @@ const Parser = struct { |
| 1805 | p.i = pos_0; | 1805 | p.i = pos_0; |
| 1806 | if (p.parseDOTASTERISK()) break :blk_0 true; | 1806 | if (p.parseDOTASTERISK()) break :blk_0 true; |
| 1807 | p.i = pos_0; | 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 | p.i = pos_0; | 1809 | p.i = pos_0; |
| 1810 | if (p.parseFnCallArguments()) break :blk_0 true; | 1810 | if (p.parseFnCallArguments()) break :blk_0 true; |
| 1811 | p.i = pos_0; | 1811 | p.i = pos_0; |
| ... | @@ -1821,7 +1821,7 @@ const Parser = struct { | ... | @@ -1821,7 +1821,7 @@ const Parser = struct { |
| 1821 | p.i = pos_0; | 1821 | p.i = pos_0; |
| 1822 | if (p.parseDOTASTERISK()) break :blk_0 true; | 1822 | if (p.parseDOTASTERISK()) break :blk_0 true; |
| 1823 | p.i = pos_0; | 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 | p.i = pos_0; | 1825 | p.i = pos_0; |
| 1826 | if (p.parseLPAREN()) break :blk_0 true; | 1826 | if (p.parseLPAREN()) break :blk_0 true; |
| 1827 | p.i = pos_0; | 1827 | p.i = pos_0; |
| ... | @@ -3211,7 +3211,6 @@ const Parser = struct { | ... | @@ -3211,7 +3211,6 @@ const Parser = struct { |
| 3211 | const match_1 = (p.i < p.source.len and switch (p.source[p.i]) { | 3211 | const match_1 = (p.i < p.source.len and switch (p.source[p.i]) { |
| 3212 | '*'...'*', | 3212 | '*'...'*', |
| 3213 | '.'...'.', | 3213 | '.'...'.', |
| 3214 | '?'...'?', | ||
| 3215 | => blk_2: { | 3214 | => blk_2: { |
| 3216 | p.i += 1; | 3215 | p.i += 1; |
| 3217 | break :blk_2 true; | 3216 | break :blk_2 true; |
| ... | @@ -3279,20 +3278,6 @@ const Parser = struct { | ... | @@ -3279,20 +3278,6 @@ const Parser = struct { |
| 3279 | break :blk_0 false; | 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 | pub fn parseEQUAL(p: *Parser) bool { | 3281 | pub fn parseEQUAL(p: *Parser) bool { |
| 3297 | return blk_0: { | 3282 | return blk_0: { |
| 3298 | const pos_0 = p.i; | 3283 | const pos_0 = p.i; |