| author | |
| committer | |
| log | 4fa5b59d4470daa595b67e36ceb8290064cbc8a7 |
| tree | 562bac1444f4159dc825dfd166c31d53c72498fe |
| parent | 775dac91494ed602061ce4a28e7da8d64a0bd18a |
| signature |
This now matches the behavior of Parse.zig3 files changed, 21 insertions(+), 3 deletions(-)
doc/langref/grammar.peg+2-1| ... | ... | @@ -318,12 +318,13 @@ CompareOpTok |
| 318 | 318 | |
| 319 | 319 | BitwiseOp <- pre_op_white BitwiseOpTok post_op_white |
| 320 | 320 | / !pre_op_white BitwiseOpTok !post_op_white |
| 321 | / pre_op_white KEYWORD_catch post_op_white Payload? | |
| 322 | / !pre_op_white KEYWORD_catch !post_op_white Payload? | |
| 321 | 323 | BitwiseOpTok |
| 322 | 324 | <- AMPERSAND ![&] |
| 323 | 325 | / CARET |
| 324 | 326 | / PIPE |
| 325 | 327 | / KEYWORD_orelse |
| 326 | / KEYWORD_catch Payload? | |
| 327 | 328 | |
| 328 | 329 | BitShiftOp <- pre_op_white BitShiftOpTok post_op_white |
| 329 | 330 | / !pre_op_white BitShiftOpTok !post_op_white |
lib/std/zig/parser_fuzz.zig+5| ... | ... | @@ -114,6 +114,11 @@ test "volatile const" { |
| 114 | 114 | try checkAgainstOracle("*volatile\nconst\n0"); |
| 115 | 115 | } |
| 116 | 116 | |
| 117 | // Found using AFL++ | |
| 118 | test "catch capture whitespace" { | |
| 119 | try checkAgainstOracle("test{0 catch |h|0;}"); | |
| 120 | } | |
| 121 | ||
| 117 | 122 | fn checkAgainstOracle(source: [:0]const u8) !void { |
| 118 | 123 | var fba_buf: [1 << 18]u8 = undefined; |
| 119 | 124 | var fba: std.heap.FixedBufferAllocator = .init(&fba_buf); |
lib/std/zig/parser_generated_oracle.zig+14-2| ... | ... | @@ -1665,6 +1665,20 @@ const Parser = struct { |
| 1665 | 1665 | break :blk_1 !match_1; |
| 1666 | 1666 | }) break :blk_0 true; |
| 1667 | 1667 | p.i = pos_0; |
| 1668 | if (try p.parsepre_op_white() and try p.parseKEYWORD_catch() and try p.parsepost_op_white() and (try p.parsePayload() or true)) break :blk_0 true; | |
| 1669 | p.i = pos_0; | |
| 1670 | if (blk_1: { | |
| 1671 | const pos_1 = p.i; | |
| 1672 | const match_1 = try p.parsepre_op_white(); | |
| 1673 | p.i = pos_1; | |
| 1674 | break :blk_1 !match_1; | |
| 1675 | } and try p.parseKEYWORD_catch() and blk_1: { | |
| 1676 | const pos_1 = p.i; | |
| 1677 | const match_1 = try p.parsepost_op_white(); | |
| 1678 | p.i = pos_1; | |
| 1679 | break :blk_1 !match_1; | |
| 1680 | } and (try p.parsePayload() or true)) break :blk_0 true; | |
| 1681 | p.i = pos_0; | |
| 1668 | 1682 | break :blk_0 false; |
| 1669 | 1683 | }; |
| 1670 | 1684 | } |
| ... | ... | @@ -1691,8 +1705,6 @@ const Parser = struct { |
| 1691 | 1705 | p.i = pos_0; |
| 1692 | 1706 | if (try p.parseKEYWORD_orelse()) break :blk_0 true; |
| 1693 | 1707 | p.i = pos_0; |
| 1694 | if (try p.parseKEYWORD_catch() and (try p.parsePayload() or true)) break :blk_0 true; | |
| 1695 | p.i = pos_0; | |
| 1696 | 1708 | break :blk_0 false; |
| 1697 | 1709 | }; |
| 1698 | 1710 | } |