@@ -13981,6 +13981,40 @@ fn lowerAstErrors(astgen: *AstGen) !void {
13981
13981
var notes: std.ArrayListUnmanaged(u32) = .empty;
13982
13982
defer notes.deinit(gpa);
13983
13983
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
+
13984
14018
var cur_err = tree.errors[0];
13985
14019
for (tree.errors[1..]) |err| {
13986
14020
if (err.is_note) {
0 commit comments