# HG changeset patch # User Bram Moolenaar # Date 1639927803 -3600 # Node ID 6f8d3470fa90e471d62009eaf51b0c8643fbe5e6 # Parent 6a31b4d210e018e37b1638d66200547346ed4fea patch 8.2.3852: Vim9: not enough tests Commit: https://github.com/vim/vim/commit/f47c5a8e2d8eda7c2c8a9cccf9568eb56c03a0cf Author: Bram Moolenaar Date: Sun Dec 19 15:17:21 2021 +0000 patch 8.2.3852: Vim9: not enough tests Problem: Vim9: not enough tests. Solution: Also run existing tests for Vim9 script. Make errors more consistent. diff --git a/src/errors.h b/src/errors.h --- a/src/errors.h +++ b/src/errors.h @@ -286,6 +286,8 @@ EXTERN char e_invalid_command[] #ifdef FEAT_EVAL EXTERN char e_invalid_command_str[] INIT(= N_("E476: Invalid command: %s")); +EXTERN char e_cannot_index_a_funcref[] + INIT(= N_("E695: Cannot index a Funcref")); EXTERN char e_list_value_has_more_items_than_targets[] INIT(= N_("E710: List value has more items than targets")); EXTERN char e_list_value_does_not_have_enough_items[] diff --git a/src/eval.c b/src/eval.c --- a/src/eval.c +++ b/src/eval.c @@ -4026,6 +4026,8 @@ eval_index( } else if (evaluate) { + int error = FALSE; + #ifdef FEAT_FLOAT // allow for indexing with float if (vim9 && rettv->v_type == VAR_DICT @@ -4035,7 +4037,11 @@ eval_index( var1.v_type = VAR_STRING; } #endif - if (tv_get_string_chk(&var1) == NULL) + if (vim9 && rettv->v_type == VAR_LIST) + tv_get_number_chk(&var1, &error); + else + error = tv_get_string_chk(&var1) == NULL; + if (error) { // not a number or string clear_tv(&var1); @@ -4118,7 +4124,7 @@ check_can_index(typval_T *rettv, int eva case VAR_FUNC: case VAR_PARTIAL: if (verbose) - emsg(_("E695: Cannot index a Funcref")); + emsg(_(e_cannot_index_a_funcref)); return FAIL; case VAR_FLOAT: #ifdef FEAT_FLOAT diff --git a/src/testdir/test_listdict.vim b/src/testdir/test_listdict.vim --- a/src/testdir/test_listdict.vim +++ b/src/testdir/test_listdict.vim @@ -1291,12 +1291,19 @@ endfunc " List and dict indexing tests func Test_listdict_index() - call assert_fails('echo function("min")[0]', 'E695:') - call assert_fails('echo v:true[0]', 'E909:') + call CheckLegacyAndVim9Failure(['echo function("min")[0]'], 'E695:') + call CheckLegacyAndVim9Failure(['echo v:true[0]'], 'E909:') + call CheckLegacyAndVim9Failure(['echo v:null[0]'], 'E909:') + let d = {'k' : 10} call assert_fails('echo d.', 'E15:') - call assert_fails('echo d[1:2]', 'E719:') + call CheckDefAndScriptFailure2(['var d = {k: 10}', 'echo d.'], 'E1127', 'E15:') + + call CheckLegacyAndVim9Failure(['VAR d = {"k": 10}', 'echo d[1 : 2]'], 'E719:') + call assert_fails("let v = [4, 6][{-> 1}]", 'E729:') + call CheckDefAndScriptFailure2(['var v = [4, 6][() => 1]'], 'E1012', 'E703:') + call assert_fails("let v = range(5)[2:[]]", 'E730:') call assert_fails("let v = range(5)[2:{-> 2}(]", ['E15:', 'E116:']) call assert_fails("let v = range(5)[2:3", 'E111:') diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -750,6 +750,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 3852, +/**/ 3851, /**/ 3850, diff --git a/src/vim9compile.c b/src/vim9compile.c --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -3043,7 +3043,25 @@ compile_member(int is_slice, int *keepin } else { - emsg(_(e_string_list_dict_or_blob_required)); + switch (vartype) + { + case VAR_FUNC: + case VAR_PARTIAL: + emsg(_(e_cannot_index_a_funcref)); + break; + case VAR_BOOL: + case VAR_SPECIAL: + case VAR_JOB: + case VAR_CHANNEL: + case VAR_INSTR: + case VAR_UNKNOWN: + case VAR_ANY: + case VAR_VOID: + emsg(_(e_cannot_index_special_variable)); + break; + default: + emsg(_(e_string_list_dict_or_blob_required)); + } return FAIL; } return OK;