const expect = @import("std").testing.expect;
const builtin = @import("builtin");

test "@fieldParentPtr struct" {
    if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
    if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;

    const C = struct {
        a: bool = true,
        b: f32 = 3.14,
        c: struct { u8 } = .{42},
        d: i32 = 12345,
    };

    {
        const c: C = .{ .a = false };
        const pcf = &c.a;
        const pc: *const C = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .a = false };
        const pcf = &c.a;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .a = false };
        var pcf: @TypeOf(&c.a) = undefined;
        pcf = &c.a;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .a = false };
        var pcf: @TypeOf(&c.a) = undefined;
        pcf = &c.a;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }

    {
        const c: C = .{ .b = 666.667 };
        const pcf = &c.b;
        const pc: *const C = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .b = 666.667 };
        const pcf = &c.b;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .b = 666.667 };
        var pcf: @TypeOf(&c.b) = undefined;
        pcf = &c.b;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .b = 666.667 };
        var pcf: @TypeOf(&c.b) = undefined;
        pcf = &c.b;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }

    {
        const c: C = .{ .c = .{255} };
        const pcf = &c.c;
        const pc: *const C = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .c = .{255} };
        const pcf = &c.c;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .c = .{255} };
        var pcf: @TypeOf(&c.c) = undefined;
        pcf = &c.c;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .c = .{255} };
        var pcf: @TypeOf(&c.c) = undefined;
        pcf = &c.c;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }

    {
        const c: C = .{ .d = -1111111111 };
        const pcf = &c.d;
        const pc: *const C = @alignCast(@fieldParentPtr("d", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .d = -1111111111 };
        const pcf = &c.d;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("d", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .d = -1111111111 };
        var pcf: @TypeOf(&c.d) = undefined;
        pcf = &c.d;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("d", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .d = -1111111111 };
        var pcf: @TypeOf(&c.d) = undefined;
        pcf = &c.d;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("d", pcf));
        try expect(pc == &c);
    }
}

test "@fieldParentPtr extern struct" {
    if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
    if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;

    const C = extern struct {
        a: bool = true,
        b: f32 = 3.14,
        c: extern struct { x: u8 } = .{ .x = 42 },
        d: i32 = 12345,
    };

    {
        const c: C = .{ .a = false };
        const pcf = &c.a;
        const pc: *const C = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .a = false };
        const pcf = &c.a;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .a = false };
        var pcf: @TypeOf(&c.a) = undefined;
        pcf = &c.a;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .a = false };
        var pcf: @TypeOf(&c.a) = undefined;
        pcf = &c.a;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }

    {
        const c: C = .{ .b = 666.667 };
        const pcf = &c.b;
        const pc: *const C = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .b = 666.667 };
        const pcf = &c.b;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .b = 666.667 };
        var pcf: @TypeOf(&c.b) = undefined;
        pcf = &c.b;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .b = 666.667 };
        var pcf: @TypeOf(&c.b) = undefined;
        pcf = &c.b;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }

    {
        const c: C = .{ .c = .{ .x = 255 } };
        const pcf = &c.c;
        const pc: *const C = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .c = .{ .x = 255 } };
        const pcf = &c.c;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .c = .{ .x = 255 } };
        var pcf: @TypeOf(&c.c) = undefined;
        pcf = &c.c;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .c = .{ .x = 255 } };
        var pcf: @TypeOf(&c.c) = undefined;
        pcf = &c.c;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }

    {
        const c: C = .{ .d = -1111111111 };
        const pcf = &c.d;
        const pc: *const C = @alignCast(@fieldParentPtr("d", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .d = -1111111111 };
        const pcf = &c.d;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("d", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .d = -1111111111 };
        var pcf: @TypeOf(&c.d) = undefined;
        pcf = &c.d;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("d", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .d = -1111111111 };
        var pcf: @TypeOf(&c.d) = undefined;
        pcf = &c.d;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("d", pcf));
        try expect(pc == &c);
    }
}

