fix(lower): resolved author drives variadic packing in bare call [0102c F1]
Attempt-2 fix for the F1 review finding. After `resolveBareCallee` picks a shadowed same-name author's FuncId at a normal call site, the call path still re-fetched the FIRST-WINS function AST by name to drive variadic argument packing. When the resolved (shadow) author's variadic shape differs from the first-wins author's, arguments were packed against the WRONG signature — a fixed-arity shadow packed as if variadic, or a variadic shadow not packed at all — producing IR with the wrong argument count (LLVM verification failure). The `.func` arm now carries the resolved `*FnDecl` alongside its FuncId (`BareCallee.func: ResolvedAuthor`), so `packVariadicCallArgs` reads THE resolved author's signature. The rest of the arm already used the resolved FuncId's IR function (ret/params/ctx/coercion), so the callee now has one source of truth in the whole call lowering — no re-fetch by name after resolution. Default-arg / closure / UFCS / comptime *sites* remain first-wins (fix-0102d); `expandCallDefaults` runs before resolution and is a default site. Regression: examples/0726-modules-flat-same-name-variadic — two flat file imports each author `combine` and `pick` with OPPOSITE variadic shapes (a.sx fixed `combine` / variadic `pick`; b.sx variadic `combine` / fixed `pick`). Each module's bare call must pack against ITS OWN author. Fails on the pre-fix re-lookup (LLVM "Incorrect number of arguments passed to called function" for both `combine.1` and `pick.2`); passes after. Gate: zig build, zig build test (400/400), bash tests/run_examples.sh (463 passed) all green. Matrix 0722-0725/0727 unchanged; single-author / local resolution byte-for-byte unchanged (the `.func` arm never runs for them).
This commit is contained in:
@@ -1438,7 +1438,7 @@ test "lower: shadowed same-name author gets its own FuncId + real body (fix-0102
|
||||
try std.testing.expect(lowering.resolveBareCallee("greet", main_path) == .ambiguous);
|
||||
try std.testing.expect(lowering.resolveBareCallee("greet", a_path) == .none);
|
||||
switch (lowering.resolveBareCallee("greet", b_path)) {
|
||||
.func => |fid| try std.testing.expectEqual(shadow_fid.?, fid),
|
||||
.func => |resolved| try std.testing.expectEqual(shadow_fid.?, resolved.fid),
|
||||
else => return error.TestUnexpectedResult,
|
||||
}
|
||||
// A name no module authors (and no flat import provides) never routes.
|
||||
|
||||
Reference in New Issue
Block a user