]> granicus.if.org Git - vim/commitdiff
patch 8.0.0343: b:changedtick can be unlocked v8.0.0343
authorBram Moolenaar <Bram@vim.org>
Mon, 20 Feb 2017 21:35:33 +0000 (22:35 +0100)
committerBram Moolenaar <Bram@vim.org>
Mon, 20 Feb 2017 21:35:33 +0000 (22:35 +0100)
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
src/eval.c
src/testdir/test_changedtick.vim
src/version.c

index bdc4b6388b14b0c17fdbde8f7ddd63d905d27241..30e71345a67bdd06b484e20d812697cbc3600ab8 100644 (file)
@@ -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:
index 0bb18824142e0bee6e0088d8036788db0d93260a..3cd73b6ea3ba45674afa959048c7da0d6944e749 100644 (file)
@@ -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)
index f273f0f76ee2fde8e8879b6af6abac356f8df8b8..9aaba2770be2b2624036f9d8e89e171406972903 100644 (file)
@@ -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
index c1dff6cff771511f615762ccd81d9cfbff40a8e0..5db4b111c3469e5c6fce52f90663eaabc4ea1533 100644 (file)
@@ -764,6 +764,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    343,
 /**/
     342,
 /**/