motiejus/zig

fork of https://codeberg.org/ziglang/zig
git clone https://git.jakstys.lt/motiejus/zig.git
Log | Tree | Refs | README | LICENSE

commit 13897be0abfeddf7bdfbdc1600bd8279c26004de (tree)
parent 4aaff75c8191b9cff40d3423f44bdb831a88d89b
Author: Veikka Tuominen <git@vexu.eu>
Date:   Tue, 18 Oct 2022 12:40:01 +0300

Type: bitSizeOf non-packed structs should include padding

Closes #13214

Diffstat:
Msrc/type.zig | 9+++++++++
Mtest/behavior/sizeof_and_typeof.zig | 2+-
2 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/src/type.zig b/src/type.zig @@ -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()); diff --git a/test/behavior/sizeof_and_typeof.zig b/test/behavior/sizeof_and_typeof.zig @@ -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);