test "@fieldParentPtr extern struct first zero-bit field" {
    if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
    if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;

    const C = extern struct {
        a: u0 = 0,
        b: f32 = 3.14,
        c: i32 = 12345,
    };

    {
        const c: C = .{ .a = 0 };
        const pcf = &c.a;
        const pc: *const C = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .a = 0 };
        const pcf = &c.a;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .a = 0 };
        var pcf: @TypeOf(&c.a) = undefined;
        pcf = &c.a;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .a = 0 };
        var pcf: @TypeOf(&c.a) = undefined;
        pcf = &c.a;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }

    {
        const c: C = .{ .b = 666.667 };
        const pcf = &c.b;
        const pc: *const C = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .b = 666.667 };
        const pcf = &c.b;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .b = 666.667 };
        var pcf: @TypeOf(&c.b) = undefined;
        pcf = &c.b;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .b = 666.667 };
        var pcf: @TypeOf(&c.b) = undefined;
        pcf = &c.b;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }

    {
        const c: C = .{ .c = -1111111111 };
        const pcf = &c.c;
        const pc: *const C = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .c = -1111111111 };
        const pcf = &c.c;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .c = -1111111111 };
        var pcf: @TypeOf(&c.c) = undefined;
        pcf = &c.c;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .c = -1111111111 };
        var pcf: @TypeOf(&c.c) = undefined;
        pcf = &c.c;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
}

test "@fieldParentPtr extern struct middle zero-bit field" {
    if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
    if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;

    const C = extern struct {
        a: f32 = 3.14,
        b: u0 = 0,
        c: i32 = 12345,
    };

    {
        const c: C = .{ .a = 666.667 };
        const pcf = &c.a;
        const pc: *const C = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .a = 666.667 };
        const pcf = &c.a;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .a = 666.667 };
        var pcf: @TypeOf(&c.a) = undefined;
        pcf = &c.a;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .a = 666.667 };
        var pcf: @TypeOf(&c.a) = undefined;
        pcf = &c.a;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }

    {
        const c: C = .{ .b = 0 };
        const pcf = &c.b;
        const pc: *const C = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .b = 0 };
        const pcf = &c.b;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .b = 0 };
        var pcf: @TypeOf(&c.b) = undefined;
        pcf = &c.b;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .b = 0 };
        var pcf: @TypeOf(&c.b) = undefined;
        pcf = &c.b;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }

    {
        const c: C = .{ .c = -1111111111 };
        const pcf = &c.c;
        const pc: *const C = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .c = -1111111111 };
        const pcf = &c.c;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .c = -1111111111 };
        var pcf: @TypeOf(&c.c) = undefined;
        pcf = &c.c;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .c = -1111111111 };
        var pcf: @TypeOf(&c.c) = undefined;
        pcf = &c.c;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
}

test "@fieldParentPtr extern struct last zero-bit field" {
    if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
    if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;

    const C = extern struct {
        a: f32 = 3.14,
        b: i32 = 12345,
        c: u0 = 0,
    };

    {
        const c: C = .{ .a = 666.667 };
        const pcf = &c.a;
        const pc: *const C = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .a = 666.667 };
        const pcf = &c.a;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .a = 666.667 };
        var pcf: @TypeOf(&c.a) = undefined;
        pcf = &c.a;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .a = 666.667 };
        var pcf: @TypeOf(&c.a) = undefined;
        pcf = &c.a;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }

    {
        const c: C = .{ .b = -1111111111 };
        const pcf = &c.b;
        const pc: *const C = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .b = -1111111111 };
        const pcf = &c.b;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .b = -1111111111 };
        var pcf: @TypeOf(&c.b) = undefined;
        pcf = &c.b;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .b = -1111111111 };
        var pcf: @TypeOf(&c.b) = undefined;
        pcf = &c.b;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }

    {
        const c: C = .{ .c = 0 };
        const pcf = &c.c;
        const pc: *const C = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .c = 0 };
        const pcf = &c.c;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .c = 0 };
        var pcf: @TypeOf(&c.c) = undefined;
        pcf = &c.c;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .c = 0 };
        var pcf: @TypeOf(&c.c) = undefined;
        pcf = &c.c;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
}

