mirror of
https://codeberg.org/ziglang/zig.git
synced 2025-12-06 13:54:21 +00:00
disallow alignment on packed union fields
This commit is contained in:
parent
5678a600ff
commit
e82d67233b
5 changed files with 16 additions and 12 deletions
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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 = &.{},
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue