Skip to content

Commit 8da43d0

Browse files
committed
llvm: correct calculation of index of zero-bit field
If the field comes before any non-zero-bit field then the index of the next field should be returned. Closes ziglang#13363
1 parent bd91fdc commit 8da43d0

File tree

2 files changed

+22
-2
lines changed

2 files changed

+22
-2
lines changed

src/codegen/llvm.zig

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10096,7 +10096,7 @@ fn llvmFieldIndex(
1009610096
llvm_field_index += 1;
1009710097
}
1009810098

10099-
if (field_index == i) {
10099+
if (field_index <= i) {
1010010100
ptr_pl_buf.* = .{
1010110101
.data = .{
1010210102
.pointee_type = field_ty,
@@ -10129,7 +10129,7 @@ fn llvmFieldIndex(
1012910129
llvm_field_index += 1;
1013010130
}
1013110131

10132-
if (field_index == i) {
10132+
if (field_index <= i) {
1013310133
ptr_pl_buf.* = .{
1013410134
.data = .{
1013510135
.pointee_type = field.ty,

test/behavior/struct.zig

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1398,3 +1398,23 @@ test "under-aligned struct field" {
13981398
const result = std.mem.readIntNative(u64, array[4..12]);
13991399
try expect(result == 1234);
14001400
}
1401+
1402+
test "address of zero-bit field is equal to address of only field" {
1403+
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1404+
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1405+
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1406+
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
1407+
1408+
{
1409+
const A = struct { b: void = {}, u: u8 };
1410+
var a = A{ .u = 0 };
1411+
const a_ptr = @fieldParentPtr(A, "b", &a.b);
1412+
try std.testing.expectEqual(&a, a_ptr);
1413+
}
1414+
{
1415+
const A = struct { u: u8, b: void = {} };
1416+
var a = A{ .u = 0 };
1417+
const a_ptr = @fieldParentPtr(A, "b", &a.b);
1418+
try std.testing.expectEqual(&a, a_ptr);
1419+
}
1420+
}

0 commit comments

Comments
 (0)