diff --git a/examples/164-pack-mixed-comptime.sx b/examples/164-pack-mixed-comptime.sx new file mode 100644 index 0000000..a49adf9 --- /dev/null +++ b/examples/164-pack-mixed-comptime.sx @@ -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; +} diff --git a/tests/expected/164-pack-mixed-comptime.exit b/tests/expected/164-pack-mixed-comptime.exit new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/tests/expected/164-pack-mixed-comptime.exit @@ -0,0 +1 @@ +1 diff --git a/tests/expected/164-pack-mixed-comptime.txt b/tests/expected/164-pack-mixed-comptime.txt new file mode 100644 index 0000000..6c400b9 --- /dev/null +++ b/tests/expected/164-pack-mixed-comptime.txt @@ -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)