From 2d3ac2e03093c4b0ae5d18c5f2f51ae0c2a9ec72 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Thu, 3 Feb 2022 12:34:05 +0000 Subject: [PATCH] patch 8.2.4287: cannot assign empty list with type to variable with list type Problem: Cannot assign empty list with any list type to variable with specific list type. Solution: Use unknown list type for empty list if the specified type is any. --- src/testdir/test_vim9_assign.vim | 9 +++++++++ src/testdir/test_vim9_func.vim | 6 +++--- src/version.c | 2 ++ src/vim9type.c | 6 +++++- 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/testdir/test_vim9_assign.vim b/src/testdir/test_vim9_assign.vim index 73b331070f..744fc5e715 100644 --- a/src/testdir/test_vim9_assign.vim +++ b/src/testdir/test_vim9_assign.vim @@ -1249,6 +1249,15 @@ def Test_assignment_var_list() v9.CheckScriptSuccess(lines) enddef +def Test_assignment_empty_list() + var lines =<< trim END + var l2: list = [] + var l: list + l = l2 + END + v9.CheckDefAndScriptSuccess(lines) +enddef + def Test_assignment_vim9script() var lines =<< trim END vim9script diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim index 434d49bf97..55297cb652 100644 --- a/src/testdir/test_vim9_func.vim +++ b/src/testdir/test_vim9_func.vim @@ -3461,11 +3461,11 @@ def Test_list_any_type_checked() enddef Foo() END + # "any" could be "dict", thus OK lines[2] = 'var l: list' - v9.CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch, expected list> but got list', 2) - + v9.CheckScriptSuccess(lines) lines[2] = 'var l: list = []' - v9.CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch, expected list> but got list', 2) + v9.CheckScriptSuccess(lines) lines[2] = 'var l: list = [11]' v9.CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch, expected list> but got list', 2) diff --git a/src/version.c b/src/version.c index e6edb17be2..b53b4eb3df 100644 --- a/src/version.c +++ b/src/version.c @@ -746,6 +746,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 4287, /**/ 4286, /**/ diff --git a/src/vim9type.c b/src/vim9type.c index f184171c11..f72698cb9d 100644 --- a/src/vim9type.c +++ b/src/vim9type.c @@ -344,7 +344,11 @@ typval2type_int(typval_T *tv, int copyID, garray_T *type_gap, int flags) list_T *l = tv->vval.v_list; listitem_T *li; - if (l == NULL || (l->lv_first == NULL && l->lv_type == NULL)) + // An empty list has type list, unless the type was specified + // and is not list. This matters when assigning to a variable + // with a specific list type. + if (l == NULL || (l->lv_first == NULL + && (l->lv_type == NULL || l->lv_type->tt_member == &t_any))) return &t_list_empty; if ((flags & TVTT_DO_MEMBER) == 0) return &t_list_any;