aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/eval.c14
-rw-r--r--src/nvim/eval/typval.c2
-rw-r--r--test/functional/vimscript/null_spec.lua8
3 files changed, 14 insertions, 10 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index ee0860a8d1..f9b32d758d 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -1467,14 +1467,22 @@ char *get_lval(char *const name, typval_T *const rettv, lval_T *const lp, const
}
return NULL;
}
- if (!(lp->ll_tv->v_type == VAR_LIST && lp->ll_tv->vval.v_list != NULL)
- && !(lp->ll_tv->v_type == VAR_DICT && lp->ll_tv->vval.v_dict != NULL)
- && !(lp->ll_tv->v_type == VAR_BLOB && lp->ll_tv->vval.v_blob != NULL)) {
+ if (lp->ll_tv->v_type != VAR_LIST
+ && lp->ll_tv->v_type != VAR_DICT
+ && lp->ll_tv->v_type != VAR_BLOB) {
if (!quiet) {
emsg(_("E689: Can only index a List, Dictionary or Blob"));
}
return NULL;
}
+
+ // a NULL list/blob works like an empty list/blob, allocate one now.
+ if (lp->ll_tv->v_type == VAR_LIST && lp->ll_tv->vval.v_list == NULL) {
+ tv_list_alloc_ret(lp->ll_tv, kListLenUnknown);
+ } else if (lp->ll_tv->v_type == VAR_BLOB && lp->ll_tv->vval.v_blob == NULL) {
+ tv_blob_alloc_ret(lp->ll_tv);
+ }
+
if (lp->ll_range) {
if (!quiet) {
emsg(_("E708: [:] must come last"));
diff --git a/src/nvim/eval/typval.c b/src/nvim/eval/typval.c
index ea118e4bc6..9fca4adcf7 100644
--- a/src/nvim/eval/typval.c
+++ b/src/nvim/eval/typval.c
@@ -625,7 +625,7 @@ listitem_T *tv_list_check_range_index_one(list_T *const l, int *const n1, const
listitem_T *li = tv_list_find_index(l, n1);
if (li == NULL) {
if (!quiet) {
- semsg(_(e_list_index_out_of_range_nr), (int64_t)n1);
+ semsg(_(e_list_index_out_of_range_nr), (int64_t)(*n1));
}
return NULL;
}
diff --git a/test/functional/vimscript/null_spec.lua b/test/functional/vimscript/null_spec.lua
index 4ba5dd6b45..d4c36d835b 100644
--- a/test/functional/vimscript/null_spec.lua
+++ b/test/functional/vimscript/null_spec.lua
@@ -53,17 +53,13 @@ describe('NULL', function()
end)
end
describe('list', function()
- -- Incorrect behaviour
- -- FIXME Should error out with different message
- null_test('makes :unlet act as if it is not a list', ':unlet L[0]',
- 'Vim(unlet):E689: Can only index a List, Dictionary or Blob')
-
-- Subjectable behaviour
-
null_expr_test('is equal to empty list', 'L == []', 0, 1)
null_expr_test('is equal to empty list (reverse order)', '[] == L', 0, 1)
-- Correct behaviour
+ null_test('can be :unlet item with error message for empty list', ':unlet L[0]',
+ 'Vim(unlet):E684: List index out of range: 0')
null_expr_test('can be indexed with error message for empty list', 'L[0]',
'E684: List index out of range: 0', nil)
null_expr_test('can be splice-indexed', 'L[:]', 0, {})