changeset 23808:baf9069f64ca v8.2.2445

patch 8.2.2445: Vim9: no proper error for lambda missing return type Commit: https://github.com/vim/vim/commit/0346b799fc228a3b48967ca0747e6b23586dbaa6 Author: Bram Moolenaar <Bram@vim.org> Date: Sun Jan 31 22:18:29 2021 +0100 patch 8.2.2445: Vim9: no proper error for lambda missing return type Problem: Vim9: no proper error for lambda missing return type. Solution: Check for this error. (closes https://github.com/vim/vim/issues/7758)
author Bram Moolenaar <Bram@vim.org>
date Sun, 31 Jan 2021 22:30:03 +0100
parents 6e9cb7d9ff96
children 0dcd6d533273
files src/errors.h src/testdir/test_vim9_func.vim src/userfunc.c src/version.c
diffstat 4 files changed, 18 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/errors.h
+++ b/src/errors.h
@@ -349,3 +349,5 @@ EXTERN char e_cannot_define_autocommands
 	INIT(= N_("E1155: Cannot define autocommands for ALL events"));
 EXTERN char e_cannot_change_arglist_recursively[]
 	INIT(= N_("E1156: Cannot change the argument list recursively"));
+EXTERN char e_missing_return_type[]
+	INIT(= N_("E1157: Missing return type"));
--- a/src/testdir/test_vim9_func.vim
+++ b/src/testdir/test_vim9_func.vim
@@ -687,6 +687,13 @@ def Test_call_lambda_args()
   CheckDefAndScriptFailure(lines, 'E1012:')
 enddef
 
+def Test_lambda_return_type()
+  var lines =<< trim END
+    var Ref = (): => 123
+  END
+  CheckDefAndScriptFailure(lines, 'E1157:', 1)
+enddef
+
 def Test_lambda_uses_assigned_var()
   CheckDefSuccess([
         'var x: any = "aaa"'
--- a/src/userfunc.c
+++ b/src/userfunc.c
@@ -491,6 +491,11 @@ skip_arrow(
 	    s = skipwhite(s + 1);
 	    *ret_type = s;
 	    s = skip_type(s, TRUE);
+	    if (s == *ret_type)
+	    {
+		emsg(_(e_missing_return_type));
+		return NULL;
+	    }
 	}
 	bef = s;
 	s = skipwhite(s);
@@ -543,6 +548,7 @@ get_lambda_tv(
     char_u	*tofree2 = NULL;
     int		equal_arrow = **arg == '(';
     int		white_error = FALSE;
+    int		called_emsg_start = called_emsg;
 
     if (equal_arrow && !in_vim9script())
 	return NOTDONE;
@@ -560,7 +566,7 @@ get_lambda_tv(
     {
 	if (types_optional)
 	    ga_clear_strings(&argtypes);
-	return NOTDONE;
+	return called_emsg == called_emsg_start ? NOTDONE : FAIL;
     }
 
     // Parse the arguments for real.
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    2445,
+/**/
     2444,
 /**/
     2443,