changeset 21733:1bb5adfe5966 v8.2.1416

patch 8.2.1416: Vim9: boolean evaluation does not work as intended Commit: https://github.com/vim/vim/commit/3e06a1e2a8c0854c881574f33363e00264db1f1d Author: Bram Moolenaar <Bram@vim.org> 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)
author Bram Moolenaar <Bram@vim.org>
date Mon, 10 Aug 2020 22:00:05 +0200
parents f0845166f35b
children 985c234ddd18
files src/eval.c src/testdir/test_vim9_expr.vim src/testdir/vim9.vim src/version.c
diffstat 4 files changed, 45 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- 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);
--- 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()
--- 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')
--- 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,