From 2ed9288246821c39ae75fa21998a53b34e713cd4 Mon Sep 17 00:00:00 2001 From: Matthew Borkowski Date: Thu, 30 Sep 2021 01:55:21 -0400 Subject: [PATCH] parse.zig: better c pointer prefix parsing, don't index out of bounds on eof --- lib/std/zig/parse.zig | 17 ++++++----------- lib/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 index 021b028455..a449f6ae0f 100644 --- 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 index 57f081decb..f69f0598dd 100644 --- 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;