summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2022-02-17 14:42:02 +0000
committerBram Moolenaar <Bram@vim.org>2022-02-17 14:42:02 +0000
commitea5c898b5fb60828b0223f258910f84f5c645e63 (patch)
treed8df35556cad1d7b84116c33a3dafa8bb521a560
parente08be09a08485e8c919f46c05223c1ccfdaf175d (diff)
patch 8.2.4408: Vim9: some code not covered by testsv8.2.4408
Problem: Vim9: some code not covered by tests. Solution: Add a few more tests. Correct error message. Allow unlet on dict with a number key.
-rw-r--r--src/errors.h3
-rw-r--r--src/testdir/test_vim9_assign.vim15
-rw-r--r--src/version.c2
-rw-r--r--src/vim9execute.c24
4 files changed, 33 insertions, 11 deletions
diff --git a/src/errors.h b/src/errors.h
index 8e2b9da6c6..5f2685ab3e 100644
--- a/src/errors.h
+++ b/src/errors.h
@@ -3010,8 +3010,7 @@ EXTERN char e_variable_arguments_type_must_be_list_str[]
INIT(= N_("E1180: Variable arguments type must be a list: %s"));
EXTERN char e_cannot_use_underscore_here[]
INIT(= N_("E1181: Cannot use an underscore here"));
-EXTERN char e_blob_required[]
- INIT(= N_("E1182: Blob required"));
+// E1182 unused
EXTERN char e_cannot_use_range_with_assignment_operator_str[]
INIT(= N_("E1183: Cannot use a range with an assignment operator: %s"));
#endif
diff --git a/src/testdir/test_vim9_assign.vim b/src/testdir/test_vim9_assign.vim
index 835bc1edd3..c5f56c2ef1 100644
--- a/src/testdir/test_vim9_assign.vim
+++ b/src/testdir/test_vim9_assign.vim
@@ -610,6 +610,12 @@ def Test_assign_index()
bl[1] = 8
END
v9.CheckDefExecAndScriptFailure(lines, ['E1184:', 'E979:'], 2)
+
+ lines =<< trim END
+ g:bl = 'not a blob'
+ g:bl[1 : 2] = 8
+ END
+ v9.CheckDefExecAndScriptFailure(lines, ['E897:', 'E689:'], 2)
enddef
def Test_init_in_for_loop()
@@ -1231,6 +1237,7 @@ def Test_script_var_default()
assert_equal(0z, bl)
assert_equal({}, d)
enddef
+ Echo()
END
v9.CheckScriptSuccess(lines)
enddef
@@ -2070,9 +2077,10 @@ def Test_unlet()
], 'E1081:', 2)
# dict unlet
- var dd = {a: 1, b: 2, c: 3}
+ var dd = {a: 1, b: 2, c: 3, 4: 4}
unlet dd['a']
unlet dd.c
+ unlet dd[4]
assert_equal({b: 2}, dd)
# list unlet
@@ -2181,6 +2189,11 @@ def Test_unlet()
'unlet dd[g:alist]',
], 'E1105:', 2)
+ v9.CheckDefExecFailure([
+ 'g:dd = {"a": 1, 2: 2}'
+ 'unlet g:dd[0z11]',
+ ], 'E1029:', 2)
+
# can compile unlet before variable exists
g:someDict = {key: 'val'}
var k = 'key'
diff --git a/src/version.c b/src/version.c
index 76d7895e0d..edac69059d 100644
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 4408,
+/**/
4407,
/**/
4406,
diff --git a/src/vim9execute.c b/src/vim9execute.c
index 318fec918c..1c5dd74da0 100644
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -1876,7 +1876,7 @@ execute_storeindex(isn_T *iptr, ectx_T *ectx)
}
/*
- * Store a value in a blob range.
+ * Store a value in a list or blob range.
*/
static int
execute_storerange(isn_T *iptr, ectx_T *ectx)
@@ -1893,13 +1893,13 @@ execute_storerange(isn_T *iptr, ectx_T *ectx)
// -2 second index or "none"
// -1 destination list or blob
tv = STACK_TV_BOT(-4);
+ SOURCING_LNUM = iptr->isn_lnum;
if (tv_dest->v_type == VAR_LIST)
{
long n1;
long n2;
int error = FALSE;
- SOURCING_LNUM = iptr->isn_lnum;
n1 = (long)tv_get_number_chk(tv_idx1, &error);
if (error)
status = FAIL;
@@ -1973,7 +1973,7 @@ execute_storerange(isn_T *iptr, ectx_T *ectx)
else
{
status = FAIL;
- emsg(_(e_blob_required));
+ emsg(_(e_list_or_blob_required));
}
clear_tv(tv_idx1);
@@ -2001,7 +2001,7 @@ execute_unletindex(isn_T *iptr, ectx_T *ectx)
if (tv_dest->v_type == VAR_DICT)
{
// unlet a dict item, index must be a string
- if (tv_idx->v_type != VAR_STRING)
+ if (tv_idx->v_type != VAR_STRING && tv_idx->v_type != VAR_NUMBER)
{
SOURCING_LNUM = iptr->isn_lnum;
semsg(_(e_expected_str_but_got_str),
@@ -2012,7 +2012,7 @@ execute_unletindex(isn_T *iptr, ectx_T *ectx)
else
{
dict_T *d = tv_dest->vval.v_dict;
- char_u *key = tv_idx->vval.v_string;
+ char_u *key;
dictitem_T *di = NULL;
if (d != NULL && value_check_lock(
@@ -2021,8 +2021,16 @@ execute_unletindex(isn_T *iptr, ectx_T *ectx)
else
{
SOURCING_LNUM = iptr->isn_lnum;
- if (key == NULL)
- key = (char_u *)"";
+ if (tv_idx->v_type == VAR_STRING)
+ {
+ key = tv_idx->vval.v_string;
+ if (key == NULL)
+ key = (char_u *)"";
+ }
+ else
+ {
+ key = tv_get_string(tv_idx);
+ }
if (d != NULL)
di = dict_find(d, key, (int)STRLEN(key));
if (di == NULL)
@@ -3173,7 +3181,7 @@ exec_instructions(ectx_T *ectx)
}
break;
- // store value in blob range
+ // store value in list or blob range
case ISN_STORERANGE:
if (execute_storerange(iptr, ectx) == FAIL)
goto on_error;