diff --git a/src/Compilation.zig b/src/Compilation.zig index fac1ad4baa..73185a91ea 100644 --- a/src/Compilation.zig +++ b/src/Compilation.zig @@ -1962,6 +1962,7 @@ pub fn destroy(comp: *Compilation) void { comp.failed_win32_resources.deinit(gpa); comp.link_diags.deinit(); + comp.link_task_queue.deinit(gpa); comp.clearMiscFailures(); diff --git a/src/Sema.zig b/src/Sema.zig index 24e64cbc46..b0ce7729cf 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -26619,6 +26619,7 @@ fn zirFuncFancy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A const pt = sema.pt; const zcu = pt.zcu; + const ip = &zcu.intern_pool; const inst_data = sema.code.instructions.items(.data)[@intFromEnum(inst)].pl_node; const extra = sema.code.extraData(Zir.Inst.FuncFancy, inst_data.payload_index); const target = zcu.getTarget(); @@ -26789,7 +26790,21 @@ fn zirFuncFancy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A const zir_decl = sema.code.getDeclaration(decl_inst.resolve(&zcu.intern_pool) orelse return error.AnalysisFail)[0]; if (zir_decl.flags.is_export) { - break :cc .C; + break :cc target.cCallingConvention() orelse { + // This target has no default C calling convention. We sometimes trigger a similar + // error by trying to evaluate `std.builtin.CallingConvention.c`, so for consistency, + // let's eval that now and just get the transitive error. (It's guaranteed to error + // because it does the exact `cCallingConvention` call we just did.) + const cc_type = try sema.getBuiltinType("CallingConvention"); + _ = try sema.namespaceLookupVal( + block, + LazySrcLoc.unneeded, + cc_type.getNamespaceIndex(zcu), + try ip.getOrPutString(sema.gpa, pt.tid, "c", .no_embedded_nulls), + ); + // The above should have errored. + @panic("std.builtin is corrupt"); + }; } } break :cc .auto;