patch 8.0.0345: islocked('d.changedtick') does not work

Problem:    islocked('d.changedtick') does not work.
Solution:   Make it work.
diff --git a/src/buffer.c b/src/buffer.c
index 328c2b3..b394d8e 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -884,7 +884,7 @@
 
     if (di != NULL)
     {
-	di->di_flags |= DI_FLAGS_LOCK | DI_FLAGS_FIX | DI_FLAGS_RO;
+	di->di_flags |= DI_FLAGS_FIX | DI_FLAGS_RO;
 	di->di_tv.v_type = VAR_NUMBER;
 	di->di_tv.v_lock = VAR_FIXED;
 	di->di_tv.vval.v_number = 0;
diff --git a/src/eval.c b/src/eval.c
index b835af8..c4154d0 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -1811,6 +1811,7 @@
  *
  * flags:
  *  GLV_QUIET:       do not give error messages
+ *  GLV_READ_ONLY:   will not change the variable
  *  GLV_NO_AUTOLOAD: do not use script autoloading
  *
  * Returns a pointer to just after the name, including indexes.
@@ -2078,7 +2079,8 @@
 		break;
 	    }
 	    /* existing variable, need to check if it can be changed */
-	    else if (var_check_ro(lp->ll_di->di_flags, name, FALSE))
+	    else if ((flags & GLV_READ_ONLY) == 0
+			     && var_check_ro(lp->ll_di->di_flags, name, FALSE))
 	    {
 		clear_tv(&var1);
 		return NULL;
diff --git a/src/evalfunc.c b/src/evalfunc.c
index 55900bd..1307d12 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -6561,7 +6561,7 @@
 
     rettv->vval.v_number = -1;
     end = get_lval(get_tv_string(&argvars[0]), NULL, &lv, FALSE, FALSE,
-					GLV_NO_AUTOLOAD, FNE_CHECK_START);
+			     GLV_NO_AUTOLOAD | GLV_READ_ONLY, FNE_CHECK_START);
     if (end != NULL && lv.ll_name != NULL)
     {
 	if (*end != NUL)
diff --git a/src/testdir/test_changedtick.vim b/src/testdir/test_changedtick.vim
index 9aaba27..3a91bb5 100644
--- a/src/testdir/test_changedtick.vim
+++ b/src/testdir/test_changedtick.vim
@@ -32,6 +32,12 @@
   call assert_equal(v + 1, getbufvar(bnr, 'changedtick'))
 endfunc
 
+func Test_changedtick_islocked()
+  call assert_equal(0, islocked('b:changedtick'))
+  let d = b:
+  call assert_equal(0, islocked('d.changedtick'))
+endfunc
+
 func Test_changedtick_fixed()
   call assert_fails('let b:changedtick = 4', 'E46:')
   call assert_fails('let b:["changedtick"] = 4', 'E46:')
diff --git a/src/version.c b/src/version.c
index 7214854..2b08df5 100644
--- a/src/version.c
+++ b/src/version.c
@@ -765,6 +765,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    345,
+/**/
     344,
 /**/
     343,
diff --git a/src/vim.h b/src/vim.h
index f3e87fe..8636c56 100644
--- a/src/vim.h
+++ b/src/vim.h
@@ -2474,10 +2474,12 @@
 #define TFN_QUIET	2	/* no error messages */
 #define TFN_NO_AUTOLOAD	4	/* do not use script autoloading */
 #define TFN_NO_DEREF	8	/* do not dereference a Funcref */
+#define TFN_READ_ONLY	16	/* will not change the var */
 
 /* Values for get_lval() flags argument: */
 #define GLV_QUIET	TFN_QUIET	/* no error messages */
 #define GLV_NO_AUTOLOAD	TFN_NO_AUTOLOAD	/* do not use script autoloading */
+#define GLV_READ_ONLY	TFN_READ_ONLY	/* will not change the var */
 
 #define DO_NOT_FREE_CNT 99999	/* refcount for dict or list that should not
 				   be freed. */