diff --git a/src/codegen.zig b/src/codegen.zig index 9e5ae11a63..1718201e6c 100644 --- a/src/codegen.zig +++ b/src/codegen.zig @@ -684,10 +684,22 @@ fn lowerParentPtr( .struct_type, .anon_struct_type, .union_type, - => @as(u32, @intCast(base_type.toType().structFieldOffset( - @as(u32, @intCast(field.index)), - mod, - ))), + => switch (base_type.toType().containerLayout(mod)) { + .Auto, .Extern => @intCast(base_type.toType().structFieldOffset( + @intCast(field.index), + mod, + )), + .Packed => if (mod.typeToStruct(base_type.toType())) |struct_obj| + math.divExact(u16, struct_obj.packedFieldBitOffset( + mod, + @intCast(field.index), + ), 8) catch |err| switch (err) { + error.UnexpectedRemainder => 0, + error.DivisionByZero => unreachable, + } + else + 0, + }, else => unreachable, }), ); diff --git a/test/behavior/packed-struct.zig b/test/behavior/packed-struct.zig index 12cc027ef4..e2970c3603 100644 --- a/test/behavior/packed-struct.zig +++ b/test/behavior/packed-struct.zig @@ -376,7 +376,6 @@ test "load pointer from packed struct" { } test "@intFromPtr on a packed struct field" { - if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO @@ -608,7 +607,6 @@ test "pointer to container level packed struct field" { if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; diff --git a/test/behavior/struct.zig b/test/behavior/struct.zig index 3210e0c112..b3160cb2d3 100644 --- a/test/behavior/struct.zig +++ b/test/behavior/struct.zig @@ -1077,7 +1077,6 @@ test "packed struct with undefined initializers" { if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;