authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-10-18 12:40:01+03:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-10-20 20:11:00+03:00
log13897be0abfeddf7bdfbdc1600bd8279c26004de
tree59417b4c3b27894002a20faa1dd64882a87572fc
parent4aaff75c8191b9cff40d3423f44bdb831a88d89b

Type: bitSizeOf non-packed structs should include padding

Closes #13214

2 files changed, 10 insertions(+), 1 deletions(-)

src/type.zig+9
......@@ -3619,6 +3619,9 @@ pub const Type = extern union {
36193619
36203620 .@"struct" => {
36213621 if (sema_kit) |sk| _ = try sk.sema.resolveTypeFields(sk.block, sk.src, ty);
3622 if (ty.containerLayout() != .Packed) {
3623 return (try ty.abiSizeAdvanced(target, if (sema_kit) |sk| .{ .sema_kit = sk } else .eager)).scalar * 8;
3624 }
36223625 var total: u64 = 0;
36233626 for (ty.structFields().values()) |field| {
36243627 total += try bitSizeAdvanced(field.ty, target, sema_kit);
......@@ -3628,6 +3631,9 @@ pub const Type = extern union {
36283631
36293632 .tuple, .anon_struct => {
36303633 if (sema_kit) |sk| _ = try sk.sema.resolveTypeFields(sk.block, sk.src, ty);
3634 if (ty.containerLayout() != .Packed) {
3635 return (try ty.abiSizeAdvanced(target, if (sema_kit) |sk| .{ .sema_kit = sk } else .eager)).scalar * 8;
3636 }
36313637 var total: u64 = 0;
36323638 for (ty.tupleFields().types) |field_ty| {
36333639 total += try bitSizeAdvanced(field_ty, target, sema_kit);
......@@ -3643,6 +3649,9 @@ pub const Type = extern union {
36433649
36443650 .@"union", .union_safety_tagged, .union_tagged => {
36453651 if (sema_kit) |sk| _ = try sk.sema.resolveTypeFields(sk.block, sk.src, ty);
3652 if (ty.containerLayout() != .Packed) {
3653 return (try ty.abiSizeAdvanced(target, if (sema_kit) |sk| .{ .sema_kit = sk } else .eager)).scalar * 8;
3654 }
36463655 const union_obj = ty.cast(Payload.Union).?.data;
36473656 assert(union_obj.haveFieldTypes());
36483657
test/behavior/sizeof_and_typeof.zig+1-1
......@@ -218,7 +218,7 @@ test "@bitSizeOf" {
218218 try expect(@bitSizeOf(u8) == @sizeOf(u8) * 8);
219219 try expect(@bitSizeOf(struct {
220220 a: u2,
221 }) == 2);
221 }) == 8);
222222 try expect(@bitSizeOf(packed struct {
223223 a: u2,
224224 }) == 2);