diff options
| author | Alex Rønne Petersen <alex@alexrp.com> | 2024-10-28 21:57:29 +0100 |
|---|---|---|
| committer | Alex Rønne Petersen <alex@alexrp.com> | 2024-11-02 10:44:18 +0100 |
| commit | e4e3d7ab4140ae6f078d3ffd72fce4c0a5e6e59f (patch) | |
| tree | 6229a776e8a65739b4a0f6b377c8cd76d4b9b4d5 /src/Sema.zig | |
| parent | f508e227052bb13943bad16b324944ae72d8af4e (diff) | |
| download | zig-e4e3d7ab4140ae6f078d3ffd72fce4c0a5e6e59f.tar.gz zig-e4e3d7ab4140ae6f078d3ffd72fce4c0a5e6e59f.zip | |
Sema: Disallow calling functions with certain special calling conventions.
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; |
