Files
sx/examples/packs/0548-packs-xx-pack-index-two-elements.sx
agra 66bdc70bf1 test: group examples into per-category folders
Move examples/*.sx and their expected/ snapshots into per-category
subfolders (examples/<category>/...). Folder = leading filename token,
with ffi-objc/ffi-jni kept whole; filenames are unchanged. The corpus
runner and LSP sweep now discover each category's expected/ dir, while
issues/ stays flat. Example 1058's repo-root-relative companion import
is made file-relative. Path strings embedded in 164 snapshots were
regenerated (path-only changes). Test-layout docs in CLAUDE.md updated.
2026-06-21 14:41:34 +03:00

26 lines
974 B
Plaintext

// Erase two DISTINCT comptime-pack elements to protocol locals — each gets
// its own heap copy and resolves to its OWN concrete type's method (IntCell.get
// vs Doubler.get), proving the per-element erasure picks the right vtable.
//
// Regression (issue 0135): single-element `xx pack[i]` erasure to a protocol
// scalar was unsupported (the bare pack lowered as a value and errored).
#import "modules/std.sx";
VL :: protocol(T: Type) { get :: (self: *Self) -> T; }
IntCell :: struct { v: i64; }
impl VL(i64) for IntCell { get :: (self: *IntCell) -> i64 => self.v; }
Doubler :: struct { n: i64; }
impl VL(i64) for Doubler { get :: (self: *Doubler) -> i64 => self.n * 2; }
sum_two :: (..sources: VL) -> i64 {
a : VL(i64) = xx sources[0]; // erase element 0
b : VL(i64) = xx sources[1]; // erase element 1
return a.get() + b.get();
}
main :: () -> i32 {
print("{}\n", sum_two(IntCell.{ v = 10 }, Doubler.{ n = 16 })); // 10 + (16*2) = 42
0
}