mirror of
https://github.com/ziglang/zig.git
synced 2026-02-12 20:37:54 +00:00
Type: bitSizeOf non-packed structs should include padding
Closes #13214
This commit is contained in:
parent
4aaff75c81
commit
13897be0ab
@ -3619,6 +3619,9 @@ pub const Type = extern union {
|
||||
|
||||
.@"struct" => {
|
||||
if (sema_kit) |sk| _ = try sk.sema.resolveTypeFields(sk.block, sk.src, ty);
|
||||
if (ty.containerLayout() != .Packed) {
|
||||
return (try ty.abiSizeAdvanced(target, if (sema_kit) |sk| .{ .sema_kit = sk } else .eager)).scalar * 8;
|
||||
}
|
||||
var total: u64 = 0;
|
||||
for (ty.structFields().values()) |field| {
|
||||
total += try bitSizeAdvanced(field.ty, target, sema_kit);
|
||||
@ -3628,6 +3631,9 @@ pub const Type = extern union {
|
||||
|
||||
.tuple, .anon_struct => {
|
||||
if (sema_kit) |sk| _ = try sk.sema.resolveTypeFields(sk.block, sk.src, ty);
|
||||
if (ty.containerLayout() != .Packed) {
|
||||
return (try ty.abiSizeAdvanced(target, if (sema_kit) |sk| .{ .sema_kit = sk } else .eager)).scalar * 8;
|
||||
}
|
||||
var total: u64 = 0;
|
||||
for (ty.tupleFields().types) |field_ty| {
|
||||
total += try bitSizeAdvanced(field_ty, target, sema_kit);
|
||||
@ -3643,6 +3649,9 @@ pub const Type = extern union {
|
||||
|
||||
.@"union", .union_safety_tagged, .union_tagged => {
|
||||
if (sema_kit) |sk| _ = try sk.sema.resolveTypeFields(sk.block, sk.src, ty);
|
||||
if (ty.containerLayout() != .Packed) {
|
||||
return (try ty.abiSizeAdvanced(target, if (sema_kit) |sk| .{ .sema_kit = sk } else .eager)).scalar * 8;
|
||||
}
|
||||
const union_obj = ty.cast(Payload.Union).?.data;
|
||||
assert(union_obj.haveFieldTypes());
|
||||
|
||||
|
||||
@ -218,7 +218,7 @@ test "@bitSizeOf" {
|
||||
try expect(@bitSizeOf(u8) == @sizeOf(u8) * 8);
|
||||
try expect(@bitSizeOf(struct {
|
||||
a: u2,
|
||||
}) == 2);
|
||||
}) == 8);
|
||||
try expect(@bitSizeOf(packed struct {
|
||||
a: u2,
|
||||
}) == 2);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user