]> granicus.if.org Git - vim/commitdiff
patch 8.2.1412: Vim: not operator does not result in boolean v8.2.1412
authorBram Moolenaar <Bram@vim.org>
Sun, 9 Aug 2020 20:17:55 +0000 (22:17 +0200)
committerBram Moolenaar <Bram@vim.org>
Sun, 9 Aug 2020 20:17:55 +0000 (22:17 +0200)
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.

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

index b1fad1dcd5e32e07168cebcef83be69d58cf3ea7..abdf076d2649880945d7a8b9841ca1300cf327a1 100644 (file)
@@ -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;
        }
     }
index 0af5402cc280f4f65dc4c07e407ed0941b716481..aa599731893bcd8879a00384ebbf3f0069a9028e 100644 (file)
@@ -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
index 64eca6bfabaea9e6408f94b0e35b75467671bf0b..4d86275a8dcab641ab0de7a726decceede51e558 100644 (file)
@@ -754,6 +754,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1412,
 /**/
     1411,
 /**/