aboutsummaryrefslogtreecommitdiff
path: root/src/Sema.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2023-02-18 14:10:56 -0700
committerAndrew Kelley <andrew@ziglang.org>2023-02-18 19:20:19 -0700
commit4dd958d585256df3119d5617d22492f41ed02884 (patch)
tree6be6266e06c0b1dd5ad13992292046a6bae1537d /src/Sema.zig
parent601db3981ce820cfbca6001cbdfa87e24aa35ab5 (diff)
downloadzig-4dd958d585256df3119d5617d22492f41ed02884.tar.gz
zig-4dd958d585256df3119d5617d22492f41ed02884.zip
improve error message for byref capture of byval array
Diffstat (limited to 'src/Sema.zig')
-rw-r--r--src/Sema.zig22
1 files changed, 16 insertions, 6 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index 7e8520eaa1..07176ad1a0 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -9716,6 +9716,21 @@ fn zirElemPtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air
const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data;
const array_ptr = try sema.resolveInst(extra.lhs);
const elem_index = try sema.resolveInst(extra.rhs);
+ const indexable_ty = sema.typeOf(array_ptr);
+ if (indexable_ty.zigTypeTag() != .Pointer) {
+ const capture_src: LazySrcLoc = .{ .for_capture_from_input = inst_data.src_node };
+ const msg = msg: {
+ const msg = try sema.errMsg(block, capture_src, "pointer capture of non pointer type '{}'", .{
+ indexable_ty.fmt(sema.mod),
+ });
+ errdefer msg.destroy(sema.gpa);
+ if (indexable_ty.zigTypeTag() == .Array) {
+ try sema.errNote(block, src, msg, "consider using '&' here", .{});
+ }
+ break :msg msg;
+ };
+ return sema.failWithOwnedErrorMsg(msg);
+ }
return sema.elemPtrOneLayerOnly(block, src, array_ptr, elem_index, src, false);
}
@@ -24195,12 +24210,7 @@ fn elemPtrOneLayerOnly(
},
}
},
- else => {
- // TODO add note pointing at corresponding for loop input and suggest using '&'
- return sema.fail(block, indexable_src, "pointer capture of non pointer type '{}'", .{
- indexable_ty.fmt(sema.mod),
- });
- },
+ else => unreachable,
}
}