diff options
author | Bram Moolenaar <Bram@vim.org> | 2020-09-19 14:12:34 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2020-09-19 14:12:34 +0200 |
commit | 77b20977dc31ecf753dddad7a7c7b8f7b6e0c244 (patch) | |
tree | 5c532798c3e4b8d2b61ce118c0fcc230975531bd /src | |
parent | dec07510bbdf335a2de3d63591231a90ef3e4c80 (diff) | |
download | vim-git-77b20977dc31ecf753dddad7a7c7b8f7b6e0c244.tar.gz |
patch 8.2.1710: Vim9: list of list type can be wrongv8.2.1710
Problem: Vim9: list of list type can be wrong.
Solution: Use VAR_UNKNOWN for empty list. Recognize VAR_UNKNOWN when
looking for a common type. (closes #6979)
Diffstat (limited to 'src')
-rw-r--r-- | src/testdir/test_vim9_expr.vim | 12 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9type.c | 15 |
3 files changed, 28 insertions, 1 deletions
diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim index d79e2cd6b..b9a68112b 100644 --- a/src/testdir/test_vim9_expr.vim +++ b/src/testdir/test_vim9_expr.vim @@ -1513,6 +1513,10 @@ def Test_expr7_list() 2] [3, 4] + let llstring: list<list<string>> = [['text'], []] + llstring = [[], ['text']] + llstring = [[], []] + CheckDefFailure(["let x = 1234[3]"], 'E1107:', 1) CheckDefExecFailure(["let x = g:anint[3]"], 'E1062:', 1) @@ -1718,6 +1722,14 @@ def Test_expr7_dict() mixed = #{a: 234} mixed = #{} + let dictlist: dict<list<string>> = #{absent: [], present: ['hi']} + dictlist = #{absent: ['hi'], present: []} + dictlist = #{absent: [], present: []} + + let dictdict: dict<dict<string>> = #{one: #{a: 'text'}, two: #{}} + dictdict = #{one: #{}, two: #{a: 'text'}} + dictdict = #{one: #{}, two: #{}} + CheckDefFailure(["let x = #{a:8}"], 'E1069:', 1) CheckDefFailure(["let x = #{a : 8}"], 'E1068:', 1) CheckDefFailure(["let x = #{a :8}"], 'E1068:', 1) diff --git a/src/version.c b/src/version.c index 60aa10599..3b1f963bb 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 */ /**/ + 1710, +/**/ 1709, /**/ 1708, diff --git a/src/vim9type.c b/src/vim9type.c index cc879d0e7..a7ffd32ed 100644 --- a/src/vim9type.c +++ b/src/vim9type.c @@ -869,6 +869,19 @@ common_type(type_T *type1, type_T *type2, type_T **dest, garray_T *type_gap) return; } + // If either is VAR_UNKNOWN use the other type. An empty list/dict has no + // specific type. + if (type1->tt_type == VAR_UNKNOWN) + { + *dest = type2; + return; + } + if (type2->tt_type == VAR_UNKNOWN) + { + *dest = type1; + return; + } + if (type1->tt_type == type2->tt_type) { if (type1->tt_type == VAR_LIST || type2->tt_type == VAR_DICT) @@ -932,7 +945,7 @@ get_member_type_from_stack( // Use "any" for an empty list or dict. if (count == 0) - return &t_void; + return &t_unknown; // Use the first value type for the list member type, then find the common // type from following items. |