diff options
| author | Alex Rønne Petersen <alex@alexrp.com> | 2024-11-03 14:27:09 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-11-03 14:27:09 +0100 |
| commit | 3054486d1dedd49553680da2c074d1ab413797fd (patch) | |
| tree | 79c3d4e9b417d14ddb11a47e26da083d5e06e8aa /src/Sema.zig | |
| parent | 2f003f39b28176f08de51271eb66b5f3a54c7aae (diff) | |
| parent | e4e3d7ab4140ae6f078d3ffd72fce4c0a5e6e59f (diff) | |
| download | zig-3054486d1dedd49553680da2c074d1ab413797fd.tar.gz zig-3054486d1dedd49553680da2c074d1ab413797fd.zip | |
Merge pull request #21843 from alexrp/callconv-followup
Some follow-up work for #21697
Diffstat (limited to 'src/Sema.zig')
| -rw-r--r-- | src/Sema.zig | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/src/Sema.zig b/src/Sema.zig index 46fe7f0a31..65805b6a67 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -7574,13 +7574,13 @@ fn analyzeCall( if (try sema.resolveValue(func)) |func_val| if (func_val.isUndef(zcu)) return sema.failWithUseOfUndef(block, call_src); - if (cc == .naked) { + if (!callConvIsCallable(cc)) { const maybe_func_inst = try sema.funcDeclSrcInst(func); const msg = msg: { const msg = try sema.errMsg( func_src, - "unable to call function with naked calling convention", - .{}, + "unable to call function with calling convention '{s}'", + .{@tagName(cc)}, ); errdefer msg.destroy(sema.gpa); @@ -9764,6 +9764,33 @@ fn checkCallConvSupportsVarArgs(sema: *Sema, block: *Block, src: LazySrcLoc, cc: } } +fn callConvIsCallable(cc: std.builtin.CallingConvention.Tag) bool { + return switch (cc) { + .naked, + + .arm_interrupt, + .avr_interrupt, + .avr_signal, + .csky_interrupt, + .m68k_interrupt, + .mips_interrupt, + .mips64_interrupt, + .riscv32_interrupt, + .riscv64_interrupt, + .x86_interrupt, + .x86_64_interrupt, + + .amdgcn_kernel, + .nvptx_kernel, + .spirv_kernel, + .spirv_fragment, + .spirv_vertex, + => false, + + else => true, + }; +} + fn checkMergeAllowed(sema: *Sema, block: *Block, src: LazySrcLoc, peer_ty: Type) !void { const pt = sema.pt; const zcu = pt.zcu; |
