From 530cc2c1111699d9d02ad9ebef94efa6b99f5205 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Thu, 28 Aug 2025 18:29:48 -0700 Subject: [PATCH] std.Io.Reader: work around llvm backend bug tracked by #25067 and I already have a fix cooking in another branch --- lib/std/Io/Reader.zig | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/std/Io/Reader.zig b/lib/std/Io/Reader.zig index a1092b3980..5be8413c74 100644 --- a/lib/std/Io/Reader.zig +++ b/lib/std/Io/Reader.zig @@ -1163,7 +1163,11 @@ pub inline fn takeStruct(r: *Reader, comptime T: type, endian: std.builtin.Endia .@"struct" => |info| switch (info.layout) { .auto => @compileError("ill-defined memory layout"), .@"extern" => { - var res = (try r.takeStructPointer(T)).*; + // This code works around https://github.com/ziglang/zig/issues/25067 + // by avoiding a call to `peekStructPointer`. + const struct_bytes = try r.takeArray(@sizeOf(T)); + var res: T = undefined; + @memcpy(@as([]u8, @ptrCast(&res)), struct_bytes); if (native_endian != endian) std.mem.byteSwapAllFields(T, &res); return res; }, @@ -1188,7 +1192,11 @@ pub inline fn peekStruct(r: *Reader, comptime T: type, endian: std.builtin.Endia .@"struct" => |info| switch (info.layout) { .auto => @compileError("ill-defined memory layout"), .@"extern" => { - var res = (try r.peekStructPointer(T)).*; + // This code works around https://github.com/ziglang/zig/issues/25067 + // by avoiding a call to `peekStructPointer`. + const struct_bytes = try r.peekArray(@sizeOf(T)); + var res: T = undefined; + @memcpy(@as([]u8, @ptrCast(&res)), struct_bytes); if (native_endian != endian) std.mem.byteSwapAllFields(T, &res); return res; },