# HG changeset patch # User Bram Moolenaar # Date 1609876806 -3600 # Node ID b0a6e7325169547188db0a11550890f5e4db491a # Parent 32ad1f147776786b236c9bbfbef6194848ff5cfa patch 8.2.2304: Vim9: no test for unletting an imported variable Commit: https://github.com/vim/vim/commit/0acbf5ae6632b36c2d2f93406478270ef21f528b Author: Bram Moolenaar Date: Tue Jan 5 20:58:25 2021 +0100 patch 8.2.2304: Vim9: no test for unletting an imported variable Problem: Vim9: no test for unletting an imported variable. Solution: Add a test. Fix line number in error. diff --git a/src/testdir/test_vim9_assign.vim b/src/testdir/test_vim9_assign.vim --- a/src/testdir/test_vim9_assign.vim +++ b/src/testdir/test_vim9_assign.vim @@ -1349,6 +1349,11 @@ def Test_unlet() assert_false(exists('s:somevar')) unlet! s:somevar + CheckDefExecFailure([ + 'var dd = 111', + 'unlet dd', + ], 'E1081:', 2) + # dict unlet var dd = {a: 1, b: 2, c: 3} unlet dd['a'] @@ -1367,21 +1372,29 @@ def Test_unlet() assert_equal([{a: 1}, {c: 3}], dl) CheckDefExecFailure([ - 'var ll = test_null_list()', - 'unlet ll[0]', - ], 'E684:') + 'var ll = test_null_list()', + 'unlet ll[0]', + ], 'E684:', 2) CheckDefExecFailure([ - 'var ll = [1]', - 'unlet ll[2]', - ], 'E684:') + 'var ll = [1]', + 'unlet ll[2]', + ], 'E684:', 2) + CheckDefExecFailure([ + 'var ll = [1]', + 'unlet ll[g:astring]', + ], 'E39:', 2) CheckDefExecFailure([ - 'var dd = test_null_dict()', - 'unlet dd["a"]', - ], 'E716:') + 'var dd = test_null_dict()', + 'unlet dd["a"]', + ], 'E716:', 2) CheckDefExecFailure([ - 'var dd = {a: 1}', - 'unlet dd["b"]', - ], 'E716:') + 'var dd = {a: 1}', + 'unlet dd["b"]', + ], 'E716:', 2) + CheckDefExecFailure([ + 'var dd = {a: 1}', + 'unlet dd[g:alist]', + ], 'E1105:', 2) # can compile unlet before variable exists g:someDict = {key: 'val'} @@ -1426,6 +1439,18 @@ def Test_unlet() 'defcompile', ], 'E1081:') + writefile(['vim9script', 'export var svar = 1234'], 'XunletExport.vim') + var lines =<< trim END + vim9script + import svar from './XunletExport.vim' + def UnletSvar() + unlet svar + enddef + defcompile + END + CheckScriptFailure(lines, 'E1081:', 1) + delete('XunletExport.vim') + $ENVVAR = 'foobar' assert_equal('foobar', $ENVVAR) unlet $ENVVAR diff --git a/src/version.c b/src/version.c --- 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 */ /**/ + 2304, +/**/ 2303, /**/ 2302, diff --git a/src/vim9execute.c b/src/vim9execute.c --- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -1917,6 +1917,7 @@ call_def_function( // unlet a dict item, index must be a string if (tv_idx->v_type != VAR_STRING) { + SOURCING_LNUM = iptr->isn_lnum; semsg(_(e_expected_str_but_got_str), vartype_name(VAR_STRING), vartype_name(tv_idx->v_type)); @@ -1935,6 +1936,7 @@ call_def_function( if (di == NULL) { // NULL dict is equivalent to empty dict + SOURCING_LNUM = iptr->isn_lnum; semsg(_(e_dictkey), key); status = FAIL; } @@ -1950,6 +1952,7 @@ call_def_function( // unlet a List item, index must be a number if (tv_idx->v_type != VAR_NUMBER) { + SOURCING_LNUM = iptr->isn_lnum; semsg(_(e_expected_str_but_got_str), vartype_name(VAR_NUMBER), vartype_name(tv_idx->v_type)); @@ -1964,6 +1967,7 @@ call_def_function( li = list_find(l, n); if (li == NULL) { + SOURCING_LNUM = iptr->isn_lnum; semsg(_(e_listidx), n); status = FAIL; } @@ -3129,6 +3133,7 @@ call_def_function( case ISN_2STRING: case ISN_2STRING_ANY: + SOURCING_LNUM = iptr->isn_lnum; if (do_2string(STACK_TV_BOT(iptr->isn_arg.number), iptr->isn_type == ISN_2STRING_ANY) == FAIL) goto on_error;