changeset 10908:6b6abffbdf59 v8.0.0343

patch 8.0.0343: b:changedtick can be unlocked commit https://github.com/vim/vim/commit/e7877fe0de1426f8de9ada825e4f7b64810c7dbc Author: Bram Moolenaar <Bram@vim.org> Date: Mon Feb 20 22:35:33 2017 +0100 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)
author Christian Brabandt <cb@256bit.org>
date Mon, 20 Feb 2017 22:45:05 +0100
parents 7b96d04312c2
children e155b0b3d532
files runtime/doc/eval.txt src/eval.c src/testdir/test_changedtick.vim src/version.c
diffstat 4 files changed, 24 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -9082,9 +9082,12 @@ 7. Commands						*expression-commands*
 				: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:
--- 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)
--- 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
--- a/src/version.c
+++ b/src/version.c
@@ -765,6 +765,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    343,
+/**/
     342,
 /**/
     341,