fix(lower): key fn_decl_fids by stable AST pointer in scanDecls [0102b F1]
scanDecls declared a bare `.fn_decl` via `declareFunction(&fd, ...)`, where `fd` is the switch-capture COPY of `decl.data.fn_decl`. Its address is a per-iteration stack temporary, so the winner author's `fn_decl_fids` entry was keyed by an address no later decl-identity lookup can reproduce — `fn_ast_map` and `module_fns` carry the stable `&decl.data.fn_decl`, so a lookup by that pointer missed the winner's FuncId. fix-0102c routes calls through exactly these stable pointers, so the key has to match. Record the entry under `&decl.data.fn_decl` (the persistent AST node field) to match `fn_ast_map`/`module_fns`. The other declareFunction sites already pass stable pointers (const_decl field, module_fns entry, fn_ast_map entry, struct-method node field, heap-synthesized objc decl); `lowered_fids` keys by FuncId value, so neither has the temporary-address mistake. Strengthen the fix-0102b regression test: assert the identity map round-trips by the STABLE pointer for BOTH same-name authors — the winner's `fn_ast_map` pointer resolves to the first-wins FuncId, and the shadow's `module_fns` pointer resolves to a distinct FuncId. This assertion fails on the pre-fix code (winner keyed by `&fd` → null) and passes after. Call resolution unchanged (name path still default). Gate (this worktree): zig build, zig build test (400/400), bash tests/run_examples.sh (457 passed) all green.
This commit is contained in:
@@ -791,8 +791,14 @@ pub const Lowering = struct {
|
||||
self.program_index.fn_ast_map.put(fd.name, &decl.data.fn_decl) catch {};
|
||||
self.program_index.import_flags.put(fd.name, is_imported) catch {};
|
||||
}
|
||||
// Declare extern stub for all functions (bodies lowered lazily)
|
||||
self.declareFunction(&fd, fd.name);
|
||||
// Declare extern stub for all functions (bodies lowered
|
||||
// lazily). Key the identity map (`fn_decl_fids`, inside
|
||||
// `declareFunction`) by the STABLE AST field pointer — the
|
||||
// same `&decl.data.fn_decl` stored in `fn_ast_map` and
|
||||
// `module_fns` — not the switch-capture copy `fd`, whose
|
||||
// address is a per-iteration stack temporary that no later
|
||||
// decl-identity lookup can reproduce.
|
||||
self.declareFunction(&decl.data.fn_decl, fd.name);
|
||||
},
|
||||
.const_decl => |cd| {
|
||||
if (cd.value.data == .fn_decl) {
|
||||
|
||||
Reference in New Issue
Block a user