diff src/userfunc.c @ 33914:966a1af141b0 v9.0.2157

patch 9.0.2157: Vim9: incorrectly parses :def func definitions Commit: https://github.com/vim/vim/commit/e4a450a87ba532cbfe1c4e97cac378eaafc3ae39 Author: Christian Brabandt <cb@256bit.org> 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 <cb@256bit.org> 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 <cb@256bit.org>
author Christian Brabandt <cb@256bit.org>
date Mon, 11 Dec 2023 18:00:02 +0100
parents f2445075dbeb
children a49ae967e9ed
line wrap: on
line diff
--- 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)
 	    {