patch 9.0.2157: Vim9: incorrectly parses :def func definitions

Commit: 
https://github.com/vim/vim/commit/e4a450a87ba532cbfe1c4e97cac378eaafc3ae39
Author: Christian Brabandt <[email protected]>
Date:   Fri Dec 8 20:57:38 2023 +0100

    patch 9.0.2157: Vim9: incorrectly parses :def func definitions
    
    Problem:  Vim9: incorrectly parses :def func definitions
    Solution: check for more context when parsing function args
    
    Signed-off-by: Christian Brabandt <[email protected]>
    Incorrectly parses def function definitions
    
    Vim currently allows to define the following vim9 function:
      def Func(f=
      )
      enddef
    
    It currently thinks a Lambda is following the `=` but it doesn't check,
    that there is actually an expression following. So when such a think is
    encountered, remember that an expression should be following.
    
    If no expression is coming in the next few lines, fail parsing the
    function arguments, which will Vim no longer accept such a function.
    
    Signed-off-by: Christian Brabandt <[email protected]>

diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim
index 47b23e85e..27585a904 100644
--- a/src/testdir/test_vim9_func.vim
+++ b/src/testdir/test_vim9_func.vim
@@ -861,6 +861,13 @@ def Test_func_with_comments()
   END
   v9.CheckScriptFailure(lines, 'E125:', 1)
 
+  lines =<< trim END
+      def Func(f=
+      )
+      enddef
+  END
+  v9.CheckScriptFailure(lines, 'E125:', 2)
+
   lines =<< trim END
       def Func(
         arg: string# comment
diff --git a/src/userfunc.c b/src/userfunc.c
index 33e73a9a5..e2b1bc322 100644
--- a/src/userfunc.c
+++ b/src/userfunc.c
@@ -243,6 +243,7 @@ get_function_args(
     int                c;
     int                any_default = FALSE;
     char_u     *whitep = *argp;
+    int                need_expr = FALSE;
 
     if (newargs != NULL)
        ga_init2(newargs, sizeof(char_u *), 3);
@@ -282,7 +283,7 @@ get_function_args(
                semsg(_(e_invalid_argument_str), *argp);
            goto err_ret;
        }
-       if (*p == endchar)
+       if (*p == endchar && !need_expr)
            break;
 
        if (p[0] == '.' && p[1] == '.' && p[2] == '.')
@@ -435,6 +436,8 @@ get_function_args(
                        if (ga_grow(default_args, 1) == FAIL)
                            goto err_ret;
 
+                       if (need_expr)
+                           need_expr = FALSE;
                        // trim trailing whitespace
                        while (p > expr && VIM_ISWHITE(p[-1]))
                            p--;
@@ -453,7 +456,11 @@ get_function_args(
                    }
                }
                else
+               {
                    mustend = TRUE;
+                   if (*skipwhite(p) == NUL)
+                       need_expr = TRUE;
+               }
            }
            else if (any_default)
            {
diff --git a/src/version.c b/src/version.c
index f7d6cbcb6..919f42f2d 100644
--- a/src/version.c
+++ b/src/version.c
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2157,
 /**/
     2156,
 /**/

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/E1rCjdS-00EY3i-Qr%40256bit.org.

Raspunde prin e-mail lui