| ... | ... | @@ -1,6 +1,7 @@ |
| 1 | 1 | const assert = std.debug.assert; |
| 2 | 2 | const std = @import("std"); |
| 3 | 3 | const Runner = @This(); |
| 4 | const zig_version_string = @import("builtin").zig_version_string; |
| 4 | 5 | |
| 5 | 6 | gpa: std.mem.Allocator, |
| 6 | 7 | arena: *std.heap.ArenaAllocator, |
| ... | ... | @@ -51,24 +52,33 @@ fn deinit(runner: *Runner) void { |
| 51 | 52 | runner.* = undefined; |
| 52 | 53 | } |
| 53 | 54 | |
| 54 | | const Fallible = error{AlreadyReported} || std.mem.Allocator.Error || std.Io.Cancelable; |
| 55 | | fn fail(runner: *Runner, comptime fmt: []const u8, args: anytype) Fallible { |
| 55 | const FailError = error{AlreadyReported} || std.mem.Allocator.Error || std.Io.Cancelable; |
| 56 | fn fail(runner: *Runner, comptime fmt: []const u8, args: anytype) FailError { |
| 56 | 57 | return runner.failString(try runner.eb_wip.printString(fmt, args)); |
| 57 | 58 | } |
| 58 | | fn failString(runner: *Runner, msg: std.zig.ErrorBundle.String) Fallible { |
| 59 | fn failString(runner: *Runner, msg: std.zig.ErrorBundle.String) FailError { |
| 59 | 60 | try runner.eb_wip.addRootErrorMessage(.{ |
| 60 | 61 | .msg = msg, |
| 61 | 62 | }); |
| 62 | 63 | return error.AlreadyReported; |
| 63 | 64 | } |
| 64 | 65 | |
| 65 | | pub const ProtocolError = Fallible || std.Io.Reader.Error || std.Io.Writer.Error; |
| 66 | pub const ProtocolError = error{ |
| 67 | ServerReadFailed, |
| 68 | ServerWriteFailed, |
| 69 | ServerEndOfStream, |
| 70 | } || FailError; |
| 66 | 71 | pub fn runServer(runner: *Runner) ProtocolError { |
| 67 | | try runner.server.serveStringMessage(.zig_version, @import("builtin").zig_version_string); |
| 72 | runner.server.serveStringMessage(.zig_version, zig_version_string) catch |err| switch (err) { |
| 73 | error.WriteFailed => return error.ServerWriteFailed, |
| 74 | }; |
| 68 | 75 | while (true) { |
| 69 | 76 | _ = runner.arena.reset(.retain_capacity); |
| 70 | 77 | const arena = runner.arena.allocator(); |
| 71 | | const hdr = try runner.server.receiveMessage(); |
| 78 | const hdr = runner.server.receiveMessage() catch |err| switch (err) { |
| 79 | error.ReadFailed => return error.ServerReadFailed, |
| 80 | error.EndOfStream => return error.ServerEndOfStream, |
| 81 | }; |
| 72 | 82 | switch (hdr.tag) { |
| 73 | 83 | else => |tag| return runner.fail("unsupported message: {t}", .{tag}), |
| 74 | 84 | .exit => std.process.exit(0), |
| ... | ... | @@ -273,16 +283,20 @@ pub fn runServer(runner: *Runner) ProtocolError { |
| 273 | 283 | .query_test_metadata => { |
| 274 | 284 | const expected_panic_msgs = try arena.alloc(u32, runner.args.targets.items.len); |
| 275 | 285 | @memset(expected_panic_msgs, 0); |
| 276 | | try runner.server.serveTestMetadata(.{ |
| 286 | runner.server.serveTestMetadata(.{ |
| 277 | 287 | .names = runner.args.targets.items, |
| 278 | 288 | .expected_panic_msgs = expected_panic_msgs, |
| 279 | 289 | .string_bytes = runner.args.target_bytes.items, |
| 280 | | }); |
| 290 | }) catch |err| switch (err) { |
| 291 | error.WriteFailed => return error.ServerWriteFailed, |
| 292 | }; |
| 281 | 293 | }, |
| 282 | 294 | .run_test => { |
| 283 | 295 | const test_index = runner.server.receiveBody_u32() catch unreachable; |
| 284 | | try runner.server.serveBodylessMessage(.test_started); |
| 285 | | try runner.server.serveTestResults(.{ |
| 296 | runner.server.serveBodylessMessage(.test_started) catch |err| switch (err) { |
| 297 | error.WriteFailed => return error.ServerWriteFailed, |
| 298 | }; |
| 299 | runner.server.serveTestResults(.{ |
| 286 | 300 | .index = test_index, |
| 287 | 301 | .flags = .{ |
| 288 | 302 | .status = if (runner.testOne(test_index)) |
| ... | ... | @@ -290,14 +304,18 @@ pub fn runServer(runner: *Runner) ProtocolError { |
| 290 | 304 | else |err| status: switch (err) { |
| 291 | 305 | error.Canceled, |
| 292 | 306 | error.OutOfMemory, |
| 293 | | error.ReadFailed, |
| 294 | | error.WriteFailed, |
| 307 | error.ServerWriteFailed, |
| 295 | 308 | => |e| return e, |
| 296 | 309 | error.AlreadyReported => { |
| 297 | 310 | var eb = try runner.eb_wip.toOwnedBundle(""); |
| 298 | 311 | defer eb.deinit(runner.gpa); |
| 299 | 312 | assert(eb.errorMessageCount() > 0); // already reported what? |
| 300 | | try runner.server.serveErrorBundle(.error_bundle, eb); |
| 313 | runner.server.serveErrorBundle( |
| 314 | .error_bundle, |
| 315 | eb, |
| 316 | ) catch |server_err| switch (server_err) { |
| 317 | error.WriteFailed => return error.ServerWriteFailed, |
| 318 | }; |
| 301 | 319 | const eb_wip: std.zig.ErrorBundle.Wip = try .init(runner.gpa); |
| 302 | 320 | runner.eb_wip.deinit(); |
| 303 | 321 | runner.eb_wip = eb_wip; |
| ... | ... | @@ -309,7 +327,9 @@ pub fn runServer(runner: *Runner) ProtocolError { |
| 309 | 327 | .log_err_count = 0, |
| 310 | 328 | .leak_count = 0, |
| 311 | 329 | }, |
| 312 | | }); |
| 330 | }) catch |err| switch (err) { |
| 331 | error.WriteFailed => return error.ServerWriteFailed, |
| 332 | }; |
| 313 | 333 | assert(runner.eb_wip.root_list.items.len == 0); // failed to report |
| 314 | 334 | }, |
| 315 | 335 | } |
| ... | ... | @@ -320,6 +340,15 @@ fn discoverInput( |
| 320 | 340 | runner: *Runner, |
| 321 | 341 | dir: std.zig.Server.Message.InputDir, |
| 322 | 342 | sub_path: []const u8, |
| 343 | ) error{ServerWriteFailed}!void { |
| 344 | return runner.discoverInputInner(dir, sub_path) catch |err| switch (err) { |
| 345 | error.WriteFailed => return error.ServerWriteFailed, |
| 346 | }; |
| 347 | } |
| 348 | fn discoverInputInner( |
| 349 | runner: *Runner, |
| 350 | dir: std.zig.Server.Message.InputDir, |
| 351 | sub_path: []const u8, |
| 323 | 352 | ) std.Io.Writer.Error!void { |
| 324 | 353 | try runner.server.serveMessageHeader(.{ |
| 325 | 354 | .tag = .discovered_inputs, |
| ... | ... | @@ -435,14 +464,14 @@ pub const SourceReader = struct { |
| 435 | 464 | src_loc: []const u8, |
| 436 | 465 | comptime fmt: []const u8, |
| 437 | 466 | args: anytype, |
| 438 | | ) Fallible { |
| 467 | ) FailError { |
| 439 | 468 | return s.failString(src_loc, try s.eb_wip.printString(fmt, args)); |
| 440 | 469 | } |
| 441 | 470 | fn failString( |
| 442 | 471 | s: *SourceReader, |
| 443 | 472 | src_loc: []const u8, |
| 444 | 473 | msg: std.zig.ErrorBundle.String, |
| 445 | | ) Fallible { |
| 474 | ) FailError { |
| 446 | 475 | const line: u32, const column: u32, const source_line = src_loc: { |
| 447 | 476 | const pos = src_loc.ptr - s.interface.buffer.ptr; |
| 448 | 477 | const end = std.mem.findScalarPos(u8, s.interface.buffer, pos, '\n') orelse |
| ... | ... | @@ -531,8 +560,8 @@ const Update = struct { |
| 531 | 560 | |
| 532 | 561 | const TestError = error{ |
| 533 | 562 | SkipTest, |
| 534 | | } || Fallible || std.Io.Reader.ShortError || std.Io.Writer.Error; |
| 535 | | fn testOne(runner: *Runner, test_index: u32) TestError!void { |
| 563 | } || FailError; |
| 564 | fn testOne(runner: *Runner, test_index: u32) (error{ServerWriteFailed} || TestError)!void { |
| 536 | 565 | const target_query = |
| 537 | 566 | std.mem.sliceTo(runner.args.target_bytes.items[runner.args.targets.items[test_index]..], 0); |
| 538 | 567 | const manifest_file = runner.args.manifest_file orelse |
| ... | ... | @@ -660,16 +689,24 @@ fn testOne(runner: *Runner, test_index: u32) TestError!void { |
| 660 | 689 | error.OutOfMemory, |
| 661 | 690 | error.AlreadyReported, |
| 662 | 691 | error.SkipTest, |
| 663 | | error.WriteFailed, |
| 664 | 692 | => |e| return e, |
| 665 | | error.ReadFailed => switch (contents_impl) { |
| 693 | error.ContentsReadFailed => switch (contents_impl) { |
| 666 | 694 | .ending => unreachable, |
| 667 | | .dr => return runner.fail("unable to read manifest: {t}", .{manifest_fr.err.?}), |
| 668 | | .fr => |fr| return runner.fail("unable to read contents file: {t}", .{fr.err.?}), |
| 695 | .dr => switch (manifest_fr.err orelse return error.OutOfMemory) { |
| 696 | error.Canceled => |e| return e, |
| 697 | else => |e| return runner.fail("unable to read manifest: {t}", .{e}), |
| 698 | }, |
| 699 | .fr => |fr| switch (fr.err.?) { |
| 700 | error.Canceled => |e| return e, |
| 701 | else => |e| return runner.fail("unable to read contents file: {t}", .{e}), |
| 702 | }, |
| 669 | 703 | }, |
| 670 | 704 | }; |
| 671 | 705 | } else |err| switch (err) { |
| 672 | | error.ReadFailed => |e| return e, |
| 706 | error.ReadFailed => switch (manifest_fr.err orelse return error.OutOfMemory) { |
| 707 | error.Canceled => |e| return e, |
| 708 | else => |e| return runner.fail("unable to read manifest: {t}", .{e}), |
| 709 | }, |
| 673 | 710 | error.StreamTooLong => unreachable, |
| 674 | 711 | error.EndOfStream => if (skip_delimiter) |
| 675 | 712 | return runner.fail("manifest missing \"#}}\" delimiter", .{}), |
| ... | ... | @@ -687,7 +724,7 @@ fn handleCommand( |
| 687 | 724 | cmd: Command, |
| 688 | 725 | arg: ?[]const u8, |
| 689 | 726 | contents_r: *std.Io.Reader, |
| 690 | | ) TestError!void { |
| 727 | ) (error{ContentsReadFailed} || TestError)!void { |
| 691 | 728 | var name_buffer: [std.Progress.Node.max_name_len]u8 = undefined; |
| 692 | 729 | const cmd_prog_node = runner.prog_node.start(std.mem.print(&name_buffer, "#{t}{s}{s}", .{ |
| 693 | 730 | cmd, if (arg) |_| " " else "", arg orelse "", |
| ... | ... | @@ -702,9 +739,8 @@ fn handleCommand( |
| 702 | 739 | cmd_src_loc, |
| 703 | 740 | "\"#skip\" must appear before other commands", |
| 704 | 741 | .{}, |
| 705 | | ) else if (std.mem.eql(u8, update.target_query, arg.?)) |
| 706 | | return error.SkipTest, |
| 707 | | .exe, .lib, .obj => try runner.spawnCompiler(&update.compiler, update.src_dir, switch (cmd) { |
| 742 | ) else if (std.mem.eql(u8, update.target_query, arg.?)) return error.SkipTest, |
| 743 | .exe, .lib, .obj => runner.spawnCompiler(&update.compiler, update.src_dir, switch (cmd) { |
| 708 | 744 | else => unreachable, |
| 709 | 745 | .exe => .Exe, |
| 710 | 746 | .lib => .Lib, |
| ... | ... | @@ -746,7 +782,10 @@ fn handleCommand( |
| 746 | 782 | .mode = mode, |
| 747 | 783 | .backend = backend, |
| 748 | 784 | }; |
| 749 | | }), |
| 785 | }) catch |err| switch (err) { |
| 786 | error.Canceled, error.OutOfMemory, error.AlreadyReported => |e| return e, |
| 787 | error.ReadFailed => return error.ContentsReadFailed, |
| 788 | }, |
| 750 | 789 | .write => { |
| 751 | 790 | const file = update.src_dir.createFile(runner.io, arg.?, .{}) catch |err| switch (err) { |
| 752 | 791 | error.Canceled => |e| return e, |
| ... | ... | @@ -756,7 +795,7 @@ fn handleCommand( |
| 756 | 795 | var fw_buffer: [512]u8 = undefined; |
| 757 | 796 | var fw = file.writer(runner.io, &fw_buffer); |
| 758 | 797 | _ = contents_r.streamRemaining(&fw.interface) catch |err| switch (err) { |
| 759 | | error.ReadFailed => |e| return e, |
| 798 | error.ReadFailed => return error.ContentsReadFailed, |
| 760 | 799 | error.WriteFailed => switch (fw.err.?) { |
| 761 | 800 | error.Canceled => |e| return e, |
| 762 | 801 | else => |e| return update.manifest_sr.fail( |
| ... | ... | @@ -797,7 +836,9 @@ fn handleCommand( |
| 797 | 836 | )); |
| 798 | 837 | update.prog_node.end(); |
| 799 | 838 | update.prog_node = runner.prog_node.start( |
| 800 | | switch (try contents_r.readSliceShort(&name_buffer)) { |
| 839 | switch (contents_r.readSliceShort(&name_buffer) catch |err| switch (err) { |
| 840 | error.ReadFailed => return error.ContentsReadFailed, |
| 841 | }) { |
| 801 | 842 | 0 => switch (update.num) { |
| 802 | 843 | 0 => "initial update", |
| 803 | 844 | else => |num| std.mem.print(&name_buffer, "update {d}", .{num}) catch |
| ... | ... | @@ -807,10 +848,17 @@ fn handleCommand( |
| 807 | 848 | }, |
| 808 | 849 | 0, |
| 809 | 850 | ); |
| 810 | | _ = try contents_r.discardRemaining(); |
| 851 | _ = contents_r.discardRemaining() catch |err| switch (err) { |
| 852 | error.ReadFailed => return error.ContentsReadFailed, |
| 853 | }; |
| 811 | 854 | if (comp.state != .idle) |
| 812 | 855 | return update.manifest_sr.fail(cmd_src_loc, "missing \"#check\"", .{}); |
| 813 | | try comp.client.serveBodylessMessage(.update); |
| 856 | comp.client.serveBodylessMessage(.update) catch |err| switch (err) { |
| 857 | error.WriteFailed => switch (comp.fw.err.?) { |
| 858 | error.Canceled => |e| return e, |
| 859 | else => |e| return runner.fail("unable to send message to compiler: {t}", .{e}), |
| 860 | }, |
| 861 | }; |
| 814 | 862 | comp.state = .update; |
| 815 | 863 | update.mtime = update.mtime.addDuration(.fromSeconds(2)); |
| 816 | 864 | update.num += 1; |
| ... | ... | @@ -820,7 +868,8 @@ fn handleCommand( |
| 820 | 868 | return update.manifest_sr.fail(arg.?, "unknown check", .{}); |
| 821 | 869 | const expected = |
| 822 | 870 | contents_r.allocRemaining(runner.gpa, .unlimited) catch |err| switch (err) { |
| 823 | | error.OutOfMemory, error.ReadFailed => |e| return e, |
| 871 | error.OutOfMemory => |e| return e, |
| 872 | error.ReadFailed => return error.ContentsReadFailed, |
| 824 | 873 | error.StreamTooLong => unreachable, // .unlimited |
| 825 | 874 | }; |
| 826 | 875 | defer runner.gpa.free(expected); |
| ... | ... | @@ -860,11 +909,13 @@ fn handleCommand( |
| 860 | 909 | .errors => { |
| 861 | 910 | var error_aw: std.Io.Writer.Allocating = .init(runner.gpa); |
| 862 | 911 | defer error_aw.deinit(); |
| 863 | | try eb.renderToWriter(.{ |
| 912 | eb.renderToWriter(.{ |
| 864 | 913 | .include_reference_trace = false, |
| 865 | 914 | .include_source_line = false, |
| 866 | 915 | .include_log_text = true, |
| 867 | | }, &error_aw.writer); |
| 916 | }, &error_aw.writer) catch |err| switch (err) { |
| 917 | error.WriteFailed => return error.OutOfMemory, |
| 918 | }; |
| 868 | 919 | const actual = error_aw.written(); |
| 869 | 920 | std.mem.replaceScalar(u8, actual, '\\', '/'); |
| 870 | 921 | std.testing.expectEqualStrings(expected, actual) catch |err| switch (err) { |
| ... | ... | @@ -900,7 +951,9 @@ fn handleCommand( |
| 900 | 951 | return runner.fail("compiler failed to send terminating error_bundle", .{}); |
| 901 | 952 | }, |
| 902 | 953 | } |
| 903 | | assert(try contents_r.discardRemaining() == 0); |
| 954 | assert(contents_r.discardRemaining() catch |err| switch (err) { |
| 955 | error.ReadFailed => return error.ContentsReadFailed, |
| 956 | } == 0); |
| 904 | 957 | switch (cmd) { |
| 905 | 958 | .todo, .skip => {}, |
| 906 | 959 | else => update.allow_skip = false, |
| ... | ... | @@ -914,7 +967,7 @@ fn spawnCompiler( |
| 914 | 967 | output_mode: std.lang.OutputMode, |
| 915 | 968 | args_r: *std.Io.Reader, |
| 916 | 969 | target: Compiler.Target, |
| 917 | | ) (Fallible || std.Io.Reader.ShortError)!void { |
| 970 | ) (std.Io.Reader.ShortError || FailError)!void { |
| 918 | 971 | const gpa = runner.gpa; |
| 919 | 972 | const arena = runner.arena.allocator(); |
| 920 | 973 | if (compiler.*) |*comp| { |
| ... | ... | @@ -1072,7 +1125,7 @@ const Compiler = struct { |
| 1072 | 1125 | }; |
| 1073 | 1126 | }; |
| 1074 | 1127 | |
| 1075 | | fn receiveMessage(comp: *Compiler) Fallible!?struct { |
| 1128 | fn receiveMessage(comp: *Compiler) FailError!?struct { |
| 1076 | 1129 | tag: std.zig.Server.Message.Tag, |
| 1077 | 1130 | body: []const u8, |
| 1078 | 1131 | } { |
| ... | ... | @@ -1107,7 +1160,7 @@ const Compiler = struct { |
| 1107 | 1160 | expected: []const u8, |
| 1108 | 1161 | src_dir: std.Io.Dir, |
| 1109 | 1162 | digest: *const std.Build.Cache.BinDigest, |
| 1110 | | ) Fallible!void { |
| 1163 | ) FailError!void { |
| 1111 | 1164 | const runner = comp.runner; |
| 1112 | 1165 | const gpa = runner.gpa; |
| 1113 | 1166 | const arena = runner.arena.allocator(); |
| ... | ... | @@ -1288,7 +1341,7 @@ const Compiler = struct { |
| 1288 | 1341 | } |
| 1289 | 1342 | } |
| 1290 | 1343 | |
| 1291 | | fn compileC(parent_comp: *Compiler, src_dir: std.Io.Dir, c_path: []const u8) Fallible![]const u8 { |
| 1344 | fn compileC(parent_comp: *Compiler, src_dir: std.Io.Dir, c_path: []const u8) FailError![]const u8 { |
| 1292 | 1345 | const runner = parent_comp.runner; |
| 1293 | 1346 | const arena = runner.arena.allocator(); |
| 1294 | 1347 | var compiler: ?Compiler = null; |
| ... | ... | @@ -1308,7 +1361,10 @@ const Compiler = struct { |
| 1308 | 1361 | }; |
| 1309 | 1362 | const comp = &compiler.?; |
| 1310 | 1363 | comp.client.serveBodylessMessage(.update) catch |err| switch (err) { |
| 1311 | | error.WriteFailed => return runner.fail("unable to send message: {t}", .{comp.fw.err.?}), |
| 1364 | error.WriteFailed => switch (comp.fw.err.?) { |
| 1365 | error.Canceled => |e| return e, |
| 1366 | else => |e| return runner.fail("unable to send message: {t}", .{e}), |
| 1367 | }, |
| 1312 | 1368 | }; |
| 1313 | 1369 | comp.state = .update; |
| 1314 | 1370 | var out_path: ?[]const u8 = null; |
| ... | ... | @@ -1348,7 +1404,7 @@ const Compiler = struct { |
| 1348 | 1404 | return out_path.?; |
| 1349 | 1405 | } |
| 1350 | 1406 | |
| 1351 | | fn exit(comp: *Compiler) Fallible!void { |
| 1407 | fn exit(comp: *Compiler) FailError!void { |
| 1352 | 1408 | const runner = comp.runner; |
| 1353 | 1409 | comp.client.serveBodylessMessage(.exit) catch |err| switch (err) { |
| 1354 | 1410 | error.WriteFailed => switch (comp.fw.err.?) { |
| ... | ... | @@ -1465,9 +1521,15 @@ pub fn main(init: std.process.Init) (std.mem.Allocator.Error || std.Io.Cancelabl |
| 1465 | 1521 | defer runner.deinit(); |
| 1466 | 1522 | switch (runner.runServer()) { |
| 1467 | 1523 | error.Canceled, error.OutOfMemory => |e| return e, |
| 1468 | | error.ReadFailed => fatal("unable to receive message: {t}", .{stdin.err.?}), |
| 1469 | | error.EndOfStream => fatal("no more messages", .{}), |
| 1470 | | error.WriteFailed => fatal("unable to send message: {t}", .{stdout.err.?}), |
| 1524 | error.ServerReadFailed => switch (stdin.err.?) { |
| 1525 | error.Canceled => |e| return e, |
| 1526 | else => |e| fatal("unable to receive message: {t}", .{e}), |
| 1527 | }, |
| 1528 | error.ServerWriteFailed => switch (stdout.err.?) { |
| 1529 | error.Canceled => |e| return e, |
| 1530 | else => |e| fatal("unable to send message: {t}", .{e}), |
| 1531 | }, |
| 1532 | error.ServerEndOfStream => fatal("no more messages", .{}), |
| 1471 | 1533 | error.AlreadyReported => { |
| 1472 | 1534 | var eb = try runner.eb_wip.toOwnedBundle(""); |
| 1473 | 1535 | defer eb.deinit(init.gpa); |
| ... | ... | @@ -1590,9 +1652,15 @@ pub fn main(init: std.process.Init) (std.mem.Allocator.Error || std.Io.Cancelabl |
| 1590 | 1652 | }; |
| 1591 | 1653 | const success = runClient(init.gpa, arena, init.io, &client, &args) catch |err| switch (err) { |
| 1592 | 1654 | error.OutOfMemory => |e| return e, |
| 1593 | | error.ReadFailed => fatal("unable to receive message: {t}", .{child_reader.err.?}), |
| 1655 | error.ReadFailed => switch (child_reader.err.?) { |
| 1656 | error.Canceled => |e| return e, |
| 1657 | else => |e| fatal("unable to receive message: {t}", .{e}), |
| 1658 | }, |
| 1659 | error.WriteFailed => switch (child_writer.err.?) { |
| 1660 | error.Canceled => |e| return e, |
| 1661 | else => |e| fatal("unable to send message: {t}", .{e}), |
| 1662 | }, |
| 1594 | 1663 | error.EndOfStream => fatal("no more messages", .{}), |
| 1595 | | error.WriteFailed => fatal("unable to send message: {t}", .{child_writer.err.?}), |
| 1596 | 1664 | }; |
| 1597 | 1665 | _ = child.wait(init.io) catch |err| switch (err) { |
| 1598 | 1666 | error.Canceled => |e| return e, |
| ... | ... | @@ -1734,12 +1802,11 @@ fn runClient( |
| 1734 | 1802 | switch (hdr.tag) { |
| 1735 | 1803 | else => try client.in.discardAll(hdr.bytes_len), |
| 1736 | 1804 | .zig_version => { |
| 1737 | | const expected = @import("builtin").zig_version_string; |
| 1738 | | const actual = try client.in.take(hdr.bytes_len); |
| 1739 | | if (!std.mem.eql(u8, expected, actual)) { |
| 1805 | const actual_version = try client.in.take(hdr.bytes_len); |
| 1806 | if (!std.mem.eql(u8, zig_version_string, actual_version)) { |
| 1740 | 1807 | try stderr.print( |
| 1741 | 1808 | "error: zig version mismatch compiler test runner vs compiler: {q} vs {q}\n", |
| 1742 | | .{ expected, actual }, |
| 1809 | .{ zig_version_string, actual_version }, |
| 1743 | 1810 | ); |
| 1744 | 1811 | try stderr.flush(); |
| 1745 | 1812 | std.process.exit(1); |