authorgravatar for matthew.h.borkowski@gmail.comMatthew Borkowski <matthew.h.borkowski@gmail.com> 2021-09-30 01:55:21-04:00
committergravatar for mail@isaacfreund.comIsaac Freund <mail@isaacfreund.com> 2021-09-30 15:36:57+02:00
log2ed9288246821c39ae75fa21998a53b34e713cd4
tree3cd75ee423b941316bfbfa123e5495fcfe89bdce
parentba7f40c4302fe88fddc92b5b44365f74e00800ff

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


2 files changed, 14 insertions(+), 11 deletions(-)

lib/std/zig/parse.zig+6-11
...@@ -1584,18 +1584,13 @@ const Parser = struct {...@@ -1584,18 +1584,13 @@ const Parser = struct {
1584 _ = p.nextToken();1584 _ = p.nextToken();
1585 const asterisk = p.nextToken();1585 const asterisk = p.nextToken();
1586 var sentinel: Node.Index = 0;1586 var sentinel: Node.Index = 0;
1587 prefix: {1587 if (p.eatToken(.identifier)) |ident| {
1588 if (p.eatToken(.identifier)) |ident| {1588 const ident_slice = p.source[p.token_starts[ident]..p.token_starts[ident + 1]];
1589 const token_slice = p.source[p.token_starts[ident]..][0..2];1589 if (!std.mem.eql(u8, std.mem.trimRight(u8, ident_slice, &std.ascii.spaces), "c")) {
1590 if (!std.mem.eql(u8, token_slice, "c]")) {1590 p.tok_i -= 1;
1591 p.tok_i -= 1;
1592 } else {
1593 break :prefix;
1594 }
1595 }
1596 if (p.eatToken(.colon)) |_| {
1597 sentinel = try p.expectExpr();
1598 }1591 }
1592 } else if (p.eatToken(.colon)) |_| {
1593 sentinel = try p.expectExpr();
1599 }1594 }
1600 _ = try p.expectToken(.r_bracket);1595 _ = try p.expectToken(.r_bracket);
1601 const mods = try p.parsePtrModifiers();1596 const mods = try p.parsePtrModifiers();
lib/std/zig/parser_test.zig+8
...@@ -5259,6 +5259,14 @@ test "recovery: nonfinal varargs" {...@@ -5259,6 +5259,14 @@ test "recovery: nonfinal varargs" {
5259 });5259 });
5260}5260}
52615261
5262test "recovery: eof in c pointer" {
5263 try testError(
5264 \\const Ptr = [*c
5265 , &[_]Error{
5266 .expected_token,
5267 });
5268}
5269
5262const std = @import("std");5270const std = @import("std");
5263const mem = std.mem;5271const mem = std.mem;
5264const print = std.debug.print;5272const print = std.debug.print;