Skip to content

Commit cfcf644

Browse files
committed
fix: Correct error message for invalid bytes in multiline strings
1 parent ae5b1a9 commit cfcf644

File tree

2 files changed

+48
-0
lines changed

2 files changed

+48
-0
lines changed

lib/std/zig/AstGen.zig

+34
Original file line numberDiff line numberDiff line change
@@ -13981,6 +13981,40 @@ fn lowerAstErrors(astgen: *AstGen) !void {
1398113981
var notes: std.ArrayListUnmanaged(u32) = .empty;
1398213982
defer notes.deinit(gpa);
1398313983

13984+
const token_starts = tree.tokens.items(.start);
13985+
const token_tags = tree.tokens.items(.tag);
13986+
const parse_err = tree.errors[0];
13987+
const tok = parse_err.token + @intFromBool(parse_err.token_is_prev);
13988+
const tok_start = token_starts[tok];
13989+
13990+
if (token_tags[tok] == .invalid and tree.source[tok_start] == '\\') {
13991+
const bad_off = blk: {
13992+
const tok_len: u32 = @intCast(tree.tokenSlice(tok).len);
13993+
const tok_end = tok_start + tok_len;
13994+
var idx = tok_start;
13995+
while (idx < tok_end) : (idx += 1) {
13996+
switch (tree.source[idx]) {
13997+
0x00...0x09, 0x0b...0x1f, 0x7f => break,
13998+
else => {},
13999+
}
14000+
}
14001+
break :blk idx - tok_start;
14002+
};
14003+
14004+
const byte_abs = tok_start + bad_off;
14005+
try notes.append(gpa, try astgen.errNoteTokOff(tok, bad_off, "invalid byte: '{'}'", .{
14006+
std.zig.fmtEscapes(tree.source[byte_abs..][0..1]),
14007+
}));
14008+
const err: Ast.Error = .{
14009+
.tag = Ast.Error.Tag.expected_token,
14010+
.token = tok,
14011+
.extra = .{ .expected_tag = std.zig.Token.Tag.multiline_string_literal_line },
14012+
};
14013+
msg.clearRetainingCapacity();
14014+
try tree.renderError(err, msg.writer(gpa));
14015+
return try astgen.appendErrorTokNotes(tok, "{s}", .{msg.items}, notes.items);
14016+
}
14017+
1398414018
var cur_err = tree.errors[0];
1398514019
for (tree.errors[1..]) |err| {
1398614020
if (err.is_note) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
export fn entry() void {
2+
const foo =
3+
\\const S = struct {
4+
\\ // hello
5+
\\}
6+
;
7+
_ = foo;
8+
}
9+
// error
10+
// backend=stage2
11+
// target=native
12+
//
13+
// :4:9: error: expected 'a string literal', found invalid bytes
14+
// :4:11: note: invalid byte: '\t'

0 commit comments

Comments
 (0)