| ... | @@ -19587,6 +19587,14 @@ fn analyzeSlice( | ... | @@ -19587,6 +19587,14 @@ fn analyzeSlice( |
| 19587 | if (!end_is_len) { | 19587 | if (!end_is_len) { |
| 19588 | const end = try sema.coerce(block, Type.usize, uncasted_end_opt, end_src); | 19588 | const end = try sema.coerce(block, Type.usize, uncasted_end_opt, end_src); |
| 19589 | if (try sema.resolveMaybeUndefVal(block, end_src, end)) |end_val| { | 19589 | if (try sema.resolveMaybeUndefVal(block, end_src, end)) |end_val| { |
| | 19590 | if (end_val.compare(.gt, len_val, Type.usize)) { |
| | 19591 | return sema.fail( |
| | 19592 | block, |
| | 19593 | end_src, |
| | 19594 | "end index {} out of bounds for array of length {}", |
| | 19595 | .{ end_val.fmtValue(Type.usize), len_val.fmtValue(Type.usize) }, |
| | 19596 | ); |
| | 19597 | } |
| 19590 | if (end_val.eql(len_val, Type.usize)) { | 19598 | if (end_val.eql(len_val, Type.usize)) { |
| 19591 | end_is_len = true; | 19599 | end_is_len = true; |
| 19592 | } | 19600 | } |
| ... | @@ -19605,6 +19613,14 @@ fn analyzeSlice( | ... | @@ -19605,6 +19613,14 @@ fn analyzeSlice( |
| 19605 | .data = slice_val.sliceLen(), | 19613 | .data = slice_val.sliceLen(), |
| 19606 | }; | 19614 | }; |
| 19607 | const slice_len_val = Value.initPayload(&int_payload.base); | 19615 | const slice_len_val = Value.initPayload(&int_payload.base); |
| | 19616 | if (end_val.compare(.gt, slice_len_val, Type.usize)) { |
| | 19617 | return sema.fail( |
| | 19618 | block, |
| | 19619 | end_src, |
| | 19620 | "end index {} out of bounds for slice of length {}", |
| | 19621 | .{ end_val.fmtValue(Type.usize), slice_len_val.fmtValue(Type.usize) }, |
| | 19622 | ); |
| | 19623 | } |
| 19608 | if (end_val.eql(slice_len_val, Type.usize)) { | 19624 | if (end_val.eql(slice_len_val, Type.usize)) { |
| 19609 | end_is_len = true; | 19625 | end_is_len = true; |
| 19610 | } | 19626 | } |
| ... | @@ -19635,6 +19651,20 @@ fn analyzeSlice( | ... | @@ -19635,6 +19651,20 @@ fn analyzeSlice( |
| 19635 | break :s null; | 19651 | break :s null; |
| 19636 | }; | 19652 | }; |
| 19637 | | 19653 | |
| | 19654 | // requirement: start <= end |
| | 19655 | if (try sema.resolveDefinedValue(block, src, end)) |end_val| { |
| | 19656 | if (try sema.resolveDefinedValue(block, src, start)) |start_val| { |
| | 19657 | if (start_val.compare(.gt, end_val, Type.usize)) { |
| | 19658 | return sema.fail( |
| | 19659 | block, |
| | 19660 | start_src, |
| | 19661 | "start index {} is larger than end index {}", |
| | 19662 | .{ start_val.fmtValue(Type.usize), end_val.fmtValue(Type.usize) }, |
| | 19663 | ); |
| | 19664 | } |
| | 19665 | } |
| | 19666 | } |
| | 19667 | |
| 19638 | const new_len = try sema.analyzeArithmetic(block, .sub, end, start, src, end_src, start_src); | 19668 | const new_len = try sema.analyzeArithmetic(block, .sub, end, start, src, end_src, start_src); |
| 19639 | const opt_new_len_val = try sema.resolveDefinedValue(block, src, new_len); | 19669 | const opt_new_len_val = try sema.resolveDefinedValue(block, src, new_len); |
| 19640 | | 19670 | |