From 2ed57ac3675624b9d943d7753f48855e5dbebdbb Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sat, 1 Apr 2023 22:05:38 +0100 Subject: patch 9.0.1436: cannot compare a typed variable with v:none Problem: Cannot compare a typed variable with v:none. Solution: Allow for "x is v:none" and "x isnot v:none". (issue #12194) --- src/testdir/test_vim9_func.vim | 25 +++++++++++++++++++++++++ src/version.c | 2 ++ src/vim9execute.c | 10 +++++++++- src/vim9instr.c | 20 ++++++++++++-------- 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 @@ -695,6 +695,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1436, /**/ 1435, /**/ 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)); -- cgit v1.2.3