module foo;
macro int @cofefe(a; @body(x))
{
    @body(a);
    @body(a);
    return 1;
}

extern fn int printf(char *, ...);

fn void main()
{
    int x = 0;
    @cofefe(1; int y)
    {
        defer printf("defer: %d\n", x++);
        printf("%d\n", x++);
    };
    printf("Done!\n");
}

/* #expect: foo.ll

define void @foo.main() #0 {
entry:
  %x = alloca i32, align 4
  %y = alloca i32, align 4
  store i32 0, ptr %x, align 4
  store i32 1, ptr %y, align 4
  %0 = load i32, ptr %x, align 4
  %add = add i32 %0, 1
  store i32 %add, ptr %x, align 4
  %1 = call i32 (ptr, ...) @printf(ptr @.str, i32 %0)
  %2 = load i32, ptr %x, align 4
  %add1 = add i32 %2, 1
  store i32 %add1, ptr %x, align 4
  %3 = call i32 (ptr, ...) @printf(ptr @.str.1, i32 %2)
  store i32 1, ptr %y, align 4
  %4 = load i32, ptr %x, align 4
  %add2 = add i32 %4, 1
  store i32 %add2, ptr %x, align 4
  %5 = call i32 (ptr, ...) @printf(ptr @.str.2, i32 %4)
  %6 = load i32, ptr %x, align 4
  %add3 = add i32 %6, 1
  store i32 %add3, ptr %x, align 4
  %7 = call i32 (ptr, ...) @printf(ptr @.str.3, i32 %6)
  %8 = call i32 (ptr, ...) @printf(ptr @.str.4)
  ret void
}


