diff --git a/src/evalvars.c b/src/evalvars.c index 9e11578e13..fde80d750d 100644 --- a/src/evalvars.c +++ b/src/evalvars.c @@ -1663,10 +1663,20 @@ do_unlet(char_u *name, int forceit) dict_T *d; dictitem_T *di; + // can't :unlet a script variable in Vim9 script if (in_vim9script() && check_vim9_unlet(name) == FAIL) return FAIL; ht = find_var_ht(name, &varname); + + // can't :unlet a script variable in Vim9 script from a function + if (ht == get_script_local_ht() + && SCRIPT_ID_VALID(current_sctx.sc_sid) + && SCRIPT_ITEM(current_sctx.sc_sid)->sn_version + == SCRIPT_VERSION_VIM9 + && check_vim9_unlet(name) == FAIL) + return FAIL; + if (ht != NULL && *varname != NUL) { d = get_current_funccal_dict(ht); diff --git a/src/testdir/test_vim9_assign.vim b/src/testdir/test_vim9_assign.vim index 60c8fe9589..ad7b85b5fc 100644 --- a/src/testdir/test_vim9_assign.vim +++ b/src/testdir/test_vim9_assign.vim @@ -1208,6 +1208,14 @@ def Test_unlet() 'enddef', 'defcompile', ], 'E1081:') + CheckScriptFailure([ + 'vim9script', + 'var svar = 123', + 'func Func()', + ' unlet s:svar', + 'endfunc', + 'Func()', + ], 'E1081:') CheckScriptFailure([ 'vim9script', 'var svar = 123', diff --git a/src/version.c b/src/version.c index be2b33c19d..70ff9a457e 100644 --- a/src/version.c +++ b/src/version.c @@ -750,6 +750,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 2157, /**/ 2156, /**/