summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-10-15 21:54:56 +0200
committerBram Moolenaar <Bram@vim.org>2020-10-15 21:54:56 +0200
commit27491cd3ef86c10a2b64bcb657f29e1d0fccb183 (patch)
tree2a0f6dd9c839f1f755d33e158fedf4a12de75ce0 /src
parenta604ccc959c3bff88d3d5bc3c965819fc326d239 (diff)
patch 8.2.1851: Vim9: "!" followed by space incorrectly usedv8.2.1851
Problem: Vim9: "!" followed by space incorrectly used. Solution: Skip over trailing spaces. (closes #7131)
Diffstat (limited to 'src')
-rw-r--r--src/eval.c4
-rw-r--r--src/testdir/test_vim9_expr.vim19
-rw-r--r--src/version.c2
-rw-r--r--src/vim9compile.c9
4 files changed, 28 insertions, 6 deletions
diff --git a/src/eval.c b/src/eval.c
index 58d98e56c4..9ef3128638 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -3390,10 +3390,14 @@ eval7_leader(
f = rettv->vval.v_float;
else
#endif
+ {
+ while (VIM_ISWHITE(end_leader[-1]))
+ --end_leader;
if (in_vim9script() && end_leader[-1] == '!')
val = tv2bool(rettv);
else
val = tv_get_number_chk(rettv, &error);
+ }
if (error)
{
clear_tv(rettv);
diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim
index b279df23d6..950c38ceb0 100644
--- a/src/testdir/test_vim9_expr.vim
+++ b/src/testdir/test_vim9_expr.vim
@@ -2292,6 +2292,22 @@ def Test_expr7_not()
assert_equal(true, !!'asdf')
assert_equal(true, !![2])
+ assert_equal(true, ! false)
+ assert_equal(true, !! true)
+ assert_equal(true, ! ! true)
+ assert_equal(true, !!! false)
+ assert_equal(true, ! ! ! false)
+
+ g:true = true
+ g:false = false
+ assert_equal(true, ! g:false)
+ assert_equal(true, !! g:true)
+ assert_equal(true, ! ! g:true)
+ assert_equal(true, !!! g:false)
+ assert_equal(true, ! ! ! g:false)
+ unlet g:true
+ unlet g:false
+
assert_equal(true, !test_null_partial())
assert_equal(false, !{-> 'yes'})
@@ -2314,8 +2330,7 @@ def Test_expr7_not()
assert_equal(false, ![1, 2, 3]->reverse())
assert_equal(true, ![]->reverse())
END
- CheckDefSuccess(lines)
- CheckScriptSuccess(['vim9script'] + lines)
+ CheckDefAndScriptSuccess(lines)
enddef
func Test_expr7_fails()
diff --git a/src/version.c b/src/version.c
index a2d8221ca3..934b82215c 100644
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1851,
+/**/
1850,
/**/
1849,
diff --git a/src/vim9compile.c b/src/vim9compile.c
index 0f29ceb0a6..74156249e1 100644
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -3041,7 +3041,7 @@ apply_leader(typval_T *rettv, int numeric_only, char_u *start, char_u **end)
++p;
break;
}
- else
+ else if (*p == '!')
{
int v = tv2bool(rettv);
@@ -3178,12 +3178,13 @@ compile_leader(cctx_T *cctx, int numeric_only, char_u *start, char_u **end)
}
else
{
- int invert = TRUE;
+ int invert = *p == '!';
- while (p > start && p[-1] == '!')
+ while (p > start && (p[-1] == '!' || VIM_ISWHITE(p[-1])))
{
+ if (p[-1] == '!')
+ invert = !invert;
--p;
- invert = !invert;
}
if (generate_2BOOL(cctx, invert) == FAIL)
return FAIL;