changeset 22238:939f7184566f v8.2.1668

patch 8.2.1668: Vim9: not accepting 0 or 1 as bool when type is any Commit: https://github.com/vim/vim/commit/dadaddd59f3b53c41e92dc42219ab006deb14109 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Sep 12 19:11:23 2020 +0200 patch 8.2.1668: Vim9: not accepting 0 or 1 as bool when type is any Problem: Vim9: not accepting 0 or 1 as bool when type is any. Solution: Convert the type with the CHECKTYPE instruction. (closes https://github.com/vim/vim/issues/6913)
author Bram Moolenaar <Bram@vim.org>
date Sat, 12 Sep 2020 19:15:03 +0200
parents 27c33305cb9c
children 3e8d7529c28f
files src/testdir/test_vim9_expr.vim src/version.c src/vim9execute.c
diffstat 3 files changed, 22 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_vim9_expr.vim
+++ b/src/testdir/test_vim9_expr.vim
@@ -2369,6 +2369,9 @@ def Test_expr7_method_call()
 		type: '',
 		module: ''}
 		], getloclist(0))
+
+  let result: bool = get(#{n: 0}, 'n', 0)
+  assert_equal(false, result)
 enddef
 
 func Test_expr7_trailing_fails()
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1668,
+/**/
     1667,
 /**/
     1666,
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -2510,11 +2510,23 @@ call_def_function(
 				|| (tv->v_type == VAR_FUNC
 					       && ct->ct_type == VAR_PARTIAL)))
 		    {
-			SOURCING_LNUM = iptr->isn_lnum;
-			semsg(_(e_expected_str_but_got_str),
-				    vartype_name(ct->ct_type),
-				    vartype_name(tv->v_type));
-			goto on_error;
+			if (tv->v_type == VAR_NUMBER && ct->ct_type == VAR_BOOL
+				&& (tv->vval.v_number == 0
+						    || tv->vval.v_number == 1))
+			{
+			    // number 0 is FALSE, number 1 is TRUE
+			    tv->v_type = VAR_BOOL;
+			    tv->vval.v_number = tv->vval.v_number
+						      ? VVAL_TRUE : VVAL_FALSE;
+			}
+			else
+			{
+			    SOURCING_LNUM = iptr->isn_lnum;
+			    semsg(_(e_expected_str_but_got_str),
+					vartype_name(ct->ct_type),
+					vartype_name(tv->v_type));
+			    goto on_error;
+			}
 		    }
 		}
 		break;