summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/evalvars.c10
-rw-r--r--src/testdir/test_vim9_assign.vim8
-rw-r--r--src/version.c2
3 files changed, 20 insertions, 0 deletions
diff --git a/src/evalvars.c b/src/evalvars.c
index 9e11578e1..fde80d750 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 60c8fe958..ad7b85b5f 100644
--- a/src/testdir/test_vim9_assign.vim
+++ b/src/testdir/test_vim9_assign.vim
@@ -1211,6 +1211,14 @@ def Test_unlet()
CheckScriptFailure([
'vim9script',
'var svar = 123',
+ 'func Func()',
+ ' unlet s:svar',
+ 'endfunc',
+ 'Func()',
+ ], 'E1081:')
+ CheckScriptFailure([
+ 'vim9script',
+ 'var svar = 123',
'def Func()',
' unlet s:svar',
'enddef',
diff --git a/src/version.c b/src/version.c
index be2b33c19..70ff9a457 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 */
/**/
+ 2157,
+/**/
2156,
/**/
2155,