0
0
mirror of https://github.com/vim/vim.git synced 2025-09-25 03:54:15 -04:00

patch 8.2.1412: Vim: not operator does not result in boolean

Problem:    Vim: not operator does not result in boolean.
Solution:   Make type depend on operator. (issue 6678)  Fix using "false" and
            "true" in Vim9 script.
This commit is contained in:
Bram Moolenaar
2020-08-09 22:17:55 +02:00
parent a9a47d157a
commit 6e4cfffe80
3 changed files with 33 additions and 1 deletions

View File

@@ -3222,12 +3222,14 @@ eval7(
{ {
rettv->v_type = VAR_BOOL; rettv->v_type = VAR_BOOL;
rettv->vval.v_number = VVAL_TRUE; rettv->vval.v_number = VVAL_TRUE;
ret = OK;
} }
else if (len == 5 && in_vim9script() else if (len == 5 && in_vim9script()
&& STRNCMP(s, "false", 4) == 0) && STRNCMP(s, "false", 4) == 0)
{ {
rettv->v_type = VAR_BOOL; rettv->v_type = VAR_BOOL;
rettv->vval.v_number = VVAL_FALSE; rettv->vval.v_number = VVAL_FALSE;
ret = OK;
} }
else else
ret = eval_variable(s, len, rettv, NULL, TRUE, FALSE); ret = eval_variable(s, len, rettv, NULL, TRUE, FALSE);
@@ -3271,6 +3273,7 @@ eval7_leader(
int ret = OK; int ret = OK;
int error = FALSE; int error = FALSE;
varnumber_T val = 0; varnumber_T val = 0;
vartype_T type = rettv->v_type;
#ifdef FEAT_FLOAT #ifdef FEAT_FLOAT
float_T f = 0.0; float_T f = 0.0;
@@ -3301,7 +3304,10 @@ eval7_leader(
f = !f; f = !f;
else else
#endif #endif
{
val = !val; val = !val;
type = VAR_BOOL;
}
} }
else if (*end_leader == '-') else if (*end_leader == '-')
{ {
@@ -3310,7 +3316,10 @@ eval7_leader(
f = -f; f = -f;
else else
#endif #endif
{
val = -val; val = -val;
type = VAR_NUMBER;
}
} }
} }
#ifdef FEAT_FLOAT #ifdef FEAT_FLOAT
@@ -3323,6 +3332,9 @@ eval7_leader(
#endif #endif
{ {
clear_tv(rettv); clear_tv(rettv);
if (in_vim9script())
rettv->v_type = type;
else
rettv->v_type = VAR_NUMBER; rettv->v_type = VAR_NUMBER;
rettv->vval.v_number = val; rettv->vval.v_number = val;
} }

View File

@@ -1313,6 +1313,16 @@ def Test_expr7_special()
assert_equal(g:special_false, false) assert_equal(g:special_false, false)
assert_equal(g:special_true, v:true) assert_equal(g:special_true, v:true)
assert_equal(g:special_false, v:false) assert_equal(g:special_false, v:false)
assert_equal(true, !false)
assert_equal(false, !true)
assert_equal(true, !0)
assert_equal(false, !1)
assert_equal(false, !!false)
assert_equal(true, !!true)
assert_equal(false, !!0)
assert_equal(true, !!1)
assert_equal(g:special_null, v:null) assert_equal(g:special_null, v:null)
assert_equal(g:special_none, v:none) assert_equal(g:special_none, v:none)
@@ -1332,6 +1342,14 @@ def Test_expr7_special_vim9script()
assert_equal(true, t) assert_equal(true, t)
assert_equal(v:false, false) assert_equal(v:false, false)
assert_equal(false, f) assert_equal(false, f)
assert_equal(true, !false)
assert_equal(false, !true)
assert_equal(true, !0)
assert_equal(false, !1)
assert_equal(false, !!false)
assert_equal(true, !!true)
assert_equal(false, !!0)
assert_equal(true, !!1)
END END
CheckScriptSuccess(lines) CheckScriptSuccess(lines)
enddef enddef

View File

@@ -754,6 +754,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1412,
/**/ /**/
1411, 1411,
/**/ /**/