aboutsummaryrefslogtreecommitdiff
path: root/src/Module.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/Module.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/Module.zig')
-rw-r--r--src/Module.zig15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/Module.zig b/src/Module.zig
index d332c4db53..66d6aa3fe5 100644
--- a/src/Module.zig
+++ b/src/Module.zig
@@ -1867,6 +1867,16 @@ pub const SrcLoc = struct {
else => return nodeToSpan(tree, node),
}
},
+ .node_offset_return_operand => |node_off| {
+ const tree = try src_loc.file_scope.getTree(gpa);
+ const node = src_loc.declRelativeToNodeIndex(node_off);
+ const node_tags = tree.nodes.items(.tag);
+ const node_datas = tree.nodes.items(.data);
+ if (node_tags[node] == .@"return" and node_datas[node].lhs != 0) {
+ return nodeToSpan(tree, node_datas[node].lhs);
+ }
+ return nodeToSpan(tree, node);
+ },
}
}
@@ -2221,6 +2231,10 @@ pub const LazySrcLoc = union(enum) {
/// The source location points to the RHS of an assignment.
/// The Decl is determined contextually.
node_offset_store_operand: i32,
+ /// The source location points to the operand of a `return` statement, or
+ /// the `return` itself if there is no explicit operand.
+ /// The Decl is determined contextually.
+ node_offset_return_operand: i32,
/// The source location points to a for loop input.
/// The Decl is determined contextually.
for_input: struct {
@@ -2347,6 +2361,7 @@ pub const LazySrcLoc = union(enum) {
.node_offset_init_ty,
.node_offset_store_ptr,
.node_offset_store_operand,
+ .node_offset_return_operand,
.for_input,
.for_capture_from_input,
.array_cat_lhs,