authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-11-04 18:47:52+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-11-05 12:54:38+02:00
logf92e7bed7b6b83b2cdfe2bfed047e3a7bcdd2116
tree1e88680f7a1ff2b488f41a7ce89439183456acb2
parent51b1083d66b29d110c8cf60b59052170dd34a95f

stage2: bitsize of packed struct should trigger backing int ty check

Closes #13398

2 files changed, 18 insertions(+), 7 deletions(-)

src/type.zig+5-7
......@@ -3574,15 +3574,13 @@ pub const Type = extern union {
35743574 .u128, .i128, .f128 => return 128,
35753575
35763576 .@"struct" => {
3577 if (sema_kit) |sk| _ = try sk.sema.resolveTypeFields(sk.block, sk.src, ty);
3578 if (ty.containerLayout() != .Packed) {
3577 const struct_obj = ty.castTag(.@"struct").?.data;
3578 if (struct_obj.layout != .Packed) {
35793579 return (try ty.abiSizeAdvanced(target, if (sema_kit) |sk| .{ .sema_kit = sk } else .eager)).scalar * 8;
35803580 }
3581 var total: u64 = 0;
3582 for (ty.structFields().values()) |field| {
3583 total += try bitSizeAdvanced(field.ty, target, sema_kit);
3584 }
3585 return total;
3581 if (sema_kit) |sk| _ = try sk.sema.resolveTypeLayout(sk.block, sk.src, ty);
3582 assert(struct_obj.haveLayout());
3583 return try struct_obj.backing_int_ty.bitSizeAdvanced(target, sema_kit);
35863584 },
35873585
35883586 .tuple, .anon_struct => {
test/cases/compile_errors/bitsize_of_packed_struct_checks_backing_int_ty.zig created+13
......@@ -0,0 +1,13 @@
1const Foo = packed struct(u32) {
2 x: u1,
3};
4fn bar(_: Foo) callconv(.C) void {}
5pub export fn entry() void {
6 bar(.{ .x = 0 });
7}
8
9// error
10// backend=stage2
11// target=native
12//
13// :1:27: error: backing integer type 'u32' has bit size 32 but the struct fields have a total bit size of 1