summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2023-04-01 22:05:38 +0100
committerBram Moolenaar <Bram@vim.org>2023-04-01 22:05:38 +0100
commit2ed57ac3675624b9d943d7753f48855e5dbebdbb (patch)
tree213eef0fee9ddfb36cc601580333f34842544894
parent38d867f041349e1400c2cce9cac06f59ae6ccbb1 (diff)
patch 9.0.1436: cannot compare a typed variable with v:nonev9.0.1436
Problem: Cannot compare a typed variable with v:none. Solution: Allow for "x is v:none" and "x isnot v:none". (issue #12194)
-rw-r--r--src/testdir/test_vim9_func.vim25
-rw-r--r--src/version.c2
-rw-r--r--src/vim9execute.c10
-rw-r--r--src/vim9instr.c20
4 files changed, 48 insertions, 9 deletions
diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim
index 0f28ba038f..2965afac8f 100644
--- a/src/testdir/test_vim9_func.vim
+++ b/src/testdir/test_vim9_func.vim
@@ -752,6 +752,31 @@ def Test_call_default_args()
v9.CheckScriptSuccess(lines)
enddef
+def Test_using_vnone_default()
+ var lines =<< trim END
+ vim9script
+
+ def F(a: string = v:none)
+ if a isnot v:none
+ var b = a
+ endif
+ enddef
+ F()
+ END
+ v9.CheckScriptSuccess(lines)
+
+ # TODO: this should give an error for using a missing argument
+ # lines =<< trim END
+ # vim9script
+
+ # def F(a: string = v:none)
+ # var b = a
+ # enddef
+ # F()
+ # END
+ # v9.CheckScriptFailure(lines, 'E99:')
+enddef
+
def Test_convert_number_to_float()
var lines =<< trim END
vim9script
diff --git a/src/version.c b/src/version.c
index 547d6a7b7a..23d4936770 100644
--- a/src/version.c
+++ b/src/version.c
@@ -696,6 +696,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1436,
+/**/
1435,
/**/
1434,
diff --git a/src/vim9execute.c b/src/vim9execute.c
index 18cebdba8c..d558ca0fa2 100644
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -3496,7 +3496,15 @@ exec_instructions(ectx_T *ectx)
case ISN_LOAD:
if (GA_GROW_FAILS(&ectx->ec_stack, 1))
goto theend;
- copy_tv(STACK_TV_VAR(iptr->isn_arg.number), STACK_TV_BOT(0));
+ tv = STACK_TV_VAR(iptr->isn_arg.number);
+ if (tv->v_type == VAR_UNKNOWN)
+ {
+ // missing argument or default value v:none
+ STACK_TV_BOT(0)->v_type = VAR_SPECIAL;
+ STACK_TV_BOT(0)->vval.v_number = VVAL_NONE;
+ }
+ else
+ copy_tv(tv, STACK_TV_BOT(0));
++ectx->ec_stack.ga_len;
break;
diff --git a/src/vim9instr.c b/src/vim9instr.c
index e2cdc3a78a..52402c14ec 100644
--- a/src/vim9instr.c
+++ b/src/vim9instr.c
@@ -413,7 +413,7 @@ generate_two_op(cctx_T *cctx, char_u *op)
*/
static isntype_T
get_compare_isn(
- exprtype_T exprtype,
+ exprtype_T exprtype,
typval_T *tv1,
typval_T *tv2,
type_T *type1,
@@ -485,13 +485,17 @@ get_compare_isn(
return ISN_DROP;
}
if (isntype == ISN_DROP
- || ((exprtype != EXPR_EQUAL && exprtype != EXPR_NEQUAL
- && (vartype1 == VAR_BOOL || vartype1 == VAR_SPECIAL
- || vartype2 == VAR_BOOL || vartype2 == VAR_SPECIAL)))
- || ((exprtype != EXPR_EQUAL && exprtype != EXPR_NEQUAL
- && exprtype != EXPR_IS && exprtype != EXPR_ISNOT
- && (vartype1 == VAR_BLOB || vartype2 == VAR_BLOB
- || vartype1 == VAR_LIST || vartype2 == VAR_LIST))))
+ || (isntype != ISN_COMPARENULL
+ && (((exprtype != EXPR_EQUAL
+ && exprtype != EXPR_NEQUAL
+ && (vartype1 == VAR_BOOL || vartype1 == VAR_SPECIAL
+ || vartype2 == VAR_BOOL || vartype2 == VAR_SPECIAL)))
+ || ((exprtype != EXPR_EQUAL
+ && exprtype != EXPR_NEQUAL
+ && exprtype != EXPR_IS
+ && exprtype != EXPR_ISNOT
+ && (vartype1 == VAR_BLOB || vartype2 == VAR_BLOB
+ || vartype1 == VAR_LIST || vartype2 == VAR_LIST))))))
{
semsg(_(e_cannot_compare_str_with_str),
vartype_name(vartype1), vartype_name(vartype2));