authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-07-31 18:25:27-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-08-01 00:39:30-07:00
log4f6013bf50e1b99b5c9ea238a2165bfe41fc57d4
treeb56fec06557c59b22580db67fc5caa31a8a4d228
parente84cda0ebf8886346d42db78e8f3eb8d0bf515bd

add behavior test for sub-aligned field access

The workaround in std.zig.Server remains because the C backend is not passing the new test. see #14904

1 files changed, 22 insertions(+), 0 deletions(-)

test/behavior/align.zig+22
...@@ -593,3 +593,25 @@ test "alignment of slice element" {...@@ -593,3 +593,25 @@ test "alignment of slice element" {
593 const a: []align(1024) const u8 = undefined;593 const a: []align(1024) const u8 = undefined;
594 try expect(@TypeOf(&a[0]) == *align(1024) const u8);594 try expect(@TypeOf(&a[0]) == *align(1024) const u8);
595}595}
596
597test "sub-aligned pointer field access" {
598 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
599 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
600 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest;
601 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
602 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
603
604 // Originally reported at https://github.com/ziglang/zig/issues/14904
605
606 const Header = extern struct {
607 tag: u32,
608 bytes_len: u32,
609 };
610 var buf: [9]u8 align(4) = .{ 1, 2, 3, 4, 5, 6, 7, 8, 9 };
611 const ptr: *align(1) Header = @ptrCast(buf[1..][0..8]);
612 const x = ptr.bytes_len;
613 switch (builtin.cpu.arch.endian()) {
614 .Big => try expect(x == 0x06070809),
615 .Little => try expect(x == 0x09080706),
616 }
617}