// Feature 1 — a pack argument that doesn't conform to the constraint protocol
// is a per-position error. `Naked` has no `impl Show`, so passing it to a
// `..xs: Show` pack is rejected (pointing at the offending argument).

#import "modules/std.sx";

Show :: protocol(T: Type) {
    get :: (self: *Self) -> T;
}
IntBox :: struct { v: s64; }
impl Show(s64) for IntBox { get :: (self: *IntBox) -> s64 => self.v; }

Naked :: struct { x: s64; }   // intentionally NOT `impl Show`

howmany :: (..xs: Show) -> s64 {
    return xs.len;
}

main :: () -> s32 {
    a := IntBox.{ v = 1 };
    n := Naked.{ x = 2 };
    print("{}\n", howmany(a, n));   // `n` does not conform to Show
    0;
}
