From e7877fe0de1426f8de9ada825e4f7b64810c7dbc Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Mon, 20 Feb 2017 22:35:33 +0100 Subject: patch 8.0.0343: b:changedtick can be unlocked Problem: b:changedtick can be unlocked, even though it has no effect. (Nikolai Pavlov) Solution: Add a check and error E940. (closes #1496) --- runtime/doc/eval.txt | 7 +++++-- src/eval.c | 6 ++++++ src/testdir/test_changedtick.vim | 16 +++++++++++----- src/version.c | 2 ++ 4 files changed, 24 insertions(+), 7 deletions(-) diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt index bdc4b6388..30e71345a 100644 --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -9082,9 +9082,12 @@ This does NOT work: > :lockvar v :let v = 'asdf' " fails! :unlet v -< *E741* +< *E741* *E940* If you try to change a locked variable you get an - error message: "E741: Value is locked: {name}" + error message: "E741: Value is locked: {name}". + If you try to lock or unlock a built-in variable you + get an error message: "E940: Cannot lock or unlock + variable {name}". [depth] is relevant when locking a |List| or |Dictionary|. It specifies how deep the locking goes: diff --git a/src/eval.c b/src/eval.c index 0bb188241..3cd73b6ea 100644 --- a/src/eval.c +++ b/src/eval.c @@ -2882,6 +2882,12 @@ do_lock_var( di = find_var(lp->ll_name, NULL, TRUE); if (di == NULL) ret = FAIL; + else if ((di->di_flags & DI_FLAGS_FIX) + && di->di_tv.v_type != VAR_DICT + && di->di_tv.v_type != VAR_LIST) + /* For historic reasons this error is not given for a list or dict. + * E.g., the b: dict could be locked/unlocked. */ + EMSG2(_("E940: Cannot lock or unlock variable %s"), lp->ll_name); else { if (lock) diff --git a/src/testdir/test_changedtick.vim b/src/testdir/test_changedtick.vim index f273f0f76..9aaba2770 100644 --- a/src/testdir/test_changedtick.vim +++ b/src/testdir/test_changedtick.vim @@ -33,13 +33,19 @@ func Test_changedtick_bdel() endfunc func Test_changedtick_fixed() - call assert_fails('let b:changedtick = 4', 'E46') - call assert_fails('let b:["changedtick"] = 4', 'E46') + call assert_fails('let b:changedtick = 4', 'E46:') + call assert_fails('let b:["changedtick"] = 4', 'E46:') - call assert_fails('unlet b:changedtick', 'E795') - call assert_fails('unlet b:["changedtick"]', 'E46') + call assert_fails('lockvar b:changedtick', 'E940:') + call assert_fails('lockvar b:["changedtick"]', 'E46:') + call assert_fails('unlockvar b:changedtick', 'E940:') + call assert_fails('unlockvar b:["changedtick"]', 'E46:') + call assert_fails('unlet b:changedtick', 'E795:') + call assert_fails('unlet b:["changedtick"]', 'E46:') let d = b: - call assert_fails('unlet d["changedtick"]', 'E46') + call assert_fails('lockvar d["changedtick"]', 'E46:') + call assert_fails('unlockvar d["changedtick"]', 'E46:') + call assert_fails('unlet d["changedtick"]', 'E46:') endfunc diff --git a/src/version.c b/src/version.c index c1dff6cff..5db4b111c 100644 --- a/src/version.c +++ b/src/version.c @@ -764,6 +764,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 343, /**/ 342, /**/ -- cgit v1.2.1