aboutsummaryrefslogtreecommitdiff
path: root/src/Sema.zig
diff options
context:
space:
mode:
authorAlex Rønne Petersen <alex@alexrp.com>2024-10-28 21:57:29 +0100
committerAlex Rønne Petersen <alex@alexrp.com>2024-11-02 10:44:18 +0100
commite4e3d7ab4140ae6f078d3ffd72fce4c0a5e6e59f (patch)
tree6229a776e8a65739b4a0f6b377c8cd76d4b9b4d5 /src/Sema.zig
parentf508e227052bb13943bad16b324944ae72d8af4e (diff)
downloadzig-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.zig33
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;