changeset 23523:b0a6e7325169 v8.2.2304

patch 8.2.2304: Vim9: no test for unletting an imported variable Commit: https://github.com/vim/vim/commit/0acbf5ae6632b36c2d2f93406478270ef21f528b Author: Bram Moolenaar <Bram@vim.org> 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.
author Bram Moolenaar <Bram@vim.org>
date Tue, 05 Jan 2021 21:00:06 +0100
parents 32ad1f147776
children d2787a89dcf8
files src/testdir/test_vim9_assign.vim src/version.c src/vim9execute.c
diffstat 3 files changed, 44 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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,
--- 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;