| ... | ... | @@ -5409,6 +5409,19 @@ fn lookupInNamespace( |
| 5409 | 5409 | return null; |
| 5410 | 5410 | } |
| 5411 | 5411 | |
| 5412 | fn funcDeclSrc(sema: *Sema, block: *Block, src: LazySrcLoc, func_inst: Air.Inst.Ref) !?Module.SrcLoc { |
| 5413 | const func_val = (try sema.resolveMaybeUndefVal(block, src, func_inst)) orelse return null; |
| 5414 | if (func_val.isUndef()) return null; |
| 5415 | const owner_decl_index = switch (func_val.tag()) { |
| 5416 | .extern_fn => func_val.castTag(.extern_fn).?.data.owner_decl, |
| 5417 | .function => func_val.castTag(.function).?.data.owner_decl, |
| 5418 | .decl_ref => sema.mod.declPtr(func_val.castTag(.decl_ref).?.data).val.castTag(.function).?.data.owner_decl, |
| 5419 | else => return null, |
| 5420 | }; |
| 5421 | const owner_decl = sema.mod.declPtr(owner_decl_index); |
| 5422 | return owner_decl.srcLoc(); |
| 5423 | } |
| 5424 | |
| 5412 | 5425 | fn zirCall( |
| 5413 | 5426 | sema: *Sema, |
| 5414 | 5427 | block: *Block, |
| ... | ... | @@ -5464,41 +5477,35 @@ fn zirCall( |
| 5464 | 5477 | const func_ty_info = func_ty.fnInfo(); |
| 5465 | 5478 | |
| 5466 | 5479 | const fn_params_len = func_ty_info.param_types.len; |
| 5467 | | if (func_ty_info.is_var_args) { |
| 5468 | | assert(func_ty_info.cc == .C); |
| 5469 | | if (total_args < fn_params_len) { |
| 5470 | | // TODO add error note: declared here |
| 5471 | | if (bound_arg_src != null) { |
| 5472 | | return sema.fail( |
| 5473 | | block, |
| 5474 | | call_src, |
| 5475 | | "member function expected at least {d} argument(s), found {d}", |
| 5476 | | .{ fn_params_len - 1, args_len }, |
| 5477 | | ); |
| 5478 | | } |
| 5479 | | return sema.fail( |
| 5480 | | block, |
| 5481 | | func_src, |
| 5482 | | "expected at least {d} argument(s), found {d}", |
| 5483 | | .{ fn_params_len, args_len }, |
| 5484 | | ); |
| 5480 | check_args: { |
| 5481 | if (func_ty_info.is_var_args) { |
| 5482 | assert(func_ty_info.cc == .C); |
| 5483 | if (total_args >= fn_params_len) break :check_args; |
| 5484 | } else if (fn_params_len == total_args) { |
| 5485 | break :check_args; |
| 5485 | 5486 | } |
| 5486 | | } else if (fn_params_len != total_args) { |
| 5487 | | // TODO add error note: declared here |
| 5488 | | if (bound_arg_src != null) { |
| 5489 | | return sema.fail( |
| 5487 | |
| 5488 | const decl_src = try sema.funcDeclSrc(block, func_src, func); |
| 5489 | const member_str = if (bound_arg_src != null) "member function " else ""; |
| 5490 | const variadic_str = if (func_ty_info.is_var_args) "at least " else ""; |
| 5491 | const msg = msg: { |
| 5492 | const msg = try sema.errMsg( |
| 5490 | 5493 | block, |
| 5491 | | call_src, |
| 5492 | | "member function expected {d} argument(s), found {d}", |
| 5493 | | .{ fn_params_len - 1, args_len }, |
| 5494 | func_src, |
| 5495 | "{s}expected {s}{d} argument(s), found {d}", |
| 5496 | .{ |
| 5497 | member_str, |
| 5498 | variadic_str, |
| 5499 | fn_params_len - @boolToInt(bound_arg_src != null), |
| 5500 | args_len, |
| 5501 | }, |
| 5494 | 5502 | ); |
| 5495 | | } |
| 5496 | | return sema.fail( |
| 5497 | | block, |
| 5498 | | call_src, |
| 5499 | | "expected {d} argument(s), found {d}", |
| 5500 | | .{ fn_params_len, args_len }, |
| 5501 | | ); |
| 5503 | errdefer msg.destroy(sema.gpa); |
| 5504 | |
| 5505 | if (decl_src) |some| try sema.mod.errNoteNonLazy(some, msg, "function declared here", .{}); |
| 5506 | break :msg msg; |
| 5507 | }; |
| 5508 | return sema.failWithOwnedErrorMsg(msg); |
| 5502 | 5509 | } |
| 5503 | 5510 | |
| 5504 | 5511 | const args_body = sema.code.extra[extra.end..]; |
| ... | ... | @@ -5625,13 +5632,20 @@ fn analyzeCall( |
| 5625 | 5632 | const func_ty_info = func_ty.fnInfo(); |
| 5626 | 5633 | const cc = func_ty_info.cc; |
| 5627 | 5634 | if (cc == .Naked) { |
| 5628 | | // TODO add error note: declared here |
| 5629 | | return sema.fail( |
| 5630 | | block, |
| 5631 | | func_src, |
| 5632 | | "unable to call function with naked calling convention", |
| 5633 | | .{}, |
| 5634 | | ); |
| 5635 | const decl_src = try sema.funcDeclSrc(block, func_src, func); |
| 5636 | const msg = msg: { |
| 5637 | const msg = try sema.errMsg( |
| 5638 | block, |
| 5639 | func_src, |
| 5640 | "unable to call function with naked calling convention", |
| 5641 | .{}, |
| 5642 | ); |
| 5643 | errdefer msg.destroy(sema.gpa); |
| 5644 | |
| 5645 | if (decl_src) |some| try sema.mod.errNoteNonLazy(some, msg, "function declared here", .{}); |
| 5646 | break :msg msg; |
| 5647 | }; |
| 5648 | return sema.failWithOwnedErrorMsg(msg); |
| 5635 | 5649 | } |
| 5636 | 5650 | const fn_params_len = func_ty_info.param_types.len; |
| 5637 | 5651 | if (func_ty_info.is_var_args) { |