changeset 23223:98548b8fbc98 v8.2.2157

patch 8.2.2157: Vim9: can delete a Vim9 script variable from a function Commit: https://github.com/vim/vim/commit/9aed729fe9e62536236875a42fb170d2c8fb3046 Author: Bram Moolenaar <Bram@vim.org> Date: Fri Dec 18 15:38:00 2020 +0100 patch 8.2.2157: Vim9: can delete a Vim9 script variable from a function Problem: Vim9: can delete a Vim9 script variable from a function. Solution: Check the variable is defined in Vim9 script. (closes https://github.com/vim/vim/issues/7483)
author Bram Moolenaar <Bram@vim.org>
date Fri, 18 Dec 2020 15:45:05 +0100
parents 02583af08913
children ee10fbb1d6ed
files src/evalvars.c src/testdir/test_vim9_assign.vim src/version.c
diffstat 3 files changed, 20 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- 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);
--- 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',
--- 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,