]> granicus.if.org Git - vim/commitdiff
patch 8.2.2590: Vim9: default argument value may cause internal error v8.2.2590
authorBram Moolenaar <Bram@vim.org>
Thu, 11 Mar 2021 19:04:04 +0000 (20:04 +0100)
committerBram Moolenaar <Bram@vim.org>
Thu, 11 Mar 2021 19:04:04 +0000 (20:04 +0100)
Problem:    Vim9: default argument value may cause internal error.
Solution:   Hide later function arguments when compiling the expression.
            (closes #7948)

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

index 810b3a3cf013192a4d3b4c36116ad9510fe66014..6258b7d5d4687e34bc88d9abb7a14abdd410aa2c 100644 (file)
@@ -311,6 +311,14 @@ def Test_call_default_args()
   delfunc g:Func
   CheckScriptFailure(['def Func(arg: number = "text")', 'enddef', 'defcompile'], 'E1013: Argument 1: type mismatch, expected number but got string')
   delfunc g:Func
+
+  var lines =<< trim END
+      vim9script
+      def Func(a = b == 0 ? 1 : 2, b = 0)
+      enddef
+      defcompile
+  END
+  CheckScriptFailure(lines, 'E1001: Variable not found: b')
 enddef
 
 def FuncWithComment(  # comment
index 87ac80f5be441b376e3ccc8ada36cb24f180721b..1eecf5d98aa2fe1746373b7b160f2c7ac5766564 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2590,
 /**/
     2589,
 /**/
index d29c66b66b883d2b1e1df478dda7566e974642f6..c49c499841f55750a48d77e44624608096fd1450 100644 (file)
@@ -8199,6 +8199,7 @@ compile_def_function(
     {
        int     count = ufunc->uf_def_args.ga_len;
        int     first_def_arg = ufunc->uf_args.ga_len - count;
+       int     uf_args_len = ufunc->uf_args.ga_len;
        int     i;
        char_u  *arg;
        int     off = STACK_FRAME_SIZE + (ufunc->uf_va_name != NULL ? 1 : 0);
@@ -8211,16 +8212,24 @@ compile_def_function(
        ufunc->uf_def_arg_idx = ALLOC_CLEAR_MULT(int, count + 1);
        if (ufunc->uf_def_arg_idx == NULL)
            goto erret;
+       SOURCING_LNUM = 0;  // line number unknown
        for (i = 0; i < count; ++i)
        {
            garray_T    *stack = &cctx.ctx_type_stack;
            type_T      *val_type;
            int         arg_idx = first_def_arg + i;
            where_T     where;
+           int         r;
+
+           // Make sure later arguments are not found.
+           ufunc->uf_args.ga_len = i;
 
            ufunc->uf_def_arg_idx[i] = instr->ga_len;
            arg = ((char_u **)(ufunc->uf_def_args.ga_data))[i];
-           if (compile_expr0(&arg, &cctx) == FAIL)
+           r = compile_expr0(&arg, &cctx);
+
+           ufunc->uf_args.ga_len = uf_args_len;
+           if (r == FAIL)
                goto erret;
 
            // If no type specified use the type of the default value.