| ... | ... | @@ -6387,14 +6387,18 @@ fn zirCall( |
| 6387 | 6387 | } |
| 6388 | 6388 | resolved_args[arg_index] = resolved; |
| 6389 | 6389 | } |
| 6390 | | if (sema.owner_func == null or !sema.owner_func.?.calls_or_awaits_errorable_fn) |
| 6390 | if (sema.owner_func == null or !sema.owner_func.?.calls_or_awaits_errorable_fn) { |
| 6391 | 6391 | input_is_error = false; // input was an error type, but no errorable fn's were actually called |
| 6392 | } |
| 6393 | |
| 6394 | // AstGen ensures that a call instruction is always preceded by a dbg_stmt instruction. |
| 6395 | const call_dbg_node = inst - 1; |
| 6392 | 6396 | |
| 6393 | 6397 | if (sema.mod.backendSupportsFeature(.error_return_trace) and sema.mod.comp.bin_file.options.error_return_tracing and |
| 6394 | 6398 | !block.is_comptime and !block.is_typeof and (input_is_error or pop_error_return_trace)) |
| 6395 | 6399 | { |
| 6396 | 6400 | const call_inst: Air.Inst.Ref = if (modifier == .always_tail) undefined else b: { |
| 6397 | | break :b try sema.analyzeCall(block, func, func_src, call_src, modifier, ensure_result_used, resolved_args, bound_arg_src); |
| 6401 | break :b try sema.analyzeCall(block, func, func_src, call_src, modifier, ensure_result_used, resolved_args, bound_arg_src, call_dbg_node); |
| 6398 | 6402 | }; |
| 6399 | 6403 | |
| 6400 | 6404 | const return_ty = sema.typeOf(call_inst); |
| ... | ... | @@ -6423,11 +6427,11 @@ fn zirCall( |
| 6423 | 6427 | } |
| 6424 | 6428 | |
| 6425 | 6429 | if (modifier == .always_tail) // Perform the call *after* the restore, so that a tail call is possible. |
| 6426 | | return sema.analyzeCall(block, func, func_src, call_src, modifier, ensure_result_used, resolved_args, bound_arg_src); |
| 6430 | return sema.analyzeCall(block, func, func_src, call_src, modifier, ensure_result_used, resolved_args, bound_arg_src, call_dbg_node); |
| 6427 | 6431 | |
| 6428 | 6432 | return call_inst; |
| 6429 | 6433 | } else { |
| 6430 | | return sema.analyzeCall(block, func, func_src, call_src, modifier, ensure_result_used, resolved_args, bound_arg_src); |
| 6434 | return sema.analyzeCall(block, func, func_src, call_src, modifier, ensure_result_used, resolved_args, bound_arg_src, call_dbg_node); |
| 6431 | 6435 | } |
| 6432 | 6436 | } |
| 6433 | 6437 | |
| ... | ... | @@ -6511,6 +6515,7 @@ fn analyzeCall( |
| 6511 | 6515 | ensure_result_used: bool, |
| 6512 | 6516 | uncasted_args: []const Air.Inst.Ref, |
| 6513 | 6517 | bound_arg_src: ?LazySrcLoc, |
| 6518 | call_dbg_node: ?Zir.Inst.Index, |
| 6514 | 6519 | ) CompileError!Air.Inst.Ref { |
| 6515 | 6520 | const mod = sema.mod; |
| 6516 | 6521 | |
| ... | ... | @@ -6628,6 +6633,7 @@ fn analyzeCall( |
| 6628 | 6633 | uncasted_args, |
| 6629 | 6634 | call_tag, |
| 6630 | 6635 | bound_arg_src, |
| 6636 | call_dbg_node, |
| 6631 | 6637 | )) |some| { |
| 6632 | 6638 | return some; |
| 6633 | 6639 | } else |err| switch (err) { |
| ... | ... | @@ -7016,6 +7022,8 @@ fn analyzeCall( |
| 7016 | 7022 | } |
| 7017 | 7023 | } |
| 7018 | 7024 | |
| 7025 | if (call_dbg_node) |some| try sema.zirDbgStmt(block, some); |
| 7026 | |
| 7019 | 7027 | try sema.queueFullTypeResolution(func_ty_info.return_type); |
| 7020 | 7028 | if (sema.owner_func != null and func_ty_info.return_type.isError()) { |
| 7021 | 7029 | sema.owner_func.?.calls_or_awaits_errorable_fn = true; |
| ... | ... | @@ -7252,6 +7260,7 @@ fn instantiateGenericCall( |
| 7252 | 7260 | uncasted_args: []const Air.Inst.Ref, |
| 7253 | 7261 | call_tag: Air.Inst.Tag, |
| 7254 | 7262 | bound_arg_src: ?LazySrcLoc, |
| 7263 | call_dbg_node: ?Zir.Inst.Index, |
| 7255 | 7264 | ) CompileError!Air.Inst.Ref { |
| 7256 | 7265 | const mod = sema.mod; |
| 7257 | 7266 | const gpa = sema.gpa; |
| ... | ... | @@ -7508,6 +7517,8 @@ fn instantiateGenericCall( |
| 7508 | 7517 | try sema.queueFullTypeResolution(new_fn_info.return_type); |
| 7509 | 7518 | } |
| 7510 | 7519 | |
| 7520 | if (call_dbg_node) |some| try sema.zirDbgStmt(block, some); |
| 7521 | |
| 7511 | 7522 | if (sema.owner_func != null and new_fn_info.return_type.isError()) { |
| 7512 | 7523 | sema.owner_func.?.calls_or_awaits_errorable_fn = true; |
| 7513 | 7524 | } |
| ... | ... | @@ -11822,7 +11833,7 @@ fn maybeErrorUnwrap(sema: *Sema, block: *Block, body: []const Zir.Inst.Index, op |
| 11822 | 11833 | const panic_fn = try sema.getBuiltin("panicUnwrapError"); |
| 11823 | 11834 | const err_return_trace = try sema.getErrorReturnTrace(block); |
| 11824 | 11835 | const args: [2]Air.Inst.Ref = .{ err_return_trace, operand }; |
| 11825 | | _ = try sema.analyzeCall(block, panic_fn, src, src, .auto, false, &args, null); |
| 11836 | _ = try sema.analyzeCall(block, panic_fn, src, src, .auto, false, &args, null, null); |
| 11826 | 11837 | return true; |
| 11827 | 11838 | }, |
| 11828 | 11839 | .panic => { |
| ... | ... | @@ -11833,7 +11844,7 @@ fn maybeErrorUnwrap(sema: *Sema, block: *Block, body: []const Zir.Inst.Index, op |
| 11833 | 11844 | const panic_fn = try sema.getBuiltin("panic"); |
| 11834 | 11845 | const err_return_trace = try sema.getErrorReturnTrace(block); |
| 11835 | 11846 | const args: [3]Air.Inst.Ref = .{ msg_inst, err_return_trace, .null_value }; |
| 11836 | | _ = try sema.analyzeCall(block, panic_fn, src, src, .auto, false, &args, null); |
| 11847 | _ = try sema.analyzeCall(block, panic_fn, src, src, .auto, false, &args, null, null); |
| 11837 | 11848 | return true; |
| 11838 | 11849 | }, |
| 11839 | 11850 | else => unreachable, |
| ... | ... | @@ -17279,7 +17290,7 @@ fn retWithErrTracing( |
| 17279 | 17290 | const args: [1]Air.Inst.Ref = .{err_return_trace}; |
| 17280 | 17291 | |
| 17281 | 17292 | if (!need_check) { |
| 17282 | | _ = try sema.analyzeCall(block, return_err_fn, src, src, .never_inline, false, &args, null); |
| 17293 | _ = try sema.analyzeCall(block, return_err_fn, src, src, .never_inline, false, &args, null, null); |
| 17283 | 17294 | _ = try block.addUnOp(ret_tag, operand); |
| 17284 | 17295 | return always_noreturn; |
| 17285 | 17296 | } |
| ... | ... | @@ -17290,7 +17301,7 @@ fn retWithErrTracing( |
| 17290 | 17301 | |
| 17291 | 17302 | var else_block = block.makeSubBlock(); |
| 17292 | 17303 | defer else_block.instructions.deinit(gpa); |
| 17293 | | _ = try sema.analyzeCall(&else_block, return_err_fn, src, src, .never_inline, false, &args, null); |
| 17304 | _ = try sema.analyzeCall(&else_block, return_err_fn, src, src, .never_inline, false, &args, null, null); |
| 17294 | 17305 | _ = try else_block.addUnOp(ret_tag, operand); |
| 17295 | 17306 | |
| 17296 | 17307 | try sema.air_extra.ensureUnusedCapacity(gpa, @typeInfo(Air.CondBr).Struct.fields.len + |
| ... | ... | @@ -21647,7 +21658,7 @@ fn zirBuiltinCall(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError |
| 21647 | 21658 | } |
| 21648 | 21659 | } |
| 21649 | 21660 | const ensure_result_used = extra.flags.ensure_result_used; |
| 21650 | | return sema.analyzeCall(block, func, func_src, call_src, modifier, ensure_result_used, resolved_args, bound_arg_src); |
| 21661 | return sema.analyzeCall(block, func, func_src, call_src, modifier, ensure_result_used, resolved_args, bound_arg_src, null); |
| 21651 | 21662 | } |
| 21652 | 21663 | |
| 21653 | 21664 | fn zirFieldParentPtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { |
| ... | ... | @@ -23481,7 +23492,7 @@ fn panicWithMsg( |
| 23481 | 23492 | Value.null, |
| 23482 | 23493 | ); |
| 23483 | 23494 | const args: [3]Air.Inst.Ref = .{ msg_inst, null_stack_trace, .null_value }; |
| 23484 | | _ = try sema.analyzeCall(block, panic_fn, src, src, .auto, false, &args, null); |
| 23495 | _ = try sema.analyzeCall(block, panic_fn, src, src, .auto, false, &args, null, null); |
| 23485 | 23496 | } |
| 23486 | 23497 | |
| 23487 | 23498 | fn panicUnwrapError( |
| ... | ... | @@ -23519,7 +23530,7 @@ fn panicUnwrapError( |
| 23519 | 23530 | const err = try fail_block.addTyOp(unwrap_err_tag, Type.anyerror, operand); |
| 23520 | 23531 | const err_return_trace = try sema.getErrorReturnTrace(&fail_block); |
| 23521 | 23532 | const args: [2]Air.Inst.Ref = .{ err_return_trace, err }; |
| 23522 | | _ = try sema.analyzeCall(&fail_block, panic_fn, sema.src, sema.src, .auto, false, &args, null); |
| 23533 | _ = try sema.analyzeCall(&fail_block, panic_fn, sema.src, sema.src, .auto, false, &args, null, null); |
| 23523 | 23534 | } |
| 23524 | 23535 | } |
| 23525 | 23536 | try sema.addSafetyCheckExtra(parent_block, ok, &fail_block); |
| ... | ... | @@ -23604,7 +23615,7 @@ fn panicSentinelMismatch( |
| 23604 | 23615 | else { |
| 23605 | 23616 | const panic_fn = try sema.getBuiltin("checkNonScalarSentinel"); |
| 23606 | 23617 | const args: [2]Air.Inst.Ref = .{ expected_sentinel, actual_sentinel }; |
| 23607 | | _ = try sema.analyzeCall(parent_block, panic_fn, sema.src, sema.src, .auto, false, &args, null); |
| 23618 | _ = try sema.analyzeCall(parent_block, panic_fn, sema.src, sema.src, .auto, false, &args, null, null); |
| 23608 | 23619 | return; |
| 23609 | 23620 | }; |
| 23610 | 23621 | |
| ... | ... | @@ -23641,7 +23652,7 @@ fn safetyCheckFormatted( |
| 23641 | 23652 | _ = try fail_block.addNoOp(.trap); |
| 23642 | 23653 | } else { |
| 23643 | 23654 | const panic_fn = try sema.getBuiltin(func); |
| 23644 | | _ = try sema.analyzeCall(&fail_block, panic_fn, sema.src, sema.src, .auto, false, args, null); |
| 23655 | _ = try sema.analyzeCall(&fail_block, panic_fn, sema.src, sema.src, .auto, false, args, null, null); |
| 23645 | 23656 | } |
| 23646 | 23657 | try sema.addSafetyCheckExtra(parent_block, ok, &fail_block); |
| 23647 | 23658 | } |