From c792642d76ef5f985f2b51c52e92e39311b8f830 Mon Sep 17 00:00:00 2001 From: agra Date: Wed, 27 May 2026 19:05:16 +0300 Subject: [PATCH] =?UTF-8?q?ffi=20M5.A.next.4A.bare.1.A:=20bare=20$args=20?= =?UTF-8?q?=E2=80=94=20expected-failing=20test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Step 4A final slice's lock-in. `$args` (whole pack) as a bare expression should evaluate to a comptime `[]Type` slice value — the whole pack passed through as data so builder fns can walk it. Today's parser arm (commit fd03b58, M5.A.next.4.3) requires the `[]` form: bare `$` hits the focused "expected '[' after '$'" diagnostic I added when wiring the indexed access. `examples/170-pack-bare-value.sx` exercises four call shapes of a pack-fn whose body binds `list := $args` then returns `list.len`. Expected output (post-fix) is "0/1/3/4" per call. Today the parser rejection diff makes the test fail — 209/209 + 1 expected-failing = 210 total. Cadence shape 2: expected output is the WORKING shape; pre-fix the parser-error diff fails. Next commit lands the parser extension + AST node + lowering and the test flips green. --- examples/170-pack-bare-value.sx | 35 +++++++++++++++++++++++++ tests/expected/170-pack-bare-value.exit | 1 + tests/expected/170-pack-bare-value.txt | 4 +++ 3 files changed, 40 insertions(+) create mode 100644 examples/170-pack-bare-value.sx create mode 100644 tests/expected/170-pack-bare-value.exit create mode 100644 tests/expected/170-pack-bare-value.txt diff --git a/examples/170-pack-bare-value.sx b/examples/170-pack-bare-value.sx new file mode 100644 index 0000000..675a43d --- /dev/null +++ b/examples/170-pack-bare-value.sx @@ -0,0 +1,35 @@ +// Variadic heterogeneous type packs — step 4 final slice (4A +// bare): `$args` referenced bare (without `[...]` indexing) in +// expression position should evaluate to a comptime `[]Type` +// slice value — the whole pack passed through as data so +// builder fns can walk it. +// +// Use case (eventual): step 5's generic Into(Block) impl body +// convert :: (self: Closure(..$args) -> $R) -> Block { +// #insert build_block_convert($args, $R); +// } +// where `build_block_convert(args: []Type, ret: Type) -> string` +// is a regular sx fn the interp executes — it walks `args` to +// emit a trampoline fn matching the per-mono signature. +// +// Today the parser-arm I wrote for `$[]` (commit +// fd03b58, M5.A.next.4.3) REQUIRES the `[` after the pack +// name; bare `$args` hits a focused diagnostic. This file +// pins that rejection. Next commit makes the `[` optional — +// no `[` yields a `comptime_pack_ref` AST node which lowering +// converts to a `[N x Type]` aggregate of `const_type` values. + +#import "modules/std.sx"; + +len_of :: (..$args) -> s64 { + list := $args; + return list.len; +} + +main :: () -> s32 { + print("{}\n", len_of()); + print("{}\n", len_of(42)); + print("{}\n", len_of(1, 2, 3)); + print("{}\n", len_of("a", true, 3.14, "b")); + return 0; +} diff --git a/tests/expected/170-pack-bare-value.exit b/tests/expected/170-pack-bare-value.exit new file mode 100644 index 0000000..573541a --- /dev/null +++ b/tests/expected/170-pack-bare-value.exit @@ -0,0 +1 @@ +0 diff --git a/tests/expected/170-pack-bare-value.txt b/tests/expected/170-pack-bare-value.txt new file mode 100644 index 0000000..dded520 --- /dev/null +++ b/tests/expected/170-pack-bare-value.txt @@ -0,0 +1,4 @@ +0 +1 +3 +4