diff --git a/src/Sema.zig b/src/Sema.zig index d3749efce3..436b065b5d 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -6387,14 +6387,18 @@ fn zirCall( } resolved_args[arg_index] = resolved; } - if (sema.owner_func == null or !sema.owner_func.?.calls_or_awaits_errorable_fn) + if (sema.owner_func == null or !sema.owner_func.?.calls_or_awaits_errorable_fn) { input_is_error = false; // input was an error type, but no errorable fn's were actually called + } + + // AstGen ensures that a call instruction is always preceded by a dbg_stmt instruction. + const call_dbg_node = inst - 1; if (sema.mod.backendSupportsFeature(.error_return_trace) and sema.mod.comp.bin_file.options.error_return_tracing and !block.is_comptime and !block.is_typeof and (input_is_error or pop_error_return_trace)) { const call_inst: Air.Inst.Ref = if (modifier == .always_tail) undefined else b: { - break :b try sema.analyzeCall(block, func, func_src, call_src, modifier, ensure_result_used, resolved_args, bound_arg_src); + break :b try sema.analyzeCall(block, func, func_src, call_src, modifier, ensure_result_used, resolved_args, bound_arg_src, call_dbg_node); }; const return_ty = sema.typeOf(call_inst); @@ -6423,11 +6427,11 @@ fn zirCall( } if (modifier == .always_tail) // Perform the call *after* the restore, so that a tail call is possible. - return sema.analyzeCall(block, func, func_src, call_src, modifier, ensure_result_used, resolved_args, bound_arg_src); + return sema.analyzeCall(block, func, func_src, call_src, modifier, ensure_result_used, resolved_args, bound_arg_src, call_dbg_node); return call_inst; } else { - return sema.analyzeCall(block, func, func_src, call_src, modifier, ensure_result_used, resolved_args, bound_arg_src); + return sema.analyzeCall(block, func, func_src, call_src, modifier, ensure_result_used, resolved_args, bound_arg_src, call_dbg_node); } } @@ -6511,6 +6515,7 @@ fn analyzeCall( ensure_result_used: bool, uncasted_args: []const Air.Inst.Ref, bound_arg_src: ?LazySrcLoc, + call_dbg_node: ?Zir.Inst.Index, ) CompileError!Air.Inst.Ref { const mod = sema.mod; @@ -6628,6 +6633,7 @@ fn analyzeCall( uncasted_args, call_tag, bound_arg_src, + call_dbg_node, )) |some| { return some; } else |err| switch (err) { @@ -7016,6 +7022,8 @@ fn analyzeCall( } } + if (call_dbg_node) |some| try sema.zirDbgStmt(block, some); + try sema.queueFullTypeResolution(func_ty_info.return_type); if (sema.owner_func != null and func_ty_info.return_type.isError()) { sema.owner_func.?.calls_or_awaits_errorable_fn = true; @@ -7252,6 +7260,7 @@ fn instantiateGenericCall( uncasted_args: []const Air.Inst.Ref, call_tag: Air.Inst.Tag, bound_arg_src: ?LazySrcLoc, + call_dbg_node: ?Zir.Inst.Index, ) CompileError!Air.Inst.Ref { const mod = sema.mod; const gpa = sema.gpa; @@ -7508,6 +7517,8 @@ fn instantiateGenericCall( try sema.queueFullTypeResolution(new_fn_info.return_type); } + if (call_dbg_node) |some| try sema.zirDbgStmt(block, some); + if (sema.owner_func != null and new_fn_info.return_type.isError()) { sema.owner_func.?.calls_or_awaits_errorable_fn = true; } @@ -11822,7 +11833,7 @@ fn maybeErrorUnwrap(sema: *Sema, block: *Block, body: []const Zir.Inst.Index, op const panic_fn = try sema.getBuiltin("panicUnwrapError"); const err_return_trace = try sema.getErrorReturnTrace(block); const args: [2]Air.Inst.Ref = .{ err_return_trace, operand }; - _ = try sema.analyzeCall(block, panic_fn, src, src, .auto, false, &args, null); + _ = try sema.analyzeCall(block, panic_fn, src, src, .auto, false, &args, null, null); return true; }, .panic => { @@ -11833,7 +11844,7 @@ fn maybeErrorUnwrap(sema: *Sema, block: *Block, body: []const Zir.Inst.Index, op const panic_fn = try sema.getBuiltin("panic"); const err_return_trace = try sema.getErrorReturnTrace(block); const args: [3]Air.Inst.Ref = .{ msg_inst, err_return_trace, .null_value }; - _ = try sema.analyzeCall(block, panic_fn, src, src, .auto, false, &args, null); + _ = try sema.analyzeCall(block, panic_fn, src, src, .auto, false, &args, null, null); return true; }, else => unreachable, @@ -17279,7 +17290,7 @@ fn retWithErrTracing( const args: [1]Air.Inst.Ref = .{err_return_trace}; if (!need_check) { - _ = try sema.analyzeCall(block, return_err_fn, src, src, .never_inline, false, &args, null); + _ = try sema.analyzeCall(block, return_err_fn, src, src, .never_inline, false, &args, null, null); _ = try block.addUnOp(ret_tag, operand); return always_noreturn; } @@ -17290,7 +17301,7 @@ fn retWithErrTracing( var else_block = block.makeSubBlock(); defer else_block.instructions.deinit(gpa); - _ = try sema.analyzeCall(&else_block, return_err_fn, src, src, .never_inline, false, &args, null); + _ = try sema.analyzeCall(&else_block, return_err_fn, src, src, .never_inline, false, &args, null, null); _ = try else_block.addUnOp(ret_tag, operand); 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 } } const ensure_result_used = extra.flags.ensure_result_used; - return sema.analyzeCall(block, func, func_src, call_src, modifier, ensure_result_used, resolved_args, bound_arg_src); + return sema.analyzeCall(block, func, func_src, call_src, modifier, ensure_result_used, resolved_args, bound_arg_src, null); } fn zirFieldParentPtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { @@ -23481,7 +23492,7 @@ fn panicWithMsg( Value.null, ); const args: [3]Air.Inst.Ref = .{ msg_inst, null_stack_trace, .null_value }; - _ = try sema.analyzeCall(block, panic_fn, src, src, .auto, false, &args, null); + _ = try sema.analyzeCall(block, panic_fn, src, src, .auto, false, &args, null, null); } fn panicUnwrapError( @@ -23519,7 +23530,7 @@ fn panicUnwrapError( const err = try fail_block.addTyOp(unwrap_err_tag, Type.anyerror, operand); const err_return_trace = try sema.getErrorReturnTrace(&fail_block); const args: [2]Air.Inst.Ref = .{ err_return_trace, err }; - _ = try sema.analyzeCall(&fail_block, panic_fn, sema.src, sema.src, .auto, false, &args, null); + _ = try sema.analyzeCall(&fail_block, panic_fn, sema.src, sema.src, .auto, false, &args, null, null); } } try sema.addSafetyCheckExtra(parent_block, ok, &fail_block); @@ -23604,7 +23615,7 @@ fn panicSentinelMismatch( else { const panic_fn = try sema.getBuiltin("checkNonScalarSentinel"); const args: [2]Air.Inst.Ref = .{ expected_sentinel, actual_sentinel }; - _ = try sema.analyzeCall(parent_block, panic_fn, sema.src, sema.src, .auto, false, &args, null); + _ = try sema.analyzeCall(parent_block, panic_fn, sema.src, sema.src, .auto, false, &args, null, null); return; }; @@ -23641,7 +23652,7 @@ fn safetyCheckFormatted( _ = try fail_block.addNoOp(.trap); } else { const panic_fn = try sema.getBuiltin(func); - _ = try sema.analyzeCall(&fail_block, panic_fn, sema.src, sema.src, .auto, false, args, null); + _ = try sema.analyzeCall(&fail_block, panic_fn, sema.src, sema.src, .auto, false, args, null, null); } try sema.addSafetyCheckExtra(parent_block, ok, &fail_block); }