]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.0.1436: cannot compare a typed variable with v:none v9.0.1436
authorBram Moolenaar <Bram@vim.org>
Sat, 1 Apr 2023 21:05:38 +0000 (22:05 +0100)
committerBram Moolenaar <Bram@vim.org>
Sat, 1 Apr 2023 21:05:38 +0000 (22:05 +0100)
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
src/version.c
src/vim9execute.c
src/vim9instr.c

index 0f28ba038ff712b9394a0dfee34d1938e90b017b..2965afac8fa3bd4e600c669e2c21100a1a06853f 100644 (file)
@@ -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
index 547d6a7b7a8b70109f93395fbf719d93ae7d9cc9..23d49367707fc8027fd110916c1d33ec11f08023 100644 (file)
@@ -695,6 +695,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1436,
 /**/
     1435,
 /**/
index 18cebdba8c52542f6eef1cdb6303244aff5e1abf..d558ca0fa23d6b835a60963aab8411b672ff48a9 100644 (file)
@@ -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;
 
index e2cdc3a78a423ea3dd495c03d57bcf0a609c6788..52402c14ec8567c12f7890cf8f65bc93f790c6af 100644 (file)
@@ -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));