summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-08-09 22:17:55 +0200
committerBram Moolenaar <Bram@vim.org>2020-08-09 22:17:55 +0200
commit6e4cfffe809a894ea831fc8011527714481d2857 (patch)
treed6aa79aef24689b61a9919bbe9c9684ccd8f033a
parenta9a47d157ab1946d1e286c9695bc68d71305af68 (diff)
patch 8.2.1412: Vim: not operator does not result in booleanv8.2.1412
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.
-rw-r--r--src/eval.c14
-rw-r--r--src/testdir/test_vim9_expr.vim18
-rw-r--r--src/version.c2
3 files changed, 33 insertions, 1 deletions
diff --git a/src/eval.c b/src/eval.c
index b1fad1dcd5..abdf076d26 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -3222,12 +3222,14 @@ eval7(
{
rettv->v_type = VAR_BOOL;
rettv->vval.v_number = VVAL_TRUE;
+ ret = OK;
}
else if (len == 5 && in_vim9script()
&& STRNCMP(s, "false", 4) == 0)
{
rettv->v_type = VAR_BOOL;
rettv->vval.v_number = VVAL_FALSE;
+ ret = OK;
}
else
ret = eval_variable(s, len, rettv, NULL, TRUE, FALSE);
@@ -3271,6 +3273,7 @@ eval7_leader(
int ret = OK;
int error = FALSE;
varnumber_T val = 0;
+ vartype_T type = rettv->v_type;
#ifdef FEAT_FLOAT
float_T f = 0.0;
@@ -3301,7 +3304,10 @@ eval7_leader(
f = !f;
else
#endif
+ {
val = !val;
+ type = VAR_BOOL;
+ }
}
else if (*end_leader == '-')
{
@@ -3310,7 +3316,10 @@ eval7_leader(
f = -f;
else
#endif
+ {
val = -val;
+ type = VAR_NUMBER;
+ }
}
}
#ifdef FEAT_FLOAT
@@ -3323,7 +3332,10 @@ eval7_leader(
#endif
{
clear_tv(rettv);
- rettv->v_type = VAR_NUMBER;
+ if (in_vim9script())
+ rettv->v_type = type;
+ else
+ rettv->v_type = VAR_NUMBER;
rettv->vval.v_number = val;
}
}
diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim
index 0af5402cc2..aa59973189 100644
--- a/src/testdir/test_vim9_expr.vim
+++ b/src/testdir/test_vim9_expr.vim
@@ -1313,6 +1313,16 @@ def Test_expr7_special()
assert_equal(g:special_false, false)
assert_equal(g:special_true, v:true)
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_none, v:none)
@@ -1332,6 +1342,14 @@ def Test_expr7_special_vim9script()
assert_equal(true, t)
assert_equal(v:false, false)
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
CheckScriptSuccess(lines)
enddef
diff --git a/src/version.c b/src/version.c
index 64eca6bfab..4d86275a8d 100644
--- a/src/version.c
+++ b/src/version.c
@@ -755,6 +755,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1412,
+/**/
1411,
/**/
1410,