test "@fieldParentPtr unaligned packed struct" {
    if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
    if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
    if (builtin.zig_backend == .stage2_llvm) return error.SkipZigTest;
    if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
    if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
    if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;

    const C = packed struct {
        a: bool = true,
        b: f32 = 3.14,
        c: packed struct { x: u8 } = .{ .x = 42 },
        d: i32 = 12345,
    };

    {
        const c: C = .{ .a = false };
        const pcf = &c.a;
        const pc: *const C = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .a = false };
        const pcf = &c.a;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .a = false };
        var pcf: @TypeOf(&c.a) = undefined;
        pcf = &c.a;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .a = false };
        var pcf: @TypeOf(&c.a) = undefined;
        pcf = &c.a;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }

    {
        const c: C = .{ .b = 666.667 };
        const pcf = &c.b;
        const pc: *const C = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .b = 666.667 };
        const pcf = &c.b;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .b = 666.667 };
        var pcf: @TypeOf(&c.b) = undefined;
        pcf = &c.b;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .b = 666.667 };
        var pcf: @TypeOf(&c.b) = undefined;
        pcf = &c.b;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }

    {
        const c: C = .{ .c = .{ .x = 255 } };
        const pcf = &c.c;
        const pc: *const C = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .c = .{ .x = 255 } };
        const pcf = &c.c;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .c = .{ .x = 255 } };
        var pcf: @TypeOf(&c.c) = undefined;
        pcf = &c.c;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .c = .{ .x = 255 } };
        var pcf: @TypeOf(&c.c) = undefined;
        pcf = &c.c;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }

    {
        const c: C = .{ .d = -1111111111 };
        const pcf = &c.d;
        const pc: *const C = @alignCast(@fieldParentPtr("d", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .d = -1111111111 };
        const pcf = &c.d;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("d", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .d = -1111111111 };
        var pcf: @TypeOf(&c.d) = undefined;
        pcf = &c.d;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("d", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .d = -1111111111 };
        var pcf: @TypeOf(&c.d) = undefined;
        pcf = &c.d;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("d", pcf));
        try expect(pc == &c);
    }
}

test "@fieldParentPtr aligned packed struct" {
    if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
    if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
    if (builtin.zig_backend == .stage2_llvm) return error.SkipZigTest;
    if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
    if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
    if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;

    const C = packed struct {
        a: f32 = 3.14,
        b: i32 = 12345,
        c: packed struct { x: u8 } = .{ .x = 42 },
        d: bool = true,
    };

    {
        const c: C = .{ .a = 666.667 };
        const pcf = &c.a;
        const pc: *const C = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .a = 666.667 };
        const pcf = &c.a;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .a = 666.667 };
        var pcf: @TypeOf(&c.a) = undefined;
        pcf = &c.a;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .a = 666.667 };
        var pcf: @TypeOf(&c.a) = undefined;
        pcf = &c.a;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }

    {
        const c: C = .{ .b = -1111111111 };
        const pcf = &c.b;
        const pc: *const C = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .b = -1111111111 };
        const pcf = &c.b;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .b = -1111111111 };
        var pcf: @TypeOf(&c.b) = undefined;
        pcf = &c.b;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .b = -1111111111 };
        var pcf: @TypeOf(&c.b) = undefined;
        pcf = &c.b;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }

    {
        const c: C = .{ .c = .{ .x = 255 } };
        const pcf = &c.c;
        const pc: *const C = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .c = .{ .x = 255 } };
        const pcf = &c.c;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .c = .{ .x = 255 } };
        var pcf: @TypeOf(&c.c) = undefined;
        pcf = &c.c;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .c = .{ .x = 255 } };
        var pcf: @TypeOf(&c.c) = undefined;
        pcf = &c.c;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }

    {
        const c: C = .{ .d = false };
        const pcf = &c.d;
        const pc: *const C = @alignCast(@fieldParentPtr("d", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .d = false };
        const pcf = &c.d;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("d", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .d = false };
        var pcf: @TypeOf(&c.d) = undefined;
        pcf = &c.d;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("d", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .d = false };
        var pcf: @TypeOf(&c.d) = undefined;
        pcf = &c.d;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("d", pcf));
        try expect(pc == &c);
    }
}

