]> granicus.if.org Git - vim/commitdiff
patch 8.2.1291: Vim9: type of varargs items is not checked v8.2.1291
authorBram Moolenaar <Bram@vim.org>
Sat, 25 Jul 2020 14:33:02 +0000 (16:33 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 25 Jul 2020 14:33:02 +0000 (16:33 +0200)
Problem:    Vim9: type of varargs items is not checked.
Solution:   Check the list item types. (closes #6523)

src/testdir/test_vim9_func.vim
src/version.c
src/vim9execute.c

index ef98583fe3c04a7e346c0c029c67589d6a978d62..49be8f97a2527eb872cc78521e1bc9249448c51c 100644 (file)
@@ -164,7 +164,55 @@ def Test_call_def_varargs()
   assert_equal('one,foo', MyDefVarargs('one'))
   assert_equal('one,two', MyDefVarargs('one', 'two'))
   assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three'))
-  call CheckDefFailure(['MyDefVarargs("one", 22)'], 'E1013: argument 2: type mismatch, expected string but got number')
+  CheckDefFailure(['MyDefVarargs("one", 22)'],
+      'E1013: argument 2: type mismatch, expected string but got number')
+  CheckDefFailure(['MyDefVarargs("one", "two", 123)'],
+      'E1013: argument 3: type mismatch, expected string but got number')
+
+  let lines =<< trim END
+      vim9script
+      def Func(...l: list<string>)
+        echo l
+      enddef
+      Func('a', 'b', 'c')
+  END
+  CheckScriptSuccess(lines)
+
+  lines =<< trim END
+      vim9script
+      def Func(...l: list<string>)
+        echo l
+      enddef
+      Func()
+  END
+  CheckScriptSuccess(lines)
+
+  lines =<< trim END
+      vim9script
+      def Func(...l: list<string>)
+        echo l
+      enddef
+      Func(1, 2, 3)
+  END
+  CheckScriptFailure(lines, 'E1013:')
+
+  lines =<< trim END
+      vim9script
+      def Func(...l: list<string>)
+        echo l
+      enddef
+      Func('a', 9)
+  END
+  CheckScriptFailure(lines, 'E1013:')
+
+  lines =<< trim END
+      vim9script
+      def Func(...l: list<string>)
+        echo l
+      enddef
+      Func(1, 'a')
+  END
+  CheckScriptFailure(lines, 'E1013:')
 enddef
 
 let s:value = ''
index 20365a0a4530f37ce6dbd94850dae02862fd523a..8934011f6557bc60cd2e3c3103ad5833ea4eb43a 100644 (file)
@@ -754,6 +754,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1291,
 /**/
     1290,
 /**/
index ab8142d23cb44913bd4ac453a96a0e486019dbcc..e52df61ac136d13818bbca21f3cd8323c05cbaca 100644 (file)
@@ -755,9 +755,27 @@ call_def_function(
            argc -= vararg_count;
        if (exe_newlist(vararg_count, &ectx) == FAIL)
            goto failed_early;
+
+       // Check the type of the list items.
+       tv = STACK_TV_BOT(-1);
+       if (ufunc->uf_va_type != NULL
+               && ufunc->uf_va_type->tt_member != &t_any
+               && tv->vval.v_list != NULL)
+       {
+           type_T      *expected = ufunc->uf_va_type->tt_member;
+           listitem_T  *li = tv->vval.v_list->lv_first;
+
+           for (idx = 0; idx < vararg_count; ++idx)
+           {
+               if (check_typval_type(expected, &li->li_tv) == FAIL)
+                   goto failed_early;
+               li = li->li_next;
+           }
+       }
+
        if (defcount > 0)
            // Move varargs list to below missing default arguments.
-           *STACK_TV_BOT(defcount- 1) = *STACK_TV_BOT(-1);
+           *STACK_TV_BOT(defcount - 1) = *STACK_TV_BOT(-1);
        --ectx.ec_stack.ga_len;
     }