changeset 24293:bbf4b3185554 v8.2.2687

patch 8.2.2687: Vim9: cannot use "const" for global variable in :def function Commit: https://github.com/vim/vim/commit/d877a5700fe9d5b92562514924549316382384aa Author: Bram Moolenaar <Bram@vim.org> Date: Thu Apr 1 19:42:48 2021 +0200 patch 8.2.2687: Vim9: cannot use "const" for global variable in :def function Problem: Vim9: cannot use "const" for global variable in :def function. Solution: Do allow using :const for a global variable. (closes https://github.com/vim/vim/issues/8030)
author Bram Moolenaar <Bram@vim.org>
date Thu, 01 Apr 2021 19:45:02 +0200
parents 09302e0fb4a5
children e4dddd2b4a50
files src/testdir/test_vim9_assign.vim src/version.c src/vim9compile.c src/vim9execute.c
diffstat 4 files changed, 28 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_vim9_assign.vim
+++ b/src/testdir/test_vim9_assign.vim
@@ -1277,6 +1277,13 @@ def Test_var_declaration()
     g:FLIST[0] = 22
     assert_equal([22], g:FLIST)
 
+    def SetGlobalConst()
+      const g:globConst = 123
+    enddef
+    SetGlobalConst()
+    assert_equal(123, g:globConst)
+    assert_true(islocked('g:globConst'))
+
     const w:FOO: number = 46
     assert_equal(46, w:FOO)
     const w:FOOS = 'wfoos'
@@ -1341,6 +1348,17 @@ def Test_var_declaration_fails()
 
   lines =<< trim END
     vim9script
+    def SetGlobalConst()
+      const g:globConst = 123
+    enddef
+    SetGlobalConst()
+    g:globConst = 234
+  END
+  CheckScriptFailure(lines, 'E741: Value is locked: globConst')
+  unlet g:globConst
+
+  lines =<< trim END
+    vim9script
     const cdict: dict<string> = {}
     def Change()
       cdict.foo = 'foo'
--- 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 */
 /**/
+    2687,
+/**/
     2686,
 /**/
     2685,
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -5752,7 +5752,8 @@ compile_lhs(
 				      &lhs->lhs_opt_flags, &lhs->lhs_vimvaridx,
 						 &lhs->lhs_type, cctx) == FAIL)
 	    return FAIL;
-	if (lhs->lhs_dest != dest_local)
+	if (lhs->lhs_dest != dest_local
+				 && cmdidx != CMD_const && cmdidx != CMD_final)
 	{
 	    // Specific kind of variable recognized.
 	    declare_error = is_decl;
@@ -6519,6 +6520,7 @@ compile_assignment(char_u *arg, exarg_T 
 	else
 	{
 	    if (is_decl && cmdidx == CMD_const && (lhs.lhs_dest == dest_script
+						|| lhs.lhs_dest == dest_global
 						|| lhs.lhs_dest == dest_local))
 		// ":const var": lock the value, but not referenced variables
 		generate_LOCKCONST(cctx);
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -963,9 +963,12 @@ check_for_number(typval_T *tv)
 store_var(char_u *name, typval_T *tv)
 {
     funccal_entry_T entry;
-
+    int		    flags = ASSIGN_DECL;
+
+    if (tv->v_lock)
+	flags |= ASSIGN_CONST;
     save_funccal(&entry);
-    set_var_const(name, NULL, tv, FALSE, ASSIGN_DECL, 0);
+    set_var_const(name, NULL, tv, FALSE, flags, 0);
     restore_funccal();
 }