test "@fieldParentPtr nested packed struct" {
    if (builtin.zig_backend == .stage2_llvm) return error.SkipZigTest;
    if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
    if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
    if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;

    {
        const C = packed struct {
            a: u8,
            b: packed struct {
                a: u8,
                b: packed struct {
                    a: u8,
                },
            },
        };

        {
            const c: C = .{ .a = 0, .b = .{ .a = 0, .b = .{ .a = 0 } } };
            const pcbba = &c.b.b.a;
            const pcbb: @TypeOf(&c.b.b) = @alignCast(@fieldParentPtr("a", pcbba));
            try expect(pcbb == &c.b.b);
            const pcb: @TypeOf(&c.b) = @alignCast(@fieldParentPtr("b", pcbb));
            try expect(pcb == &c.b);
            const pc: *const C = @alignCast(@fieldParentPtr("b", pcb));
            try expect(pc == &c);
        }

        {
            var c: C = undefined;
            c = .{ .a = 0, .b = .{ .a = 0, .b = .{ .a = 0 } } };
            var pcbba: @TypeOf(&c.b.b.a) = undefined;
            pcbba = &c.b.b.a;
            var pcbb: @TypeOf(&c.b.b) = undefined;
            pcbb = @alignCast(@fieldParentPtr("a", pcbba));
            try expect(pcbb == &c.b.b);
            var pcb: @TypeOf(&c.b) = undefined;
            pcb = @alignCast(@fieldParentPtr("b", pcbb));
            try expect(pcb == &c.b);
            var pc: *C = undefined;
            pc = @alignCast(@fieldParentPtr("b", pcb));
            try expect(pc == &c);
        }
    }

    {
        const C = packed struct {
            a: u8,
            b: packed struct {
                a: u9,
                b: packed struct {
                    a: u8,
                },
            },
        };

        {
            const c: C = .{ .a = 0, .b = .{ .a = 0, .b = .{ .a = 0 } } };
            const pcbba = &c.b.b.a;
            const pcbb: @TypeOf(&c.b.b) = @alignCast(@fieldParentPtr("a", pcbba));
            try expect(pcbb == &c.b.b);
            const pcb: @TypeOf(&c.b) = @alignCast(@fieldParentPtr("b", pcbb));
            try expect(pcb == &c.b);
            const pc: *const C = @alignCast(@fieldParentPtr("b", pcb));
            try expect(pc == &c);
        }

        {
            var c: C = undefined;
            c = .{ .a = 0, .b = .{ .a = 0, .b = .{ .a = 0 } } };
            var pcbba: @TypeOf(&c.b.b.a) = undefined;
            pcbba = &c.b.b.a;
            var pcbb: @TypeOf(&c.b.b) = undefined;
            pcbb = @alignCast(@fieldParentPtr("a", pcbba));
            try expect(pcbb == &c.b.b);
            var pcb: @TypeOf(&c.b) = undefined;
            pcb = @alignCast(@fieldParentPtr("b", pcbb));
            try expect(pcb == &c.b);
            var pc: *C = undefined;
            pc = @alignCast(@fieldParentPtr("b", pcb));
            try expect(pc == &c);
        }
    }

    {
        const C = packed struct {
            a: u9,
            b: packed struct {
                a: u7,
                b: packed struct {
                    a: u8,
                },
            },
        };

        {
            const c: C = .{ .a = 0, .b = .{ .a = 0, .b = .{ .a = 0 } } };
            const pcbba = &c.b.b.a;
            const pcbb: @TypeOf(&c.b.b) = @alignCast(@fieldParentPtr("a", pcbba));
            try expect(pcbb == &c.b.b);
            const pcb: @TypeOf(&c.b) = @alignCast(@fieldParentPtr("b", pcbb));
            try expect(pcb == &c.b);
            const pc: *const C = @alignCast(@fieldParentPtr("b", pcb));
            try expect(pc == &c);
        }

        {
            var c: C = undefined;
            c = .{ .a = 0, .b = .{ .a = 0, .b = .{ .a = 0 } } };
            var pcbba: @TypeOf(&c.b.b.a) = undefined;
            pcbba = &c.b.b.a;
            var pcbb: @TypeOf(&c.b.b) = undefined;
            pcbb = @alignCast(@fieldParentPtr("a", pcbba));
            try expect(pcbb == &c.b.b);
            var pcb: @TypeOf(&c.b) = undefined;
            pcb = @alignCast(@fieldParentPtr("b", pcbb));
            try expect(pcb == &c.b);
            var pc: *C = undefined;
            pc = @alignCast(@fieldParentPtr("b", pcb));
            try expect(pc == &c);
        }
    }

    {
        const C = packed struct {
            a: u9,
            b: packed struct {
                a: u8,
                b: packed struct {
                    a: u8,
                },
            },
        };

        {
            const c: C = .{ .a = 0, .b = .{ .a = 0, .b = .{ .a = 0 } } };
            const pcbba = &c.b.b.a;
            const pcbb: @TypeOf(&c.b.b) = @alignCast(@fieldParentPtr("a", pcbba));
            try expect(pcbb == &c.b.b);
            const pcb: @TypeOf(&c.b) = @alignCast(@fieldParentPtr("b", pcbb));
            try expect(pcb == &c.b);
            const pc: *const C = @alignCast(@fieldParentPtr("b", pcb));
            try expect(pc == &c);
        }

        {
            var c: C = undefined;
            c = .{ .a = 0, .b = .{ .a = 0, .b = .{ .a = 0 } } };
            var pcbba: @TypeOf(&c.b.b.a) = undefined;
            pcbba = &c.b.b.a;
            var pcbb: @TypeOf(&c.b.b) = undefined;
            pcbb = @alignCast(@fieldParentPtr("a", pcbba));
            try expect(pcbb == &c.b.b);
            var pcb: @TypeOf(&c.b) = undefined;
            pcb = @alignCast(@fieldParentPtr("b", pcbb));
            try expect(pcb == &c.b);
            var pc: *C = undefined;
            pc = @alignCast(@fieldParentPtr("b", pcb));
            try expect(pc == &c);
        }
    }
}

