Commit e82d67233b

David Rubin <david@vortan.dev>
2025-08-01 23:57:06
disallow alignment on packed union fields
1 parent 5678a60
lib/std/zig/AstGen.zig
@@ -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;
test/behavior/type.zig
@@ -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 = &.{},
         },
test/cases/compile_errors/packed_struct_field_alignment_unavailable_for_reify_type.zig
@@ -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
test/cases/compile_errors/packed_union_alignment_override.zig
@@ -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
test/cases/compile_errors/reify_struct.zig
@@ -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
+