authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-03-05 19:24:55-08:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-03-08 19:20:34-07:00
log80625990d5ce82b781de54c4587b489cbd2cd55f
tree76f7583b67d1e817efb0d2f401836d9a229aaf83
parent85ed81bb94ca59da49a128cb6ee5065b130ba06c

std: different mechanism for disabling network dependency

On Windows, it is sometimes problematic to depend on ws2_32.dll. Before, users of std.Io.Threaded would have to call ioBasic() rather than io() in order to avoid unnecessary dependencies on ws2_32.dll. Now, the application can disable networking with std.Options. This change is necessary due to moving networking functionality to be based on Io.Operation, which is a tagged union.

40 files changed, 122 insertions(+), 230 deletions(-)

lib/compiler/test_runner.zig+1-1
...@@ -17,7 +17,7 @@ var fba: std.heap.FixedBufferAllocator = .init(&fba_buffer);...@@ -17,7 +17,7 @@ var fba: std.heap.FixedBufferAllocator = .init(&fba_buffer);
17var fba_buffer: [8192]u8 = undefined;17var fba_buffer: [8192]u8 = undefined;
18var stdin_buffer: [4096]u8 = undefined;18var stdin_buffer: [4096]u8 = undefined;
19var stdout_buffer: [4096]u8 = undefined;19var stdout_buffer: [4096]u8 = undefined;
20const runner_threaded_io: Io = Io.Threaded.global_single_threaded.ioBasic();20const runner_threaded_io: Io = Io.Threaded.global_single_threaded.io();
2121
22/// Keep in sync with logic in `std.Build.addRunArtifact` which decides whether22/// Keep in sync with logic in `std.Build.addRunArtifact` which decides whether
23/// the test runner will communicate with the build runner via `std.zig.Server`.23/// the test runner will communicate with the build runner via `std.zig.Server`.
lib/compiler_rt.zig+1-1
...@@ -17,7 +17,7 @@ else...@@ -17,7 +17,7 @@ else
17 null;17 null;
1818
19pub const std_options_debug_io: std.Io = if (builtin.is_test)19pub const std_options_debug_io: std.Io = if (builtin.is_test)
20 std.Io.Threaded.global_single_threaded.ioBasic()20 std.Io.Threaded.global_single_threaded.io()
21else21else
22 unreachable;22 unreachable;
2323
lib/fuzzer.zig+1-1
...@@ -13,7 +13,7 @@ pub const std_options = std.Options{...@@ -13,7 +13,7 @@ pub const std_options = std.Options{
13 .logFn = logOverride,13 .logFn = logOverride,
14};14};
1515
16const io = std.Io.Threaded.global_single_threaded.ioBasic();16const io = std.Io.Threaded.global_single_threaded.io();
1717
18fn logOverride(18fn logOverride(
19 comptime level: std.log.Level,19 comptime level: std.log.Level,
lib/std/Io/Threaded.zig+19-147
...@@ -1908,142 +1908,10 @@ pub fn io(t: *Threaded) Io {...@@ -1908,142 +1908,10 @@ pub fn io(t: *Threaded) Io {
1908 };1908 };
1909}1909}
19101910
1911/// Same as `io` but disables all networking functionality, which has
1912/// an additional dependency on Windows (ws2_32).
1913pub fn ioBasic(t: *Threaded) Io {
1914 return .{
1915 .userdata = t,
1916 .vtable = &.{
1917 .crashHandler = crashHandler,
1918
1919 .async = async,
1920 .concurrent = concurrent,
1921 .await = await,
1922 .cancel = cancel,
1923
1924 .groupAsync = groupAsync,
1925 .groupConcurrent = groupConcurrent,
1926 .groupAwait = groupAwait,
1927 .groupCancel = groupCancel,
1928
1929 .recancel = recancel,
1930 .swapCancelProtection = swapCancelProtection,
1931 .checkCancel = checkCancel,
1932
1933 .futexWait = futexWait,
1934 .futexWaitUncancelable = futexWaitUncancelable,
1935 .futexWake = futexWake,
1936
1937 .operate = operate,
1938 .batchAwaitAsync = batchAwaitAsync,
1939 .batchAwaitConcurrent = batchAwaitConcurrent,
1940 .batchCancel = batchCancel,
1941
1942 .dirCreateDir = dirCreateDir,
1943 .dirCreateDirPath = dirCreateDirPath,
1944 .dirCreateDirPathOpen = dirCreateDirPathOpen,
1945 .dirStat = dirStat,
1946 .dirStatFile = dirStatFile,
1947 .dirAccess = dirAccess,
1948 .dirCreateFile = dirCreateFile,
1949 .dirCreateFileAtomic = dirCreateFileAtomic,
1950 .dirOpenFile = dirOpenFile,
1951 .dirOpenDir = dirOpenDir,
1952 .dirClose = dirClose,
1953 .dirRead = dirRead,
1954 .dirRealPath = dirRealPath,
1955 .dirRealPathFile = dirRealPathFile,
1956 .dirDeleteFile = dirDeleteFile,
1957 .dirDeleteDir = dirDeleteDir,
1958 .dirRename = dirRename,
1959 .dirRenamePreserve = dirRenamePreserve,
1960 .dirSymLink = dirSymLink,
1961 .dirReadLink = dirReadLink,
1962 .dirSetOwner = dirSetOwner,
1963 .dirSetFileOwner = dirSetFileOwner,
1964 .dirSetPermissions = dirSetPermissions,
1965 .dirSetFilePermissions = dirSetFilePermissions,
1966 .dirSetTimestamps = dirSetTimestamps,
1967 .dirHardLink = dirHardLink,
1968
1969 .fileStat = fileStat,
1970 .fileLength = fileLength,
1971 .fileClose = fileClose,
1972 .fileWritePositional = fileWritePositional,
1973 .fileWriteFileStreaming = fileWriteFileStreaming,
1974 .fileWriteFilePositional = fileWriteFilePositional,
1975 .fileReadPositional = fileReadPositional,
1976 .fileSeekBy = fileSeekBy,
1977 .fileSeekTo = fileSeekTo,
1978 .fileSync = fileSync,
1979 .fileIsTty = fileIsTty,
1980 .fileEnableAnsiEscapeCodes = fileEnableAnsiEscapeCodes,
1981 .fileSupportsAnsiEscapeCodes = fileSupportsAnsiEscapeCodes,
1982 .fileSetLength = fileSetLength,
1983 .fileSetOwner = fileSetOwner,
1984 .fileSetPermissions = fileSetPermissions,
1985 .fileSetTimestamps = fileSetTimestamps,
1986 .fileLock = fileLock,
1987 .fileTryLock = fileTryLock,
1988 .fileUnlock = fileUnlock,
1989 .fileDowngradeLock = fileDowngradeLock,
1990 .fileRealPath = fileRealPath,
1991 .fileHardLink = fileHardLink,
1992
1993 .fileMemoryMapCreate = fileMemoryMapCreate,
1994 .fileMemoryMapDestroy = fileMemoryMapDestroy,
1995 .fileMemoryMapSetLength = fileMemoryMapSetLength,
1996 .fileMemoryMapRead = fileMemoryMapRead,
1997 .fileMemoryMapWrite = fileMemoryMapWrite,
1998
1999 .processExecutableOpen = processExecutableOpen,
2000 .processExecutablePath = processExecutablePath,
2001 .lockStderr = lockStderr,
2002 .tryLockStderr = tryLockStderr,
2003 .unlockStderr = unlockStderr,
2004 .processCurrentPath = processCurrentPath,
2005 .processSetCurrentDir = processSetCurrentDir,
2006 .processSetCurrentPath = processSetCurrentPath,
2007 .processReplace = processReplace,
2008 .processReplacePath = processReplacePath,
2009 .processSpawn = processSpawn,
2010 .processSpawnPath = processSpawnPath,
2011 .childWait = childWait,
2012 .childKill = childKill,
2013
2014 .progressParentFile = progressParentFile,
2015
2016 .now = now,
2017 .clockResolution = clockResolution,
2018 .sleep = sleep,
2019
2020 .random = random,
2021 .randomSecure = randomSecure,
2022
2023 .netListenIp = netListenIpUnavailable,
2024 .netListenUnix = netListenUnixUnavailable,
2025 .netAccept = netAcceptUnavailable,
2026 .netBindIp = netBindIpUnavailable,
2027 .netConnectIp = netConnectIpUnavailable,
2028 .netSocketCreatePair = netSocketCreatePairUnavailable,
2029 .netConnectUnix = netConnectUnixUnavailable,
2030 .netClose = netCloseUnavailable,
2031 .netShutdown = netShutdownUnavailable,
2032 .netRead = netReadUnavailable,
2033 .netWrite = netWriteUnavailable,
2034 .netWriteFile = netWriteFileUnavailable,
2035 .netSend = netSendUnavailable,
2036 .netInterfaceNameResolve = netInterfaceNameResolveUnavailable,
2037 .netInterfaceName = netInterfaceNameUnavailable,
2038 .netLookup = netLookupUnavailable,
2039 },
2040 };
2041}
2042
2043pub const socket_flags_unsupported = is_darwin or native_os == .haiku;1911pub const socket_flags_unsupported = is_darwin or native_os == .haiku;
2044const have_accept4 = !socket_flags_unsupported;1912const have_accept4 = !socket_flags_unsupported;
2045const have_flock_open_flags = @hasField(posix.O, "EXLOCK");1913const have_flock_open_flags = @hasField(posix.O, "EXLOCK");
2046const have_networking = native_os != .wasi;1914const have_networking = std.options.networking and native_os != .wasi;
2047const have_flock = @TypeOf(posix.system.flock) != void;1915const have_flock = @TypeOf(posix.system.flock) != void;
2048const have_sendmmsg = native_os == .linux;1916const have_sendmmsg = native_os == .linux;
2049const have_futex = switch (builtin.cpu.arch) {1917const have_futex = switch (builtin.cpu.arch) {
...@@ -2595,7 +2463,7 @@ fn futexWait(userdata: ?*anyopaque, ptr: *const u32, expected: u32, timeout: Io....@@ -2595,7 +2463,7 @@ fn futexWait(userdata: ?*anyopaque, ptr: *const u32, expected: u32, timeout: Io.
2595 return;2463 return;
2596 }2464 }
2597 const t: *Threaded = @ptrCast(@alignCast(userdata));2465 const t: *Threaded = @ptrCast(@alignCast(userdata));
2598 const t_io = ioBasic(t);2466 const t_io = io(t);
2599 const timeout_ns: ?u64 = ns: {2467 const timeout_ns: ?u64 = ns: {
2600 const d = timeout.toDurationFromNow(t_io) orelse break :ns null;2468 const d = timeout.toDurationFromNow(t_io) orelse break :ns null;
2601 break :ns std.math.lossyCast(u64, d.raw.toNanoseconds());2469 break :ns std.math.lossyCast(u64, d.raw.toNanoseconds());
...@@ -2788,7 +2656,7 @@ fn batchAwaitAsync(userdata: ?*anyopaque, b: *Io.Batch) Io.Cancelable!void {...@@ -2788,7 +2656,7 @@ fn batchAwaitAsync(userdata: ?*anyopaque, b: *Io.Batch) Io.Cancelable!void {
2788fn batchAwaitConcurrent(userdata: ?*anyopaque, b: *Io.Batch, timeout: Io.Timeout) Io.Batch.AwaitConcurrentError!void {2656fn batchAwaitConcurrent(userdata: ?*anyopaque, b: *Io.Batch, timeout: Io.Timeout) Io.Batch.AwaitConcurrentError!void {
2789 const t: *Threaded = @ptrCast(@alignCast(userdata));2657 const t: *Threaded = @ptrCast(@alignCast(userdata));
2790 if (is_windows) {2658 if (is_windows) {
2791 const deadline: ?Io.Clock.Timestamp = timeout.toTimestamp(ioBasic(t));2659 const deadline: ?Io.Clock.Timestamp = timeout.toTimestamp(io(t));
2792 try batchDrainSubmittedWindows(t, b, true);2660 try batchDrainSubmittedWindows(t, b, true);
2793 while (b.pending.head != .none and b.completed.head == .none) {2661 while (b.pending.head != .none and b.completed.head == .none) {
2794 var delay_interval: windows.LARGE_INTEGER = interval: {2662 var delay_interval: windows.LARGE_INTEGER = interval: {
...@@ -2898,7 +2766,7 @@ fn batchAwaitConcurrent(userdata: ?*anyopaque, b: *Io.Batch, timeout: Io.Timeout...@@ -2898,7 +2766,7 @@ fn batchAwaitConcurrent(userdata: ?*anyopaque, b: *Io.Batch, timeout: Io.Timeout
2898 },2766 },
2899 else => {},2767 else => {},
2900 }2768 }
2901 const t_io = ioBasic(t);2769 const t_io = io(t);
2902 const deadline = timeout.toTimestamp(t_io);2770 const deadline = timeout.toTimestamp(t_io);
2903 while (true) {2771 while (true) {
2904 const timeout_ms: i32 = t: {2772 const timeout_ms: i32 = t: {
...@@ -3536,7 +3404,7 @@ fn dirCreateDirPathOpenPosix(...@@ -3536,7 +3404,7 @@ fn dirCreateDirPathOpenPosix(
3536 options: Dir.OpenOptions,3404 options: Dir.OpenOptions,
3537) Dir.CreateDirPathOpenError!Dir {3405) Dir.CreateDirPathOpenError!Dir {
3538 const t: *Threaded = @ptrCast(@alignCast(userdata));3406 const t: *Threaded = @ptrCast(@alignCast(userdata));
3539 const t_io = ioBasic(t);3407 const t_io = io(t);
3540 return dirOpenDirPosix(t, dir, sub_path, options) catch |err| switch (err) {3408 return dirOpenDirPosix(t, dir, sub_path, options) catch |err| switch (err) {
3541 error.FileNotFound => {3409 error.FileNotFound => {
3542 _ = try dir.createDirPathStatus(t_io, sub_path, permissions);3410 _ = try dir.createDirPathStatus(t_io, sub_path, permissions);
...@@ -3657,7 +3525,7 @@ fn dirCreateDirPathOpenWasi(...@@ -3657,7 +3525,7 @@ fn dirCreateDirPathOpenWasi(
3657 options: Dir.OpenOptions,3525 options: Dir.OpenOptions,
3658) Dir.CreateDirPathOpenError!Dir {3526) Dir.CreateDirPathOpenError!Dir {
3659 const t: *Threaded = @ptrCast(@alignCast(userdata));3527 const t: *Threaded = @ptrCast(@alignCast(userdata));
3660 const t_io = ioBasic(t);3528 const t_io = io(t);
3661 return dirOpenDirWasi(t, dir, sub_path, options) catch |err| switch (err) {3529 return dirOpenDirWasi(t, dir, sub_path, options) catch |err| switch (err) {
3662 error.FileNotFound => {3530 error.FileNotFound => {
3663 _ = try dir.createDirPathStatus(t_io, sub_path, permissions);3531 _ = try dir.createDirPathStatus(t_io, sub_path, permissions);
...@@ -4698,7 +4566,7 @@ fn dirCreateFileAtomic(...@@ -4698,7 +4566,7 @@ fn dirCreateFileAtomic(
4698 options: Dir.CreateFileAtomicOptions,4566 options: Dir.CreateFileAtomicOptions,
4699) Dir.CreateFileAtomicError!File.Atomic {4567) Dir.CreateFileAtomicError!File.Atomic {
4700 const t: *Threaded = @ptrCast(@alignCast(userdata));4568 const t: *Threaded = @ptrCast(@alignCast(userdata));
4701 const t_io = ioBasic(t);4569 const t_io = io(t);
47024570
4703 // Linux has O_TMPFILE, but linkat() does not support AT_REPLACE, so it's4571 // Linux has O_TMPFILE, but linkat() does not support AT_REPLACE, so it's
4704 // useless when we have to make up a bogus path name to do the rename()4572 // useless when we have to make up a bogus path name to do the rename()
...@@ -10326,19 +10194,19 @@ fn processExecutablePath(userdata: ?*anyopaque, out_buffer: []u8) process.Execut...@@ -10326,19 +10194,19 @@ fn processExecutablePath(userdata: ?*anyopaque, out_buffer: []u8) process.Execut
10326 const rc = std.c._NSGetExecutablePath(&symlink_path_buf, &n);10194 const rc = std.c._NSGetExecutablePath(&symlink_path_buf, &n);
10327 if (rc != 0) return error.NameTooLong;10195 if (rc != 0) return error.NameTooLong;
10328 const symlink_path = std.mem.sliceTo(&symlink_path_buf, 0);10196 const symlink_path = std.mem.sliceTo(&symlink_path_buf, 0);
10329 return Io.Dir.realPathFileAbsolute(ioBasic(t), symlink_path, out_buffer) catch |err| switch (err) {10197 return Io.Dir.realPathFileAbsolute(io(t), symlink_path, out_buffer) catch |err| switch (err) {
10330 error.NetworkNotFound => unreachable, // Windows-only10198 error.NetworkNotFound => unreachable, // Windows-only
10331 error.FileBusy => unreachable, // Windows-only10199 error.FileBusy => unreachable, // Windows-only
10332 else => |e| return e,10200 else => |e| return e,
10333 };10201 };
10334 },10202 },
10335 .linux, .serenity => return Io.Dir.readLinkAbsolute(ioBasic(t), "/proc/self/exe", out_buffer) catch |err| switch (err) {10203 .linux, .serenity => return Io.Dir.readLinkAbsolute(io(t), "/proc/self/exe", out_buffer) catch |err| switch (err) {
10336 error.UnsupportedReparsePointType => unreachable, // Windows-only10204 error.UnsupportedReparsePointType => unreachable, // Windows-only
10337 error.NetworkNotFound => unreachable, // Windows-only10205 error.NetworkNotFound => unreachable, // Windows-only
10338 error.FileBusy => unreachable, // Windows-only10206 error.FileBusy => unreachable, // Windows-only
10339 else => |e| return e,10207 else => |e| return e,
10340 },10208 },
10341 .illumos => return Io.Dir.readLinkAbsolute(ioBasic(t), "/proc/self/path/a.out", out_buffer) catch |err| switch (err) {10209 .illumos => return Io.Dir.readLinkAbsolute(io(t), "/proc/self/path/a.out", out_buffer) catch |err| switch (err) {
10342 error.UnsupportedReparsePointType => unreachable, // Windows-only10210 error.UnsupportedReparsePointType => unreachable, // Windows-only
10343 error.NetworkNotFound => unreachable, // Windows-only10211 error.NetworkNotFound => unreachable, // Windows-only
10344 error.FileBusy => unreachable, // Windows-only10212 error.FileBusy => unreachable, // Windows-only
...@@ -11700,7 +11568,7 @@ fn sleepPosix(timeout: Io.Timeout) Io.Cancelable!void {...@@ -11700,7 +11568,7 @@ fn sleepPosix(timeout: Io.Timeout) Io.Cancelable!void {
11700}11568}
1170111569
11702fn sleepWasi(t: *Threaded, timeout: Io.Timeout) Io.Cancelable!void {11570fn sleepWasi(t: *Threaded, timeout: Io.Timeout) Io.Cancelable!void {
11703 const t_io = ioBasic(t);11571 const t_io = io(t);
11704 const w = std.os.wasi;11572 const w = std.os.wasi;
1170511573
11706 const clock: w.subscription_clock_t = if (timeout.toDurationFromNow(t_io)) |d| .{11574 const clock: w.subscription_clock_t = if (timeout.toDurationFromNow(t_io)) |d| .{
...@@ -11729,7 +11597,7 @@ fn sleepWasi(t: *Threaded, timeout: Io.Timeout) Io.Cancelable!void {...@@ -11729,7 +11597,7 @@ fn sleepWasi(t: *Threaded, timeout: Io.Timeout) Io.Cancelable!void {
11729}11597}
1173011598
11731fn sleepNanosleep(t: *Threaded, timeout: Io.Timeout) Io.Cancelable!void {11599fn sleepNanosleep(t: *Threaded, timeout: Io.Timeout) Io.Cancelable!void {
11732 const t_io = ioBasic(t);11600 const t_io = io(t);
11733 const sec_type = @typeInfo(posix.timespec).@"struct".fields[0].type;11601 const sec_type = @typeInfo(posix.timespec).@"struct".fields[0].type;
11734 const nsec_type = @typeInfo(posix.timespec).@"struct".fields[1].type;11602 const nsec_type = @typeInfo(posix.timespec).@"struct".fields[1].type;
1173511603
...@@ -11961,6 +11829,7 @@ fn netListenUnixWindows(...@@ -11961,6 +11829,7 @@ fn netListenUnixWindows(
11961 options: net.UnixAddress.ListenOptions,11829 options: net.UnixAddress.ListenOptions,
11962) net.UnixAddress.ListenError!net.Socket.Handle {11830) net.UnixAddress.ListenError!net.Socket.Handle {
11963 if (!net.has_unix_sockets) return error.AddressFamilyUnsupported;11831 if (!net.has_unix_sockets) return error.AddressFamilyUnsupported;
11832 if (!have_networking) return error.NetworkDown;
11964 const t: *Threaded = @ptrCast(@alignCast(userdata));11833 const t: *Threaded = @ptrCast(@alignCast(userdata));
1196511834
11966 const socket_handle = openSocketWsa(t, posix.AF.UNIX, .{ .mode = .stream }) catch |err| switch (err) {11835 const socket_handle = openSocketWsa(t, posix.AF.UNIX, .{ .mode = .stream }) catch |err| switch (err) {
...@@ -12457,6 +12326,7 @@ fn netConnectUnixWindows(...@@ -12457,6 +12326,7 @@ fn netConnectUnixWindows(
12457 address: *const net.UnixAddress,12326 address: *const net.UnixAddress,
12458) net.UnixAddress.ConnectError!net.Socket.Handle {12327) net.UnixAddress.ConnectError!net.Socket.Handle {
12459 if (!net.has_unix_sockets) return error.AddressFamilyUnsupported;12328 if (!net.has_unix_sockets) return error.AddressFamilyUnsupported;
12329 if (!have_networking) return error.NetworkDown;
12460 const t: *Threaded = @ptrCast(@alignCast(userdata));12330 const t: *Threaded = @ptrCast(@alignCast(userdata));
1246112331
12462 const socket_handle = try openSocketWsa(t, posix.AF.UNIX, .{ .mode = .stream });12332 const socket_handle = try openSocketWsa(t, posix.AF.UNIX, .{ .mode = .stream });
...@@ -13426,7 +13296,7 @@ fn netReceiveWindowsOne(...@@ -13426,7 +13296,7 @@ fn netReceiveWindowsOne(
13426 data_buffer: []u8,13296 data_buffer: []u8,
13427 flags: net.ReceiveFlags,13297 flags: net.ReceiveFlags,
13428) net.Socket.ReceiveError!void {13298) net.Socket.ReceiveError!void {
13429 comptime assert(have_networking);13299 if (!have_networking) return error.NetworkDown;
1343013300
13431 var windows_flags: u32 =13301 var windows_flags: u32 =
13432 @as(u32, if (flags.oob) ws2_32.MSG.OOB else 0) |13302 @as(u32, if (flags.oob) ws2_32.MSG.OOB else 0) |
...@@ -13601,6 +13471,7 @@ fn netWriteWindows(...@@ -13601,6 +13471,7 @@ fn netWriteWindows(
13601 data: []const []const u8,13471 data: []const []const u8,
13602 splat: usize,13472 splat: usize,
13603) net.Stream.Writer.Error!usize {13473) net.Stream.Writer.Error!usize {
13474 if (!have_networking) return error.NetworkDown;
13604 const t: *Threaded = @ptrCast(@alignCast(userdata));13475 const t: *Threaded = @ptrCast(@alignCast(userdata));
13605 comptime assert(is_windows);13476 comptime assert(is_windows);
1360613477
...@@ -13723,6 +13594,7 @@ fn addBuf(v: []posix.iovec_const, i: *iovlen_t, bytes: []const u8) void {...@@ -13723,6 +13594,7 @@ fn addBuf(v: []posix.iovec_const, i: *iovlen_t, bytes: []const u8) void {
13723}13594}
1372413595
13725fn netClose(userdata: ?*anyopaque, handles: []const net.Socket.Handle) void {13596fn netClose(userdata: ?*anyopaque, handles: []const net.Socket.Handle) void {
13597 if (!have_networking) unreachable;
13726 const t: *Threaded = @ptrCast(@alignCast(userdata));13598 const t: *Threaded = @ptrCast(@alignCast(userdata));
13727 _ = t;13599 _ = t;
13728 switch (native_os) {13600 switch (native_os) {
...@@ -13931,7 +13803,7 @@ fn netLookupUnavailable(...@@ -13931,7 +13803,7 @@ fn netLookupUnavailable(
13931 _ = host_name;13803 _ = host_name;
13932 _ = options;13804 _ = options;
13933 const t: *Threaded = @ptrCast(@alignCast(userdata));13805 const t: *Threaded = @ptrCast(@alignCast(userdata));
13934 resolved.close(ioBasic(t));13806 resolved.close(io(t));
13935 return error.NetworkDown;13807 return error.NetworkDown;
13936}13808}
1393713809
...@@ -14214,7 +14086,7 @@ fn tryLockStderr(userdata: ?*anyopaque, terminal_mode: ?Io.Terminal.Mode) Io.Can...@@ -14214,7 +14086,7 @@ fn tryLockStderr(userdata: ?*anyopaque, terminal_mode: ?Io.Terminal.Mode) Io.Can
1421414086
14215fn initLockedStderr(t: *Threaded, terminal_mode: ?Io.Terminal.Mode) Io.Cancelable!Io.LockedStderr {14087fn initLockedStderr(t: *Threaded, terminal_mode: ?Io.Terminal.Mode) Io.Cancelable!Io.LockedStderr {
14216 if (!t.stderr_writer_initialized) {14088 if (!t.stderr_writer_initialized) {
14217 const io_t = ioBasic(t);14089 const io_t = io(t);
14218 if (is_windows) t.stderr_writer.file = .stderr();14090 if (is_windows) t.stderr_writer.file = .stderr();
14219 t.stderr_writer.io = io_t;14091 t.stderr_writer.io = io_t;
14220 t.stderr_writer_initialized = true;14092 t.stderr_writer_initialized = true;
lib/std/std.zig+4-1
...@@ -174,6 +174,9 @@ pub const Options = struct {...@@ -174,6 +174,9 @@ pub const Options = struct {
174 /// stack traces will just print an error to the relevant `Io.Writer` and return.174 /// stack traces will just print an error to the relevant `Io.Writer` and return.
175 allow_stack_tracing: bool = !@import("builtin").strip_debug_info,175 allow_stack_tracing: bool = !@import("builtin").strip_debug_info,
176176
177 /// Allows disabling networking in std.Io implementations.
178 networking: bool = true,
179
177 /// TODO This is a separate decl instead of a field as a workaround around180 /// TODO This is a separate decl instead of a field as a workaround around
178 /// compilation errors due to zig not being lazy enough.181 /// compilation errors due to zig not being lazy enough.
179 pub const logTerminalMode: fn () Io.Terminal.Mode = log.defaultTerminalMode;182 pub const logTerminalMode: fn () Io.Terminal.Mode = log.defaultTerminalMode;
...@@ -202,7 +205,7 @@ pub const Options = struct {...@@ -202,7 +205,7 @@ pub const Options = struct {
202 /// implementation based on coroutines, one likely wants `std.debug.print`205 /// implementation based on coroutines, one likely wants `std.debug.print`
203 /// to directly write to stderr without trying to interact with the code206 /// to directly write to stderr without trying to interact with the code
204 /// being debugged.207 /// being debugged.
205 pub const debug_io: Io = if (@hasDecl(root, "std_options_debug_io")) root.std_options_debug_io else debug_threaded_io.?.ioBasic();208 pub const debug_io: Io = if (@hasDecl(root, "std_options_debug_io")) root.std_options_debug_io else debug_threaded_io.?.io();
206209
207 /// Overrides `std.Io.File.Permissions`.210 /// Overrides `std.Io.File.Permissions`.
208 pub const FilePermissions: ?type = if (@hasDecl(root, "std_options_FilePermissions")) root.std_options_FilePermissions else null;211 pub const FilePermissions: ?type = if (@hasDecl(root, "std_options_FilePermissions")) root.std_options_FilePermissions else null;
lib/ubsan_rt.zig+4
...@@ -3,6 +3,10 @@ const builtin = @import("builtin");...@@ -3,6 +3,10 @@ const builtin = @import("builtin");
3const assert = std.debug.assert;3const assert = std.debug.assert;
4const panic = std.debug.panicExtra;4const panic = std.debug.panicExtra;
55
6pub const std_options: std.Options = .{
7 .networking = false,
8};
9
6const SourceLocation = extern struct {10const SourceLocation = extern struct {
7 file_name: ?[*:0]const u8,11 file_name: ?[*:0]const u8,
8 line: u32,12 line: u32,
test/incremental/add_decl+6-6
...@@ -10,7 +10,7 @@ pub fn main() !void {...@@ -10,7 +10,7 @@ pub fn main() !void {
10 try std.Io.File.stdout().writeStreamingAll(io, foo);10 try std.Io.File.stdout().writeStreamingAll(io, foo);
11}11}
12const foo = "good morning\n";12const foo = "good morning\n";
13const io = std.Io.Threaded.global_single_threaded.ioBasic();13const io = std.Io.Threaded.global_single_threaded.io();
14#expect_stdout="good morning\n"14#expect_stdout="good morning\n"
1515
16#update=add new declaration16#update=add new declaration
...@@ -21,7 +21,7 @@ pub fn main() !void {...@@ -21,7 +21,7 @@ pub fn main() !void {
21}21}
22const foo = "good morning\n";22const foo = "good morning\n";
23const bar = "good evening\n";23const bar = "good evening\n";
24const io = std.Io.Threaded.global_single_threaded.ioBasic();24const io = std.Io.Threaded.global_single_threaded.io();
25#expect_stdout="good morning\n"25#expect_stdout="good morning\n"
2626
27#update=reference new declaration27#update=reference new declaration
...@@ -32,7 +32,7 @@ pub fn main() !void {...@@ -32,7 +32,7 @@ pub fn main() !void {
32}32}
33const foo = "good morning\n";33const foo = "good morning\n";
34const bar = "good evening\n";34const bar = "good evening\n";
35const io = std.Io.Threaded.global_single_threaded.ioBasic();35const io = std.Io.Threaded.global_single_threaded.io();
36#expect_stdout="good evening\n"36#expect_stdout="good evening\n"
3737
38#update=reference missing declaration38#update=reference missing declaration
...@@ -43,7 +43,7 @@ pub fn main() !void {...@@ -43,7 +43,7 @@ pub fn main() !void {
43}43}
44const foo = "good morning\n";44const foo = "good morning\n";
45const bar = "good evening\n";45const bar = "good evening\n";
46const io = std.Io.Threaded.global_single_threaded.ioBasic();46const io = std.Io.Threaded.global_single_threaded.io();
47#expect_error=main.zig:3:52: error: use of undeclared identifier 'qux'47#expect_error=main.zig:3:52: error: use of undeclared identifier 'qux'
4848
49#update=add missing declaration49#update=add missing declaration
...@@ -55,7 +55,7 @@ pub fn main() !void {...@@ -55,7 +55,7 @@ pub fn main() !void {
55const foo = "good morning\n";55const foo = "good morning\n";
56const bar = "good evening\n";56const bar = "good evening\n";
57const qux = "good night\n";57const qux = "good night\n";
58const io = std.Io.Threaded.global_single_threaded.ioBasic();58const io = std.Io.Threaded.global_single_threaded.io();
59#expect_stdout="good night\n"59#expect_stdout="good night\n"
6060
61#update=remove unused declarations61#update=remove unused declarations
...@@ -65,5 +65,5 @@ pub fn main() !void {...@@ -65,5 +65,5 @@ pub fn main() !void {
65 try std.Io.File.stdout().writeStreamingAll(io, qux);65 try std.Io.File.stdout().writeStreamingAll(io, qux);
66}66}
67const qux = "good night\n";67const qux = "good night\n";
68const io = std.Io.Threaded.global_single_threaded.ioBasic();68const io = std.Io.Threaded.global_single_threaded.io();
69#expect_stdout="good night\n"69#expect_stdout="good night\n"
test/incremental/add_decl_namespaced+6-6
...@@ -10,7 +10,7 @@ pub fn main() !void {...@@ -10,7 +10,7 @@ pub fn main() !void {
10 try std.Io.File.stdout().writeStreamingAll(io, @This().foo);10 try std.Io.File.stdout().writeStreamingAll(io, @This().foo);
11}11}
12const foo = "good morning\n";12const foo = "good morning\n";
13const io = std.Io.Threaded.global_single_threaded.ioBasic();13const io = std.Io.Threaded.global_single_threaded.io();
14#expect_stdout="good morning\n"14#expect_stdout="good morning\n"
1515
16#update=add new declaration16#update=add new declaration
...@@ -21,7 +21,7 @@ pub fn main() !void {...@@ -21,7 +21,7 @@ pub fn main() !void {
21}21}
22const foo = "good morning\n";22const foo = "good morning\n";
23const bar = "good evening\n";23const bar = "good evening\n";
24const io = std.Io.Threaded.global_single_threaded.ioBasic();24const io = std.Io.Threaded.global_single_threaded.io();
25#expect_stdout="good morning\n"25#expect_stdout="good morning\n"
2626
27#update=reference new declaration27#update=reference new declaration
...@@ -32,7 +32,7 @@ pub fn main() !void {...@@ -32,7 +32,7 @@ pub fn main() !void {
32}32}
33const foo = "good morning\n";33const foo = "good morning\n";
34const bar = "good evening\n";34const bar = "good evening\n";
35const io = std.Io.Threaded.global_single_threaded.ioBasic();35const io = std.Io.Threaded.global_single_threaded.io();
36#expect_stdout="good evening\n"36#expect_stdout="good evening\n"
3737
38#update=reference missing declaration38#update=reference missing declaration
...@@ -43,7 +43,7 @@ pub fn main() !void {...@@ -43,7 +43,7 @@ pub fn main() !void {
43}43}
44const foo = "good morning\n";44const foo = "good morning\n";
45const bar = "good evening\n";45const bar = "good evening\n";
46const io = std.Io.Threaded.global_single_threaded.ioBasic();46const io = std.Io.Threaded.global_single_threaded.io();
47#expect_error=main.zig:3:59: error: root source file struct 'main' has no member named 'qux'47#expect_error=main.zig:3:59: error: root source file struct 'main' has no member named 'qux'
48#expect_error=main.zig:1:1: note: struct declared here48#expect_error=main.zig:1:1: note: struct declared here
4949
...@@ -56,7 +56,7 @@ pub fn main() !void {...@@ -56,7 +56,7 @@ pub fn main() !void {
56const foo = "good morning\n";56const foo = "good morning\n";
57const bar = "good evening\n";57const bar = "good evening\n";
58const qux = "good night\n";58const qux = "good night\n";
59const io = std.Io.Threaded.global_single_threaded.ioBasic();59const io = std.Io.Threaded.global_single_threaded.io();
60#expect_stdout="good night\n"60#expect_stdout="good night\n"
6161
62#update=remove unused declarations62#update=remove unused declarations
...@@ -66,5 +66,5 @@ pub fn main() !void {...@@ -66,5 +66,5 @@ pub fn main() !void {
66 try std.Io.File.stdout().writeStreamingAll(io, @This().qux);66 try std.Io.File.stdout().writeStreamingAll(io, @This().qux);
67}67}
68const qux = "good night\n";68const qux = "good night\n";
69const io = std.Io.Threaded.global_single_threaded.ioBasic();69const io = std.Io.Threaded.global_single_threaded.io();
70#expect_stdout="good night\n"70#expect_stdout="good night\n"
test/incremental/bad_import+2-2
...@@ -11,7 +11,7 @@ pub fn main() !void {...@@ -11,7 +11,7 @@ pub fn main() !void {
11 try std.Io.File.stdout().writeStreamingAll(io, "success\n");11 try std.Io.File.stdout().writeStreamingAll(io, "success\n");
12}12}
13const std = @import("std");13const std = @import("std");
14const io = std.Io.Threaded.global_single_threaded.ioBasic();14const io = std.Io.Threaded.global_single_threaded.io();
15#file=foo.zig15#file=foo.zig
16comptime {16comptime {
17 _ = @import("bad.zig");17 _ = @import("bad.zig");
...@@ -34,5 +34,5 @@ pub fn main() !void {...@@ -34,5 +34,5 @@ pub fn main() !void {
34 try std.Io.File.stdout().writeStreamingAll(io, "success\n");34 try std.Io.File.stdout().writeStreamingAll(io, "success\n");
35}35}
36const std = @import("std");36const std = @import("std");
37const io = std.Io.Threaded.global_single_threaded.ioBasic();37const io = std.Io.Threaded.global_single_threaded.io();
38#expect_stdout="success\n"38#expect_stdout="success\n"
test/incremental/change_embed_file+3-3
...@@ -10,7 +10,7 @@ const string = @embedFile("string.txt");...@@ -10,7 +10,7 @@ const string = @embedFile("string.txt");
10pub fn main() !void {10pub fn main() !void {
11 try std.Io.File.stdout().writeStreamingAll(io, string);11 try std.Io.File.stdout().writeStreamingAll(io, string);
12}12}
13const io = std.Io.Threaded.global_single_threaded.ioBasic();13const io = std.Io.Threaded.global_single_threaded.io();
14#file=string.txt14#file=string.txt
15Hello, World!15Hello, World!
16#expect_stdout="Hello, World!\n"16#expect_stdout="Hello, World!\n"
...@@ -31,7 +31,7 @@ const string = @embedFile("string.txt");...@@ -31,7 +31,7 @@ const string = @embedFile("string.txt");
31pub fn main() !void {31pub fn main() !void {
32 try std.Io.File.stdout().writeStreamingAll(io, "a hardcoded string\n");32 try std.Io.File.stdout().writeStreamingAll(io, "a hardcoded string\n");
33}33}
34const io = std.Io.Threaded.global_single_threaded.ioBasic();34const io = std.Io.Threaded.global_single_threaded.io();
35#expect_stdout="a hardcoded string\n"35#expect_stdout="a hardcoded string\n"
3636
37#update=re-introduce reference to file37#update=re-introduce reference to file
...@@ -41,7 +41,7 @@ const string = @embedFile("string.txt");...@@ -41,7 +41,7 @@ const string = @embedFile("string.txt");
41pub fn main() !void {41pub fn main() !void {
42 try std.Io.File.stdout().writeStreamingAll(io, string);42 try std.Io.File.stdout().writeStreamingAll(io, string);
43}43}
44const io = std.Io.Threaded.global_single_threaded.ioBasic();44const io = std.Io.Threaded.global_single_threaded.io();
45#expect_error=main.zig:2:27: error: unable to open 'string.txt': FileNotFound45#expect_error=main.zig:2:27: error: unable to open 'string.txt': FileNotFound
4646
47#update=recreate file47#update=recreate file
test/incremental/change_enum_tag_type+3-3
...@@ -19,7 +19,7 @@ pub fn main() !void {...@@ -19,7 +19,7 @@ pub fn main() !void {
19 try stdout_writer.interface.print("{s}\n", .{@tagName(val)});19 try stdout_writer.interface.print("{s}\n", .{@tagName(val)});
20}20}
21const std = @import("std");21const std = @import("std");
22const io = std.Io.Threaded.global_single_threaded.ioBasic();22const io = std.Io.Threaded.global_single_threaded.io();
23#expect_stdout="a\n"23#expect_stdout="a\n"
24#update=too many enum fields24#update=too many enum fields
25#file=main.zig25#file=main.zig
...@@ -43,7 +43,7 @@ comptime {...@@ -43,7 +43,7 @@ comptime {
43 std.debug.assert(@TypeOf(@intFromEnum(Foo.e)) == Tag);43 std.debug.assert(@TypeOf(@intFromEnum(Foo.e)) == Tag);
44}44}
45const std = @import("std");45const std = @import("std");
46const io = std.Io.Threaded.global_single_threaded.ioBasic();46const io = std.Io.Threaded.global_single_threaded.io();
47#expect_error=main.zig:7:5: error: enumeration value '4' too large for type 'u2'47#expect_error=main.zig:7:5: error: enumeration value '4' too large for type 'u2'
48#update=increase tag size48#update=increase tag size
49#file=main.zig49#file=main.zig
...@@ -62,5 +62,5 @@ pub fn main() !void {...@@ -62,5 +62,5 @@ pub fn main() !void {
62 try stdout_writer.interface.print("{s}\n", .{@tagName(val)});62 try stdout_writer.interface.print("{s}\n", .{@tagName(val)});
63}63}
64const std = @import("std");64const std = @import("std");
65const io = std.Io.Threaded.global_single_threaded.ioBasic();65const io = std.Io.Threaded.global_single_threaded.io();
66#expect_stdout="a\n"66#expect_stdout="a\n"
test/incremental/change_exports+6-6
...@@ -21,7 +21,7 @@ pub fn main() !void {...@@ -21,7 +21,7 @@ pub fn main() !void {
21 try stdout_writer.interface.print("{}\n", .{S.bar});21 try stdout_writer.interface.print("{}\n", .{S.bar});
22}22}
23const std = @import("std");23const std = @import("std");
24const io = std.Io.Threaded.global_single_threaded.ioBasic();24const io = std.Io.Threaded.global_single_threaded.io();
25#expect_stdout="123\n"25#expect_stdout="123\n"
2626
27#update=add conflict27#update=add conflict
...@@ -44,7 +44,7 @@ pub fn main() !void {...@@ -44,7 +44,7 @@ pub fn main() !void {
44 try stdout_writer.interface.print("{} {}\n", .{ S.bar, S.other });44 try stdout_writer.interface.print("{} {}\n", .{ S.bar, S.other });
45}45}
46const std = @import("std");46const std = @import("std");
47const io = std.Io.Threaded.global_single_threaded.ioBasic();47const io = std.Io.Threaded.global_single_threaded.io();
48#expect_error=main.zig:6:5: error: exported symbol collision: foo48#expect_error=main.zig:6:5: error: exported symbol collision: foo
49#expect_error=main.zig:1:1: note: other symbol here49#expect_error=main.zig:1:1: note: other symbol here
5050
...@@ -68,7 +68,7 @@ pub fn main() !void {...@@ -68,7 +68,7 @@ pub fn main() !void {
68 try stdout_writer.interface.print("{} {}\n", .{ S.bar, S.other });68 try stdout_writer.interface.print("{} {}\n", .{ S.bar, S.other });
69}69}
70const std = @import("std");70const std = @import("std");
71const io = std.Io.Threaded.global_single_threaded.ioBasic();71const io = std.Io.Threaded.global_single_threaded.io();
72#expect_stdout="123 456\n"72#expect_stdout="123 456\n"
7373
74#update=put exports in decl74#update=put exports in decl
...@@ -94,7 +94,7 @@ pub fn main() !void {...@@ -94,7 +94,7 @@ pub fn main() !void {
94 try stdout_writer.interface.print("{} {}\n", .{ S.bar, S.other });94 try stdout_writer.interface.print("{} {}\n", .{ S.bar, S.other });
95}95}
96const std = @import("std");96const std = @import("std");
97const io = std.Io.Threaded.global_single_threaded.ioBasic();97const io = std.Io.Threaded.global_single_threaded.io();
98#expect_stdout="123 456\n"98#expect_stdout="123 456\n"
9999
100#update=remove reference to exporting decl100#update=remove reference to exporting decl
...@@ -141,7 +141,7 @@ pub fn main() !void {...@@ -141,7 +141,7 @@ pub fn main() !void {
141 try stdout_writer.interface.print("{} {}\n", .{ S.bar, S.other });141 try stdout_writer.interface.print("{} {}\n", .{ S.bar, S.other });
142}142}
143const std = @import("std");143const std = @import("std");
144const io = std.Io.Threaded.global_single_threaded.ioBasic();144const io = std.Io.Threaded.global_single_threaded.io();
145#expect_stdout="123 456\n"145#expect_stdout="123 456\n"
146146
147#update=reintroduce reference to exporting decl, introducing conflict147#update=reintroduce reference to exporting decl, introducing conflict
...@@ -167,7 +167,7 @@ pub fn main() !void {...@@ -167,7 +167,7 @@ pub fn main() !void {
167 try stdout_writer.interface.print("{} {}\n", .{ S.bar, S.other });167 try stdout_writer.interface.print("{} {}\n", .{ S.bar, S.other });
168}168}
169const std = @import("std");169const std = @import("std");
170const io = std.Io.Threaded.global_single_threaded.ioBasic();170const io = std.Io.Threaded.global_single_threaded.io();
171#expect_error=main.zig:5:5: error: exported symbol collision: bar171#expect_error=main.zig:5:5: error: exported symbol collision: bar
172#expect_error=main.zig:2:1: note: other symbol here172#expect_error=main.zig:2:1: note: other symbol here
173#expect_error=main.zig:6:5: error: exported symbol collision: other173#expect_error=main.zig:6:5: error: exported symbol collision: other
test/incremental/change_fn_type+3-3
...@@ -12,7 +12,7 @@ fn foo(x: u8) !void {...@@ -12,7 +12,7 @@ fn foo(x: u8) !void {
12 return stdout_writer.interface.print("{d}\n", .{x});12 return stdout_writer.interface.print("{d}\n", .{x});
13}13}
14const std = @import("std");14const std = @import("std");
15const io = std.Io.Threaded.global_single_threaded.ioBasic();15const io = std.Io.Threaded.global_single_threaded.io();
16#expect_stdout="123\n"16#expect_stdout="123\n"
1717
18#update=change function type18#update=change function type
...@@ -25,7 +25,7 @@ fn foo(x: i64) !void {...@@ -25,7 +25,7 @@ fn foo(x: i64) !void {
25 return stdout_writer.interface.print("{d}\n", .{x});25 return stdout_writer.interface.print("{d}\n", .{x});
26}26}
27const std = @import("std");27const std = @import("std");
28const io = std.Io.Threaded.global_single_threaded.ioBasic();28const io = std.Io.Threaded.global_single_threaded.io();
29#expect_stdout="123\n"29#expect_stdout="123\n"
3030
31#update=change function argument31#update=change function argument
...@@ -38,5 +38,5 @@ fn foo(x: i64) !void {...@@ -38,5 +38,5 @@ fn foo(x: i64) !void {
38 return stdout_writer.interface.print("{d}\n", .{x});38 return stdout_writer.interface.print("{d}\n", .{x});
39}39}
40const std = @import("std");40const std = @import("std");
41const io = std.Io.Threaded.global_single_threaded.ioBasic();41const io = std.Io.Threaded.global_single_threaded.io();
42#expect_stdout="-42\n"42#expect_stdout="-42\n"
test/incremental/change_generic_line_number+2-2
...@@ -4,7 +4,7 @@...@@ -4,7 +4,7 @@
4#update=initial version4#update=initial version
5#file=main.zig5#file=main.zig
6const std = @import("std");6const std = @import("std");
7const io = std.Io.Threaded.global_single_threaded.ioBasic();7const io = std.Io.Threaded.global_single_threaded.io();
8fn Printer(message: []const u8) type {8fn Printer(message: []const u8) type {
9 return struct {9 return struct {
10 fn print() !void {10 fn print() !void {
...@@ -20,7 +20,7 @@ pub fn main() !void {...@@ -20,7 +20,7 @@ pub fn main() !void {
20#update=change line number20#update=change line number
21#file=main.zig21#file=main.zig
22const std = @import("std");22const std = @import("std");
23const io = std.Io.Threaded.global_single_threaded.ioBasic();23const io = std.Io.Threaded.global_single_threaded.io();
2424
25fn Printer(message: []const u8) type {25fn Printer(message: []const u8) type {
26 return struct {26 return struct {
test/incremental/change_line_number+2-2
...@@ -7,7 +7,7 @@ const std = @import("std");...@@ -7,7 +7,7 @@ const std = @import("std");
7pub fn main() !void {7pub fn main() !void {
8 try std.Io.File.stdout().writeStreamingAll(io, "foo\n");8 try std.Io.File.stdout().writeStreamingAll(io, "foo\n");
9}9}
10const io = std.Io.Threaded.global_single_threaded.ioBasic();10const io = std.Io.Threaded.global_single_threaded.io();
11#expect_stdout="foo\n"11#expect_stdout="foo\n"
12#update=change line number12#update=change line number
13#file=main.zig13#file=main.zig
...@@ -16,5 +16,5 @@ const std = @import("std");...@@ -16,5 +16,5 @@ const std = @import("std");
16pub fn main() !void {16pub fn main() !void {
17 try std.Io.File.stdout().writeStreamingAll(io, "foo\n");17 try std.Io.File.stdout().writeStreamingAll(io, "foo\n");
18}18}
19const io = std.Io.Threaded.global_single_threaded.ioBasic();19const io = std.Io.Threaded.global_single_threaded.io();
20#expect_stdout="foo\n"20#expect_stdout="foo\n"
test/incremental/change_panic_handler+3-3
...@@ -17,7 +17,7 @@ fn myPanic(msg: []const u8, _: ?usize) noreturn {...@@ -17,7 +17,7 @@ fn myPanic(msg: []const u8, _: ?usize) noreturn {
17 std.process.exit(0);17 std.process.exit(0);
18}18}
19const std = @import("std");19const std = @import("std");
20const io = std.Io.Threaded.global_single_threaded.ioBasic();20const io = std.Io.Threaded.global_single_threaded.io();
21#expect_stdout="panic message: integer overflow\n"21#expect_stdout="panic message: integer overflow\n"
2222
23#update=change the panic handler body23#update=change the panic handler body
...@@ -35,7 +35,7 @@ fn myPanic(msg: []const u8, _: ?usize) noreturn {...@@ -35,7 +35,7 @@ fn myPanic(msg: []const u8, _: ?usize) noreturn {
35 std.process.exit(0);35 std.process.exit(0);
36}36}
37const std = @import("std");37const std = @import("std");
38const io = std.Io.Threaded.global_single_threaded.ioBasic();38const io = std.Io.Threaded.global_single_threaded.io();
39#expect_stdout="new panic message: integer overflow\n"39#expect_stdout="new panic message: integer overflow\n"
4040
41#update=change the panic handler function value41#update=change the panic handler function value
...@@ -53,5 +53,5 @@ fn myPanicNew(msg: []const u8, _: ?usize) noreturn {...@@ -53,5 +53,5 @@ fn myPanicNew(msg: []const u8, _: ?usize) noreturn {
53 std.process.exit(0);53 std.process.exit(0);
54}54}
55const std = @import("std");55const std = @import("std");
56const io = std.Io.Threaded.global_single_threaded.ioBasic();56const io = std.Io.Threaded.global_single_threaded.io();
57#expect_stdout="third panic message: integer overflow\n"57#expect_stdout="third panic message: integer overflow\n"
test/incremental/change_panic_handler_explicit+3-3
...@@ -47,7 +47,7 @@ fn myPanic(msg: []const u8, _: ?usize) noreturn {...@@ -47,7 +47,7 @@ fn myPanic(msg: []const u8, _: ?usize) noreturn {
47 std.process.exit(0);47 std.process.exit(0);
48}48}
49const std = @import("std");49const std = @import("std");
50const io = std.Io.Threaded.global_single_threaded.ioBasic();50const io = std.Io.Threaded.global_single_threaded.io();
51#expect_stdout="panic message: integer overflow\n"51#expect_stdout="panic message: integer overflow\n"
5252
53#update=change the panic handler body53#update=change the panic handler body
...@@ -95,7 +95,7 @@ fn myPanic(msg: []const u8, _: ?usize) noreturn {...@@ -95,7 +95,7 @@ fn myPanic(msg: []const u8, _: ?usize) noreturn {
95 std.process.exit(0);95 std.process.exit(0);
96}96}
97const std = @import("std");97const std = @import("std");
98const io = std.Io.Threaded.global_single_threaded.ioBasic();98const io = std.Io.Threaded.global_single_threaded.io();
99#expect_stdout="new panic message: integer overflow\n"99#expect_stdout="new panic message: integer overflow\n"
100100
101#update=change the panic handler function value101#update=change the panic handler function value
...@@ -143,5 +143,5 @@ fn myPanicNew(msg: []const u8, _: ?usize) noreturn {...@@ -143,5 +143,5 @@ fn myPanicNew(msg: []const u8, _: ?usize) noreturn {
143 std.process.exit(0);143 std.process.exit(0);
144}144}
145const std = @import("std");145const std = @import("std");
146const io = std.Io.Threaded.global_single_threaded.ioBasic();146const io = std.Io.Threaded.global_single_threaded.io();
147#expect_stdout="third panic message: integer overflow\n"147#expect_stdout="third panic message: integer overflow\n"
test/incremental/change_shift_op+2-2
...@@ -13,7 +13,7 @@ fn foo(x: u16) !void {...@@ -13,7 +13,7 @@ fn foo(x: u16) !void {
13 try stdout_writer.interface.print("0x{x}\n", .{x << 4});13 try stdout_writer.interface.print("0x{x}\n", .{x << 4});
14}14}
15const std = @import("std");15const std = @import("std");
16const io = std.Io.Threaded.global_single_threaded.ioBasic();16const io = std.Io.Threaded.global_single_threaded.io();
17#expect_stdout="0x3000\n"17#expect_stdout="0x3000\n"
18#update=change to right shift18#update=change to right shift
19#file=main.zig19#file=main.zig
...@@ -25,5 +25,5 @@ fn foo(x: u16) !void {...@@ -25,5 +25,5 @@ fn foo(x: u16) !void {
25 try stdout_writer.interface.print("0x{x}\n", .{x >> 4});25 try stdout_writer.interface.print("0x{x}\n", .{x >> 4});
26}26}
27const std = @import("std");27const std = @import("std");
28const io = std.Io.Threaded.global_single_threaded.ioBasic();28const io = std.Io.Threaded.global_single_threaded.io();
29#expect_stdout="0x130\n"29#expect_stdout="0x130\n"
test/incremental/change_struct_same_fields+3-3
...@@ -18,7 +18,7 @@ fn foo(val: *const S) !void {...@@ -18,7 +18,7 @@ fn foo(val: *const S) !void {
18 );18 );
19}19}
20const std = @import("std");20const std = @import("std");
21const io = std.Io.Threaded.global_single_threaded.ioBasic();21const io = std.Io.Threaded.global_single_threaded.io();
22#expect_stdout="100 200\n"22#expect_stdout="100 200\n"
2323
24#update=change struct layout24#update=change struct layout
...@@ -36,7 +36,7 @@ fn foo(val: *const S) !void {...@@ -36,7 +36,7 @@ fn foo(val: *const S) !void {
36 );36 );
37}37}
38const std = @import("std");38const std = @import("std");
39const io = std.Io.Threaded.global_single_threaded.ioBasic();39const io = std.Io.Threaded.global_single_threaded.io();
40#expect_stdout="100 200\n"40#expect_stdout="100 200\n"
4141
42#update=change values42#update=change values
...@@ -54,5 +54,5 @@ fn foo(val: *const S) !void {...@@ -54,5 +54,5 @@ fn foo(val: *const S) !void {
54 );54 );
55}55}
56const std = @import("std");56const std = @import("std");
57const io = std.Io.Threaded.global_single_threaded.ioBasic();57const io = std.Io.Threaded.global_single_threaded.io();
58#expect_stdout="1234 5678\n"58#expect_stdout="1234 5678\n"
test/incremental/change_zon_file+3-3
...@@ -10,7 +10,7 @@ const message: []const u8 = @import("message.zon");...@@ -10,7 +10,7 @@ const message: []const u8 = @import("message.zon");
10pub fn main() !void {10pub fn main() !void {
11 try std.Io.File.stdout().writeStreamingAll(io, message);11 try std.Io.File.stdout().writeStreamingAll(io, message);
12}12}
13const io = std.Io.Threaded.global_single_threaded.ioBasic();13const io = std.Io.Threaded.global_single_threaded.io();
14#file=message.zon14#file=message.zon
15"Hello, World!\n"15"Hello, World!\n"
16#expect_stdout="Hello, World!\n"16#expect_stdout="Hello, World!\n"
...@@ -32,7 +32,7 @@ const message: []const u8 = @import("message.zon");...@@ -32,7 +32,7 @@ const message: []const u8 = @import("message.zon");
32pub fn main() !void {32pub fn main() !void {
33 try std.Io.File.stdout().writeStreamingAll(io, "a hardcoded string\n");33 try std.Io.File.stdout().writeStreamingAll(io, "a hardcoded string\n");
34}34}
35const io = std.Io.Threaded.global_single_threaded.ioBasic();35const io = std.Io.Threaded.global_single_threaded.io();
36#expect_error=message.zon:1:1: error: unable to load 'message.zon': FileNotFound36#expect_error=message.zon:1:1: error: unable to load 'message.zon': FileNotFound
37#expect_error=main.zig:2:37: note: file imported here37#expect_error=main.zig:2:37: note: file imported here
3838
...@@ -48,5 +48,5 @@ const message: []const u8 = @import("message.zon");...@@ -48,5 +48,5 @@ const message: []const u8 = @import("message.zon");
48pub fn main() !void {48pub fn main() !void {
49 try std.Io.File.stdout().writeStreamingAll(io, message);49 try std.Io.File.stdout().writeStreamingAll(io, message);
50}50}
51const io = std.Io.Threaded.global_single_threaded.ioBasic();51const io = std.Io.Threaded.global_single_threaded.io();
52#expect_stdout="We're back, World!\n"52#expect_stdout="We're back, World!\n"
test/incremental/change_zon_file_no_result_type+1-1
...@@ -6,7 +6,7 @@...@@ -6,7 +6,7 @@
6#update=initial version6#update=initial version
7#file=main.zig7#file=main.zig
8const std = @import("std");8const std = @import("std");
9const io = std.Io.Threaded.global_single_threaded.ioBasic();9const io = std.Io.Threaded.global_single_threaded.io();
10pub fn main() !void {10pub fn main() !void {
11 try std.Io.File.stdout().writeStreamingAll(io, @import("foo.zon").message);11 try std.Io.File.stdout().writeStreamingAll(io, @import("foo.zon").message);
12}12}
test/incremental/compile_log+3-3
...@@ -10,7 +10,7 @@ const std = @import("std");...@@ -10,7 +10,7 @@ const std = @import("std");
10pub fn main() !void {10pub fn main() !void {
11 try std.Io.File.stdout().writeStreamingAll(io, "Hello, World!\n");11 try std.Io.File.stdout().writeStreamingAll(io, "Hello, World!\n");
12}12}
13const io = std.Io.Threaded.global_single_threaded.ioBasic();13const io = std.Io.Threaded.global_single_threaded.io();
14#expect_stdout="Hello, World!\n"14#expect_stdout="Hello, World!\n"
1515
16#update=add compile log16#update=add compile log
...@@ -20,7 +20,7 @@ pub fn main() !void {...@@ -20,7 +20,7 @@ pub fn main() !void {
20 try std.Io.File.stdout().writeStreamingAll(io, "Hello, World!\n");20 try std.Io.File.stdout().writeStreamingAll(io, "Hello, World!\n");
21 @compileLog("this is a log");21 @compileLog("this is a log");
22}22}
23const io = std.Io.Threaded.global_single_threaded.ioBasic();23const io = std.Io.Threaded.global_single_threaded.io();
24#expect_error=main.zig:4:5: error: found compile log statement24#expect_error=main.zig:4:5: error: found compile log statement
25#expect_compile_log=@as(*const [13:0]u8, "this is a log")25#expect_compile_log=@as(*const [13:0]u8, "this is a log")
2626
...@@ -30,5 +30,5 @@ const std = @import("std");...@@ -30,5 +30,5 @@ const std = @import("std");
30pub fn main() !void {30pub fn main() !void {
31 try std.Io.File.stdout().writeStreamingAll(io, "Hello, World!\n");31 try std.Io.File.stdout().writeStreamingAll(io, "Hello, World!\n");
32}32}
33const io = std.Io.Threaded.global_single_threaded.ioBasic();33const io = std.Io.Threaded.global_single_threaded.io();
34#expect_stdout="Hello, World!\n"34#expect_stdout="Hello, World!\n"
test/incremental/fix_astgen_failure+3-3
...@@ -19,7 +19,7 @@ const std = @import("std");...@@ -19,7 +19,7 @@ const std = @import("std");
19pub fn hello() !void {19pub fn hello() !void {
20 try std.Io.File.stdout().writeStreamingAll(io, "Hello, World!\n");20 try std.Io.File.stdout().writeStreamingAll(io, "Hello, World!\n");
21}21}
22const io = std.Io.Threaded.global_single_threaded.ioBasic();22const io = std.Io.Threaded.global_single_threaded.io();
23#expect_stdout="Hello, World!\n"23#expect_stdout="Hello, World!\n"
24#update=add new error24#update=add new error
25#file=foo.zig25#file=foo.zig
...@@ -27,7 +27,7 @@ const std = @import("std");...@@ -27,7 +27,7 @@ const std = @import("std");
27pub fn hello() !void {27pub fn hello() !void {
28 try std.Io.File.stdout().writeStreamingAll(io, hello_str);28 try std.Io.File.stdout().writeStreamingAll(io, hello_str);
29}29}
30const io = std.Io.Threaded.global_single_threaded.ioBasic();30const io = std.Io.Threaded.global_single_threaded.io();
31#expect_error=foo.zig:3:52: error: use of undeclared identifier 'hello_str'31#expect_error=foo.zig:3:52: error: use of undeclared identifier 'hello_str'
32#update=fix the new error32#update=fix the new error
33#file=foo.zig33#file=foo.zig
...@@ -36,5 +36,5 @@ const hello_str = "Hello, World! Again!\n";...@@ -36,5 +36,5 @@ const hello_str = "Hello, World! Again!\n";
36pub fn hello() !void {36pub fn hello() !void {
37 try std.Io.File.stdout().writeStreamingAll(io, hello_str);37 try std.Io.File.stdout().writeStreamingAll(io, hello_str);
38}38}
39const io = std.Io.Threaded.global_single_threaded.ioBasic();39const io = std.Io.Threaded.global_single_threaded.io();
40#expect_stdout="Hello, World! Again!\n"40#expect_stdout="Hello, World! Again!\n"
test/incremental/function_becomes_inline+3-3
...@@ -11,7 +11,7 @@ fn foo() !void {...@@ -11,7 +11,7 @@ fn foo() !void {
11 try std.Io.File.stdout().writeStreamingAll(io, "Hello, World!\n");11 try std.Io.File.stdout().writeStreamingAll(io, "Hello, World!\n");
12}12}
13const std = @import("std");13const std = @import("std");
14const io = std.Io.Threaded.global_single_threaded.ioBasic();14const io = std.Io.Threaded.global_single_threaded.io();
15#expect_stdout="Hello, World!\n"15#expect_stdout="Hello, World!\n"
1616
17#update=make function inline17#update=make function inline
...@@ -23,7 +23,7 @@ inline fn foo() !void {...@@ -23,7 +23,7 @@ inline fn foo() !void {
23 try std.Io.File.stdout().writeStreamingAll(io, "Hello, World!\n");23 try std.Io.File.stdout().writeStreamingAll(io, "Hello, World!\n");
24}24}
25const std = @import("std");25const std = @import("std");
26const io = std.Io.Threaded.global_single_threaded.ioBasic();26const io = std.Io.Threaded.global_single_threaded.io();
27#expect_stdout="Hello, World!\n"27#expect_stdout="Hello, World!\n"
2828
29#update=change string29#update=change string
...@@ -35,5 +35,5 @@ inline fn foo() !void {...@@ -35,5 +35,5 @@ inline fn foo() !void {
35 try std.Io.File.stdout().writeStreamingAll(io, "Hello, `inline` World!\n");35 try std.Io.File.stdout().writeStreamingAll(io, "Hello, `inline` World!\n");
36}36}
37const std = @import("std");37const std = @import("std");
38const io = std.Io.Threaded.global_single_threaded.ioBasic();38const io = std.Io.Threaded.global_single_threaded.io();
39#expect_stdout="Hello, `inline` World!\n"39#expect_stdout="Hello, `inline` World!\n"
test/incremental/hello+2-2
...@@ -6,7 +6,7 @@...@@ -6,7 +6,7 @@
6#update=initial version6#update=initial version
7#file=main.zig7#file=main.zig
8const std = @import("std");8const std = @import("std");
9const io = std.Io.Threaded.global_single_threaded.ioBasic();9const io = std.Io.Threaded.global_single_threaded.io();
10pub fn main() !void {10pub fn main() !void {
11 try std.Io.File.stdout().writeStreamingAll(io, "good morning\n");11 try std.Io.File.stdout().writeStreamingAll(io, "good morning\n");
12}12}
...@@ -14,7 +14,7 @@ pub fn main() !void {...@@ -14,7 +14,7 @@ pub fn main() !void {
14#update=change the string14#update=change the string
15#file=main.zig15#file=main.zig
16const std = @import("std");16const std = @import("std");
17const io = std.Io.Threaded.global_single_threaded.ioBasic();17const io = std.Io.Threaded.global_single_threaded.io();
18pub fn main() !void {18pub fn main() !void {
19 try std.Io.File.stdout().writeStreamingAll(io, "おはようございます\n");19 try std.Io.File.stdout().writeStreamingAll(io, "おはようございます\n");
20}20}
test/incremental/make_decl_pub+2-2
...@@ -14,7 +14,7 @@ const std = @import("std");...@@ -14,7 +14,7 @@ const std = @import("std");
14fn hello() !void {14fn hello() !void {
15 try std.Io.File.stdout().writeStreamingAll(io, "Hello, World!\n");15 try std.Io.File.stdout().writeStreamingAll(io, "Hello, World!\n");
16}16}
17const io = std.Io.Threaded.global_single_threaded.ioBasic();17const io = std.Io.Threaded.global_single_threaded.io();
18#expect_error=main.zig:3:12: error: 'hello' is not marked 'pub'18#expect_error=main.zig:3:12: error: 'hello' is not marked 'pub'
19#expect_error=foo.zig:2:1: note: declared here19#expect_error=foo.zig:2:1: note: declared here
2020
...@@ -24,5 +24,5 @@ const std = @import("std");...@@ -24,5 +24,5 @@ const std = @import("std");
24pub fn hello() !void {24pub fn hello() !void {
25 try std.Io.File.stdout().writeStreamingAll(io, "Hello, World!\n");25 try std.Io.File.stdout().writeStreamingAll(io, "Hello, World!\n");
26}26}
27const io = std.Io.Threaded.global_single_threaded.ioBasic();27const io = std.Io.Threaded.global_single_threaded.io();
28#expect_stdout="Hello, World!\n"28#expect_stdout="Hello, World!\n"
test/incremental/modify_inline_fn+2-2
...@@ -13,7 +13,7 @@ pub fn main() !void {...@@ -13,7 +13,7 @@ pub fn main() !void {
13inline fn getStr() []const u8 {13inline fn getStr() []const u8 {
14 return "foo\n";14 return "foo\n";
15}15}
16const io = std.Io.Threaded.global_single_threaded.ioBasic();16const io = std.Io.Threaded.global_single_threaded.io();
17#expect_stdout="foo\n"17#expect_stdout="foo\n"
18#update=change the string18#update=change the string
19#file=main.zig19#file=main.zig
...@@ -25,5 +25,5 @@ pub fn main() !void {...@@ -25,5 +25,5 @@ pub fn main() !void {
25inline fn getStr() []const u8 {25inline fn getStr() []const u8 {
26 return "bar\n";26 return "bar\n";
27}27}
28const io = std.Io.Threaded.global_single_threaded.ioBasic();28const io = std.Io.Threaded.global_single_threaded.io();
29#expect_stdout="bar\n"29#expect_stdout="bar\n"
test/incremental/move_src+2-2
...@@ -16,7 +16,7 @@ fn foo() u32 {...@@ -16,7 +16,7 @@ fn foo() u32 {
16fn bar() u32 {16fn bar() u32 {
17 return 123;17 return 123;
18}18}
19const io = std.Io.Threaded.global_single_threaded.ioBasic();19const io = std.Io.Threaded.global_single_threaded.io();
20#expect_stdout="7 123\n"20#expect_stdout="7 123\n"
2121
22#update=add newline22#update=add newline
...@@ -33,5 +33,5 @@ fn foo() u32 {...@@ -33,5 +33,5 @@ fn foo() u32 {
33fn bar() u32 {33fn bar() u32 {
34 return 123;34 return 123;
35}35}
36const io = std.Io.Threaded.global_single_threaded.ioBasic();36const io = std.Io.Threaded.global_single_threaded.io();
37#expect_stdout="8 123\n"37#expect_stdout="8 123\n"
test/incremental/no_change_preserves_tag_names+2-2
...@@ -7,7 +7,7 @@...@@ -7,7 +7,7 @@
7#file=main.zig7#file=main.zig
8const std = @import("std");8const std = @import("std");
9var some_enum: enum { first, second } = .first;9var some_enum: enum { first, second } = .first;
10const io = std.Io.Threaded.global_single_threaded.ioBasic();10const io = std.Io.Threaded.global_single_threaded.io();
11pub fn main() !void {11pub fn main() !void {
12 try std.Io.File.stdout().writeStreamingAll(io, @tagName(some_enum));12 try std.Io.File.stdout().writeStreamingAll(io, @tagName(some_enum));
13}13}
...@@ -16,7 +16,7 @@ pub fn main() !void {...@@ -16,7 +16,7 @@ pub fn main() !void {
16#file=main.zig16#file=main.zig
17const std = @import("std");17const std = @import("std");
18var some_enum: enum { first, second } = .first;18var some_enum: enum { first, second } = .first;
19const io = std.Io.Threaded.global_single_threaded.ioBasic();19const io = std.Io.Threaded.global_single_threaded.io();
20pub fn main() !void {20pub fn main() !void {
21 try std.Io.File.stdout().writeStreamingAll(io, @tagName(some_enum));21 try std.Io.File.stdout().writeStreamingAll(io, @tagName(some_enum));
22}22}
test/incremental/recursive_function_becomes_non_recursive+2-2
...@@ -14,7 +14,7 @@ fn foo(recurse: bool) !void {...@@ -14,7 +14,7 @@ fn foo(recurse: bool) !void {
14 try stdout.writeStreamingAll(io, "non-recursive path\n");14 try stdout.writeStreamingAll(io, "non-recursive path\n");
15}15}
16const std = @import("std");16const std = @import("std");
17const io = std.Io.Threaded.global_single_threaded.ioBasic();17const io = std.Io.Threaded.global_single_threaded.io();
18#expect_stdout="non-recursive path\n"18#expect_stdout="non-recursive path\n"
1919
20#update=eliminate recursion and change argument20#update=eliminate recursion and change argument
...@@ -28,5 +28,5 @@ fn foo(recurse: bool) !void {...@@ -28,5 +28,5 @@ fn foo(recurse: bool) !void {
28 try stdout.writeStreamingAll(io, "non-recursive path\n");28 try stdout.writeStreamingAll(io, "non-recursive path\n");
29}29}
30const std = @import("std");30const std = @import("std");
31const io = std.Io.Threaded.global_single_threaded.ioBasic();31const io = std.Io.Threaded.global_single_threaded.io();
32#expect_stdout="x==1\n"32#expect_stdout="x==1\n"
test/incremental/remove_enum_field+2-2
...@@ -14,7 +14,7 @@ pub fn main() !void {...@@ -14,7 +14,7 @@ pub fn main() !void {
14 try stdout_writer.interface.print("{}\n", .{@intFromEnum(MyEnum.foo)});14 try stdout_writer.interface.print("{}\n", .{@intFromEnum(MyEnum.foo)});
15}15}
16const std = @import("std");16const std = @import("std");
17const io = std.Io.Threaded.global_single_threaded.ioBasic();17const io = std.Io.Threaded.global_single_threaded.io();
18#expect_stdout="1\n"18#expect_stdout="1\n"
19#update=remove enum field19#update=remove enum field
20#file=main.zig20#file=main.zig
...@@ -27,6 +27,6 @@ pub fn main() !void {...@@ -27,6 +27,6 @@ pub fn main() !void {
27 try stdout_writer.interface.print("{}\n", .{@intFromEnum(MyEnum.foo)});27 try stdout_writer.interface.print("{}\n", .{@intFromEnum(MyEnum.foo)});
28}28}
29const std = @import("std");29const std = @import("std");
30const io = std.Io.Threaded.global_single_threaded.ioBasic();30const io = std.Io.Threaded.global_single_threaded.io();
31#expect_error=main.zig:7:69: error: enum 'main.MyEnum' has no member named 'foo'31#expect_error=main.zig:7:69: error: enum 'main.MyEnum' has no member named 'foo'
32#expect_error=main.zig:1:16: note: enum declared here32#expect_error=main.zig:1:16: note: enum declared here
test/incremental/unreferenced_error+4-4
...@@ -10,7 +10,7 @@ pub fn main() !void {...@@ -10,7 +10,7 @@ pub fn main() !void {
10 try std.Io.File.stdout().writeStreamingAll(io, a);10 try std.Io.File.stdout().writeStreamingAll(io, a);
11}11}
12const a = "Hello, World!\n";12const a = "Hello, World!\n";
13const io = std.Io.Threaded.global_single_threaded.ioBasic();13const io = std.Io.Threaded.global_single_threaded.io();
14#expect_stdout="Hello, World!\n"14#expect_stdout="Hello, World!\n"
1515
16#update=introduce compile error16#update=introduce compile error
...@@ -20,7 +20,7 @@ pub fn main() !void {...@@ -20,7 +20,7 @@ pub fn main() !void {
20 try std.Io.File.stdout().writeStreamingAll(io, a);20 try std.Io.File.stdout().writeStreamingAll(io, a);
21}21}
22const a = @compileError("bad a");22const a = @compileError("bad a");
23const io = std.Io.Threaded.global_single_threaded.ioBasic();23const io = std.Io.Threaded.global_single_threaded.io();
24#expect_error=main.zig:5:11: error: bad a24#expect_error=main.zig:5:11: error: bad a
2525
26#update=remove error reference26#update=remove error reference
...@@ -31,7 +31,7 @@ pub fn main() !void {...@@ -31,7 +31,7 @@ pub fn main() !void {
31}31}
32const a = @compileError("bad a");32const a = @compileError("bad a");
33const b = "Hi there!\n";33const b = "Hi there!\n";
34const io = std.Io.Threaded.global_single_threaded.ioBasic();34const io = std.Io.Threaded.global_single_threaded.io();
35#expect_stdout="Hi there!\n"35#expect_stdout="Hi there!\n"
3636
37#update=introduce and remove reference to error37#update=introduce and remove reference to error
...@@ -42,5 +42,5 @@ pub fn main() !void {...@@ -42,5 +42,5 @@ pub fn main() !void {
42}42}
43const a = "Back to a\n";43const a = "Back to a\n";
44const b = @compileError("bad b");44const b = @compileError("bad b");
45const io = std.Io.Threaded.global_single_threaded.ioBasic();45const io = std.Io.Threaded.global_single_threaded.io();
46#expect_stdout="Back to a\n"46#expect_stdout="Back to a\n"
test/standalone/coff_dwarf/build.zig+3
...@@ -46,6 +46,9 @@ pub fn build(b: *std.Build) void {...@@ -46,6 +46,9 @@ pub fn build(b: *std.Build) void {
46 lib.root_module.addCSourceFile(.{ .file = b.path("shared_lib.c"), .flags = &.{"-gdwarf"} });46 lib.root_module.addCSourceFile(.{ .file = b.path("shared_lib.c"), .flags = &.{"-gdwarf"} });
47 exe.root_module.linkLibrary(lib);47 exe.root_module.linkLibrary(lib);
4848
49 if (target.result.os.tag == .windows)
50 exe.root_module.linkSystemLibrary("ws2_32", .{});
51
49 const run = b.addRunArtifact(exe);52 const run = b.addRunArtifact(exe);
50 run.expectExitCode(0);53 run.expectExitCode(0);
51 run.skip_foreign_checks = true;54 run.skip_foreign_checks = true;
test/standalone/dirname/exists_in.zig+1-1
...@@ -26,7 +26,7 @@ pub fn main(init: std.process.Init) !void {...@@ -26,7 +26,7 @@ pub fn main(init: std.process.Init) !void {
26 return error.BadUsage;26 return error.BadUsage;
27 };27 };
2828
29 const io = std.Io.Threaded.global_single_threaded.ioBasic();29 const io = std.Io.Threaded.global_single_threaded.io();
3030
31 var dir = try std.Io.Dir.cwd().openDir(io, dir_path, .{});31 var dir = try std.Io.Dir.cwd().openDir(io, dir_path, .{});
32 defer dir.close(io);32 defer dir.close(io);
test/standalone/dirname/touch.zig+1-1
...@@ -21,7 +21,7 @@ pub fn main(init: std.process.Init) !void {...@@ -21,7 +21,7 @@ pub fn main(init: std.process.Init) !void {
21 const dir_path = std.Io.Dir.path.dirname(path) orelse unreachable;21 const dir_path = std.Io.Dir.path.dirname(path) orelse unreachable;
22 const basename = std.Io.Dir.path.basename(path);22 const basename = std.Io.Dir.path.basename(path);
2323
24 const io = std.Io.Threaded.global_single_threaded.ioBasic();24 const io = std.Io.Threaded.global_single_threaded.io();
2525
26 var dir = try std.Io.Dir.cwd().openDir(io, dir_path, .{});26 var dir = try std.Io.Dir.cwd().openDir(io, dir_path, .{});
27 defer dir.close(io);27 defer dir.close(io);
test/standalone/issue_5825/build.zig+1
...@@ -34,6 +34,7 @@ pub fn build(b: *std.Build) void {...@@ -34,6 +34,7 @@ pub fn build(b: *std.Build) void {
34 exe.subsystem = .console;34 exe.subsystem = .console;
35 exe.root_module.linkSystemLibrary("kernel32", .{});35 exe.root_module.linkSystemLibrary("kernel32", .{});
36 exe.root_module.linkSystemLibrary("ntdll", .{});36 exe.root_module.linkSystemLibrary("ntdll", .{});
37 exe.root_module.linkSystemLibrary("ws2_32", .{});
37 exe.root_module.addObject(obj);38 exe.root_module.addObject(obj);
3839
39 // TODO: actually check the output40 // TODO: actually check the output
test/standalone/mix_o_files/build.zig+3
...@@ -16,6 +16,9 @@ pub fn build(b: *std.Build) void {...@@ -16,6 +16,9 @@ pub fn build(b: *std.Build) void {
16 }),16 }),
17 });17 });
1818
19 if (target.result.os.tag == .windows)
20 obj.root_module.linkSystemLibrary("ws2_32", .{});
21
19 const exe = b.addExecutable(.{22 const exe = b.addExecutable(.{
20 .name = "test",23 .name = "test",
21 .root_module = b.createModule(.{24 .root_module = b.createModule(.{
test/standalone/run_cwd/check_file_exists.zig+1-1
...@@ -5,7 +5,7 @@ pub fn main(init: std.process.Init) !void {...@@ -5,7 +5,7 @@ pub fn main(init: std.process.Init) !void {
5 if (args.len != 2) return error.BadUsage;5 if (args.len != 2) return error.BadUsage;
6 const path = args[1];6 const path = args[1];
77
8 const io = std.Io.Threaded.global_single_threaded.ioBasic();8 const io = std.Io.Threaded.global_single_threaded.io();
99
10 std.Io.Dir.cwd().access(io, path, .{}) catch return error.AccessFailed;10 std.Io.Dir.cwd().access(io, path, .{}) catch return error.AccessFailed;
11}11}
test/standalone/shared_library/build.zig+4-1
...@@ -5,7 +5,7 @@ pub fn build(b: *std.Build) void {...@@ -5,7 +5,7 @@ pub fn build(b: *std.Build) void {
5 b.default_step = test_step;5 b.default_step = test_step;
66
7 const optimize: std.builtin.OptimizeMode = .Debug;7 const optimize: std.builtin.OptimizeMode = .Debug;
8 const target = b.graph.host;8 const target = b.standardTargetOptions(.{});
99
10 const exe_names: []const []const u8 = &.{ "test", "test-dync" };10 const exe_names: []const []const u8 = &.{ "test", "test-dync" };
11 const lib_names: []const []const u8 = &.{ "mathtest", "mathtest-dync" };11 const lib_names: []const []const u8 = &.{ "mathtest", "mathtest-dync" };
...@@ -24,6 +24,9 @@ pub fn build(b: *std.Build) void {...@@ -24,6 +24,9 @@ pub fn build(b: *std.Build) void {
24 }),24 }),
25 });25 });
2626
27 if (target.result.os.tag == .windows)
28 lib.root_module.linkSystemLibrary("ws2_32", .{});
29
27 const exe = b.addExecutable(.{30 const exe = b.addExecutable(.{
28 .name = exe_name,31 .name = exe_name,
29 .root_module = b.createModule(.{32 .root_module = b.createModule(.{
test/standalone/windows_argv/build.zig+3
...@@ -20,6 +20,8 @@ pub fn build(b: *std.Build) !void {...@@ -20,6 +20,8 @@ pub fn build(b: *std.Build) !void {
20 .optimize = optimize,20 .optimize = optimize,
21 }),21 }),
22 });22 });
23 lib_gnu.root_module.linkSystemLibrary("ws2_32", .{});
24
23 const verify_gnu = b.addExecutable(.{25 const verify_gnu = b.addExecutable(.{
24 .name = "verify-gnu",26 .name = "verify-gnu",
25 .root_module = b.createModule(.{27 .root_module = b.createModule(.{
...@@ -101,6 +103,7 @@ pub fn build(b: *std.Build) !void {...@@ -101,6 +103,7 @@ pub fn build(b: *std.Build) !void {
101 .flags = &.{ "-DUNICODE", "-D_UNICODE" },103 .flags = &.{ "-DUNICODE", "-D_UNICODE" },
102 });104 });
103 verify_msvc.root_module.linkLibrary(lib_msvc);105 verify_msvc.root_module.linkLibrary(lib_msvc);
106 verify_msvc.root_module.linkSystemLibrary("ws2_32", .{});
104 verify_msvc.root_module.link_libc = true;107 verify_msvc.root_module.link_libc = true;
105108
106 const run_msvc = b.addRunArtifact(fuzz);109 const run_msvc = b.addRunArtifact(fuzz);