test "@fieldParentPtr packed struct first zero-bit field" {
    if (builtin.zig_backend == .stage2_llvm) return error.SkipZigTest;
    if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
    if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;

    const C = packed struct {
        a: u0 = 0,
        b: f32 = 3.14,
        c: i32 = 12345,
    };

    {
        const c: C = .{ .a = 0 };
        const pcf = &c.a;
        const pc: *const C = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .a = 0 };
        const pcf = &c.a;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .a = 0 };
        var pcf: @TypeOf(&c.a) = undefined;
        pcf = &c.a;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .a = 0 };
        var pcf: @TypeOf(&c.a) = undefined;
        pcf = &c.a;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }

    {
        const c: C = .{ .b = 666.667 };
        const pcf = &c.b;
        const pc: *const C = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .b = 666.667 };
        const pcf = &c.b;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .b = 666.667 };
        var pcf: @TypeOf(&c.b) = undefined;
        pcf = &c.b;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .b = 666.667 };
        var pcf: @TypeOf(&c.b) = undefined;
        pcf = &c.b;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }

    {
        const c: C = .{ .c = -1111111111 };
        const pcf = &c.c;
        const pc: *const C = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .c = -1111111111 };
        const pcf = &c.c;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .c = -1111111111 };
        var pcf: @TypeOf(&c.c) = undefined;
        pcf = &c.c;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .c = -1111111111 };
        var pcf: @TypeOf(&c.c) = undefined;
        pcf = &c.c;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
}

