summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-09-19 14:12:34 +0200
committerBram Moolenaar <Bram@vim.org>2020-09-19 14:12:34 +0200
commit77b20977dc31ecf753dddad7a7c7b8f7b6e0c244 (patch)
tree5c532798c3e4b8d2b61ce118c0fcc230975531bd
parentdec07510bbdf335a2de3d63591231a90ef3e4c80 (diff)
downloadvim-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)
-rw-r--r--src/testdir/test_vim9_expr.vim12
-rw-r--r--src/version.c2
-rw-r--r--src/vim9type.c15
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.