From: Bram Moolenaar Date: Sun, 9 Aug 2020 20:17:55 +0000 (+0200) Subject: patch 8.2.1412: Vim: not operator does not result in boolean X-Git-Tag: v8.2.1412 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6e4cfffe809a894ea831fc8011527714481d2857;p=vim patch 8.2.1412: Vim: not operator does not result in boolean 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. --- diff --git a/src/eval.c b/src/eval.c index b1fad1dcd..abdf076d2 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 0af5402cc..aa5997318 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 64eca6bfa..4d86275a8 100644 --- a/src/version.c +++ b/src/version.c @@ -754,6 +754,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1412, /**/ 1411, /**/