From: Bram Moolenaar Date: Wed, 27 Jul 2022 11:30:13 +0000 (+0100) Subject: patch 9.0.0090: no error when assigning bool to a string option X-Git-Tag: v9.0.0090 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=28f84e17b068daca2635692d279930dcb7a150d0;p=vim 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 #10766) --- diff --git a/src/evalvars.c b/src/evalvars.c index d4e8d29e8..7e6bf7a92 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 1b4b9da0d..8286713cb 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", "" 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 index c64672d82..ca150b6bb 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 024359585..b8e2ca7e3 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 74fb0e15e..2becd39a3 100644 --- a/src/version.c +++ b/src/version.c @@ -735,6 +735,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 90, /**/ 89, /**/