diff options
author | Bram Moolenaar <Bram@vim.org> | 2023-04-01 22:05:38 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2023-04-01 22:05:38 +0100 |
commit | 2ed57ac3675624b9d943d7753f48855e5dbebdbb (patch) | |
tree | 213eef0fee9ddfb36cc601580333f34842544894 | |
parent | 38d867f041349e1400c2cce9cac06f59ae6ccbb1 (diff) | |
download | vim-git-2ed57ac3675624b9d943d7753f48855e5dbebdbb.tar.gz |
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.vim | 25 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9execute.c | 10 | ||||
-rw-r--r-- | 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 0f28ba038..2965afac8 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 547d6a7b7..23d493677 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 18cebdba8..d558ca0fa 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 e2cdc3a78..52402c14e 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)); |