test "@fieldParentPtr packed struct middle zero-bit field" {
    if (builtin.zig_backend == .stage2_llvm) return error.SkipZigTest;
    if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
    if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;

    const C = packed struct {
        a: f32 = 3.14,
        b: u0 = 0,
        c: i32 = 12345,
    };

    {
        const c: C = .{ .a = 666.667 };
        const pcf = &c.a;
        const pc: *const C = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .a = 666.667 };
        const pcf = &c.a;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .a = 666.667 };
        var pcf: @TypeOf(&c.a) = undefined;
        pcf = &c.a;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .a = 666.667 };
        var pcf: @TypeOf(&c.a) = undefined;
        pcf = &c.a;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }

    {
        const c: C = .{ .b = 0 };
        const pcf = &c.b;
        const pc: *const C = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .b = 0 };
        const pcf = &c.b;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .b = 0 };
        var pcf: @TypeOf(&c.b) = undefined;
        pcf = &c.b;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .b = 0 };
        var pcf: @TypeOf(&c.b) = undefined;
        pcf = &c.b;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }

    {
        const c: C = .{ .c = -1111111111 };
        const pcf = &c.c;
        const pc: *const C = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .c = -1111111111 };
        const pcf = &c.c;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .c = -1111111111 };
        var pcf: @TypeOf(&c.c) = undefined;
        pcf = &c.c;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .c = -1111111111 };
        var pcf: @TypeOf(&c.c) = undefined;
        pcf = &c.c;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
}

test "@fieldParentPtr packed struct last zero-bit field" {
    if (builtin.zig_backend == .stage2_llvm) return error.SkipZigTest;
    if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
    if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;

    const C = packed struct {
        a: f32 = 3.14,
        b: i32 = 12345,
        c: u0 = 0,
    };

    {
        const c: C = .{ .a = 666.667 };
        const pcf = &c.a;
        const pc: *const C = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .a = 666.667 };
        const pcf = &c.a;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .a = 666.667 };
        var pcf: @TypeOf(&c.a) = undefined;
        pcf = &c.a;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .a = 666.667 };
        var pcf: @TypeOf(&c.a) = undefined;
        pcf = &c.a;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }

    {
        const c: C = .{ .b = -1111111111 };
        const pcf = &c.b;
        const pc: *const C = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .b = -1111111111 };
        const pcf = &c.b;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .b = -1111111111 };
        var pcf: @TypeOf(&c.b) = undefined;
        pcf = &c.b;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .b = -1111111111 };
        var pcf: @TypeOf(&c.b) = undefined;
        pcf = &c.b;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }

    {
        const c: C = .{ .c = 0 };
        const pcf = &c.c;
        const pc: *const C = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .c = 0 };
        const pcf = &c.c;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .c = 0 };
        var pcf: @TypeOf(&c.c) = undefined;
        pcf = &c.c;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .c = 0 };
        var pcf: @TypeOf(&c.c) = undefined;
        pcf = &c.c;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
}

test "@fieldParentPtr tagged union" {
    if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
    if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;

    const C = union(enum) {
        a: bool,
        b: f32,
        c: struct { u8 },
        d: i32,
    };

    {
        const c: C = .{ .a = false };
        const pcf = &c.a;
        const pc: *const C = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .a = false };
        const pcf = &c.a;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .a = false };
        var pcf: @TypeOf(&c.a) = undefined;
        pcf = &c.a;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .a = false };
        var pcf: @TypeOf(&c.a) = undefined;
        pcf = &c.a;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }

    {
        const c: C = .{ .b = 0 };
        const pcf = &c.b;
        const pc: *const C = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .b = 0 };
        const pcf = &c.b;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .b = 0 };
        var pcf: @TypeOf(&c.b) = undefined;
        pcf = &c.b;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .b = 0 };
        var pcf: @TypeOf(&c.b) = undefined;
        pcf = &c.b;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }

    {
        const c: C = .{ .c = .{255} };
        const pcf = &c.c;
        const pc: *const C = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .c = .{255} };
        const pcf = &c.c;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .c = .{255} };
        var pcf: @TypeOf(&c.c) = undefined;
        pcf = &c.c;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .c = .{255} };
        var pcf: @TypeOf(&c.c) = undefined;
        pcf = &c.c;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }

    {
        const c: C = .{ .d = -1111111111 };
        const pcf = &c.d;
        const pc: *const C = @alignCast(@fieldParentPtr("d", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .d = -1111111111 };
        const pcf = &c.d;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("d", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .d = -1111111111 };
        var pcf: @TypeOf(&c.d) = undefined;
        pcf = &c.d;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("d", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .d = -1111111111 };
        var pcf: @TypeOf(&c.d) = undefined;
        pcf = &c.d;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("d", pcf));
        try expect(pc == &c);
    }
}

