diff options
| author | Jacob Young <jacobly0@users.noreply.github.com> | 2022-12-18 22:09:13 -0500 |
|---|---|---|
| committer | Jacob Young <jacobly0@users.noreply.github.com> | 2022-12-18 22:11:26 -0500 |
| commit | 0e3feebb042a538405153e4bc75a3bb73ee2e63c (patch) | |
| tree | d597c19b71254dacb25c7744b03eb5c37d9ee516 /test/behavior | |
| parent | 52e5c6602550788cab96957d1a177bc7952d7a09 (diff) | |
| download | zig-0e3feebb042a538405153e4bc75a3bb73ee2e63c.tar.gz zig-0e3feebb042a538405153e4bc75a3bb73ee2e63c.zip | |
codegen: fix taking the address of a zero-bit field in a zero-bit struct
Normally when we want a pointer to the end of a struct we just add 1 to
the struct pointer. However, when it is a zero-bit struct, the pointer
type being used during lowering is often a dummy pointer type that
actually points to a non-zero-bit type, so we actually want to add 0
instead, since a zero-bit struct begins and ends at the same address.
Diffstat (limited to 'test/behavior')
| -rw-r--r-- | test/behavior/struct.zig | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/test/behavior/struct.zig b/test/behavior/struct.zig index 0984f7d1e4..b6567b14c3 100644 --- a/test/behavior/struct.zig +++ b/test/behavior/struct.zig @@ -1365,7 +1365,7 @@ test "fieldParentPtr of a zero-bit field" { if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO const S = struct { - fn testOneType(comptime A: type) !void { + fn testStruct(comptime A: type) !void { { const a = A{ .u = 0 }; const b_ptr = &a.b; @@ -1379,9 +1379,29 @@ test "fieldParentPtr of a zero-bit field" { try std.testing.expectEqual(&a, a_ptr); } } + fn testNestedStruct(comptime A: type) !void { + { + const a = A{ .u = 0 }; + const c_ptr = &a.b.c; + const b_ptr = @fieldParentPtr(@TypeOf(a.b), "c", c_ptr); + try std.testing.expectEqual(&a.b, b_ptr); + const a_ptr = @fieldParentPtr(A, "b", b_ptr); + try std.testing.expectEqual(&a, a_ptr); + } + { + var a = A{ .u = 0 }; + const c_ptr = &a.b.c; + const b_ptr = @fieldParentPtr(@TypeOf(a.b), "c", c_ptr); + try std.testing.expectEqual(&a.b, b_ptr); + const a_ptr = @fieldParentPtr(A, "b", b_ptr); + try std.testing.expectEqual(&a, a_ptr); + } + } fn doTheTest() !void { - try testOneType(struct { b: void = {}, u: u8 }); - try testOneType(struct { u: u8, b: void = {} }); + try testStruct(struct { b: void = {}, u: u8 }); + try testStruct(struct { u: u8, b: void = {} }); + try testNestedStruct(struct { b: struct { c: void = {} } = .{}, u: u8 }); + try testNestedStruct(struct { u: u8, b: struct { c: void = {} } = .{} }); } }; try S.doTheTest(); |
