ffi M5.A.next.2b.fu1.A: mixed comptime+pack — lock in unresolved-tag miss
Follow-up #1 from step 2b: pack-fns that mix a non-pack comptime param with the trailing pack (e.g. `tagged($tag: s32, ..$args)`). Today's `isPackFn` requires the pack to be the ONLY comptime param; mixed shapes fall through to the inline `lowerComptimeCall` path. That path adds non-string comptime params to `comptime_param_nodes` for #insert substitution but does NOT bind them as runtime locals, so the body's bare `tag` reference hits "unresolved 'tag'" at the call site. Next commit: - Relax `isPackFn` to "exactly one trailing pack + any number of non-pack comptime params" so the mono path takes over. - Fold comptime VALUES into the mangled name (`tagged(7, ...)` and `tagged(9, ...)` get distinct monos so each body sees its own comptime constants). - Bind comptime args as both `comptime_param_nodes` (for #insert substitution) AND runtime locals (for bare-name references). String literals stay as string locals; int/bool/float literals become typed locals of the appropriate primitive type. This is the load-bearing prerequisite for step 6 (stdlib `print`/`format` refactor to `(\$fmt, ..\$args)`) — without mixed-mode mono support, stdlib stays on the inline path forever. 203/203 example tests + `zig build test` green (the lock-in captures the wrong-shape diagnostic as the snapshot to flip).
This commit is contained in:
29
examples/164-pack-mixed-comptime.sx
Normal file
29
examples/164-pack-mixed-comptime.sx
Normal file
@@ -0,0 +1,29 @@
|
||||
// Variadic heterogeneous type packs — follow-up #1 (mixed
|
||||
// `$comptime + ..$args` pack-fn signatures).
|
||||
//
|
||||
// Today's `isPackFn` rejects pack-fns that mix any other
|
||||
// comptime param with the trailing pack — they fall through
|
||||
// to the inline `lowerComptimeCall` path. The inline path
|
||||
// doesn't bind non-string comptime params as runtime locals,
|
||||
// so a body that uses both `$tag` (s32) AND `..$args` fails
|
||||
// at the bare-name lookup of `tag`.
|
||||
//
|
||||
// Next commit relaxes `isPackFn` to accept "exactly one
|
||||
// trailing pack + any number of non-pack comptime params" and
|
||||
// `monomorphizePackFn` folds the comptime VALUES into the
|
||||
// mangled name (so distinct calls of `tagged(7, ...)` vs
|
||||
// `tagged(9, ...)` get distinct monos), then binds the
|
||||
// comptime values as both comptime substitutions and runtime
|
||||
// locals (for body code that references them by name).
|
||||
|
||||
#import "modules/std.sx";
|
||||
|
||||
tagged :: ($tag: s32, ..$args) -> s64 {
|
||||
return tag * 100 + args.len;
|
||||
}
|
||||
|
||||
main :: () -> s32 {
|
||||
print("{}\n", tagged(7, 1, 2, 3)); // 7*100 + 3 = 703
|
||||
print("{}\n", tagged(9)); // 9*100 + 0 = 900
|
||||
return 0;
|
||||
}
|
||||
1
tests/expected/164-pack-mixed-comptime.exit
Normal file
1
tests/expected/164-pack-mixed-comptime.exit
Normal file
@@ -0,0 +1 @@
|
||||
1
|
||||
1
tests/expected/164-pack-mixed-comptime.txt
Normal file
1
tests/expected/164-pack-mixed-comptime.txt
Normal file
@@ -0,0 +1 @@
|
||||
/Users/agra/projects/sx/examples/164-pack-mixed-comptime.sx:22:12: error: unresolved 'tag' (in /Users/agra/projects/sx/examples/164-pack-mixed-comptime.sx fn main)
|
||||
Reference in New Issue
Block a user