]> granicus.if.org Git - vim/commitdiff
patch 8.2.1851: Vim9: "!" followed by space incorrectly used v8.2.1851
authorBram Moolenaar <Bram@vim.org>
Thu, 15 Oct 2020 19:54:56 +0000 (21:54 +0200)
committerBram Moolenaar <Bram@vim.org>
Thu, 15 Oct 2020 19:54:56 +0000 (21:54 +0200)
Problem:    Vim9: "!" followed by space incorrectly used.
Solution:   Skip over trailing spaces. (closes #7131)

src/eval.c
src/testdir/test_vim9_expr.vim
src/version.c
src/vim9compile.c

index 58d98e56c474a726540f9a87bece72212ec1932a..9ef3128638b7da8dfbb42f0534b1706bb1e8019c 100644 (file)
@@ -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);
index b279df23d6b4feeffbe98bf20253acda5dfd185a..950c38ceb01185786bfa0dac2e71c768a34d3d69 100644 (file)
@@ -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()
index a2d8221ca3e31948966e243c54e282bcd9472eea..934b82215c55b268ab27faa4acb8763de879ed03 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1851,
 /**/
     1850,
 /**/
index 0f29ceb0a66d37b06fdc5554aa796e4f9a260a38..74156249e1ce3f0ebe15d03ef0443ba996b33693 100644 (file)
@@ -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;