changeset 22274:1634ca41e4d3 v8.2.1686

patch 8.2.1686: Vim9: "const!" not sufficiently tested Commit: https://github.com/vim/vim/commit/71abe4828974af495602ffaff63cf643a16de84b Author: Bram Moolenaar <Bram@vim.org> Date: Mon Sep 14 22:28:30 2020 +0200 patch 8.2.1686: Vim9: "const!" not sufficiently tested Problem: Vim9: "const!" not sufficiently tested. Solution: Add a few more test cases. Fix type checking.
author Bram Moolenaar <Bram@vim.org>
date Mon, 14 Sep 2020 22:30:03 +0200
parents 51375bedaefe
children 216928dbf078
files src/testdir/test_vim9_script.vim src/version.c src/vim9compile.c
diffstat 3 files changed, 23 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_vim9_script.vim
+++ b/src/testdir/test_vim9_script.vim
@@ -831,6 +831,24 @@ def Test_const()
     list->assert_equal([4, 2, 3])
     const! other = [5, 6, 7]
     other->assert_equal([5, 6, 7])
+
+    let varlist = [7, 8]
+    const! constlist = [1, varlist, 3]
+    varlist[0] = 77
+    # TODO: does not work yet
+    # constlist[1][1] = 88
+    let cl = constlist[1]
+    cl[1] = 88
+    constlist->assert_equal([1, [77, 88], 3])
+
+    let vardict = #{five: 5, six: 6}
+    const! constdict = #{one: 1, two: vardict, three: 3}
+    vardict['five'] = 55
+    # TODO: does not work yet
+    # constdict['two']['six'] = 66
+    let cd = constdict['two']
+    cd['six'] = 66
+    constdict->assert_equal(#{one: 1, two: #{five: 55, six: 66}, three: 3})
   END
   CheckDefAndScriptSuccess(lines)
 enddef
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1686,
+/**/
     1685,
 /**/
     1684,
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -5066,12 +5066,13 @@ compile_assignment(char_u *arg, exarg_T 
 		    {
 			type_T *use_type = lvar->lv_type;
 
-			// without operator type is here, otherwise below
+			// without operator check type here, otherwise below
 			if (has_index)
 			{
 			    use_type = use_type->tt_member;
 			    if (use_type == NULL)
-				use_type = &t_void;
+				// could be indexing "any"
+				use_type = &t_any;
 			}
 			if (need_type(stacktype, use_type, -1, cctx, FALSE)
 								       == FAIL)