changeset 22363:6c3d15011081 v8.2.1730

patch 8.2.1730: Vim9: cannot use member of unknown type Commit: https://github.com/vim/vim/commit/04bdd573d0a48e789eb92ed2a81e0dd732761391 Author: Bram Moolenaar <Bram@vim.org> Date: Wed Sep 23 13:25:32 2020 +0200 patch 8.2.1730: Vim9: cannot use member of unknown type Problem: Vim9: cannot use member of unknown type. Solution: When type is unknown us "any". (closes https://github.com/vim/vim/issues/6997)
author Bram Moolenaar <Bram@vim.org>
date Wed, 23 Sep 2020 13:30:03 +0200
parents 90bc9923a1df
children 436bae5a7f5b
files src/testdir/test_vim9_assign.vim src/version.c src/vim9compile.c
diffstat 3 files changed, 32 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_vim9_assign.vim
+++ b/src/testdir/test_vim9_assign.vim
@@ -676,6 +676,33 @@ def Test_assign_dict()
   assert_equal({'0': 0, '1': 1, '2': 2}, nrd)
 enddef
 
+def Test_assign_dict_unknown_type()
+  let lines =<< trim END
+      vim9script
+      let mylist = []
+      mylist += [#{one: 'one'}]
+      def Func()
+        let dd = mylist[0]
+        assert_equal('one', dd.one)
+      enddef
+      Func()
+  END
+  CheckScriptSuccess(lines)
+
+  # doesn't work yet
+  #lines =<< trim END
+  #    vim9script
+  #    let mylist = [[]]
+  #    mylist[0] += [#{one: 'one'}]
+  #    def Func()
+  #      let dd = mylist[0][0]
+  #      assert_equal('one', dd.one)
+  #    enddef
+  #    Func()
+  #END
+  #CheckScriptSuccess(lines)
+enddef
+
 def Test_assign_lambda()
   # check if assign a lambda to a variable which type is func or any.
   let lines =<< trim END
--- 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 */
 /**/
+    1730,
+/**/
     1729,
 /**/
     1728,
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -5080,12 +5080,14 @@ compile_assignment(char_u *arg, exarg_T 
 			}
 			else
 			{
-			    // An empty list or dict has a &t_void member,
+			    // An empty list or dict has a &t_unknown member,
 			    // for a variable that implies &t_any.
 			    if (stacktype == &t_list_empty)
 				lvar->lv_type = &t_list_any;
 			    else if (stacktype == &t_dict_empty)
 				lvar->lv_type = &t_dict_any;
+			    else if (stacktype == &t_unknown)
+				lvar->lv_type = &t_any;
 			    else
 				lvar->lv_type = stacktype;
 			}