// #target: macos-x64
module foo;

struct Bar
{
    int x;
    struct
    {
        struct
        {
            int y;
        }
    }
    bitstruct : uint
    {
        int ww : 2..10;
    }
}

struct Foo
{
    struct
    {
        struct
        {
            int x;
        }
        struct
        {
            int y;
        }
        int z;
    }
    int w;
}
extern fn void printf(char*, ...);

fn void main()
{
    Bar b = { 1, 2, -5 };
    printf("%d %d\n", b.y, b.ww);
    Foo f = { 5, 6, 7, 8 };
    printf("%d %d %d %d\n", f.x, f.y, f.z, f.w);
}

/* #expect: foo.ll

define void @foo.main() #0 {
entry:
  %b = alloca %Bar, align 4
  %f = alloca %Foo, align 4
  call void @llvm.memcpy.p0.p0.i32(ptr align 4 %b, ptr align 4 @.__const, i32 12, i1 false)
  %ptradd = getelementptr inbounds i8, ptr %b, i64 4
  %ptradd1 = getelementptr inbounds i8, ptr %b, i64 8
  %0 = load i32, ptr %ptradd1, align 4
  %shl = shl i32 %0, 21
  %ashr = ashr i32 %shl, 23
  %1 = load i32, ptr %ptradd, align 4
  call void (ptr, ...) @printf(ptr @.str, i32 %1, i32 %ashr)
  call void @llvm.memcpy.p0.p0.i32(ptr align 4 %f, ptr align 4 @.__const.7, i32 16, i1 false)
  %ptradd2 = getelementptr inbounds i8, ptr %f, i64 4
  %ptradd3 = getelementptr inbounds i8, ptr %f, i64 8
  %ptradd4 = getelementptr inbounds i8, ptr %f, i64 12
  %2 = load i32, ptr %f, align 4
  %3 = load i32, ptr %ptradd2, align 4
  %4 = load i32, ptr %ptradd3, align 4
  %5 = load i32, ptr %ptradd4, align 4
  call void (ptr, ...) @printf(ptr @.str.8, i32 %2, i32 %3, i32 %4, i32 %5)
  ret void
}
