summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/evalfunc.c5
-rw-r--r--src/list.c4
-rw-r--r--src/testdir/test_functions.vim3
-rw-r--r--src/version.c2
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,