]> granicus.if.org Git - vim/commitdiff
patch 9.0.0778: indexing of unknown const type fails during compilation v9.0.0778
authorBram Moolenaar <Bram@vim.org>
Mon, 17 Oct 2022 12:13:32 +0000 (13:13 +0100)
committerBram Moolenaar <Bram@vim.org>
Mon, 17 Oct 2022 12:13:32 +0000 (13:13 +0100)
Problem:    Indexing of unknown const type fails during compilation.
Solution:   Check for "any" properly. (closes #11389)

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

index b764e929cfc5ce608f676a5957fabc33d4cc647b..bc4a7902734ffbde1eb7f68a22c2bab87b49108e 100644 (file)
@@ -3132,6 +3132,30 @@ def Test_expr9_any_index_slice()
   unlet g:testlist
 enddef
 
+def Test_expr9_const_any_index_slice()
+  var lines =<< trim END
+      vim9script
+
+      export def V(): dict<any>
+        return {a: [1, 43], b: 0}
+      enddef
+  END
+  writefile(lines, 'XexportDict.vim', 'D')
+
+  lines =<< trim END
+      vim9script
+
+      import './XexportDict.vim' as x
+
+      def Test()
+        const v = x.V()
+        assert_equal(43, v.a[1])
+      enddef
+      Test()
+  END
+  v9.CheckScriptSuccess(lines)
+enddef
+
 def Test_expr_member_vim9script()
   var lines =<< trim END
       var d = {one:
index b0ba507f5a4514b94f7956f8c36503071250855b..e6b7ee1e7c5dbde41e3757385e79cf3cddc56182 100644 (file)
@@ -695,6 +695,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    778,
 /**/
     777,
 /**/
index 8be8f6b9145c88ebc7ef9ec3e833514def60a110..854c09d01c09db649a2d6739e5ec99c34793e335 100644 (file)
@@ -93,7 +93,8 @@ compile_member(int is_slice, int *keeping_dict, cctx_T *cctx)
     vartype = typep->type_curr->tt_type;
     idxtype = (((type2_T *)stack->ga_data) + stack->ga_len - 1)->type_curr;
     // If the index is a string, the variable must be a Dict.
-    if ((typep->type_curr == &t_any || typep->type_curr == &t_unknown)
+    if ((typep->type_curr->tt_type == VAR_ANY
+               || typep->type_curr->tt_type == VAR_UNKNOWN)
                                                       && idxtype == &t_string)
        vartype = VAR_DICT;
     if (vartype == VAR_STRING || vartype == VAR_LIST || vartype == VAR_BLOB)
@@ -172,8 +173,8 @@ compile_member(int is_slice, int *keeping_dict, cctx_T *cctx)
                return FAIL;
        }
     }
-    else if (vartype == VAR_LIST || typep->type_curr == &t_any
-                                            || typep->type_curr == &t_unknown)
+    else if (vartype == VAR_LIST || typep->type_curr->tt_type == VAR_ANY
+                                || typep->type_curr->tt_type == VAR_UNKNOWN)
     {
        if (is_slice)
        {
@@ -669,7 +670,7 @@ compile_arguments(
            // {sub} argument of substitute() can be compiled if it starts
            // with \=
            if (isn->isn_type == ISN_PUSHS && isn->isn_arg.string[0] == '\\'
-                   && isn->isn_arg.string[1] == '=')
+                                             && isn->isn_arg.string[1] == '=')
                compile_string(isn, cctx, 2);
        }
 
@@ -1646,10 +1647,11 @@ bool_on_stack(cctx_T *cctx)
     if (type == &t_bool)
        return OK;
 
-    if (type == &t_any
-           || type == &t_unknown
-           || type == &t_number
-           || type == &t_number_bool)
+    if (type->tt_type == VAR_ANY
+           || type->tt_type == VAR_UNKNOWN
+           || type->tt_type == VAR_NUMBER
+           || type == &t_number_bool
+           || type == &t_const_number_bool)
        // Number 0 and 1 are OK to use as a bool.  "any" could also be a bool.
        // This requires a runtime type check.
        return generate_COND2BOOL(cctx);