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.
28 lines
1.0 KiB
Plaintext
28 lines
1.0 KiB
Plaintext
// `xx <pack>[i]` erased to a protocol-typed local.
|
|
//
|
|
// Erasing a single comptime-pack element to a protocol scalar routes through
|
|
// buildProtocolErasure. A pack index is a comptime rvalue (a pack has no
|
|
// runtime storage — `sources[i]` resolves to the call-site arg, which only
|
|
// gets storage when lowered as a value), so the erasure must heap-copy the
|
|
// materialized element rather than take its address.
|
|
//
|
|
// Regression (issue 0135): `xx sources[0]` used to lower the bare pack as a
|
|
// value and error with "pack 'sources' has no runtime value".
|
|
|
|
#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; }
|
|
|
|
first :: (..sources: VL) -> i64 {
|
|
x : VL(i64) = xx sources[0]; // erase element 0 to VL(i64)
|
|
return x.get();
|
|
}
|
|
|
|
main :: () -> i32 {
|
|
print("{}\n", first(IntCell.{ v = 7 })); // 7
|
|
print("{}\n", first(IntCell.{ v = 42 }, IntCell.{ v = 99 })); // 42 (element 0)
|
|
0
|
|
}
|