authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2023-05-16 10:51:34+03:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2023-05-16 11:33:38+03:00
logfdf1675c58f029bc08e2aebdad06a5ef5924e81d
treeb1d826af5a8c52008be31170d731df94430a6234
parentb91d6ff9e8d3b224d8cfa4ce7f206264fe814f6f

Sema: avoid safety slice safety check with comptime-known start and end

Oopsie

1 files changed, 5 insertions(+), 3 deletions(-)

src/Sema.zig+5-3
......@@ -23636,7 +23636,7 @@ fn panicIndexOutOfBounds(
2363623636 try sema.safetyCheckFormatted(parent_block, ok, "panicOutOfBounds", &.{ index, len });
2363723637}
2363823638
23639fn panicStartLargerThanEnd(
23639fn panicStartGreaterThanEnd(
2364023640 sema: *Sema,
2364123641 parent_block: *Block,
2364223642 start: Air.Inst.Ref,
......@@ -29490,8 +29490,10 @@ fn analyzeSlice(
2949029490 const slice_sentinel = if (sentinel_opt != .none) sentinel else null;
2949129491
2949229492 // requirement: start <= end
29493 var need_start_gt_end_check = true;
2949329494 if (try sema.resolveDefinedValue(block, end_src, end)) |end_val| {
2949429495 if (try sema.resolveDefinedValue(block, start_src, start)) |start_val| {
29496 need_start_gt_end_check = false;
2949529497 if (!by_length and !(try sema.compareAll(start_val, .lte, end_val, Type.usize))) {
2949629498 return sema.fail(
2949729499 block,
......@@ -29545,9 +29547,9 @@ fn analyzeSlice(
2954529547 }
2954629548 }
2954729549
29548 if (!by_length and block.wantSafety() and !block.is_comptime) {
29550 if (!by_length and block.wantSafety() and !block.is_comptime and need_start_gt_end_check) {
2954929551 // requirement: start <= end
29550 try sema.panicStartLargerThanEnd(block, start, end);
29552 try sema.panicStartGreaterThanEnd(block, start, end);
2955129553 }
2955229554 const new_len = if (by_length)
2955329555 try sema.coerce(block, Type.usize, uncasted_end_opt, end_src)