From 1a2468abfcd8b539193d943c1eefb71319cc7b88 Mon Sep 17 00:00:00 2001 From: Jacob Young Date: Thu, 29 Jun 2023 00:04:51 -0400 Subject: [PATCH] Revert "Sema: preserve extern struct field alignment" This reverts commit 4620972d086ebb3b7686a79914876488c6dfd171. --- lib/std/net.zig | 4 ++-- src/Sema.zig | 10 +++------- test/behavior/struct.zig | 21 ++++++++++----------- 3 files changed, 15 insertions(+), 20 deletions(-) diff --git a/lib/std/net.zig b/lib/std/net.zig index b03c7e09dc..7a8ca62022 100644 --- a/lib/std/net.zig +++ b/lib/std/net.zig @@ -316,7 +316,7 @@ pub const Ip6Address = extern struct { .addr = undefined, }, }; - var ip_slice: *[16]u8 = result.sa.addr[0..]; + var ip_slice = result.sa.addr[0..]; var tail: [16]u8 = undefined; @@ -431,7 +431,7 @@ pub const Ip6Address = extern struct { .addr = undefined, }, }; - var ip_slice: *[16]u8 = result.sa.addr[0..]; + var ip_slice = result.sa.addr[0..]; var tail: [16]u8 = undefined; diff --git a/src/Sema.zig b/src/Sema.zig index 0681de4ad5..c1ec7d1f01 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -25926,13 +25926,9 @@ fn structFieldPtrByIndex( ptr_ty_data.packed_offset = .{ .host_size = 0, .bit_offset = 0 }; } } - } else if (struct_obj.layout == .Extern) { - // For extern structs, field aligment might be bigger than type's natural alignment. Eg, in - // `extern struct { x: u32, y: u16 }` the second field is aligned as u32. - const field_offset = struct_ty.structFieldOffset(field_index, mod); - ptr_ty_data.flags.alignment = Alignment.fromByteUnits( - if (parent_align == 0) 0 else std.math.gcd(field_offset, parent_align), - ); + } else if (struct_obj.layout == .Extern and field_index == 0) { + // This is the first field in memory, so can inherit the struct alignment + ptr_ty_data.flags.alignment = Alignment.fromByteUnits(parent_align); } else { // Our alignment is capped at the field alignment const field_align = try sema.structFieldAlignment(field, struct_obj.layout); diff --git a/test/behavior/struct.zig b/test/behavior/struct.zig index ab7b97ae94..1335498ca4 100644 --- a/test/behavior/struct.zig +++ b/test/behavior/struct.zig @@ -1680,9 +1680,9 @@ test "extern struct field pointer has correct alignment" { const S = struct { fn doTheTest() !void { - var a: extern struct { x: u32, y: u16 } = .{ .x = 1, .y = 2 }; - var b: extern struct { x: u32, y: u16 } align(1) = .{ .x = 3, .y = 4 }; - var c: extern struct { x: u32, y: u16 } align(64) = .{ .x = 5, .y = 6 }; + var a: extern struct { x: u32, y: u32 } = .{ .x = 1, .y = 2 }; + var b: extern struct { x: u32, y: u32 } align(1) = .{ .x = 3, .y = 4 }; + var c: extern struct { x: u32, y: u32 } align(64) = .{ .x = 5, .y = 6 }; const axp = &a.x; const bxp = &b.x; @@ -1693,19 +1693,18 @@ test "extern struct field pointer has correct alignment" { comptime assert(@TypeOf(axp) == *u32); comptime assert(@TypeOf(bxp) == *align(1) u32); - comptime assert(@TypeOf(cxp) == *align(64) u32); - - comptime assert(@TypeOf(ayp) == *align(@alignOf(u32)) u16); - comptime assert(@TypeOf(byp) == *align(1) u16); - comptime assert(@TypeOf(cyp) == *align(@alignOf(u32)) u16); + comptime assert(@TypeOf(cxp) == *align(64) u32); // first field, inherits larger alignment + comptime assert(@TypeOf(ayp) == *u32); + comptime assert(@TypeOf(byp) == *align(1) u32); + comptime assert(@TypeOf(cyp) == *u32); try expectEqual(@as(u32, 1), axp.*); try expectEqual(@as(u32, 3), bxp.*); try expectEqual(@as(u32, 5), cxp.*); - try expectEqual(@as(u16, 2), ayp.*); - try expectEqual(@as(u16, 4), byp.*); - try expectEqual(@as(u16, 6), cyp.*); + try expectEqual(@as(u32, 2), ayp.*); + try expectEqual(@as(u32, 4), byp.*); + try expectEqual(@as(u32, 6), cyp.*); } };