test "@fieldParentPtr untagged union" {
    if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
    if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;

    const C = union {
        a: bool,
        b: f32,
        c: struct { u8 },
        d: i32,
    };

    {
        const c: C = .{ .a = false };
        const pcf = &c.a;
        const pc: *const C = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .a = false };
        const pcf = &c.a;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .a = false };
        var pcf: @TypeOf(&c.a) = undefined;
        pcf = &c.a;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .a = false };
        var pcf: @TypeOf(&c.a) = undefined;
        pcf = &c.a;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }

    {
        const c: C = .{ .b = 0 };
        const pcf = &c.b;
        const pc: *const C = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .b = 0 };
        const pcf = &c.b;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .b = 0 };
        var pcf: @TypeOf(&c.b) = undefined;
        pcf = &c.b;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .b = 0 };
        var pcf: @TypeOf(&c.b) = undefined;
        pcf = &c.b;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }

    {
        const c: C = .{ .c = .{255} };
        const pcf = &c.c;
        const pc: *const C = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .c = .{255} };
        const pcf = &c.c;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .c = .{255} };
        var pcf: @TypeOf(&c.c) = undefined;
        pcf = &c.c;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .c = .{255} };
        var pcf: @TypeOf(&c.c) = undefined;
        pcf = &c.c;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }

    {
        const c: C = .{ .d = -1111111111 };
        const pcf = &c.d;
        const pc: *const C = @alignCast(@fieldParentPtr("d", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .d = -1111111111 };
        const pcf = &c.d;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("d", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .d = -1111111111 };
        var pcf: @TypeOf(&c.d) = undefined;
        pcf = &c.d;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("d", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .d = -1111111111 };
        var pcf: @TypeOf(&c.d) = undefined;
        pcf = &c.d;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("d", pcf));
        try expect(pc == &c);
    }
}

test "@fieldParentPtr extern union" {
    if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
    if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
    if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;

    const C = extern union {
        a: bool,
        b: f32,
        c: extern struct { x: u8 },
        d: i32,
    };

    {
        const c: C = .{ .a = false };
        const pcf = &c.a;
        const pc: *const C = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .a = false };
        const pcf = &c.a;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .a = false };
        var pcf: @TypeOf(&c.a) = undefined;
        pcf = &c.a;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .a = false };
        var pcf: @TypeOf(&c.a) = undefined;
        pcf = &c.a;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }

    {
        const c: C = .{ .b = 0 };
        const pcf = &c.b;
        const pc: *const C = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .b = 0 };
        const pcf = &c.b;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .b = 0 };
        var pcf: @TypeOf(&c.b) = undefined;
        pcf = &c.b;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .b = 0 };
        var pcf: @TypeOf(&c.b) = undefined;
        pcf = &c.b;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }

    {
        const c: C = .{ .c = .{ .x = 255 } };
        const pcf = &c.c;
        const pc: *const C = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .c = .{ .x = 255 } };
        const pcf = &c.c;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .c = .{ .x = 255 } };
        var pcf: @TypeOf(&c.c) = undefined;
        pcf = &c.c;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .c = .{ .x = 255 } };
        var pcf: @TypeOf(&c.c) = undefined;
        pcf = &c.c;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }

    {
        const c: C = .{ .d = -1111111111 };
        const pcf = &c.d;
        const pc: *const C = @alignCast(@fieldParentPtr("d", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .d = -1111111111 };
        const pcf = &c.d;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("d", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .d = -1111111111 };
        var pcf: @TypeOf(&c.d) = undefined;
        pcf = &c.d;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("d", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .d = -1111111111 };
        var pcf: @TypeOf(&c.d) = undefined;
        pcf = &c.d;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("d", pcf));
        try expect(pc == &c);
    }
}

