| author | |
| committer | |
| log | ec04ae6e0003a7fd35782dbc26c89f9905119aee |
| tree | df7bc6096d797624c4bf17086f02763b75f8c4bd |
| parent | d9c6669f72c6d6d12a6533282c07239deac0c9c7 |
| signature | Commit is signed but in an unrecognized format. |
3 files changed, 24 insertions(+), 7 deletions(-)
doc/langref/grammar.peg+4-3| ... | ... | @@ -527,13 +527,14 @@ NUMBERLITERAL |
| 527 | 527 | / skip [0-9] digit_float* |
| 528 | 528 | |
| 529 | 529 | |
| 530 | STRINGLITERALSINGLE <- skip ["] string_char* ["] | |
| 530 | string <- ["] string_char* ["] | |
| 531 | STRINGLITERALSINGLE <- skip string | |
| 531 | 532 | STRINGLITERAL |
| 532 | <- STRINGLITERALSINGLE | |
| 533 | <- skip string | |
| 533 | 534 | / (skip line_string)+ |
| 534 | 535 | IDENTIFIER |
| 535 | 536 | <- skip !keyword [A-Za-z_] [A-Za-z0-9_]* |
| 536 | / skip '@' STRINGLITERALSINGLE | |
| 537 | / skip '@' string | |
| 537 | 538 | BUILTINIDENTIFIER <- skip '@'[A-Za-z_][A-Za-z0-9_]* |
| 538 | 539 | |
| 539 | 540 |
lib/std/zig/parser_fuzz.zig+8| ... | ... | @@ -78,6 +78,14 @@ test "fn container field" { |
| 78 | 78 | try checkAgainstOracle("fn()0"); |
| 79 | 79 | } |
| 80 | 80 | |
| 81 | // Found using AFL++ | |
| 82 | test "at newline string" { | |
| 83 | try checkAgainstOracle( | |
| 84 | \\@ | |
| 85 | \\"" | |
| 86 | ); | |
| 87 | } | |
| 88 | ||
| 81 | 89 | fn checkAgainstOracle(source: [:0]const u8) !void { |
| 82 | 90 | var fba_buf: [1 << 18]u8 = undefined; |
| 83 | 91 | var fba: std.heap.FixedBufferAllocator = .init(&fba_buf); |
lib/std/zig/parser_generated_oracle.zig+12-4| ... | ... | @@ -2818,10 +2818,10 @@ const Parser = struct { |
| 2818 | 2818 | break :blk_0 false; |
| 2819 | 2819 | }; |
| 2820 | 2820 | } |
| 2821 | pub fn parseSTRINGLITERALSINGLE(p: *Parser) bool { | |
| 2821 | pub fn parsestring(p: *Parser) bool { | |
| 2822 | 2822 | return blk_0: { |
| 2823 | 2823 | const pos_0 = p.i; |
| 2824 | if (p.parseskip() and (p.i < p.source.len and switch (p.source[p.i]) { | |
| 2824 | if ((p.i < p.source.len and switch (p.source[p.i]) { | |
| 2825 | 2825 | '"'...'"', |
| 2826 | 2826 | => blk_1: { |
| 2827 | 2827 | p.i += 1; |
| ... | ... | @@ -2843,10 +2843,18 @@ const Parser = struct { |
| 2843 | 2843 | break :blk_0 false; |
| 2844 | 2844 | }; |
| 2845 | 2845 | } |
| 2846 | pub fn parseSTRINGLITERALSINGLE(p: *Parser) bool { | |
| 2847 | return blk_0: { | |
| 2848 | const pos_0 = p.i; | |
| 2849 | if (p.parseskip() and p.parsestring()) break :blk_0 true; | |
| 2850 | p.i = pos_0; | |
| 2851 | break :blk_0 false; | |
| 2852 | }; | |
| 2853 | } | |
| 2846 | 2854 | pub fn parseSTRINGLITERAL(p: *Parser) bool { |
| 2847 | 2855 | return blk_0: { |
| 2848 | 2856 | const pos_0 = p.i; |
| 2849 | if (p.parseSTRINGLITERALSINGLE()) break :blk_0 true; | |
| 2857 | if (p.parseskip() and p.parsestring()) break :blk_0 true; | |
| 2850 | 2858 | p.i = pos_0; |
| 2851 | 2859 | if (blk_1: { |
| 2852 | 2860 | var match_1 = false; |
| ... | ... | @@ -2902,7 +2910,7 @@ const Parser = struct { |
| 2902 | 2910 | break :blk_1 true; |
| 2903 | 2911 | } |
| 2904 | 2912 | break :blk_1 false; |
| 2905 | } and p.parseSTRINGLITERALSINGLE()) break :blk_0 true; | |
| 2913 | } and p.parsestring()) break :blk_0 true; | |
| 2906 | 2914 | p.i = pos_0; |
| 2907 | 2915 | break :blk_0 false; |
| 2908 | 2916 | }; |