vim-patch:8.2.1471: :const only locks the variable, not the value (#12765)

Problem:    :const only locks the variable, not the value.
Solution:   Lock the value as ":lockvar 1 var" would do. (closes vim/vim#6719)
241572794f
This commit is contained in:
Jan Edmund Lazo
2020-08-16 20:13:52 -04:00
committed by GitHub
parent 83f5bf435d
commit 161cdba1e3
2 changed files with 9 additions and 5 deletions

View File

@@ -9045,7 +9045,7 @@ static void set_var_const(const char *name, const size_t name_len,
} }
if (is_const) { if (is_const) {
v->di_tv.v_lock |= VAR_LOCKED; tv_item_lock(&v->di_tv, 1, true);
} }
} }

View File

@@ -36,6 +36,7 @@ func Test_define_var_with_lock()
call assert_fails('let s = "vim"', 'E741:') call assert_fails('let s = "vim"', 'E741:')
call assert_fails('let F = funcref("s:noop")', 'E741:') call assert_fails('let F = funcref("s:noop")', 'E741:')
call assert_fails('let l = [1, 2, 3]', 'E741:') call assert_fails('let l = [1, 2, 3]', 'E741:')
call assert_fails('call filter(l, "v:val % 2 == 0")', 'E741:')
call assert_fails('let d = {"foo": 10}', 'E741:') call assert_fails('let d = {"foo": 10}', 'E741:')
if has('channel') if has('channel')
call assert_fails('let j = test_null_job()', 'E741:') call assert_fails('let j = test_null_job()', 'E741:')
@@ -247,11 +248,14 @@ func Test_lock_depth_is_1()
const l = [1, 2, 3] const l = [1, 2, 3]
const d = {'foo': 10} const d = {'foo': 10}
" Modify list " Modify list - setting item is OK, adding/removing items not
call add(l, 4)
let l[0] = 42 let l[0] = 42
call assert_fails('call add(l, 4)', 'E741:')
call assert_fails('unlet l[1]', 'E741:')
" Modify dict " Modify dict - changing item is OK, adding/removing items not
let d['bar'] = 'hello' let d['foo'] = 'hello'
let d.foo = 44 let d.foo = 44
call assert_fails("let d['bar'] = 'hello'", 'E741:')
call assert_fails("unlet d['foo']", 'E741:')
endfunc endfunc