diff options
author | Bram Moolenaar <Bram@vim.org> | 2021-01-31 22:18:29 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2021-01-31 22:18:29 +0100 |
commit | 0346b799fc228a3b48967ca0747e6b23586dbaa6 (patch) | |
tree | 9cbcb1f9e27e0eeab9d11cbd387776ec4f515697 | |
parent | e507ff15d52653dad3054ddc0073708977621c0c (diff) | |
download | vim-git-0346b799fc228a3b48967ca0747e6b23586dbaa6.tar.gz |
patch 8.2.2445: Vim9: no proper error for lambda missing return typev8.2.2445
Problem: Vim9: no proper error for lambda missing return type.
Solution: Check for this error. (closes #7758)
-rw-r--r-- | src/errors.h | 2 | ||||
-rw-r--r-- | src/testdir/test_vim9_func.vim | 7 | ||||
-rw-r--r-- | src/userfunc.c | 8 | ||||
-rw-r--r-- | src/version.c | 2 |
4 files changed, 18 insertions, 1 deletions
diff --git a/src/errors.h b/src/errors.h index c27da7cc3..990fb86ee 100644 --- a/src/errors.h +++ b/src/errors.h @@ -349,3 +349,5 @@ EXTERN char e_cannot_define_autocommands_for_all_events[] 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")); diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim index a5855adcb..73ff693fa 100644 --- 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"' diff --git a/src/userfunc.c b/src/userfunc.c index 0f28b028e..701edaf30 100644 --- 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. diff --git a/src/version.c b/src/version.c index b320943a3..9fa14cbe8 100644 --- 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, |