aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/codegen.zig')
-rw-r--r--src/codegen.zig20
1 files changed, 16 insertions, 4 deletions
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,
}),
);