@@ -661,7 +661,7 @@ pub const DeclGen = struct {
661
661
try dg .renderCType (writer , ptr_cty );
662
662
try writer .writeByte (')' );
663
663
}
664
- switch (fieldLocation (base_ty , ptr_ty , @as (u32 , @intCast (field .index )), mod )) {
664
+ switch (fieldLocation (ptr_base_ty , ptr_ty , @as (u32 , @intCast (field .index )), mod )) {
665
665
.begin = > try dg .renderParentPtr (writer , field .base , location ),
666
666
.field = > | name | {
667
667
try writer .writeAll ("&(" );
@@ -5187,7 +5187,7 @@ fn airOptionalPayloadPtrSet(f: *Function, inst: Air.Inst.Index) !CValue {
5187
5187
}
5188
5188
5189
5189
fn fieldLocation (
5190
- container_ty : Type ,
5190
+ container_ptr_ty : Type ,
5191
5191
field_ptr_ty : Type ,
5192
5192
field_index : u32 ,
5193
5193
mod : * Module ,
@@ -5198,6 +5198,7 @@ fn fieldLocation(
5198
5198
end : void ,
5199
5199
} {
5200
5200
const ip = & mod .intern_pool ;
5201
+ const container_ty = container_ptr_ty .childType (mod );
5201
5202
return switch (container_ty .zigTypeTag (mod )) {
5202
5203
.Struct = > switch (container_ty .containerLayout (mod )) {
5203
5204
.Auto , .Extern = > for (field_index .. container_ty .structFieldCount (mod )) | next_field_index | {
@@ -5211,7 +5212,7 @@ fn fieldLocation(
5211
5212
.{ .identifier = ip .stringToSlice (container_ty .structFieldName (next_field_index , mod )) } };
5212
5213
} else if (container_ty .hasRuntimeBitsIgnoreComptime (mod )) .end else .begin ,
5213
5214
.Packed = > if (field_ptr_ty .ptrInfo (mod ).packed_offset .host_size == 0 )
5214
- .{ .byte_offset = container_ty .packedStructFieldByteOffset (field_index , mod ) }
5215
+ .{ .byte_offset = container_ty .packedStructFieldByteOffset (field_index , mod ) + @divExact ( container_ptr_ty . ptrInfo ( mod ). packed_offset . bit_offset , 8 ) }
5215
5216
else
5216
5217
.begin ,
5217
5218
},
@@ -5282,7 +5283,7 @@ fn airFieldParentPtr(f: *Function, inst: Air.Inst.Index) !CValue {
5282
5283
try f .renderType (writer , container_ptr_ty );
5283
5284
try writer .writeByte (')' );
5284
5285
5285
- switch (fieldLocation (container_ty , field_ptr_ty , extra .field_index , mod )) {
5286
+ switch (fieldLocation (container_ptr_ty , field_ptr_ty , extra .field_index , mod )) {
5286
5287
.begin = > try f .writeCValue (writer , field_ptr_val , .Initializer ),
5287
5288
.field = > | field | {
5288
5289
const u8_ptr_ty = try mod .adjustPtrTypeChild (field_ptr_ty , Type .u8 );
@@ -5339,7 +5340,7 @@ fn fieldPtr(
5339
5340
try f .renderType (writer , field_ptr_ty );
5340
5341
try writer .writeByte (')' );
5341
5342
5342
- switch (fieldLocation (container_ty , field_ptr_ty , field_index , mod )) {
5343
+ switch (fieldLocation (container_ptr_ty , field_ptr_ty , field_index , mod )) {
5343
5344
.begin = > try f .writeCValue (writer , container_ptr_val , .Initializer ),
5344
5345
.field = > | field | {
5345
5346
try writer .writeByte ('&' );
0 commit comments