zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 2ed9288246821c39ae75fa21998a53b34e713cd4 (tree)
parent ba7f40c4302fe88fddc92b5b44365f74e00800ff
Author: Matthew Borkowski <matthew.h.borkowski@gmail.com>
Date:   Thu, 30 Sep 2021 01:55:21 -0400

parse.zig: better c pointer prefix parsing, don't index out of bounds on eof

Diffstat:
Mlib/std/zig/parse.zig | 17++++++-----------
Mlib/std/zig/parser_test.zig | 8++++++++
2 files changed, 14 insertions(+), 11 deletions(-)

diff --git a/lib/std/zig/parse.zig b/lib/std/zig/parse.zig @@ -1584,18 +1584,13 @@ const Parser = struct { _ = p.nextToken(); const asterisk = p.nextToken(); var sentinel: Node.Index = 0; - prefix: { - if (p.eatToken(.identifier)) |ident| { - const token_slice = p.source[p.token_starts[ident]..][0..2]; - if (!std.mem.eql(u8, token_slice, "c]")) { - p.tok_i -= 1; - } else { - break :prefix; - } - } - if (p.eatToken(.colon)) |_| { - sentinel = try p.expectExpr(); + if (p.eatToken(.identifier)) |ident| { + const ident_slice = p.source[p.token_starts[ident]..p.token_starts[ident + 1]]; + if (!std.mem.eql(u8, std.mem.trimRight(u8, ident_slice, &std.ascii.spaces), "c")) { + p.tok_i -= 1; } + } else if (p.eatToken(.colon)) |_| { + sentinel = try p.expectExpr(); } _ = try p.expectToken(.r_bracket); const mods = try p.parsePtrModifiers(); diff --git a/lib/std/zig/parser_test.zig b/lib/std/zig/parser_test.zig @@ -5259,6 +5259,14 @@ test "recovery: nonfinal varargs" { }); } +test "recovery: eof in c pointer" { + try testError( + \\const Ptr = [*c + , &[_]Error{ + .expected_token, + }); +} + const std = @import("std"); const mem = std.mem; const print = std.debug.print;