# HG changeset patch # User Bram Moolenaar # Date 1597089605 -7200 # Node ID 1bb5adfe59666ea3763fbd3d077512665eff1e5b # Parent f0845166f35b98c26545b90bfe5bd1ac13c193bb patch 8.2.1416: Vim9: boolean evaluation does not work as intended Commit: https://github.com/vim/vim/commit/3e06a1e2a8c0854c881574f33363e00264db1f1d Author: Bram Moolenaar Date: Mon Aug 10 21:57:54 2020 +0200 patch 8.2.1416: Vim9: boolean evaluation does not work as intended Problem: Vim9: boolean evaluation does not work as intended. Solution: Use tv2bool() in Vim9 script. (closes https://github.com/vim/vim/issues/6681) diff --git a/src/eval.c b/src/eval.c --- a/src/eval.c +++ b/src/eval.c @@ -192,7 +192,10 @@ eval_to_bool( *error = FALSE; if (!skip) { - retval = (tv_get_number_chk(&tv, error) != 0); + if (in_vim9script()) + retval = tv2bool(&tv); + else + retval = (tv_get_number_chk(&tv, error) != 0); clear_tv(&tv); } } @@ -3098,7 +3101,8 @@ eval7( // Apply prefixed "-" and "+" now. Matters especially when // "->" follows. - if (ret == OK && evaluate && end_leader > start_leader) + if (ret == OK && evaluate && end_leader > start_leader + && rettv->v_type != VAR_BLOB) ret = eval7_leader(rettv, TRUE, start_leader, &end_leader); break; @@ -3281,7 +3285,10 @@ eval7_leader( f = rettv->vval.v_float; else #endif - val = tv_get_number_chk(rettv, &error); + 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 --- a/src/testdir/test_vim9_expr.vim +++ b/src/testdir/test_vim9_expr.vim @@ -1750,31 +1750,35 @@ enddef def Test_expr7_not() - assert_equal(true, !'') - assert_equal(true, ![]) - assert_equal(false, !'asdf') - assert_equal(false, ![2]) - assert_equal(true, !!'asdf') - assert_equal(true, !![2]) + let lines =<< trim END + assert_equal(true, !'') + assert_equal(true, ![]) + assert_equal(false, !'asdf') + assert_equal(false, ![2]) + assert_equal(true, !!'asdf') + assert_equal(true, !![2]) - assert_equal(true, !test_null_partial()) - assert_equal(false, !{-> 'yes'}) + assert_equal(true, !test_null_partial()) + assert_equal(false, !{-> 'yes'}) + + assert_equal(true, !test_null_dict()) + assert_equal(true, !{}) + assert_equal(false, !{'yes': 'no'}) - assert_equal(true, !test_null_dict()) - assert_equal(true, !{}) - assert_equal(false, !{'yes': 'no'}) + if has('channel') + assert_equal(true, !test_null_job()) + assert_equal(true, !test_null_channel()) + endif - if has('channel') - assert_equal(true, !test_null_job()) - assert_equal(true, !test_null_channel()) - endif + assert_equal(true, !test_null_blob()) + assert_equal(true, !0z) + assert_equal(false, !0z01) - assert_equal(true, !test_null_blob()) - assert_equal(true, !0z) - assert_equal(false, !0z01) - - assert_equal(true, !test_void()) - assert_equal(true, !test_unknown()) + assert_equal(true, !test_void()) + assert_equal(true, !test_unknown()) + END + CheckDefSuccess(lines) + CheckScriptSuccess(['vim9script'] + lines) enddef func Test_expr7_fails() diff --git a/src/testdir/vim9.vim b/src/testdir/vim9.vim --- a/src/testdir/vim9.vim +++ b/src/testdir/vim9.vim @@ -1,5 +1,13 @@ " Utility functions for testing vim9 script +" Check that "lines" inside ":def" has no error. +func CheckDefSuccess(lines) + call writefile(['def Func()'] + a:lines + ['enddef', 'defcompile'], 'Xdef') + so Xdef + call Func() + call delete('Xdef') +endfunc + " Check that "lines" inside ":def" results in an "error" message. func CheckDefFailure(lines, error) call writefile(['def Func()'] + a:lines + ['enddef', 'defcompile'], 'Xdef') diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -755,6 +755,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1416, +/**/ 1415, /**/ 1414,