diff --git a/examples/159-pack-generic-ret.sx b/examples/159-pack-generic-ret.sx new file mode 100644 index 0000000..9e863ef --- /dev/null +++ b/examples/159-pack-generic-ret.sx @@ -0,0 +1,23 @@ +// Variadic heterogeneous type packs — follow-up #2 (generic $R +// return type). +// +// A pack-fn's return type can be a generic name (`$R`) — bound at +// the call site to match the body's natural type or the caller's +// target. Today's `monomorphizePackFn` calls `resolveReturnType` +// which treats `$R` as an opaque struct, so the mono's signature +// gets a wrong ret_ty and the value is silently zero / garbage. +// +// `first(42)` should return 42; the lock-in pins today's `0`. +// Next commit infers the ret type from the body's tail expression +// (or first `return X;`) and rebuilds the mono signature. + +#import "modules/std.sx"; + +first :: (..$args) -> $R => args[0]; + +main :: () -> s32 { + a : s64 = first(42); + b : s64 = first(99); + print("{} {}\n", a, b); + return 0; +} diff --git a/tests/expected/159-pack-generic-ret.exit b/tests/expected/159-pack-generic-ret.exit new file mode 100644 index 0000000..573541a --- /dev/null +++ b/tests/expected/159-pack-generic-ret.exit @@ -0,0 +1 @@ +0 diff --git a/tests/expected/159-pack-generic-ret.txt b/tests/expected/159-pack-generic-ret.txt new file mode 100644 index 0000000..b748e2d --- /dev/null +++ b/tests/expected/159-pack-generic-ret.txt @@ -0,0 +1 @@ +0 0