patch 8.2.4590: Vim9: range type check has wrong offset
Problem: Vim9: range type check has wrong offset.
Solution: Adjust offset for CHECKTYPE. Remove other type check.
diff --git a/src/testdir/test_vim9_assign.vim b/src/testdir/test_vim9_assign.vim
index d2d7217..44a8fcb 100644
--- a/src/testdir/test_vim9_assign.vim
+++ b/src/testdir/test_vim9_assign.vim
@@ -1602,7 +1602,7 @@
l[g:idx : 1] = [0]
echo l
END
- v9.CheckDefExecAndScriptFailure(lines, 'E1030: Using a String as a Number: "x"')
+ v9.CheckDefExecAndScriptFailure(lines, ['E1012: Type mismatch; expected number but got string', 'E1030: Using a String as a Number: "x"'])
lines =<< trim END
var l = [1, 2]
diff --git a/src/version.c b/src/version.c
index 6f86d2b..682fdc6 100644
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 4590,
+/**/
4589,
/**/
4588,
diff --git a/src/vim9compile.c b/src/vim9compile.c
index e6c2233..06b6c79 100644
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -1802,7 +1802,7 @@
{
type = get_type_on_stack(cctx, 1);
if (need_type(type, &t_number,
- -1, 0, cctx, FALSE, FALSE) == FAIL)
+ -2, 0, cctx, FALSE, FALSE) == FAIL)
return FAIL;
}
type = get_type_on_stack(cctx, 0);
diff --git a/src/vim9execute.c b/src/vim9execute.c
index 3136dce..5bc7708 100644
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -1896,79 +1896,54 @@
SOURCING_LNUM = iptr->isn_lnum;
if (tv_dest->v_type == VAR_LIST)
{
- long n1;
- long n2;
- int error = FALSE;
+ long n1;
+ long n2;
+ listitem_T *li1;
- n1 = (long)tv_get_number_chk(tv_idx1, &error);
- if (error)
+ n1 = (long)tv_get_number_chk(tv_idx1, NULL);
+ if (tv_idx2->v_type == VAR_SPECIAL
+ && tv_idx2->vval.v_number == VVAL_NONE)
+ n2 = list_len(tv_dest->vval.v_list) - 1;
+ else
+ n2 = (long)tv_get_number_chk(tv_idx2, NULL);
+
+ li1 = check_range_index_one(tv_dest->vval.v_list, &n1, FALSE);
+ if (li1 == NULL)
status = FAIL;
else
{
- if (tv_idx2->v_type == VAR_SPECIAL
- && tv_idx2->vval.v_number == VVAL_NONE)
- n2 = list_len(tv_dest->vval.v_list) - 1;
- else
- n2 = (long)tv_get_number_chk(tv_idx2, &error);
- if (error)
- status = FAIL; // cannot happen?
- else
- {
- listitem_T *li1 = check_range_index_one(
- tv_dest->vval.v_list, &n1, FALSE);
-
- if (li1 == NULL)
- status = FAIL;
- else
- {
- status = check_range_index_two(
- tv_dest->vval.v_list,
- &n1, li1, &n2, FALSE);
- if (status != FAIL)
- status = list_assign_range(
- tv_dest->vval.v_list,
- tv->vval.v_list,
- n1,
- n2,
- tv_idx2->v_type == VAR_SPECIAL,
- (char_u *)"=",
- (char_u *)"[unknown]");
- }
- }
+ status = check_range_index_two(tv_dest->vval.v_list,
+ &n1, li1, &n2, FALSE);
+ if (status != FAIL)
+ status = list_assign_range(
+ tv_dest->vval.v_list,
+ tv->vval.v_list,
+ n1,
+ n2,
+ tv_idx2->v_type == VAR_SPECIAL,
+ (char_u *)"=",
+ (char_u *)"[unknown]");
}
}
else if (tv_dest->v_type == VAR_BLOB)
{
varnumber_T n1;
varnumber_T n2;
- int error = FALSE;
+ long bloblen;
- n1 = tv_get_number_chk(tv_idx1, &error);
- if (error)
+ n1 = tv_get_number_chk(tv_idx1, NULL);
+ if (tv_idx2->v_type == VAR_SPECIAL
+ && tv_idx2->vval.v_number == VVAL_NONE)
+ n2 = blob_len(tv_dest->vval.v_blob) - 1;
+ else
+ n2 = tv_get_number_chk(tv_idx2, NULL);
+ bloblen = blob_len(tv_dest->vval.v_blob);
+
+ if (check_blob_index(bloblen, n1, FALSE) == FAIL
+ || check_blob_range(bloblen, n1, n2, FALSE) == FAIL)
status = FAIL;
else
- {
- if (tv_idx2->v_type == VAR_SPECIAL
- && tv_idx2->vval.v_number == VVAL_NONE)
- n2 = blob_len(tv_dest->vval.v_blob) - 1;
- else
- n2 = tv_get_number_chk(tv_idx2, &error);
- if (error)
- status = FAIL;
- else
- {
- long bloblen = blob_len(tv_dest->vval.v_blob);
-
- if (check_blob_index(bloblen,
- n1, FALSE) == FAIL
- || check_blob_range(bloblen,
- n1, n2, FALSE) == FAIL)
- status = FAIL;
- else
- status = blob_set_range(
- tv_dest->vval.v_blob, n1, n2, tv);
- }
- }
+ status = blob_set_range(tv_dest->vval.v_blob, n1, n2, tv);
}
else
{