]> granicus.if.org Git - vim/commitdiff
patch 8.2.2580: Vim9: checking vararg type may be wrong v8.2.2580
authorBram Moolenaar <Bram@vim.org>
Mon, 8 Mar 2021 20:47:13 +0000 (21:47 +0100)
committerBram Moolenaar <Bram@vim.org>
Mon, 8 Mar 2021 20:47:13 +0000 (21:47 +0100)
Problem:    Vim9: checking vararg type is wrong when function is auto-loaded.
Solution:   Use the member type. (closes #7933)

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

index 2743668ee5f3b5619092fe73085f367a101c8d84..32312b0a2ac4aee71667e6250022ca3a71bcd306 100644 (file)
@@ -3154,6 +3154,10 @@ def Test_vim9_autoload()
        return 'test'
      enddef
      g:some#name = 'name'
+
+     def some#varargs(a1: string, ...l: list<string>): string
+       return a1 .. l[0] .. l[1]
+     enddef
   END
 
   mkdir('Xdir/autoload', 'p')
@@ -3166,6 +3170,8 @@ def Test_vim9_autoload()
   g:some#other = 'other'
   assert_equal('other', g:some#other)
 
+  assert_equal('abc', some#varargs('a', 'b', 'c'))
+
   # upper case script name works
   lines =<< trim END
      vim9script
index 4a4d65a21ff700f1b7e990bd2e738a0230aac471..f3c79c82f34d29248dbec5f89aba6fb6ffa42ad4 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2580,
 /**/
     2579,
 /**/
index 2e7e204e3c120be9686551760a4a298fbee05eea..d4435c4c5f1af3e9e649ebca038065b9a334e677 100644 (file)
@@ -807,9 +807,12 @@ call_by_name(char_u *name, int argcount, ectx_T *ectx, isn_T *iptr)
            // types are correct.
            for (i = 0; i < argcount; ++i)
            {
-               type_T *type = i < ufunc->uf_args.ga_len
-                                 ? ufunc->uf_arg_types[i] : ufunc->uf_va_type;
+               type_T *type = NULL;
 
+               if (i < ufunc->uf_args.ga_len)
+                   type = ufunc->uf_arg_types[i];
+               else if (ufunc->uf_va_type != NULL)
+                   type = ufunc->uf_va_type->tt_member;
                if (type != NULL && check_typval_arg_type(type,
                                                      &argv[i], i + 1) == FAIL)
                    return FAIL;