diff options
-rw-r--r-- | src/eval.c | 4 | ||||
-rw-r--r-- | src/testdir/test_vim9_expr.vim | 19 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9compile.c | 9 |
4 files changed, 28 insertions, 6 deletions
diff --git a/src/eval.c b/src/eval.c index 58d98e56c..9ef312863 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 b279df23d..950c38ceb 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 a2d8221ca..934b82215 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 0f29ceb0a..74156249e 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; |