Commit 73f283e3e2
Changed files (1)
src
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);
}