From bd2f9227435cc968b387e0b56498e5759718c56f Mon Sep 17 00:00:00 2001
From: Andrew Kelley <andrew@ziglang.org>
Date: Mon, 31 Jul 2023 18:25:27 -0700
Subject: [PATCH] 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
---
 test/behavior/align.zig | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/test/behavior/align.zig b/test/behavior/align.zig
index a5e0369ae7b8..ee6033ede443 100644
--- a/test/behavior/align.zig
+++ b/test/behavior/align.zig
@@ -593,3 +593,25 @@ test "alignment of slice element" {
     const a: []align(1024) const u8 = undefined;
     try expect(@TypeOf(&a[0]) == *align(1024) const u8);
 }
+
+test "sub-aligned pointer field access" {
+    if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
+    if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
+    if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest;
+    if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
+    if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
+
+    // Originally reported at https://github.com/ziglang/zig/issues/14904
+
+    const Header = extern struct {
+        tag: u32,
+        bytes_len: u32,
+    };
+    var buf: [9]u8 align(4) = .{ 1, 2, 3, 4, 5, 6, 7, 8, 9 };
+    const ptr: *align(1) Header = @ptrCast(buf[1..][0..8]);
+    const x = ptr.bytes_len;
+    switch (builtin.cpu.arch.endian()) {
+        .Big => try expect(x == 0x06070809),
+        .Little => try expect(x == 0x09080706),
+    }
+}