aboutsummaryrefslogtreecommitdiff
path: root/src/Sema.zig
diff options
context:
space:
mode:
authorxdBronch <51252236+xdBronch@users.noreply.github.com>2025-11-15 14:53:32 -0500
committerMatthew Lugg <mlugg@mlugg.co.uk>2025-11-16 22:59:51 +0000
commit29a1d0c06ff80836d744d2ab5db3626bf17fa0d1 (patch)
treea6724fdcb3fe2f8d548c2f3928a04effc54406c9 /src/Sema.zig
parent35d87c4406f53e74f5cdc6d003faac3ec376d0ba (diff)
downloadzig-29a1d0c06ff80836d744d2ab5db3626bf17fa0d1.tar.gz
zig-29a1d0c06ff80836d744d2ab5db3626bf17fa0d1.zip
sema: improve codegen of for loop safety checks
Diffstat (limited to 'src/Sema.zig')
-rw-r--r--src/Sema.zig13
1 files changed, 11 insertions, 2 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index 5392ef54bd..2309f2eee2 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -4563,6 +4563,9 @@ fn zirForLen(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.
// This argument is a range.
const range_start = try sema.resolveInst(zir_arg_pair[0]);
const range_end = try sema.resolveInst(zir_arg_pair[1]);
+ if (try sema.resolveDefinedValue(block, arg_src, range_start)) |start| {
+ if (try sema.valuesEqual(start, .zero_usize, .usize)) break :l range_end;
+ }
break :l try sema.analyzeArithmetic(block, .sub, range_end, range_start, arg_src, arg_src, arg_src, true);
};
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.
// Now for the runtime checks.
if (any_runtime and block.wantSafety()) {
+ var ok: Air.Inst.Ref = .none;
for (runtime_arg_lens, 0..) |arg_len, i| {
if (arg_len == .none) continue;
if (i == len_idx) continue;
- const ok = try block.addBinOp(.cmp_eq, len, arg_len);
- try sema.addSafetyCheck(block, src, ok, .for_len_mismatch);
+ const eq = try block.addBinOp(.cmp_eq, len, arg_len);
+ ok = if (ok != .none)
+ try block.addBinOp(.bool_and, ok, eq)
+ else
+ eq;
}
+ if (ok != .none)
+ try sema.addSafetyCheck(block, src, ok, .for_len_mismatch);
}
return len;