authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-06-30 23:24:52-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-06-30 23:24:52-04:00
logf571438fc0010c0c45f79a2f709161a324c5a164
tree894900ec24a7b37b437ee106564d9776d4217138
parent2282c278850e29af81e463d55c81fa08855823f8

Unrevert "Sema: preserve extern struct field alignment"

This unreverts commit 1a2468abfcd8b539193d943c1eefb71319cc7b88.

3 files changed, 20 insertions(+), 15 deletions(-)

lib/std/net.zig+2-2
...@@ -316,7 +316,7 @@ pub const Ip6Address = extern struct {...@@ -316,7 +316,7 @@ pub const Ip6Address = extern struct {
316 .addr = undefined,316 .addr = undefined,
317 },317 },
318 };318 };
319 var ip_slice = result.sa.addr[0..];319 var ip_slice: *[16]u8 = result.sa.addr[0..];
320320
321 var tail: [16]u8 = undefined;321 var tail: [16]u8 = undefined;
322322
...@@ -431,7 +431,7 @@ pub const Ip6Address = extern struct {...@@ -431,7 +431,7 @@ pub const Ip6Address = extern struct {
431 .addr = undefined,431 .addr = undefined,
432 },432 },
433 };433 };
434 var ip_slice = result.sa.addr[0..];434 var ip_slice: *[16]u8 = result.sa.addr[0..];
435435
436 var tail: [16]u8 = undefined;436 var tail: [16]u8 = undefined;
437437
src/Sema.zig+7-3
...@@ -25926,9 +25926,13 @@ fn structFieldPtrByIndex(...@@ -25926,9 +25926,13 @@ fn structFieldPtrByIndex(
25926 ptr_ty_data.packed_offset = .{ .host_size = 0, .bit_offset = 0 };25926 ptr_ty_data.packed_offset = .{ .host_size = 0, .bit_offset = 0 };
25927 }25927 }
25928 }25928 }
25929 } else if (struct_obj.layout == .Extern and field_index == 0) {25929 } else if (struct_obj.layout == .Extern) {
25930 // This is the first field in memory, so can inherit the struct alignment25930 // For extern structs, field aligment might be bigger than type's natural alignment. Eg, in
25931 ptr_ty_data.flags.alignment = Alignment.fromByteUnits(parent_align);25931 // `extern struct { x: u32, y: u16 }` the second field is aligned as u32.
25932 const field_offset = struct_ty.structFieldOffset(field_index, mod);
25933 ptr_ty_data.flags.alignment = Alignment.fromByteUnits(
25934 if (parent_align == 0) 0 else std.math.gcd(field_offset, parent_align),
25935 );
25932 } else {25936 } else {
25933 // Our alignment is capped at the field alignment25937 // Our alignment is capped at the field alignment
25934 const field_align = try sema.structFieldAlignment(field, struct_obj.layout);25938 const field_align = try sema.structFieldAlignment(field, struct_obj.layout);
test/behavior/struct.zig+11-10
...@@ -1680,9 +1680,9 @@ test "extern struct field pointer has correct alignment" {...@@ -1680,9 +1680,9 @@ test "extern struct field pointer has correct alignment" {
16801680
1681 const S = struct {1681 const S = struct {
1682 fn doTheTest() !void {1682 fn doTheTest() !void {
1683 var a: extern struct { x: u32, y: u32 } = .{ .x = 1, .y = 2 };1683 var a: extern struct { x: u32, y: u16 } = .{ .x = 1, .y = 2 };
1684 var b: extern struct { x: u32, y: u32 } align(1) = .{ .x = 3, .y = 4 };1684 var b: extern struct { x: u32, y: u16 } align(1) = .{ .x = 3, .y = 4 };
1685 var c: extern struct { x: u32, y: u32 } align(64) = .{ .x = 5, .y = 6 };1685 var c: extern struct { x: u32, y: u16 } align(64) = .{ .x = 5, .y = 6 };
16861686
1687 const axp = &a.x;1687 const axp = &a.x;
1688 const bxp = &b.x;1688 const bxp = &b.x;
...@@ -1693,18 +1693,19 @@ test "extern struct field pointer has correct alignment" {...@@ -1693,18 +1693,19 @@ test "extern struct field pointer has correct alignment" {
16931693
1694 comptime assert(@TypeOf(axp) == *u32);1694 comptime assert(@TypeOf(axp) == *u32);
1695 comptime assert(@TypeOf(bxp) == *align(1) u32);1695 comptime assert(@TypeOf(bxp) == *align(1) u32);
1696 comptime assert(@TypeOf(cxp) == *align(64) u32); // first field, inherits larger alignment1696 comptime assert(@TypeOf(cxp) == *align(64) u32);
1697 comptime assert(@TypeOf(ayp) == *u32);1697
1698 comptime assert(@TypeOf(byp) == *align(1) u32);1698 comptime assert(@TypeOf(ayp) == *align(@alignOf(u32)) u16);
1699 comptime assert(@TypeOf(cyp) == *u32);1699 comptime assert(@TypeOf(byp) == *align(1) u16);
1700 comptime assert(@TypeOf(cyp) == *align(@alignOf(u32)) u16);
17001701
1701 try expectEqual(@as(u32, 1), axp.*);1702 try expectEqual(@as(u32, 1), axp.*);
1702 try expectEqual(@as(u32, 3), bxp.*);1703 try expectEqual(@as(u32, 3), bxp.*);
1703 try expectEqual(@as(u32, 5), cxp.*);1704 try expectEqual(@as(u32, 5), cxp.*);
17041705
1705 try expectEqual(@as(u32, 2), ayp.*);1706 try expectEqual(@as(u16, 2), ayp.*);
1706 try expectEqual(@as(u32, 4), byp.*);1707 try expectEqual(@as(u16, 4), byp.*);
1707 try expectEqual(@as(u32, 6), cyp.*);1708 try expectEqual(@as(u16, 6), cyp.*);
1708 }1709 }
1709 };1710 };
17101711