diff --git a/lib/compiler_rt/int_from_float.zig b/lib/compiler_rt/int_from_float.zig index 0c2c73bb42..83de968a2e 100644 --- a/lib/compiler_rt/int_from_float.zig +++ b/lib/compiler_rt/int_from_float.zig @@ -74,7 +74,7 @@ pub inline fn bigIntFromFloat(comptime signedness: std.builtin.Signedness, resul const parts = math.frexp(a); const significand_bits_adjusted_to_handle_smin = @as(i32, significand_bits) + @intFromBool(signedness == .signed and parts.exponent == 32 * result.len); - const exponent = @max(parts.exponent - significand_bits_adjusted_to_handle_smin, 0); + const exponent: usize = @intCast(@max(parts.exponent - significand_bits_adjusted_to_handle_smin, 0)); const int: I = @intFromFloat(switch (exponent) { 0 => a, else => math.ldexp(parts.significand, significand_bits_adjusted_to_handle_smin), diff --git a/lib/std/Io/Writer.zig b/lib/std/Io/Writer.zig index 7ad466d5cb..a525a028d7 100644 --- a/lib/std/Io/Writer.zig +++ b/lib/std/Io/Writer.zig @@ -604,7 +604,7 @@ pub fn print(w: *Writer, comptime fmt: []const u8, args: anytype) Error!void { @compileError("32 arguments max are supported per format call"); } - @setEvalBranchQuota(fmt.len * 1000); + @setEvalBranchQuota(@as(comptime_int, fmt.len) * 1000); // NOTE: We're upcasting as 16-bit usize overflows. comptime var arg_state: std.fmt.ArgState = .{ .args_len = fields_info.len }; comptime var i = 0; comptime var literal: []const u8 = ""; diff --git a/lib/std/os/windows.zig b/lib/std/os/windows.zig index 2e18e8ec16..27b40fcd60 100644 --- a/lib/std/os/windows.zig +++ b/lib/std/os/windows.zig @@ -4634,25 +4634,28 @@ pub const TEB = extern struct { }; comptime { - // Offsets taken from WinDbg info and Geoff Chappell[1] (RIP) - // [1]: https://www.geoffchappell.com/studies/windows/km/ntoskrnl/inc/api/pebteb/teb/index.htm - assert(@offsetOf(TEB, "NtTib") == 0x00); - if (@sizeOf(usize) == 4) { - assert(@offsetOf(TEB, "EnvironmentPointer") == 0x1C); - assert(@offsetOf(TEB, "ClientId") == 0x20); - assert(@offsetOf(TEB, "ActiveRpcHandle") == 0x28); - assert(@offsetOf(TEB, "ThreadLocalStoragePointer") == 0x2C); - assert(@offsetOf(TEB, "ProcessEnvironmentBlock") == 0x30); - assert(@offsetOf(TEB, "LastErrorValue") == 0x34); - assert(@offsetOf(TEB, "TlsSlots") == 0xe10); - } else if (@sizeOf(usize) == 8) { - assert(@offsetOf(TEB, "EnvironmentPointer") == 0x38); - assert(@offsetOf(TEB, "ClientId") == 0x40); - assert(@offsetOf(TEB, "ActiveRpcHandle") == 0x50); - assert(@offsetOf(TEB, "ThreadLocalStoragePointer") == 0x58); - assert(@offsetOf(TEB, "ProcessEnvironmentBlock") == 0x60); - assert(@offsetOf(TEB, "LastErrorValue") == 0x68); - assert(@offsetOf(TEB, "TlsSlots") == 0x1480); + // XXX: Without this check we cannot use `std.Io.Writer` on 16-bit platforms. `std.fmt.bufPrint` will hit the unreachable in `PEB.GdiHandleBuffer` without this guard. + if (builtin.os.tag == .windows) { + // Offsets taken from WinDbg info and Geoff Chappell[1] (RIP) + // [1]: https://www.geoffchappell.com/studies/windows/km/ntoskrnl/inc/api/pebteb/teb/index.htm + assert(@offsetOf(TEB, "NtTib") == 0x00); + if (@sizeOf(usize) == 4) { + assert(@offsetOf(TEB, "EnvironmentPointer") == 0x1C); + assert(@offsetOf(TEB, "ClientId") == 0x20); + assert(@offsetOf(TEB, "ActiveRpcHandle") == 0x28); + assert(@offsetOf(TEB, "ThreadLocalStoragePointer") == 0x2C); + assert(@offsetOf(TEB, "ProcessEnvironmentBlock") == 0x30); + assert(@offsetOf(TEB, "LastErrorValue") == 0x34); + assert(@offsetOf(TEB, "TlsSlots") == 0xe10); + } else if (@sizeOf(usize) == 8) { + assert(@offsetOf(TEB, "EnvironmentPointer") == 0x38); + assert(@offsetOf(TEB, "ClientId") == 0x40); + assert(@offsetOf(TEB, "ActiveRpcHandle") == 0x50); + assert(@offsetOf(TEB, "ThreadLocalStoragePointer") == 0x58); + assert(@offsetOf(TEB, "ProcessEnvironmentBlock") == 0x60); + assert(@offsetOf(TEB, "LastErrorValue") == 0x68); + assert(@offsetOf(TEB, "TlsSlots") == 0x1480); + } } }