// `inline for` pack rejections: (1) a pack-element capture exposes only the
// constraint protocol's interface (same rule as `xs[i]`, example 0530);
// (2) a pack element cannot be captured by reference (`(*x)` — an element is
// an AST-substituted call arg, no storage); (3) a trailing pack shorter than
// the driving iterable; (4) a non-pack, non-range iterable.

#import "modules/std.sx";

Show :: protocol { show :: () -> string; }
IntBox :: struct { v: i64; }
impl Show for IntBox { show :: (self: *IntBox) -> string { int_to_string(self.v) } }

leak :: (..xs: Show) {
    inline for xs (x) {
        print("{}\n", x.v);
    }
}
borrow :: (..xs: Show) {
    inline for xs (*x) { }
}
short :: (..xs: Show) {
    inline for 0..5, xs (i, x) { }
}

main :: () {
    leak(IntBox.{ v = 5 });
    borrow(IntBox.{ v = 5 });
    short(IntBox.{ v = 1 }, IntBox.{ v = 2 });
    arr := .[1, 2, 3];
    inline for arr (x) { }
}
