]> granicus.if.org Git - vim/commitdiff
patch 8.2.0764: Vim9: assigning to option not fully tested v8.2.0764
authorBram Moolenaar <Bram@vim.org>
Fri, 15 May 2020 21:36:40 +0000 (23:36 +0200)
committerBram Moolenaar <Bram@vim.org>
Fri, 15 May 2020 21:36:40 +0000 (23:36 +0200)
Problem:    Vim9: assigning to option not fully tested.
Solution:   Add more test cases. Allow using any type for assignment.

src/testdir/test_vim9_script.vim
src/version.c
src/vim9compile.c
src/vim9execute.c

index fd1dbc8c2fcdb625596df80efa21a3bb7f67ecdc..4284aada246a899e2a9c70bad23924a9993bf9d2 100644 (file)
@@ -14,6 +14,8 @@ let s:addToMe = 111
 let g:existing = 'yes'
 let g:inc_counter = 1
 let $SOME_ENV_VAR = 'some'
+let g:alist = [7]
+let g:astring = 'text'
 
 def Test_assignment()
   let bool1: bool = true
@@ -95,7 +97,12 @@ def Test_assignment()
   assert_equal(2, &ts)
   call CheckDefFailure(['&notex += 3'], 'E113:')
   call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
+  call CheckDefFailure(['&ts = [7]'], 'E1013:')
+  call CheckDefExecFailure(['&ts = g:alist'], 'E1029: Expected number but got list')
+  call CheckDefFailure(['&ts = "xx"'], 'E1013:')
+  call CheckDefExecFailure(['&ts = g:astring'], 'E1029: Expected number but got string')
   call CheckDefFailure(['&path += 3'], 'E1013:')
+  call CheckDefExecFailure(['&bs = "asdf"'], 'E474:')
   # test freeing ISN_STOREOPT
   call CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:')
   &ts = 8
index 94db9b888dd99ba6d349ede44f148f8bd7075a09..b361dedf082280741cf0106af195ed27de6b6c2e 100644 (file)
@@ -746,6 +746,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    764,
 /**/
     763,
 /**/
index 4b294df2988a61526a332dc90b858389f799a1c8..416198a0c4066ab4c535284f2caae85e0f659385 100644 (file)
@@ -3490,7 +3490,7 @@ compile_subscript(
            type_T      **typep;
 
            // list index: list[123]
-           // list member: dict[key]
+           // dict member: dict[key]
            // TODO: blob index
            // TODO: more arguments
            // TODO: recognize list or dict at runtime
@@ -4999,8 +4999,8 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
                        goto theend;
                }
            }
-           else if (*p != '=' && check_type(member_type, stacktype, TRUE)
-                                                                      == FAIL)
+           else if (*p != '=' && need_type(stacktype, member_type, -1,
+                                                                cctx) == FAIL)
                goto theend;
        }
     }
index f50f8c6e109d6b6742f61a3b98ae87bea6ceaca1..398c94c42a2f4af6c6d96c7aebd0643ab4a2868a 100644 (file)
@@ -1164,13 +1164,9 @@ call_def_function(
                        if (s == NULL)
                            s = (char_u *)"";
                    }
-                   else if (tv->v_type == VAR_NUMBER)
-                       n = tv->vval.v_number;
                    else
-                   {
-                       emsg(_("E1051: Expected string or number"));
-                       goto failed;
-                   }
+                       // must be VAR_NUMBER, CHECKTYPE makes sure
+                       n = tv->vval.v_number;
                    msg = set_option_value(iptr->isn_arg.storeopt.so_name,
                                        n, s, iptr->isn_arg.storeopt.so_flags);
                    if (msg != NULL)