diff --git a/src/Sema.zig b/src/Sema.zig index 223cda8313..340b1f9db3 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -20197,7 +20197,11 @@ fn beginComptimePtrLoad( var deref = try beginComptimePtrLoad(sema, block, src, field_ptr.container_ptr, field_ptr.container_ty); if (field_ptr.container_ty.hasWellDefinedLayout()) { - if (deref.parent) |*parent| { + const struct_ty = field_ptr.container_ty.castTag(.@"struct"); + if (struct_ty != null and struct_ty.?.data.layout == .Packed) { + // packed structs are not byte addressable + deref.parent = null; + } else if (deref.parent) |*parent| { // Update the byte offset (in-place) try sema.resolveTypeLayout(block, src, field_ptr.container_ty); const field_offset = field_ptr.container_ty.structFieldOffset(field_index, target); diff --git a/src/value.zig b/src/value.zig index 310384c3c3..da8f7a2c62 100644 --- a/src/value.zig +++ b/src/value.zig @@ -2645,6 +2645,7 @@ pub const Value = extern union { } unreachable; }, + .undef => return Value.undef, else => unreachable, } diff --git a/test/behavior/struct.zig b/test/behavior/struct.zig index ab7d761de0..8370cd763e 100644 --- a/test/behavior/struct.zig +++ b/test/behavior/struct.zig @@ -1319,3 +1319,24 @@ test "packed struct aggregate init" { const result = @bitCast(u8, S.foo(1, 2)); try expect(result == 9); } + +test "packed struct field access via pointer" { + if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + + const S = struct { + fn doTheTest() !void { + const S = packed struct { a: u30 }; + var s1: S = .{ .a = 1 }; + var s2 = &s1; + try expect(s2.a == 1); + var s3: S = undefined; + var s4 = &s3; + _ = s4; + } + }; + try S.doTheTest(); + comptime try S.doTheTest(); +}