diff --git a/examples/156-pack-typed-index.sx b/examples/156-pack-typed-index.sx new file mode 100644 index 0000000..a944582 --- /dev/null +++ b/examples/156-pack-typed-index.sx @@ -0,0 +1,32 @@ +// Variadic heterogeneous type packs — step 2: typed pack indexing. +// +// `args[$i]` (with `$i` a comptime-known integer) inside a pack-fn +// body should resolve to the i-th call-site argument with its +// CONCRETE type, not the boxed `Any` that today's `[]Any` slice +// path yields. Without typed access, downstream operations on the +// element (field access, typed coercion, passing to a typed slot) +// either fail with "field 'X' not found on type 'Any'" or silently +// box/unbox through Any. +// +// This file pins today's failure: `args[0].x` on a struct-typed +// call arg trips "field 'x' not found on type 'Any'" because the +// AST-level type inference for `args[0]` returns Any. +// +// Next commit teaches `lowerIndexExpr` to detect a pack-name base +// with a comptime-int-literal index and substitute the i-th +// call-site arg's lowered value directly — propagating the call +// arg's real type through field access, typed assignments, and +// further indexing. + +#import "modules/std.sx"; + +Point :: struct { x: s64; y: s64; } + +get_x :: (..$args) -> s64 => args[0].x; + +main :: () -> s32 { + p := Point.{ x = 7, y = 9 }; + n := get_x(p); + print("{}\n", n); + return 0; +} diff --git a/tests/expected/156-pack-typed-index.exit b/tests/expected/156-pack-typed-index.exit new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/tests/expected/156-pack-typed-index.exit @@ -0,0 +1 @@ +1 diff --git a/tests/expected/156-pack-typed-index.txt b/tests/expected/156-pack-typed-index.txt new file mode 100644 index 0000000..ab39be2 --- /dev/null +++ b/tests/expected/156-pack-typed-index.txt @@ -0,0 +1 @@ +/Users/agra/projects/sx/examples/156-pack-typed-index.sx:25:30: error: field 'x' not found on type 'Any'