diff options
author | Bram Moolenaar <Bram@vim.org> | 2021-04-01 19:42:48 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2021-04-01 19:42:48 +0200 |
commit | d877a5700fe9d5b92562514924549316382384aa (patch) | |
tree | c7303173244d6eebffec7a7535fc9d2f97ce305c | |
parent | ce0b75711afb3ff260967a0843bca46ec09604b5 (diff) |
patch 8.2.2687: Vim9: cannot use "const" for global variable in :def functionv8.2.2687
Problem: Vim9: cannot use "const" for global variable in :def function.
Solution: Do allow using :const for a global variable. (closes #8030)
-rw-r--r-- | src/testdir/test_vim9_assign.vim | 18 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9compile.c | 4 | ||||
-rw-r--r-- | src/vim9execute.c | 5 |
4 files changed, 27 insertions, 2 deletions
diff --git a/src/testdir/test_vim9_assign.vim b/src/testdir/test_vim9_assign.vim index 05e65e1ecf..41ec7c7bec 100644 --- 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' diff --git a/src/version.c b/src/version.c index 68949e0e3c..0fb8bc3523 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 */ /**/ + 2687, +/**/ 2686, /**/ 2685, diff --git a/src/vim9compile.c b/src/vim9compile.c index fa73de23da..ca1c89cc15 100644 --- 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 *eap, cmdidx_T cmdidx, cctx_T *cctx) 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); diff --git a/src/vim9execute.c b/src/vim9execute.c index f15b93d867..9b7f87b6c1 100644 --- 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(); } |