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", .{}); return astgen.failNode(member_node, "union field missing type", .{});
} }
if (member.ast.align_expr.unwrap()) |align_expr| { 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); const align_inst = try expr(&block_scope, &block_scope.base, coerced_align_ri, align_expr);
wip_members.appendToField(@intFromEnum(align_inst)); wip_members.appendToField(@intFromEnum(align_inst));
any_aligned_fields = true; any_aligned_fields = true;

View File

@ -433,8 +433,8 @@ test "Type.Union" {
.layout = .@"packed", .layout = .@"packed",
.tag_type = null, .tag_type = null,
.fields = &.{ .fields = &.{
.{ .name = "signed", .type = i32, .alignment = @alignOf(i32) }, .{ .name = "signed", .type = i32, .alignment = 0 },
.{ .name = "unsigned", .type = u32, .alignment = @alignOf(u32) }, .{ .name = "unsigned", .type = u32, .alignment = 0 },
}, },
.decls = &.{}, .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 // :16:5: error: tuple field name '3' does not match field index 0
// :30:5: error: comptime field without default initialization value // :30:5: error: comptime field without default initialization value
// :44:5: error: extern struct fields cannot be marked comptime // :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