authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-02-18 13:22:29-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-02-18 19:20:19-07:00
log601db3981ce820cfbca6001cbdfa87e24aa35ab5
treefc16c4e08604482278b5a7dc6975b249af8a132f
parentbcb72401d3cf01c190a346af9c9d8eec4a334b45

fix source location for not-indexable for loop errors


2 files changed, 16 insertions(+), 7 deletions(-)

src/Sema.zig+7-7
...@@ -3929,11 +3929,15 @@ fn zirForLen(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air....@@ -3929,11 +3929,15 @@ fn zirForLen(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.
3929 .Int, .ComptimeInt => true,3929 .Int, .ComptimeInt => true,
3930 else => false,3930 else => false,
3931 };3931 };
3932 const arg_src: LazySrcLoc = .{ .for_input = .{
3933 .for_node_offset = inst_data.src_node,
3934 .input_index = i,
3935 } };
3932 const arg_len = if (is_int) object else l: {3936 const arg_len = if (is_int) object else l: {
3933 try checkIndexable(sema, block, src, object_ty);3937 try checkIndexable(sema, block, arg_src, object_ty);
3934 if (!object_ty.indexableHasLen()) continue;3938 if (!object_ty.indexableHasLen()) continue;
39353939
3936 break :l try sema.fieldVal(block, src, object, "len", src);3940 break :l try sema.fieldVal(block, arg_src, object, "len", arg_src);
3937 };3941 };
3938 if (len == .none) {3942 if (len == .none) {
3939 len = arg_len;3943 len = arg_len;
...@@ -3949,14 +3953,10 @@ fn zirForLen(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air....@@ -3949,14 +3953,10 @@ fn zirForLen(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.
3949 .for_node_offset = inst_data.src_node,3953 .for_node_offset = inst_data.src_node,
3950 .input_index = len_idx,3954 .input_index = len_idx,
3951 } };3955 } };
3952 const b_src: LazySrcLoc = .{ .for_input = .{
3953 .for_node_offset = inst_data.src_node,
3954 .input_index = i,
3955 } };
3956 try sema.errNote(block, a_src, msg, "length {} here", .{3956 try sema.errNote(block, a_src, msg, "length {} here", .{
3957 v.fmtValue(Type.usize, sema.mod),3957 v.fmtValue(Type.usize, sema.mod),
3958 });3958 });
3959 try sema.errNote(block, b_src, msg, "length {} here", .{3959 try sema.errNote(block, arg_src, msg, "length {} here", .{
3960 arg_val.fmtValue(Type.usize, sema.mod),3960 arg_val.fmtValue(Type.usize, sema.mod),
3961 });3961 });
3962 break :msg msg;3962 break :msg msg;
test/cases/compile_errors/for.zig+9
...@@ -3,6 +3,13 @@ export fn a() void {...@@ -3,6 +3,13 @@ export fn a() void {
3 _ = i; _ = j;3 _ = i; _ = j;
4 }4 }
5}5}
6export fn b() void {
7 const s1 = "hello";
8 const s2 = true;
9 for (s1, s2) |i, j| {
10 _ = i; _ = j;
11 }
12}
613
7// error14// error
8// backend=stage215// backend=stage2
...@@ -11,3 +18,5 @@ export fn a() void {...@@ -11,3 +18,5 @@ export fn a() void {
11// :2:5: error: non-matching for loop lengths18// :2:5: error: non-matching for loop lengths
12// :2:11: note: length 10 here19// :2:11: note: length 10 here
13// :2:19: note: length 11 here20// :2:19: note: length 11 here
21// :9:14: error: type 'bool' does not support indexing
22// :9:14: note: for loop operand must be an array, slice, tuple, or vector