| ... | @@ -7253,7 +7253,15 @@ fn analyzeCall( | ... | @@ -7253,7 +7253,15 @@ fn analyzeCall( |
| 7253 | }), | 7253 | }), |
| 7254 | .func => func_val.toIntern(), | 7254 | .func => func_val.toIntern(), |
| 7255 | .ptr => |ptr| switch (ptr.addr) { | 7255 | .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 | }, |
| 7257 | else => { | 7265 | else => { |
| 7258 | assert(callee_ty.isPtrAtRuntime(mod)); | 7266 | assert(callee_ty.isPtrAtRuntime(mod)); |
| 7259 | return sema.fail(block, call_src, "{s} call of function pointer", .{ | 7267 | return sema.fail(block, call_src, "{s} call of function pointer", .{ |