| author | |
| committer | |
| log | 91fd0f42c88f4bea424b5a5c58435a2a98b57a58 |
| tree | 37645cd0c83902451b59492dea2ad75db77cb06e |
| parent | 0fb005d1d05acb680389ce8be51bab6020309922 |
3 files changed, 58 insertions(+), 1 deletions(-)
src/Sema.zig+30| ... | ... | @@ -19587,6 +19587,14 @@ fn analyzeSlice( |
| 19587 | 19587 | if (!end_is_len) { |
| 19588 | 19588 | const end = try sema.coerce(block, Type.usize, uncasted_end_opt, end_src); |
| 19589 | 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 | 19598 | if (end_val.eql(len_val, Type.usize)) { |
| 19591 | 19599 | end_is_len = true; |
| 19592 | 19600 | } |
| ... | ... | @@ -19605,6 +19613,14 @@ fn analyzeSlice( |
| 19605 | 19613 | .data = slice_val.sliceLen(), |
| 19606 | 19614 | }; |
| 19607 | 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 | 19624 | if (end_val.eql(slice_len_val, Type.usize)) { |
| 19609 | 19625 | end_is_len = true; |
| 19610 | 19626 | } |
| ... | ... | @@ -19635,6 +19651,20 @@ fn analyzeSlice( |
| 19635 | 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 | 19668 | const new_len = try sema.analyzeArithmetic(block, .sub, end, start, src, end_src, start_src); |
| 19639 | 19669 | const opt_new_len_val = try sema.resolveDefinedValue(block, src, new_len); |
| 19640 | 19670 |
test/behavior/cast.zig+5-1| ... | ... | @@ -906,7 +906,11 @@ test "peer cast [*:x]T to [*]T" { |
| 906 | 906 | } |
| 907 | 907 | |
| 908 | 908 | test "peer cast [:x]T to [*:x]T" { |
| 909 | if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO | |
| 909 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; | |
| 910 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | |
| 911 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | |
| 912 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | |
| 913 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | |
| 910 | 914 | |
| 911 | 915 | const S = struct { |
| 912 | 916 | fn doTheTest() !void { |
test/compile_errors.zig+23| ... | ... | @@ -21,6 +21,29 @@ pub fn addCases(ctx: *TestContext) !void { |
| 21 | 21 | , &[_][]const u8{ |
| 22 | 22 | ":2:20: error: import of file outside package path: '../../above.zig'", |
| 23 | 23 | }); |
| 24 | ||
| 25 | case.addError( | |
| 26 | \\comptime { | |
| 27 | \\ var array = [_:0]u8{ 1, 2, 3, 4 }; | |
| 28 | \\ var src_slice: [:0]u8 = &array; | |
| 29 | \\ var slice = src_slice[2..5]; | |
| 30 | \\ _ = slice; | |
| 31 | \\} | |
| 32 | \\comptime { | |
| 33 | \\ var array = [_:0]u8{ 1, 2, 3, 4 }; | |
| 34 | \\ var slice = array[2..5]; | |
| 35 | \\ _ = slice; | |
| 36 | \\} | |
| 37 | \\comptime { | |
| 38 | \\ var array = [_:0]u8{ 1, 2, 3, 4 }; | |
| 39 | \\ var slice = array[3..2]; | |
| 40 | \\ _ = slice; | |
| 41 | \\} | |
| 42 | , &[_][]const u8{ | |
| 43 | ":4:26: error: end index 5 out of bounds for slice of length 4", | |
| 44 | ":9:22: error: end index 5 out of bounds for array of length 4", | |
| 45 | ":14:22: error: start index 3 is larger than end index 2", | |
| 46 | }); | |
| 24 | 47 | } |
| 25 | 48 | |
| 26 | 49 | ctx.objErrStage1("exported enum without explicit integer tag type", |