summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2022-07-27 12:30:13 +0100
committerBram Moolenaar <Bram@vim.org>2022-07-27 12:30:13 +0100
commit28f84e17b068daca2635692d279930dcb7a150d0 (patch)
tree1913ed36abd15b672ebcff947234b0b75f565084
parent7db3a8e3298bf7c7c3f74cc9c1add04f29e78d2d (diff)
patch 9.0.0090: no error when assigning bool to a string optionv9.0.0090
Problem: No error when assigning bool to a string option with setwinvar(). Solution: Give an error (closes #10766)
-rw-r--r--src/evalvars.c5
-rw-r--r--src/option.c14
-rw-r--r--src/proto/option.pro1
-rw-r--r--src/testdir/test_vim9_builtin.vim1
-rw-r--r--src/version.c2
5 files changed, 23 insertions, 0 deletions
diff --git a/src/evalvars.c b/src/evalvars.c
index d4e8d29e8a..7e6bf7a92e 100644
--- a/src/evalvars.c
+++ b/src/evalvars.c
@@ -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"
}
diff --git a/src/option.c b/src/option.c
index 1b4b9da0d3..8286713cba 100644
--- a/src/option.c
+++ b/src/option.c
@@ -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".
diff --git a/src/proto/option.pro b/src/proto/option.pro
index c64672d823..ca150b6bb5 100644
--- a/src/proto/option.pro
+++ b/src/proto/option.pro
@@ -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);
diff --git a/src/testdir/test_vim9_builtin.vim b/src/testdir/test_vim9_builtin.vim
index 0243595853..b8e2ca7e38 100644
--- a/src/testdir/test_vim9_builtin.vim
+++ b/src/testdir/test_vim9_builtin.vim
@@ -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()
diff --git a/src/version.c b/src/version.c
index 74fb0e15e0..2becd39a31 100644
--- a/src/version.c
+++ b/src/version.c
@@ -736,6 +736,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 90,
+/**/
89,
/**/
88,