| ... | ... | @@ -1,6 +1,7 @@ |
| 1 | 1 | const std = @import("std"); |
| 2 | 2 | const builtin = @import("builtin"); |
| 3 | 3 | const native_endian = builtin.target.cpu.arch.endian(); |
| 4 | const assert = std.debug.assert; |
| 4 | 5 | const expect = std.testing.expect; |
| 5 | 6 | const expectEqual = std.testing.expectEqual; |
| 6 | 7 | const expectEqualSlices = std.testing.expectEqualSlices; |
| ... | ... | @@ -1637,3 +1638,79 @@ test "instantiate struct with comptime field" { |
| 1637 | 1638 | comptime std.debug.assert(things.foo == 1); |
| 1638 | 1639 | } |
| 1639 | 1640 | } |
| 1641 | |
| 1642 | test "struct field pointer has correct alignment" { |
| 1643 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 1644 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 1645 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 1646 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 1647 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1648 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 1649 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO |
| 1650 | |
| 1651 | const S = struct { |
| 1652 | fn doTheTest() !void { |
| 1653 | var a: struct { x: u32 } = .{ .x = 123 }; |
| 1654 | var b: struct { x: u32 } align(1) = .{ .x = 456 }; |
| 1655 | var c: struct { x: u32 } align(64) = .{ .x = 789 }; |
| 1656 | |
| 1657 | const ap = &a.x; |
| 1658 | const bp = &b.x; |
| 1659 | const cp = &c.x; |
| 1660 | |
| 1661 | comptime assert(@TypeOf(ap) == *u32); |
| 1662 | comptime assert(@TypeOf(bp) == *align(1) u32); |
| 1663 | comptime assert(@TypeOf(cp) == *u32); // undefined layout, cannot inherit larger alignment |
| 1664 | |
| 1665 | try expectEqual(@as(u32, 123), ap.*); |
| 1666 | try expectEqual(@as(u32, 456), bp.*); |
| 1667 | try expectEqual(@as(u32, 789), cp.*); |
| 1668 | } |
| 1669 | }; |
| 1670 | |
| 1671 | try S.doTheTest(); |
| 1672 | try comptime S.doTheTest(); |
| 1673 | } |
| 1674 | |
| 1675 | test "extern struct field pointer has correct alignment" { |
| 1676 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 1677 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 1678 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 1679 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 1680 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1681 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 1682 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO |
| 1683 | |
| 1684 | const S = struct { |
| 1685 | fn doTheTest() !void { |
| 1686 | var a: extern struct { x: u32, y: u32 } = .{ .x = 1, .y = 2 }; |
| 1687 | var b: extern struct { x: u32, y: u32 } align(1) = .{ .x = 3, .y = 4 }; |
| 1688 | var c: extern struct { x: u32, y: u32 } align(64) = .{ .x = 5, .y = 6 }; |
| 1689 | |
| 1690 | const axp = &a.x; |
| 1691 | const bxp = &b.x; |
| 1692 | const cxp = &c.x; |
| 1693 | const ayp = &a.y; |
| 1694 | const byp = &b.y; |
| 1695 | const cyp = &c.y; |
| 1696 | |
| 1697 | comptime assert(@TypeOf(axp) == *u32); |
| 1698 | comptime assert(@TypeOf(bxp) == *align(1) u32); |
| 1699 | comptime assert(@TypeOf(cxp) == *align(64) u32); // first field, inherits larger alignment |
| 1700 | comptime assert(@TypeOf(ayp) == *u32); |
| 1701 | comptime assert(@TypeOf(byp) == *align(1) u32); |
| 1702 | comptime assert(@TypeOf(cyp) == *u32); |
| 1703 | |
| 1704 | try expectEqual(@as(u32, 1), axp.*); |
| 1705 | try expectEqual(@as(u32, 3), bxp.*); |
| 1706 | try expectEqual(@as(u32, 5), cxp.*); |
| 1707 | |
| 1708 | try expectEqual(@as(u32, 2), ayp.*); |
| 1709 | try expectEqual(@as(u32, 4), byp.*); |
| 1710 | try expectEqual(@as(u32, 6), cyp.*); |
| 1711 | } |
| 1712 | }; |
| 1713 | |
| 1714 | try S.doTheTest(); |
| 1715 | try comptime S.doTheTest(); |
| 1716 | } |