Mercurial > vim
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.