diff options
-rw-r--r-- | src/evalfunc.c | 5 | ||||
-rw-r--r-- | src/list.c | 4 | ||||
-rw-r--r-- | src/testdir/test_functions.vim | 3 | ||||
-rw-r--r-- | src/version.c | 2 |
4 files changed, 13 insertions, 1 deletions
diff --git a/src/evalfunc.c b/src/evalfunc.c index 7f7914eca7..fa27d0d274 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -8646,7 +8646,10 @@ f_range(typval_T *argvars, typval_T *rettv) list->lv_u.nonmat.lv_start = start; list->lv_u.nonmat.lv_end = end; list->lv_u.nonmat.lv_stride = stride; - list->lv_len = (end - start) / stride + 1; + if (stride > 0 ? end < start : end > start) + list->lv_len = 0; + else + list->lv_len = (end - start) / stride + 1; } /* diff --git a/src/list.c b/src/list.c index d1494c67d5..ce1ccaa1c0 100644 --- a/src/list.c +++ b/src/list.c @@ -415,6 +415,10 @@ list_find(list_T *l, long n) CHECK_LIST_MATERIALIZE(l); + // range_list_materialize may reset l->lv_len + if (n >= l->lv_len) + return NULL; + // When there is a cached index may start search from there. if (l->lv_u.mat.lv_idx_item != NULL) { diff --git a/src/testdir/test_functions.vim b/src/testdir/test_functions.vim index 49b688c25f..0801d2b695 100644 --- a/src/testdir/test_functions.vim +++ b/src/testdir/test_functions.vim @@ -3052,6 +3052,9 @@ func Test_range() " get() call assert_equal(4, get(range(1, 10), 3)) call assert_equal(-1, get(range(1, 10), 42, -1)) + call assert_equal(0, get(range(1, 0, 2), 0)) + call assert_equal(0, get(range(0, -1, 2), 0)) + call assert_equal(0, get(range(-2, -1, -2), 0)) " index() call assert_equal(1, index(range(1, 5), 2)) diff --git a/src/version.c b/src/version.c index 9b7fbe7229..1bbaac348c 100644 --- a/src/version.c +++ b/src/version.c @@ -705,6 +705,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2123, +/**/ 2122, /**/ 2121, |