aboutsummaryrefslogtreecommitdiff
path: root/src/Sema.zig
diff options
context:
space:
mode:
authormlugg <mlugg@mlugg.co.uk>2024-02-16 11:25:32 +0000
committermlugg <mlugg@mlugg.co.uk>2024-02-16 11:26:35 +0000
commite6cf3ce24c42d4a2dffd4f0204a22a31eef3c562 (patch)
treeeaa21f0a22f03d595151edc806d7120d8f5e0074 /src/Sema.zig
parent260c84535546c81028cf42f1eb6ec9f17275db0f (diff)
downloadzig-e6cf3ce24c42d4a2dffd4f0204a22a31eef3c562.tar.gz
zig-e6cf3ce24c42d4a2dffd4f0204a22a31eef3c562.zip
Sema: correct source location for return value coercion errors
When coercing the operand of a `ret_node` etc instruction, the source location for errors used to point to the entire `return` statement. Instead, we now point to the operand, as would be expected if there was an explicit `as_node` instruction (like there used to be).
Diffstat (limited to 'src/Sema.zig')
-rw-r--r--src/Sema.zig15
1 files changed, 8 insertions, 7 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index 45f0edcb56..ce231af6fd 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -19182,7 +19182,7 @@ fn zirRetErrValue(
.ty = error_set_type.toIntern(),
.name = err_name,
} })));
- return sema.analyzeRet(block, result_inst, src);
+ return sema.analyzeRet(block, result_inst, src, src);
}
fn zirRetImplicit(
@@ -19232,7 +19232,7 @@ fn zirRetImplicit(
return sema.failWithOwnedErrorMsg(block, msg);
}
- return sema.analyzeRet(block, operand, r_brace_src);
+ return sema.analyzeRet(block, operand, r_brace_src, r_brace_src);
}
fn zirRetNode(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Zir.Inst.Index {
@@ -19243,7 +19243,7 @@ fn zirRetNode(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Zir
const operand = try sema.resolveInst(inst_data.operand);
const src = inst_data.src();
- return sema.analyzeRet(block, operand, src);
+ return sema.analyzeRet(block, operand, src, .{ .node_offset_return_operand = inst_data.src_node });
}
fn zirRetLoad(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Zir.Inst.Index {
@@ -19256,7 +19256,7 @@ fn zirRetLoad(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Zir
if (block.is_comptime or block.inlining != null or sema.func_is_naked) {
const operand = try sema.analyzeLoad(block, src, ret_ptr, src);
- return sema.analyzeRet(block, operand, src);
+ return sema.analyzeRet(block, operand, src, .{ .node_offset_return_operand = inst_data.src_node });
}
if (sema.wantErrorReturnTracing(sema.fn_ret_ty)) {
@@ -19450,6 +19450,7 @@ fn analyzeRet(
block: *Block,
uncasted_operand: Air.Inst.Ref,
src: LazySrcLoc,
+ operand_src: LazySrcLoc,
) CompileError!Zir.Inst.Index {
// Special case for returning an error to an inferred error set; we need to
// add the error tag to the inferred error set of the in-scope function, so
@@ -19458,14 +19459,14 @@ fn analyzeRet(
if (sema.fn_ret_ty_ies != null and sema.fn_ret_ty.zigTypeTag(mod) == .ErrorUnion) {
try sema.addToInferredErrorSet(uncasted_operand);
}
- const operand = sema.coerceExtra(block, sema.fn_ret_ty, uncasted_operand, src, .{ .is_ret = true }) catch |err| switch (err) {
+ const operand = sema.coerceExtra(block, sema.fn_ret_ty, uncasted_operand, operand_src, .{ .is_ret = true }) catch |err| switch (err) {
error.NotCoercible => unreachable,
else => |e| return e,
};
if (block.inlining) |inlining| {
if (block.is_comptime) {
- const ret_val = try sema.resolveConstValue(block, src, operand, .{
+ const ret_val = try sema.resolveConstValue(block, operand_src, operand, .{
.needed_comptime_reason = "value being returned at comptime must be comptime-known",
});
inlining.comptime_result = operand;
@@ -19500,7 +19501,7 @@ fn analyzeRet(
if (sema.wantErrorReturnTracing(sema.fn_ret_ty)) {
// Avoid adding a frame to the error return trace in case the value is comptime-known
// to be not an error.
- const is_non_err = try sema.analyzeIsNonErr(block, src, operand);
+ const is_non_err = try sema.analyzeIsNonErr(block, operand_src, operand);
return sema.retWithErrTracing(block, src, is_non_err, air_tag, operand);
}