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 {...@@ -3619,6 +3619,9 @@ pub const Type = extern union {
36193619
3620 .@"struct" => {3620 .@"struct" => {
3621 if (sema_kit) |sk| _ = try sk.sema.resolveTypeFields(sk.block, sk.src, ty);3621 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 }
3622 var total: u64 = 0;3625 var total: u64 = 0;
3623 for (ty.structFields().values()) |field| {3626 for (ty.structFields().values()) |field| {
3624 total += try bitSizeAdvanced(field.ty, target, sema_kit);3627 total += try bitSizeAdvanced(field.ty, target, sema_kit);
...@@ -3628,6 +3631,9 @@ pub const Type = extern union {...@@ -3628,6 +3631,9 @@ pub const Type = extern union {
36283631
3629 .tuple, .anon_struct => {3632 .tuple, .anon_struct => {
3630 if (sema_kit) |sk| _ = try sk.sema.resolveTypeFields(sk.block, sk.src, ty);3633 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 }
3631 var total: u64 = 0;3637 var total: u64 = 0;
3632 for (ty.tupleFields().types) |field_ty| {3638 for (ty.tupleFields().types) |field_ty| {
3633 total += try bitSizeAdvanced(field_ty, target, sema_kit);3639 total += try bitSizeAdvanced(field_ty, target, sema_kit);
...@@ -3643,6 +3649,9 @@ pub const Type = extern union {...@@ -3643,6 +3649,9 @@ pub const Type = extern union {
36433649
3644 .@"union", .union_safety_tagged, .union_tagged => {3650 .@"union", .union_safety_tagged, .union_tagged => {
3645 if (sema_kit) |sk| _ = try sk.sema.resolveTypeFields(sk.block, sk.src, ty);3651 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 }
3646 const union_obj = ty.cast(Payload.Union).?.data;3655 const union_obj = ty.cast(Payload.Union).?.data;
3647 assert(union_obj.haveFieldTypes());3656 assert(union_obj.haveFieldTypes());
36483657
test/behavior/sizeof_and_typeof.zig+1-1
...@@ -218,7 +218,7 @@ test "@bitSizeOf" {...@@ -218,7 +218,7 @@ test "@bitSizeOf" {
218 try expect(@bitSizeOf(u8) == @sizeOf(u8) * 8);218 try expect(@bitSizeOf(u8) == @sizeOf(u8) * 8);
219 try expect(@bitSizeOf(struct {219 try expect(@bitSizeOf(struct {
220 a: u2,220 a: u2,
221 }) == 2);221 }) == 8);
222 try expect(@bitSizeOf(packed struct {222 try expect(@bitSizeOf(packed struct {
223 a: u2,223 a: u2,
224 }) == 2);224 }) == 2);