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.
This commit is contained in:
mlugg 2024-06-17 20:01:50 +01:00
parent b8d2323b88
commit f37d0725fa
No known key found for this signature in database
GPG Key ID: 3F5B7DCCBF4AF02E

View File

@ -9347,13 +9347,17 @@ fn zirFunc(
src_locs = sema.code.extraData(Zir.Inst.Func.SrcLocs, extra_index).data;
}
// If this instruction has a body it means it's the type of the `owner_decl`
// otherwise it's a function type without a `callconv` attribute and should
// never be `.C`.
const cc: std.builtin.CallingConvention = if (has_body and mod.declPtr(sema.owner_decl_index).is_exported)
.C
else
.Unspecified;
// If this instruction has a body, then it's a function declaration, and we decide
// the callconv based on whether it is exported. Otherwise, the callconv defaults
// to `.Unspecified`.
const cc: std.builtin.CallingConvention = if (has_body) cc: {
const fn_is_exported = if (sema.generic_owner != .none) exported: {
const generic_owner_fn = mod.funcInfo(sema.generic_owner);
const generic_owner_decl = mod.declPtr(generic_owner_fn.owner_decl);
break :exported generic_owner_decl.is_exported;
} else sema.owner_decl.is_exported;
break :cc if (fn_is_exported) .C else .Unspecified;
} else .Unspecified;
return sema.funcCommon(
block,