# HG changeset patch # User Bram Moolenaar # Date 1658922305 -7200 # Node ID 9908c07ccb5674f50e0a8eb775db5076776fd4c8 # Parent 38d79c3d66f01403085f8610eeaa864dc295657d patch 9.0.0090: no error when assigning bool to a string option Commit: https://github.com/vim/vim/commit/28f84e17b068daca2635692d279930dcb7a150d0 Author: Bram Moolenaar Date: Wed Jul 27 12:30:13 2022 +0100 patch 9.0.0090: no error when assigning bool to a string option Problem: No error when assigning bool to a string option with setwinvar(). Solution: Give an error (closes https://github.com/vim/vim/issues/10766) diff --git a/src/evalvars.c b/src/evalvars.c --- a/src/evalvars.c +++ b/src/evalvars.c @@ -4223,6 +4223,11 @@ set_option_from_tv(char_u *varname, typv 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 --- 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", "" or "" 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 --- 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 --- 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 --- 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,