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(...@@ -23636,7 +23636,7 @@ fn panicIndexOutOfBounds(
23636 try sema.safetyCheckFormatted(parent_block, ok, "panicOutOfBounds", &.{ index, len });23636 try sema.safetyCheckFormatted(parent_block, ok, "panicOutOfBounds", &.{ index, len });
23637}23637}
2363823638
23639fn panicStartLargerThanEnd(23639fn panicStartGreaterThanEnd(
23640 sema: *Sema,23640 sema: *Sema,
23641 parent_block: *Block,23641 parent_block: *Block,
23642 start: Air.Inst.Ref,23642 start: Air.Inst.Ref,
...@@ -29490,8 +29490,10 @@ fn analyzeSlice(...@@ -29490,8 +29490,10 @@ fn analyzeSlice(
29490 const slice_sentinel = if (sentinel_opt != .none) sentinel else null;29490 const slice_sentinel = if (sentinel_opt != .none) sentinel else null;
2949129491
29492 // requirement: start <= end29492 // requirement: start <= end
29493 var need_start_gt_end_check = true;
29493 if (try sema.resolveDefinedValue(block, end_src, end)) |end_val| {29494 if (try sema.resolveDefinedValue(block, end_src, end)) |end_val| {
29494 if (try sema.resolveDefinedValue(block, start_src, start)) |start_val| {29495 if (try sema.resolveDefinedValue(block, start_src, start)) |start_val| {
29496 need_start_gt_end_check = false;
29495 if (!by_length and !(try sema.compareAll(start_val, .lte, end_val, Type.usize))) {29497 if (!by_length and !(try sema.compareAll(start_val, .lte, end_val, Type.usize))) {
29496 return sema.fail(29498 return sema.fail(
29497 block,29499 block,
...@@ -29545,9 +29547,9 @@ fn analyzeSlice(...@@ -29545,9 +29547,9 @@ fn analyzeSlice(
29545 }29547 }
29546 }29548 }
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) {
29549 // requirement: start <= end29551 // requirement: start <= end
29550 try sema.panicStartLargerThanEnd(block, start, end);29552 try sema.panicStartGreaterThanEnd(block, start, end);
29551 }29553 }
29552 const new_len = if (by_length)29554 const new_len = if (by_length)
29553 try sema.coerce(block, Type.usize, uncasted_end_opt, end_src)29555 try sema.coerce(block, Type.usize, uncasted_end_opt, end_src)