diff --git a/examples/165-pack-type-position.sx b/examples/165-pack-type-position.sx new file mode 100644 index 0000000..f1f1912 --- /dev/null +++ b/examples/165-pack-type-position.sx @@ -0,0 +1,39 @@ +// Variadic heterogeneous type packs — step 3: `$args[$i]` in +// type positions. +// +// `$args[$i]` resolves to the i-th element type of the active +// pack binding wherever a type expression is expected: +// - return type: `-> $args[0]` +// - local var annotation: `x : $args[1] = ...` +// - (later: param types, fn-pointer types, struct field types) +// +// Today's parser hits "expected '{'" at the `$args[0]` token in +// the return type position because the `$` arm only +// accepts plain generic names; `[]` after the name isn't +// recognised. This file pins that rejection. Next commit teaches +// the parser to accept `$[]` and adds a new +// `PackIndexTypeExpr` AST node; `resolveTypeWithBindings` +// consults the active `pack_arg_types` map. +// +// The body intentionally exercises TWO positions per mono — the +// return type AND a local annotation — so the parser change has +// to cover more than just the trailing return arrow. + +#import "modules/std.sx"; + +swap_take :: (..$args) -> $args[0] { + second : $args[1] = args[1]; + // `second` is bound and typed — confirms the local-annotation + // path also resolves. The body returns args[0] (statically + // typed as $args[0]). + return args[0]; +} + +main :: () -> s32 { + // Heterogeneous call shapes — each picks a different concrete + // pair, gets its own mono. + a : s64 = swap_take(42, "ignored"); // $args[0] = s64, $args[1] = string + b : string = swap_take("first", 99); // $args[0] = string, $args[1] = s64 + print("{} {}\n", a, b); + return 0; +} diff --git a/tests/expected/165-pack-type-position.exit b/tests/expected/165-pack-type-position.exit new file mode 100644 index 0000000..573541a --- /dev/null +++ b/tests/expected/165-pack-type-position.exit @@ -0,0 +1 @@ +0 diff --git a/tests/expected/165-pack-type-position.txt b/tests/expected/165-pack-type-position.txt new file mode 100644 index 0000000..3892788 --- /dev/null +++ b/tests/expected/165-pack-type-position.txt @@ -0,0 +1 @@ +42 first