authorgravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2024-06-17 20:01:50+01:00
committergravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2024-06-17 20:01:50+01:00
logf37d0725fa4c6a0b5e4e9ca4d25e2760dc06764d
tree33b6fd35a429d3af5ebddeb47e29f428aa212e82
parentb8d2323b88e68bb5af061dd7e488f51aa0ae8176
signaturelock-open Commit is signed but in an unrecognized format.

Sema: fix callconv detection in generic functions

When analyzing `zirFunc` to instantiate a generic function, `sema.owner_decl` is not the owner Decl of the generic instance, but instead of the call site, so that dependencies are propagated correctly. (This aligns with the fact that in future, generic instantiations will not have a corresponding `Cau`.) So, when deciding the callconv in this case, we must check `sema.generic_owner` to determine whether the function is exported.

1 files changed, 11 insertions(+), 7 deletions(-)

src/Sema.zig+11-7
...@@ -9347,13 +9347,17 @@ fn zirFunc(...@@ -9347,13 +9347,17 @@ fn zirFunc(
9347 src_locs = sema.code.extraData(Zir.Inst.Func.SrcLocs, extra_index).data;9347 src_locs = sema.code.extraData(Zir.Inst.Func.SrcLocs, extra_index).data;
9348 }9348 }
93499349
9350 // If this instruction has a body it means it's the type of the `owner_decl`9350 // If this instruction has a body, then it's a function declaration, and we decide
9351 // otherwise it's a function type without a `callconv` attribute and should9351 // the callconv based on whether it is exported. Otherwise, the callconv defaults
9352 // never be `.C`.9352 // to `.Unspecified`.
9353 const cc: std.builtin.CallingConvention = if (has_body and mod.declPtr(sema.owner_decl_index).is_exported)9353 const cc: std.builtin.CallingConvention = if (has_body) cc: {
9354 .C9354 const fn_is_exported = if (sema.generic_owner != .none) exported: {
9355 else9355 const generic_owner_fn = mod.funcInfo(sema.generic_owner);
9356 .Unspecified;9356 const generic_owner_decl = mod.declPtr(generic_owner_fn.owner_decl);
9357 break :exported generic_owner_decl.is_exported;
9358 } else sema.owner_decl.is_exported;
9359 break :cc if (fn_is_exported) .C else .Unspecified;
9360 } else .Unspecified;
93579361
9358 return sema.funcCommon(9362 return sema.funcCommon(
9359 block,9363 block,