patch 8.2.3191: Vim9: not enough code is tested
Problem: Vim9: not enough code is tested.
Solution: Use CheckLegacyAndVim9Success() in more places. Fix uncovered
problems.
diff --git a/src/vim9execute.c b/src/vim9execute.c
index 73896cb..32e52ac 100644
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -2679,7 +2679,8 @@
// indexes must be a number
SOURCING_LNUM = iptr->isn_lnum;
if (check_for_number(tv_idx1) == FAIL
- || check_for_number(tv_idx2) == FAIL)
+ || (tv_idx2->v_type != VAR_SPECIAL
+ && check_for_number(tv_idx2) == FAIL))
{
status = FAIL;
}
@@ -2687,14 +2688,32 @@
{
list_T *l = tv_dest->vval.v_list;
long n1 = (long)tv_idx1->vval.v_number;
- long n2 = (long)tv_idx2->vval.v_number;
+ long n2 = tv_idx2->v_type == VAR_SPECIAL
+ ? 0 : (long)tv_idx2->vval.v_number;
listitem_T *li;
li = list_find_index(l, &n1);
- if (li == NULL
- || list_unlet_range(l, li, NULL, n1,
- TRUE, n2) == FAIL)
+ if (li == NULL)
status = FAIL;
+ else
+ {
+ if (n1 < 0)
+ n1 = list_idx_of_item(l, li);
+ if (n2 < 0)
+ {
+ listitem_T *li2 = list_find(l, n2);
+
+ if (li2 == NULL)
+ status = FAIL;
+ else
+ n2 = list_idx_of_item(l, li2);
+ }
+ if (status != FAIL
+ && list_unlet_range(l, li, NULL, n1,
+ tv_idx2->v_type != VAR_SPECIAL, n2)
+ == FAIL)
+ status = FAIL;
+ }
}
}
else