test "@fieldParentPtr packed union" {
    if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
    if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
    if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
    if (builtin.target.cpu.arch.endian() == .big) return error.SkipZigTest; // TODO

    const C = packed union {
        a: packed struct(u32) {
            a: bool,
            b: u31 = 0,
        },
        b: f32,
        c: packed struct(u32) {
            x: u8,
            b: u24 = 0,
        },
        d: i32,
    };

    {
        const c: C = .{ .a = .{ .a = false } };
        const pcf = &c.a;
        const pc: *const C = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .a = .{ .a = false } };
        const pcf = &c.a;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .a = .{ .a = false } };
        var pcf: @TypeOf(&c.a) = undefined;
        pcf = &c.a;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .a = .{ .a = false } };
        var pcf: @TypeOf(&c.a) = undefined;
        pcf = &c.a;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }

    {
        const c: C = .{ .b = 0 };
        const pcf = &c.b;
        const pc: *const C = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .b = 0 };
        const pcf = &c.b;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .b = 0 };
        var pcf: @TypeOf(&c.b) = undefined;
        pcf = &c.b;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .b = 0 };
        var pcf: @TypeOf(&c.b) = undefined;
        pcf = &c.b;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }

    {
        const c: C = .{ .c = .{ .x = 255 } };
        const pcf = &c.c;
        const pc: *const C = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .c = .{ .x = 255 } };
        const pcf = &c.c;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .c = .{ .x = 255 } };
        var pcf: @TypeOf(&c.c) = undefined;
        pcf = &c.c;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .c = .{ .x = 255 } };
        var pcf: @TypeOf(&c.c) = undefined;
        pcf = &c.c;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("c", pcf));
        try expect(pc == &c);
    }

    {
        const c: C = .{ .d = -1111111111 };
        const pcf = &c.d;
        const pc: *const C = @alignCast(@fieldParentPtr("d", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .d = -1111111111 };
        const pcf = &c.d;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("d", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .d = -1111111111 };
        var pcf: @TypeOf(&c.d) = undefined;
        pcf = &c.d;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("d", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .d = -1111111111 };
        var pcf: @TypeOf(&c.d) = undefined;
        pcf = &c.d;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("d", pcf));
        try expect(pc == &c);
    }
}

test "@fieldParentPtr tagged union all zero-bit fields" {
    if (builtin.zig_backend == .stage2_llvm) return error.SkipZigTest;
    if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
    if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;

    const C = union(enum) {
        a: u0,
        b: i0,
    };

    {
        const c: C = .{ .a = 0 };
        const pcf = &c.a;
        const pc: *const C = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .a = 0 };
        const pcf = &c.a;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .a = 0 };
        var pcf: @TypeOf(&c.a) = undefined;
        pcf = &c.a;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .a = 0 };
        var pcf: @TypeOf(&c.a) = undefined;
        pcf = &c.a;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("a", pcf));
        try expect(pc == &c);
    }

    {
        const c: C = .{ .b = 0 };
        const pcf = &c.b;
        const pc: *const C = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .b = 0 };
        const pcf = &c.b;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
    {
        const c: C = .{ .b = 0 };
        var pcf: @TypeOf(&c.b) = undefined;
        pcf = &c.b;
        var pc: *const C = undefined;
        pc = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
    {
        var c: C = undefined;
        c = .{ .b = 0 };
        var pcf: @TypeOf(&c.b) = undefined;
        pcf = &c.b;
        var pc: *C = undefined;
        pc = @alignCast(@fieldParentPtr("b", pcf));
        try expect(pc == &c);
    }
}
