| ... | @@ -7574,13 +7574,13 @@ fn analyzeCall( | ... | @@ -7574,13 +7574,13 @@ fn analyzeCall( |
| 7574 | if (try sema.resolveValue(func)) |func_val| | 7574 | if (try sema.resolveValue(func)) |func_val| |
| 7575 | if (func_val.isUndef(zcu)) | 7575 | if (func_val.isUndef(zcu)) |
| 7576 | return sema.failWithUseOfUndef(block, call_src); | 7576 | return sema.failWithUseOfUndef(block, call_src); |
| 7577 | if (cc == .naked) { | 7577 | if (!callConvIsCallable(cc)) { |
| 7578 | const maybe_func_inst = try sema.funcDeclSrcInst(func); | 7578 | const maybe_func_inst = try sema.funcDeclSrcInst(func); |
| 7579 | const msg = msg: { | 7579 | const msg = msg: { |
| 7580 | const msg = try sema.errMsg( | 7580 | const msg = try sema.errMsg( |
| 7581 | func_src, | 7581 | func_src, |
| 7582 | "unable to call function with naked calling convention", | 7582 | "unable to call function with calling convention '{s}'", |
| 7583 | .{}, | 7583 | .{@tagName(cc)}, |
| 7584 | ); | 7584 | ); |
| 7585 | errdefer msg.destroy(sema.gpa); | 7585 | errdefer msg.destroy(sema.gpa); |
| 7586 | | 7586 | |
| ... | @@ -9764,6 +9764,33 @@ fn checkCallConvSupportsVarArgs(sema: *Sema, block: *Block, src: LazySrcLoc, cc: | ... | @@ -9764,6 +9764,33 @@ fn checkCallConvSupportsVarArgs(sema: *Sema, block: *Block, src: LazySrcLoc, cc: |
| 9764 | } | 9764 | } |
| 9765 | } | 9765 | } |
| 9766 | | 9766 | |
| | 9767 | fn callConvIsCallable(cc: std.builtin.CallingConvention.Tag) bool { |
| | 9768 | return switch (cc) { |
| | 9769 | .naked, |
| | 9770 | |
| | 9771 | .arm_interrupt, |
| | 9772 | .avr_interrupt, |
| | 9773 | .avr_signal, |
| | 9774 | .csky_interrupt, |
| | 9775 | .m68k_interrupt, |
| | 9776 | .mips_interrupt, |
| | 9777 | .mips64_interrupt, |
| | 9778 | .riscv32_interrupt, |
| | 9779 | .riscv64_interrupt, |
| | 9780 | .x86_interrupt, |
| | 9781 | .x86_64_interrupt, |
| | 9782 | |
| | 9783 | .amdgcn_kernel, |
| | 9784 | .nvptx_kernel, |
| | 9785 | .spirv_kernel, |
| | 9786 | .spirv_fragment, |
| | 9787 | .spirv_vertex, |
| | 9788 | => false, |
| | 9789 | |
| | 9790 | else => true, |
| | 9791 | }; |
| | 9792 | } |
| | 9793 | |
| 9767 | fn checkMergeAllowed(sema: *Sema, block: *Block, src: LazySrcLoc, peer_ty: Type) !void { | 9794 | fn checkMergeAllowed(sema: *Sema, block: *Block, src: LazySrcLoc, peer_ty: Type) !void { |
| 9768 | const pt = sema.pt; | 9795 | const pt = sema.pt; |
| 9769 | const zcu = pt.zcu; | 9796 | const zcu = pt.zcu; |