authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-02-13 16:15:00-05:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2022-02-13 16:15:00-05:00
logf73044dae598da2b84bff7977be5a8e02093902a
tree892a4c07e5655404e94381f075f370d0e510008e
parent2a73700c0fc177fb8781b277a6ba5017dce875b9
parent0699b29ce0c5d264bf39c5f88fa6025b61ca6303
signature Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #10879 from Vexu/err

make some errors point to the end of the previous token

6 files changed, 137 insertions(+), 81 deletions(-)

lib/std/zig/Ast.zig+51-6
......@@ -64,6 +64,24 @@ pub fn renderToArrayList(tree: Ast, buffer: *std.ArrayList(u8)) RenderError!void
6464 return @import("./render.zig").renderTree(buffer, tree);
6565}
6666
67/// Returns an extra offset for column and byte offset of errors that
68/// should point after the token in the error message.
69pub fn errorOffset(tree: Ast, error_tag: Error.Tag, token: TokenIndex) u32 {
70 return switch (error_tag) {
71 .expected_semi_after_decl,
72 .expected_semi_after_stmt,
73 .expected_comma_after_field,
74 .expected_comma_after_arg,
75 .expected_comma_after_param,
76 .expected_comma_after_initializer,
77 .expected_comma_after_switch_prong,
78 .expected_semi_or_else,
79 .expected_semi_or_lbrace,
80 => @intCast(u32, tree.tokenSlice(token).len),
81 else => 0,
82 };
83}
84
6785pub fn tokenLocation(self: Ast, start_offset: ByteOffset, token_index: TokenIndex) Location {
6886 var loc = Location{
6987 .line = 0,
......@@ -216,14 +234,10 @@ pub fn renderError(tree: Ast, parse_error: Error, stream: anytype) !void {
216234 });
217235 },
218236 .expected_semi_or_else => {
219 return stream.print("expected ';' or 'else', found '{s}'", .{
220 token_tags[parse_error.token].symbol(),
221 });
237 return stream.writeAll("expected ';' or 'else' after statement");
222238 },
223239 .expected_semi_or_lbrace => {
224 return stream.print("expected ';' or '{{', found '{s}'", .{
225 token_tags[parse_error.token].symbol(),
226 });
240 return stream.writeAll("expected ';' or block after function prototype");
227241 },
228242 .expected_statement => {
229243 return stream.print("expected statement, found '{s}'", .{
......@@ -306,6 +320,28 @@ pub fn renderError(tree: Ast, parse_error: Error, stream: anytype) !void {
306320 return stream.writeAll("function prototype has parameter after varargs");
307321 },
308322
323 .expected_semi_after_decl => {
324 return stream.writeAll("expected ';' after declaration");
325 },
326 .expected_semi_after_stmt => {
327 return stream.writeAll("expected ';' after statement");
328 },
329 .expected_comma_after_field => {
330 return stream.writeAll("expected ',' after field");
331 },
332 .expected_comma_after_arg => {
333 return stream.writeAll("expected ',' after argument");
334 },
335 .expected_comma_after_param => {
336 return stream.writeAll("expected ',' after parameter");
337 },
338 .expected_comma_after_initializer => {
339 return stream.writeAll("expected ',' after initializer");
340 },
341 .expected_comma_after_switch_prong => {
342 return stream.writeAll("expected ',' after switch prong");
343 },
344
309345 .expected_token => {
310346 const found_tag = token_tags[parse_error.token];
311347 const expected_symbol = parse_error.extra.expected_tag.symbol();
......@@ -2495,6 +2531,15 @@ pub const Error = struct {
24952531 unattached_doc_comment,
24962532 varargs_nonfinal,
24972533
2534 // these have `token` set to token after which a semicolon was expected
2535 expected_semi_after_decl,
2536 expected_semi_after_stmt,
2537 expected_comma_after_field,
2538 expected_comma_after_arg,
2539 expected_comma_after_param,
2540 expected_comma_after_initializer,
2541 expected_comma_after_switch_prong,
2542
24982543 /// `expected_tag` is populated.
24992544 expected_token,
25002545 };
lib/std/zig/parse.zig+58-49
......@@ -160,6 +160,12 @@ const Parser = struct {
160160 .extra = .{ .expected_tag = expected_token },
161161 });
162162 }
163
164 fn warnExpectedAfter(p: *Parser, error_tag: AstError.Tag) error{OutOfMemory}!void {
165 @setCold(true);
166 try p.warnMsg(.{ .tag = error_tag, .token = p.tok_i - 1 });
167 }
168
163169 fn warnMsg(p: *Parser, msg: Ast.Error) error{OutOfMemory}!void {
164170 @setCold(true);
165171 try p.errors.append(p.gpa, msg);
......@@ -258,7 +264,7 @@ const Parser = struct {
258264 }
259265 // There is not allowed to be a decl after a field with no comma.
260266 // Report error but recover parser.
261 try p.warnExpected(.comma);
267 try p.warnExpectedAfter(.expected_comma_after_field);
262268 p.findNextContainerMember();
263269 }
264270 },
......@@ -361,7 +367,7 @@ const Parser = struct {
361367 }
362368 // There is not allowed to be a decl after a field with no comma.
363369 // Report error but recover parser.
364 try p.warnExpected(.comma);
370 try p.warnExpectedAfter(.expected_comma_after_field);
365371 p.findNextContainerMember();
366372 }
367373 },
......@@ -579,7 +585,7 @@ const Parser = struct {
579585 // Since parseBlock only return error.ParseError on
580586 // a missing '}' we can assume this function was
581587 // supposed to end here.
582 try p.warn(.expected_semi_or_lbrace);
588 try p.warnExpectedAfter(.expected_semi_or_lbrace);
583589 return null_node;
584590 },
585591 }
......@@ -592,7 +598,7 @@ const Parser = struct {
592598 const thread_local_token = p.eatToken(.keyword_threadlocal);
593599 const var_decl = try p.parseVarDecl();
594600 if (var_decl != 0) {
595 _ = try p.expectToken(.semicolon);
601 try p.expectSemicolon(.expected_semi_after_decl, false);
596602 return var_decl;
597603 }
598604 if (thread_local_token != null) {
......@@ -620,7 +626,7 @@ const Parser = struct {
620626 fn expectUsingNamespace(p: *Parser) !Node.Index {
621627 const usingnamespace_token = p.assertToken(.keyword_usingnamespace);
622628 const expr = try p.expectExpr();
623 _ = try p.expectToken(.semicolon);
629 try p.expectSemicolon(.expected_semi_after_decl, false);
624630 return p.addNode(.{
625631 .tag = .@"usingnamespace",
626632 .main_token = usingnamespace_token,
......@@ -857,7 +863,7 @@ const Parser = struct {
857863
858864 const var_decl = try p.parseVarDecl();
859865 if (var_decl != 0) {
860 _ = try p.expectTokenRecoverable(.semicolon);
866 try p.expectSemicolon(.expected_semi_after_decl, true);
861867 return var_decl;
862868 }
863869
......@@ -921,7 +927,7 @@ const Parser = struct {
921927
922928 const assign_expr = try p.parseAssignExpr();
923929 if (assign_expr != 0) {
924 _ = try p.expectTokenRecoverable(.semicolon);
930 try p.expectSemicolon(.expected_semi_after_stmt, true);
925931 return assign_expr;
926932 }
927933
......@@ -990,7 +996,7 @@ const Parser = struct {
990996 };
991997 _ = p.eatToken(.keyword_else) orelse {
992998 if (else_required) {
993 try p.warn(.expected_semi_or_else);
999 try p.warnExpectedAfter(.expected_semi_or_else);
9941000 }
9951001 return p.addNode(.{
9961002 .tag = .if_simple,
......@@ -1085,7 +1091,7 @@ const Parser = struct {
10851091 };
10861092 _ = p.eatToken(.keyword_else) orelse {
10871093 if (else_required) {
1088 try p.warn(.expected_semi_or_else);
1094 try p.warnExpectedAfter(.expected_semi_or_else);
10891095 }
10901096 return p.addNode(.{
10911097 .tag = .for_simple,
......@@ -1160,7 +1166,7 @@ const Parser = struct {
11601166 };
11611167 _ = p.eatToken(.keyword_else) orelse {
11621168 if (else_required) {
1163 try p.warn(.expected_semi_or_else);
1169 try p.warnExpectedAfter(.expected_semi_or_else);
11641170 }
11651171 if (cont_expr == 0) {
11661172 return p.addNode(.{
......@@ -1211,7 +1217,7 @@ const Parser = struct {
12111217 }
12121218 const assign_expr = try p.parseAssignExpr();
12131219 if (assign_expr != 0) {
1214 _ = try p.expectTokenRecoverable(.semicolon);
1220 try p.expectSemicolon(.expected_semi_after_stmt, true);
12151221 return assign_expr;
12161222 }
12171223 return null_node;
......@@ -2044,7 +2050,7 @@ const Parser = struct {
20442050 },
20452051 .colon, .r_paren, .r_bracket => return p.failExpected(.r_brace),
20462052 // Likely just a missing comma; give error but continue parsing.
2047 else => try p.warnExpected(.comma),
2053 else => try p.warnExpectedAfter(.expected_comma_after_initializer),
20482054 }
20492055 if (p.eatToken(.r_brace)) |_| break;
20502056 const next = try p.expectFieldInit();
......@@ -2085,7 +2091,7 @@ const Parser = struct {
20852091 },
20862092 .colon, .r_paren, .r_bracket => return p.failExpected(.r_brace),
20872093 // Likely just a missing comma; give error but continue parsing.
2088 else => try p.warnExpected(.comma),
2094 else => try p.warnExpectedAfter(.expected_comma_after_initializer),
20892095 }
20902096 }
20912097 const comma = (p.token_tags[p.tok_i - 2] == .comma);
......@@ -2164,7 +2170,7 @@ const Parser = struct {
21642170 },
21652171 .colon, .r_brace, .r_bracket => return p.failExpected(.r_paren),
21662172 // Likely just a missing comma; give error but continue parsing.
2167 else => try p.warnExpected(.comma),
2173 else => try p.warnExpectedAfter(.expected_comma_after_arg),
21682174 }
21692175 }
21702176 const comma = (p.token_tags[p.tok_i - 2] == .comma);
......@@ -2220,7 +2226,7 @@ const Parser = struct {
22202226 },
22212227 .colon, .r_brace, .r_bracket => return p.failExpected(.r_paren),
22222228 // Likely just a missing comma; give error but continue parsing.
2223 else => try p.warnExpected(.comma),
2229 else => try p.warnExpectedAfter(.expected_comma_after_arg),
22242230 }
22252231 }
22262232 const comma = (p.token_tags[p.tok_i - 2] == .comma);
......@@ -2461,7 +2467,7 @@ const Parser = struct {
24612467 },
24622468 .colon, .r_paren, .r_bracket => return p.failExpected(.r_brace),
24632469 // Likely just a missing comma; give error but continue parsing.
2464 else => try p.warnExpected(.comma),
2470 else => try p.warnExpectedAfter(.expected_comma_after_initializer),
24652471 }
24662472 if (p.eatToken(.r_brace)) |_| break;
24672473 const next = try p.expectFieldInit();
......@@ -2513,7 +2519,7 @@ const Parser = struct {
25132519 },
25142520 .colon, .r_paren, .r_bracket => return p.failExpected(.r_brace),
25152521 // Likely just a missing comma; give error but continue parsing.
2516 else => try p.warnExpected(.comma),
2522 else => try p.warnExpectedAfter(.expected_comma_after_initializer),
25172523 }
25182524 }
25192525 const comma = (p.token_tags[p.tok_i - 2] == .comma);
......@@ -2574,7 +2580,7 @@ const Parser = struct {
25742580 },
25752581 .colon, .r_paren, .r_bracket => return p.failExpected(.r_brace),
25762582 // Likely just a missing comma; give error but continue parsing.
2577 else => try p.warnExpected(.comma),
2583 else => try p.warnExpectedAfter(.expected_comma_after_field),
25782584 }
25792585 }
25802586 return p.addNode(.{
......@@ -3229,6 +3235,10 @@ const Parser = struct {
32293235 .rhs = p.nextToken(),
32303236 },
32313237 }),
3238 .l_brace => {
3239 // this a misplaced `.{`, handle the error somewhere else
3240 return null_node;
3241 },
32323242 else => {
32333243 p.tok_i += 1;
32343244 try p.warn(.expected_suffix_op);
......@@ -3389,7 +3399,24 @@ const Parser = struct {
33893399
33903400 /// SwitchProngList <- (SwitchProng COMMA)* SwitchProng?
33913401 fn parseSwitchProngList(p: *Parser) !Node.SubRange {
3392 return ListParseFn(parseSwitchProng)(p);
3402 const scratch_top = p.scratch.items.len;
3403 defer p.scratch.shrinkRetainingCapacity(scratch_top);
3404
3405 while (true) {
3406 const item = try parseSwitchProng(p);
3407 if (item == 0) break;
3408
3409 try p.scratch.append(p.gpa, item);
3410
3411 switch (p.token_tags[p.tok_i]) {
3412 .comma => p.tok_i += 1,
3413 // All possible delimiters.
3414 .colon, .r_paren, .r_brace, .r_bracket => break,
3415 // Likely just a missing comma; give error but continue parsing.
3416 else => try p.warnExpectedAfter(.expected_comma_after_switch_prong),
3417 }
3418 }
3419 return p.listToSpan(p.scratch.items[scratch_top..]);
33933420 }
33943421
33953422 /// ParamDeclList <- (ParamDecl COMMA)* ParamDecl?
......@@ -3415,7 +3442,7 @@ const Parser = struct {
34153442 },
34163443 .colon, .r_brace, .r_bracket => return p.failExpected(.r_paren),
34173444 // Likely just a missing comma; give error but continue parsing.
3418 else => try p.warnExpected(.comma),
3445 else => try p.warnExpectedAfter(.expected_comma_after_param),
34193446 }
34203447 }
34213448 if (varargs == .nonfinal) {
......@@ -3429,33 +3456,6 @@ const Parser = struct {
34293456 };
34303457 }
34313458
3432 const NodeParseFn = fn (p: *Parser) Error!Node.Index;
3433
3434 fn ListParseFn(comptime nodeParseFn: anytype) (fn (p: *Parser) Error!Node.SubRange) {
3435 return struct {
3436 pub fn parse(p: *Parser) Error!Node.SubRange {
3437 const scratch_top = p.scratch.items.len;
3438 defer p.scratch.shrinkRetainingCapacity(scratch_top);
3439
3440 while (true) {
3441 const item = try nodeParseFn(p);
3442 if (item == 0) break;
3443
3444 try p.scratch.append(p.gpa, item);
3445
3446 switch (p.token_tags[p.tok_i]) {
3447 .comma => p.tok_i += 1,
3448 // All possible delimiters.
3449 .colon, .r_paren, .r_brace, .r_bracket => break,
3450 // Likely just a missing comma; give error but continue parsing.
3451 else => try p.warnExpected(.comma),
3452 }
3453 }
3454 return p.listToSpan(p.scratch.items[scratch_top..]);
3455 }
3456 }.parse;
3457 }
3458
34593459 /// FnCallArguments <- LPAREN ExprList RPAREN
34603460 /// ExprList <- (Expr COMMA)* Expr?
34613461 fn parseBuiltinCall(p: *Parser) !Node.Index {
......@@ -3486,7 +3486,7 @@ const Parser = struct {
34863486 break;
34873487 },
34883488 // Likely just a missing comma; give error but continue parsing.
3489 else => try p.warnExpected(.comma),
3489 else => try p.warnExpectedAfter(.expected_comma_after_arg),
34903490 }
34913491 }
34923492 const comma = (p.token_tags[p.tok_i - 2] == .comma);
......@@ -3582,7 +3582,7 @@ const Parser = struct {
35823582 }
35833583
35843584 /// KEYWORD_if LPAREN Expr RPAREN PtrPayload? Body (KEYWORD_else Payload? Body)?
3585 fn parseIf(p: *Parser, bodyParseFn: NodeParseFn) !Node.Index {
3585 fn parseIf(p: *Parser, bodyParseFn: fn (p: *Parser) Error!Node.Index) !Node.Index {
35863586 const if_token = p.eatToken(.keyword_if) orelse return null_node;
35873587 _ = try p.expectToken(.l_paren);
35883588 const condition = try p.expectExpr();
......@@ -3670,6 +3670,15 @@ const Parser = struct {
36703670 }
36713671 }
36723672
3673 fn expectSemicolon(p: *Parser, error_tag: AstError.Tag, recoverable: bool) Error!void {
3674 if (p.token_tags[p.tok_i] == .semicolon) {
3675 _ = p.nextToken();
3676 return;
3677 }
3678 try p.warnExpectedAfter(error_tag);
3679 if (!recoverable) return error.ParseError;
3680 }
3681
36733682 fn nextToken(p: *Parser) TokenIndex {
36743683 const result = p.tok_i;
36753684 p.tok_i += 1;
src/Module.zig+2-1
......@@ -2995,13 +2995,14 @@ pub fn astGenFile(mod: *Module, file: *File) !void {
29952995 const token_starts = file.tree.tokens.items(.start);
29962996 const token_tags = file.tree.tokens.items(.tag);
29972997
2998 const extra_offset = file.tree.errorOffset(parse_err.tag, parse_err.token);
29982999 try file.tree.renderError(parse_err, msg.writer());
29993000 const err_msg = try gpa.create(ErrorMsg);
30003001 err_msg.* = .{
30013002 .src_loc = .{
30023003 .file_scope = file,
30033004 .parent_decl_node = 0,
3004 .lazy = .{ .byte_abs = token_starts[parse_err.token] },
3005 .lazy = .{ .byte_abs = token_starts[parse_err.token] + extra_offset },
30053006 },
30063007 .msg = msg.toOwnedSlice(),
30073008 };
src/main.zig+3-2
......@@ -4040,13 +4040,14 @@ fn printErrMsgToStdErr(
40404040 notes_len += 1;
40414041 }
40424042
4043 const extra_offset = tree.errorOffset(parse_error.tag, parse_error.token);
40434044 const message: Compilation.AllErrors.Message = .{
40444045 .src = .{
40454046 .src_path = path,
40464047 .msg = text,
4047 .byte_offset = @intCast(u32, start_loc.line_start),
4048 .byte_offset = @intCast(u32, start_loc.line_start) + extra_offset,
40484049 .line = @intCast(u32, start_loc.line),
4049 .column = @intCast(u32, start_loc.column),
4050 .column = @intCast(u32, start_loc.column) + extra_offset,
40504051 .source_line = source_line,
40514052 .notes = notes_buffer[0..notes_len],
40524053 },
test/compile_errors.zig+22-22
......@@ -2171,7 +2171,7 @@ pub fn addCases(ctx: *TestContext) !void {
21712171 \\ _ = x;
21722172 \\}
21732173 , &[_][]const u8{
2174 "tmp.zig:3:7: error: expected ',', found 'align'",
2174 "tmp.zig:3:6: error: expected ',' after field",
21752175 });
21762176
21772177 ctx.objErrStage1("bad alignment type",
......@@ -4704,7 +4704,7 @@ pub fn addCases(ctx: *TestContext) !void {
47044704 \\ var bad = {};
47054705 \\}
47064706 , &[_][]const u8{
4707 "tmp.zig:5:5: error: expected ';', found 'var'",
4707 "tmp.zig:4:9: error: expected ';' after statement",
47084708 });
47094709
47104710 ctx.objErrStage1("implicit semicolon - block expr",
......@@ -4715,7 +4715,7 @@ pub fn addCases(ctx: *TestContext) !void {
47154715 \\ var bad = {};
47164716 \\}
47174717 , &[_][]const u8{
4718 "tmp.zig:5:5: error: expected ';', found 'var'",
4718 "tmp.zig:4:11: error: expected ';' after statement",
47194719 });
47204720
47214721 ctx.objErrStage1("implicit semicolon - comptime statement",
......@@ -4726,7 +4726,7 @@ pub fn addCases(ctx: *TestContext) !void {
47264726 \\ var bad = {};
47274727 \\}
47284728 , &[_][]const u8{
4729 "tmp.zig:5:5: error: expected ';', found 'var'",
4729 "tmp.zig:4:18: error: expected ';' after statement",
47304730 });
47314731
47324732 ctx.objErrStage1("implicit semicolon - comptime expression",
......@@ -4737,7 +4737,7 @@ pub fn addCases(ctx: *TestContext) !void {
47374737 \\ var bad = {};
47384738 \\}
47394739 , &[_][]const u8{
4740 "tmp.zig:5:5: error: expected ';', found 'var'",
4740 "tmp.zig:4:20: error: expected ';' after statement",
47414741 });
47424742
47434743 ctx.objErrStage1("implicit semicolon - defer",
......@@ -4748,7 +4748,7 @@ pub fn addCases(ctx: *TestContext) !void {
47484748 \\ var bad = {};
47494749 \\}
47504750 , &[_][]const u8{
4751 "tmp.zig:5:5: error: expected ';', found 'var'",
4751 "tmp.zig:4:15: error: expected ';' after statement",
47524752 });
47534753
47544754 ctx.objErrStage1("implicit semicolon - if statement",
......@@ -4759,7 +4759,7 @@ pub fn addCases(ctx: *TestContext) !void {
47594759 \\ var bad = {};
47604760 \\}
47614761 , &[_][]const u8{
4762 "tmp.zig:5:5: error: expected ';' or 'else', found 'var'",
4762 "tmp.zig:4:18: error: expected ';' or 'else' after statement",
47634763 });
47644764
47654765 ctx.objErrStage1("implicit semicolon - if expression",
......@@ -4770,7 +4770,7 @@ pub fn addCases(ctx: *TestContext) !void {
47704770 \\ var bad = {};
47714771 \\}
47724772 , &[_][]const u8{
4773 "tmp.zig:5:5: error: expected ';', found 'var'",
4773 "tmp.zig:4:20: error: expected ';' after statement",
47744774 });
47754775
47764776 ctx.objErrStage1("implicit semicolon - if-else statement",
......@@ -4781,7 +4781,7 @@ pub fn addCases(ctx: *TestContext) !void {
47814781 \\ var bad = {};
47824782 \\}
47834783 , &[_][]const u8{
4784 "tmp.zig:5:5: error: expected ';', found 'var'",
4784 "tmp.zig:4:28: error: expected ';' after statement",
47854785 });
47864786
47874787 ctx.objErrStage1("implicit semicolon - if-else expression",
......@@ -4792,7 +4792,7 @@ pub fn addCases(ctx: *TestContext) !void {
47924792 \\ var bad = {};
47934793 \\}
47944794 , &[_][]const u8{
4795 "tmp.zig:5:5: error: expected ';', found 'var'",
4795 "tmp.zig:4:28: error: expected ';' after statement",
47964796 });
47974797
47984798 ctx.objErrStage1("implicit semicolon - if-else-if statement",
......@@ -4803,7 +4803,7 @@ pub fn addCases(ctx: *TestContext) !void {
48034803 \\ var bad = {};
48044804 \\}
48054805 , &[_][]const u8{
4806 "tmp.zig:5:5: error: expected ';' or 'else', found 'var'",
4806 "tmp.zig:4:37: error: expected ';' or 'else' after statement",
48074807 });
48084808
48094809 ctx.objErrStage1("implicit semicolon - if-else-if expression",
......@@ -4814,7 +4814,7 @@ pub fn addCases(ctx: *TestContext) !void {
48144814 \\ var bad = {};
48154815 \\}
48164816 , &[_][]const u8{
4817 "tmp.zig:5:5: error: expected ';', found 'var'",
4817 "tmp.zig:4:37: error: expected ';' after statement",
48184818 });
48194819
48204820 ctx.objErrStage1("implicit semicolon - if-else-if-else statement",
......@@ -4825,7 +4825,7 @@ pub fn addCases(ctx: *TestContext) !void {
48254825 \\ var bad = {};
48264826 \\}
48274827 , &[_][]const u8{
4828 "tmp.zig:5:5: error: expected ';', found 'var'",
4828 "tmp.zig:4:47: error: expected ';' after statement",
48294829 });
48304830
48314831 ctx.objErrStage1("implicit semicolon - if-else-if-else expression",
......@@ -4836,7 +4836,7 @@ pub fn addCases(ctx: *TestContext) !void {
48364836 \\ var bad = {};
48374837 \\}
48384838 , &[_][]const u8{
4839 "tmp.zig:5:5: error: expected ';', found 'var'",
4839 "tmp.zig:4:45: error: expected ';' after statement",
48404840 });
48414841
48424842 ctx.objErrStage1("implicit semicolon - test statement",
......@@ -4847,7 +4847,7 @@ pub fn addCases(ctx: *TestContext) !void {
48474847 \\ var bad = {};
48484848 \\}
48494849 , &[_][]const u8{
4850 "tmp.zig:5:5: error: expected ';' or 'else', found 'var'",
4850 "tmp.zig:4:24: error: expected ';' or 'else' after statement",
48514851 });
48524852
48534853 ctx.objErrStage1("implicit semicolon - test expression",
......@@ -4858,7 +4858,7 @@ pub fn addCases(ctx: *TestContext) !void {
48584858 \\ var bad = {};
48594859 \\}
48604860 , &[_][]const u8{
4861 "tmp.zig:5:5: error: expected ';', found 'var'",
4861 "tmp.zig:4:26: error: expected ';' after statement",
48624862 });
48634863
48644864 ctx.objErrStage1("implicit semicolon - while statement",
......@@ -4869,7 +4869,7 @@ pub fn addCases(ctx: *TestContext) !void {
48694869 \\ var bad = {};
48704870 \\}
48714871 , &[_][]const u8{
4872 "tmp.zig:5:5: error: expected ';' or 'else', found 'var'",
4872 "tmp.zig:4:21: error: expected ';' or 'else' after statement",
48734873 });
48744874
48754875 ctx.objErrStage1("implicit semicolon - while expression",
......@@ -4880,7 +4880,7 @@ pub fn addCases(ctx: *TestContext) !void {
48804880 \\ var bad = {};
48814881 \\}
48824882 , &[_][]const u8{
4883 "tmp.zig:5:5: error: expected ';', found 'var'",
4883 "tmp.zig:4:23: error: expected ';' after statement",
48844884 });
48854885
48864886 ctx.objErrStage1("implicit semicolon - while-continue statement",
......@@ -4891,7 +4891,7 @@ pub fn addCases(ctx: *TestContext) !void {
48914891 \\ var bad = {};
48924892 \\}
48934893 , &[_][]const u8{
4894 "tmp.zig:5:5: error: expected ';' or 'else', found 'var'",
4894 "tmp.zig:4:26: error: expected ';' or 'else' after statement",
48954895 });
48964896
48974897 ctx.objErrStage1("implicit semicolon - while-continue expression",
......@@ -4902,7 +4902,7 @@ pub fn addCases(ctx: *TestContext) !void {
49024902 \\ var bad = {};
49034903 \\}
49044904 , &[_][]const u8{
4905 "tmp.zig:5:5: error: expected ';', found 'var'",
4905 "tmp.zig:4:28: error: expected ';' after statement",
49064906 });
49074907
49084908 ctx.objErrStage1("implicit semicolon - for statement",
......@@ -4913,7 +4913,7 @@ pub fn addCases(ctx: *TestContext) !void {
49134913 \\ var bad = {};
49144914 \\}
49154915 , &[_][]const u8{
4916 "tmp.zig:5:5: error: expected ';' or 'else', found 'var'",
4916 "tmp.zig:4:24: error: expected ';' or 'else' after statement",
49174917 });
49184918
49194919 ctx.objErrStage1("implicit semicolon - for expression",
......@@ -4924,7 +4924,7 @@ pub fn addCases(ctx: *TestContext) !void {
49244924 \\ var bad = {};
49254925 \\}
49264926 , &[_][]const u8{
4927 "tmp.zig:5:5: error: expected ';', found 'var'",
4927 "tmp.zig:4:26: error: expected ';' after statement",
49284928 });
49294929
49304930 ctx.objErrStage1("multiple function definitions",
test/stage2/cbe.zig+1-1
......@@ -693,7 +693,7 @@ pub fn addCases(ctx: *TestContext) !void {
693693 \\ _ = E1.a;
694694 \\}
695695 , &.{
696 ":3:7: error: expected ',', found 'align'",
696 ":3:6: error: expected ',' after field",
697697 });
698698
699699 // Redundant non-exhaustive enum mark.