authorgravatar for wrongnull@gmail.comBogdan Romanyuk <wrongnull@gmail.com> 2023-11-06 18:26:28+03:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2023-11-06 15:26:28+00:00
log62e67a2b565e20f684319f5e59e1bddd79c988d3
treeee2ff28b8da9853ef01ba1401c0eccda50917877
parente74ced21b70f229167765d863613d3d5033b93fe
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Sema: emit error when pointer to extern function is called


2 files changed, 25 insertions(+), 1 deletions(-)

src/Sema.zig+9-1
......@@ -7253,7 +7253,15 @@ fn analyzeCall(
72537253 }),
72547254 .func => func_val.toIntern(),
72557255 .ptr => |ptr| switch (ptr.addr) {
7256 .decl => |decl| mod.declPtr(decl).val.toIntern(),
7256 .decl => |decl| blk: {
7257 const func_val_ptr = mod.declPtr(decl).val.toIntern();
7258 const intern_index = mod.intern_pool.indexToKey(func_val_ptr);
7259 if (intern_index == .extern_func or (intern_index == .variable and intern_index.variable.is_extern))
7260 return sema.fail(block, call_src, "{s} call of extern function pointer", .{
7261 @as([]const u8, if (is_comptime_call) "comptime" else "inline"),
7262 });
7263 break :blk func_val_ptr;
7264 },
72577265 else => {
72587266 assert(callee_ty.isPtrAtRuntime(mod));
72597267 return sema.fail(block, call_src, "{s} call of function pointer", .{
test/cases/compile_errors/invalid_extern_function_call.zig created+16
......@@ -0,0 +1,16 @@
1const x = @extern(*const fn() callconv(.C) void, .{ .name = "foo" });
2
3pub fn entry0() void {
4 comptime x();
5}
6
7pub fn entry1() void {
8 @call(.always_inline, x, .{});
9}
10
11// error
12// backend=stage2
13// target=native
14//
15// :4:15: error: comptime call of extern function pointer
16// :8:5: error: inline call of extern function pointer