]> granicus.if.org Git - vim/commitdiff
patch 9.0.0090: no error when assigning bool to a string option v9.0.0090
authorBram Moolenaar <Bram@vim.org>
Wed, 27 Jul 2022 11:30:13 +0000 (12:30 +0100)
committerBram Moolenaar <Bram@vim.org>
Wed, 27 Jul 2022 11:30:13 +0000 (12:30 +0100)
Problem:    No error when assigning bool to a string option with setwinvar().
Solution:   Give an error (closes #10766)

src/evalvars.c
src/option.c
src/proto/option.pro
src/testdir/test_vim9_builtin.vim
src/version.c

index d4e8d29e8a03cba30d58797f20e1caba9b5b0aaf..7e6bf7a92e12bae4d237c631b0bcaf335758fcbb 100644 (file)
@@ -4223,6 +4223,11 @@ set_option_from_tv(char_u *varname, typval_T *varp)
 
     if (varp->v_type == VAR_BOOL)
     {
+       if (is_string_option(varname))
+       {
+           emsg(_(e_string_required));
+           return;
+       }
        numval = (long)varp->vval.v_number;
        strval = (char_u *)"0";  // avoid using "false"
     }
index 1b4b9da0d328877ced11ca8bb5bf6b7aaffda6a0..8286713cba067cbb63e98d2c016da97ff24ac135 100644 (file)
@@ -4478,6 +4478,20 @@ is_option_allocated(char *name)
 }
 #endif
 
+#if defined(FEAT_EVAL) || defined(PROTO)
+/*
+ * Return TRUE if "name" is a string option.
+ * Returns FALSE if option "name" does not exist.
+ */
+    int
+is_string_option(char_u *name)
+{
+    int idx = findoption(name);
+
+    return idx >= 0 && (options[idx].flags & P_STRING);
+}
+#endif
+
 /*
  * Translate a string like "t_xx", "<t_xx>" or "<S-Tab>" to a key number.
  * When "has_lt" is true there is a '<' before "*arg_arg".
index c64672d823feeb2546eeecb1a29cabb7568532d0..ca150b6bb573d79396c199b546d702eda4b0ecc1 100644 (file)
@@ -43,6 +43,7 @@ char_u *get_term_code(char_u *tname);
 char_u *get_highlight_default(void);
 char_u *get_encoding_default(void);
 int is_option_allocated(char *name);
+int is_string_option(char_u *name);
 int makeset(FILE *fd, int opt_flags, int local_only);
 int makefoldset(FILE *fd);
 void clear_termoptions(void);
index 024359585367d649529b666c85ea934370a988e2..b8e2ca7e387dc40d5865b14a1212cdcb3e88d370 100644 (file)
@@ -3719,6 +3719,7 @@ def Test_setwinvar()
   v9.CheckDefAndScriptFailure(['setwinvar("a", "b", 1)'], ['E1013: Argument 1: type mismatch, expected number but got string', 'E1210: Number required for argument 1'])
   v9.CheckDefAndScriptFailure(['setwinvar(1, 2, "c")'], ['E1013: Argument 2: type mismatch, expected string but got number', 'E1174: String required for argument 2'])
   assert_fails('setwinvar(1, "", 10)', 'E461: Illegal variable name')
+  assert_fails('setwinvar(0, "&rulerformat", true)', 'E928:')
 enddef
 
 def Test_sha256()
index 74fb0e15e0cc366ad78fa7b2b14c3e62e6276e56..2becd39a31cf8ff3ed8088809475ad7da83ce55e 100644 (file)
@@ -735,6 +735,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    90,
 /**/
     89,
 /**/