]> granicus.if.org Git - vim/commitdiff
patch 8.2.2323: Vim9: error when inferring type from empty dict/list v8.2.2323
authorBram Moolenaar <Bram@vim.org>
Sun, 10 Jan 2021 18:23:27 +0000 (19:23 +0100)
committerBram Moolenaar <Bram@vim.org>
Sun, 10 Jan 2021 18:23:27 +0000 (19:23 +0100)
Problem:    Vim9: error when inferring type from empty dict/list.
Solution:   When the member is t_unknown use t_any. (closes #7009)

src/testdir/test_vim9_expr.vim
src/version.c
src/vim9compile.c

index fc42088d81ce20251c38d46ac20eac8f269b7dd0..8955a7ccf0867d47db9980b14847d91c409f7189 100644 (file)
@@ -2929,6 +2929,16 @@ def Test_expr7_list_subscript()
   lines = ['var l = [0, 1, 2]', 'echo l[g:astring : g:theone]']
   CheckDefExecFailure(lines, 'E1012:')
   CheckScriptFailure(['vim9script'] + lines, 'E1030:', 3)
+
+  lines =<< trim END
+      vim9script
+      var ld = []
+      def Func()
+        eval ld[0].key
+      enddef
+      defcompile
+  END
+  CheckScriptSuccess(lines)
 enddef
 
 def Test_expr7_dict_subscript()
@@ -2937,6 +2947,15 @@ def Test_expr7_dict_subscript()
       var l = [{lnum: 2}, {lnum: 1}]
       var res = l[0].lnum > l[1].lnum
       assert_true(res)
+
+      var dd = {}
+      def Func1()
+        eval dd.key1.key2
+      enddef
+      def Func2()
+        eval dd['key1'].key2
+      enddef
+      defcompile
   END
   CheckScriptSuccess(lines)
 enddef
index cdf27fac7bd07d6eb062fbe9efebee69307e3b4b..a21122aa6071e8ec5e191dbd1290146b5b4c18f0 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2323,
 /**/
     2322,
 /**/
index a6bb56571efe599e3b193e92d84fbdeb9f4b6d8d..94f30d4395dcb183727cc59d8c8cdf30f916d18e 100644 (file)
@@ -1899,7 +1899,10 @@ generate_STRINGMEMBER(cctx_T *cctx, char_u *name, size_t len)
     }
     // change dict type to dict member type
     if (type->tt_type == VAR_DICT)
-       ((type_T **)stack->ga_data)[stack->ga_len - 1] = type->tt_member;
+    {
+       ((type_T **)stack->ga_data)[stack->ga_len - 1] =
+                     type->tt_member == &t_unknown ? &t_any : type->tt_member;
+    }
 
     return OK;
 }
@@ -3793,7 +3796,12 @@ compile_subscript(
                    return FAIL;
                }
                if ((*typep)->tt_type == VAR_DICT)
+               {
                    *typep = (*typep)->tt_member;
+                   if (*typep == &t_unknown)
+                       // empty dict was used
+                       *typep = &t_any;
+               }
                else
                {
                    if (need_type(*typep, &t_dict_any, -2, cctx,
@@ -3831,7 +3839,12 @@ compile_subscript(
                else
                {
                    if ((*typep)->tt_type == VAR_LIST)
+                   {
                        *typep = (*typep)->tt_member;
+                       if (*typep == &t_unknown)
+                           // empty list was used
+                           *typep = &t_any;
+                   }
                    if (generate_instr_drop(cctx,
                             vtype == VAR_LIST ?  ISN_LISTINDEX : ISN_ANYINDEX,
                                                                    1) == FAIL)