| ... | ... | @@ -4563,6 +4563,9 @@ fn zirForLen(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air. |
| 4563 | 4563 | // This argument is a range. |
| 4564 | 4564 | const range_start = try sema.resolveInst(zir_arg_pair[0]); |
| 4565 | 4565 | const range_end = try sema.resolveInst(zir_arg_pair[1]); |
| 4566 | if (try sema.resolveDefinedValue(block, arg_src, range_start)) |start| { |
| 4567 | if (try sema.valuesEqual(start, .zero_usize, .usize)) break :l range_end; |
| 4568 | } |
| 4566 | 4569 | break :l try sema.analyzeArithmetic(block, .sub, range_end, range_start, arg_src, arg_src, arg_src, true); |
| 4567 | 4570 | }; |
| 4568 | 4571 | const arg_len = try sema.coerce(block, .usize, arg_len_uncoerced, arg_src); |
| ... | ... | @@ -4626,12 +4629,18 @@ fn zirForLen(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air. |
| 4626 | 4629 | |
| 4627 | 4630 | // Now for the runtime checks. |
| 4628 | 4631 | if (any_runtime and block.wantSafety()) { |
| 4632 | var ok: Air.Inst.Ref = .none; |
| 4629 | 4633 | for (runtime_arg_lens, 0..) |arg_len, i| { |
| 4630 | 4634 | if (arg_len == .none) continue; |
| 4631 | 4635 | if (i == len_idx) continue; |
| 4632 | | const ok = try block.addBinOp(.cmp_eq, len, arg_len); |
| 4633 | | try sema.addSafetyCheck(block, src, ok, .for_len_mismatch); |
| 4636 | const eq = try block.addBinOp(.cmp_eq, len, arg_len); |
| 4637 | ok = if (ok != .none) |
| 4638 | try block.addBinOp(.bool_and, ok, eq) |
| 4639 | else |
| 4640 | eq; |
| 4634 | 4641 | } |
| 4642 | if (ok != .none) |
| 4643 | try sema.addSafetyCheck(block, src, ok, .for_len_mismatch); |
| 4635 | 4644 | } |
| 4636 | 4645 | |
| 4637 | 4646 | return len; |