// #target: macos-x64
module test;
import std::io;
const FOO_SIZE = 500;

alias Foo = char[FOO_SIZE];

fn int main(String[] args)
{
    const NUM = 10;

    Foo* x = calloc(Foo.sizeof * NUM);
	Foo*[<1>] z = { x };
	Foo*[<1>] g = { x };
    for (int i = 0; i < 10; i++)
    {
        z++;
        g--;
    }
    return 0;
}

/* #expect: test.ll

define i32 @test.main(ptr %0, i64 %1) #0 {
entry:
  %args = alloca %"char[][]", align 8
  %x = alloca ptr, align 8
  %z = alloca <1 x ptr>, align 8
  %g = alloca <1 x ptr>, align 8
  %i = alloca i32, align 4
  store ptr %0, ptr %args, align 8
  %ptradd = getelementptr inbounds i8, ptr %args, i64 8
  store i64 %1, ptr %ptradd, align 8
  %2 = call ptr @std.core.mem.calloc(i64 5000) #4
  store ptr %2, ptr %x, align 8
  %3 = load ptr, ptr %x, align 8
  %4 = insertelement <1 x ptr> undef, ptr %3, i64 0
  store <1 x ptr> %4, ptr %z, align 8
  %5 = load ptr, ptr %x, align 8
  %6 = insertelement <1 x ptr> undef, ptr %5, i64 0
  store <1 x ptr> %6, ptr %g, align 8
  store i32 0, ptr %i, align 4
  br label %loop.cond

loop.cond:                                        ; preds = %loop.body, %entry
  %7 = load i32, ptr %i, align 4
  %lt = icmp slt i32 %7, 10
  br i1 %lt, label %loop.body, label %loop.exit

loop.body:                                        ; preds = %loop.cond
  %8 = load <1 x ptr>, ptr %z, align 8
  %ptroffset_any = getelementptr [500 x i8], <1 x ptr> %8, <1 x i64>
  store <1 x ptr> %ptroffset_any, ptr %z, align 8
  %9 = load <1 x ptr>, ptr %g, align 8
  %ptroffset_any1 = getelementptr [500 x i8], <1 x ptr> %9, <1 x i64>
  store <1 x ptr> %ptroffset_any1, ptr %g, align 8
  %10 = load i32, ptr %i, align 4
  %add = add i32 %10, 1
  store i32 %add, ptr %i, align 4
  br label %loop.cond

loop.exit:                                        ; preds = %loop.cond
  ret i32 0
}
