authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2026-09-26 19:08:11-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2026-09-26 19:33:42-04:00
log738fb7835f366dab6bc15ddbaecc0b334f2bb1f9
treed374a796e3e94740ccfe313d3c11973397bef955
parent44524cbf51a14d6eed0b81f97b2b267783038e72

Runner: more error set cleanup


1 files changed, 118 insertions(+), 51 deletions(-)

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