disallow alignment on packed union fields

This commit is contained in:
David Rubin 2025-08-01 14:57:06 -07:00
parent 5678a600ff
commit e82d67233b
No known key found for this signature in database
GPG key ID: B30A9572D968B0E1
5 changed files with 16 additions and 12 deletions

View file

@ -5386,6 +5386,9 @@ fn unionDeclInner(
return astgen.failNode(member_node, "union field missing type", .{});
}
if (member.ast.align_expr.unwrap()) |align_expr| {
if (layout == .@"packed") {
return astgen.failNode(align_expr, "unable to override alignment of packed union fields", .{});
}
const align_inst = try expr(&block_scope, &block_scope.base, coerced_align_ri, align_expr);
wip_members.appendToField(@intFromEnum(align_inst));
any_aligned_fields = true;

View file

@ -433,8 +433,8 @@ test "Type.Union" {
.layout = .@"packed",
.tag_type = null,
.fields = &.{
.{ .name = "signed", .type = i32, .alignment = @alignOf(i32) },
.{ .name = "unsigned", .type = u32, .alignment = @alignOf(u32) },
.{ .name = "signed", .type = i32, .alignment = 0 },
.{ .name = "unsigned", .type = u32, .alignment = 0 },
},
.decls = &.{},
},

View file

@ -1,9 +0,0 @@
export fn entry() void {
_ = @Type(.{ .@"struct" = .{ .layout = .@"packed", .fields = &.{
.{ .name = "one", .type = u4, .default_value_ptr = null, .is_comptime = false, .alignment = 2 },
}, .decls = &.{}, .is_tuple = false } });
}
// error
//
// :2:9: error: alignment in a packed struct field must be set to 0

View file

@ -0,0 +1,9 @@
const U = packed union {
x: f32,
y: u8 align(10),
z: u32,
};
// error
//
// :3:17: error: unable to override alignment of packed union fields

View file

@ -75,4 +75,5 @@ comptime {
// :16:5: error: tuple field name '3' does not match field index 0
// :30:5: error: comptime field without default initialization value
// :44:5: error: extern struct fields cannot be marked comptime
// :58:5: error: alignment in a packed struct field must be set to 0
// :58:5: error: alignment of a packed struct field must be set to 0