diff --git a/src/Sema.zig b/src/Sema.zig index 5a185a709c..7e8520eaa1 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -3929,11 +3929,15 @@ fn zirForLen(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air. .Int, .ComptimeInt => true, else => false, }; + const arg_src: LazySrcLoc = .{ .for_input = .{ + .for_node_offset = inst_data.src_node, + .input_index = i, + } }; const arg_len = if (is_int) object else l: { - try checkIndexable(sema, block, src, object_ty); + try checkIndexable(sema, block, arg_src, object_ty); if (!object_ty.indexableHasLen()) continue; - break :l try sema.fieldVal(block, src, object, "len", src); + break :l try sema.fieldVal(block, arg_src, object, "len", arg_src); }; if (len == .none) { len = arg_len; @@ -3949,14 +3953,10 @@ fn zirForLen(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air. .for_node_offset = inst_data.src_node, .input_index = len_idx, } }; - const b_src: LazySrcLoc = .{ .for_input = .{ - .for_node_offset = inst_data.src_node, - .input_index = i, - } }; try sema.errNote(block, a_src, msg, "length {} here", .{ v.fmtValue(Type.usize, sema.mod), }); - try sema.errNote(block, b_src, msg, "length {} here", .{ + try sema.errNote(block, arg_src, msg, "length {} here", .{ arg_val.fmtValue(Type.usize, sema.mod), }); break :msg msg; diff --git a/test/cases/compile_errors/for.zig b/test/cases/compile_errors/for.zig index 999782c991..abb87084b4 100644 --- a/test/cases/compile_errors/for.zig +++ b/test/cases/compile_errors/for.zig @@ -3,6 +3,13 @@ export fn a() void { _ = i; _ = j; } } +export fn b() void { + const s1 = "hello"; + const s2 = true; + for (s1, s2) |i, j| { + _ = i; _ = j; + } +} // error // backend=stage2 @@ -11,3 +18,5 @@ export fn a() void { // :2:5: error: non-matching for loop lengths // :2:11: note: length 10 here // :2:19: note: length 11 here +// :9:14: error: type 'bool' does not support indexing +// :9:14: note: for loop operand must be an array, slice, tuple, or vector