]> granicus.if.org Git - vim/commitdiff
patch 8.2.2567: Vim9: no error if variable is defined for existing function v8.2.2567
authorBram Moolenaar <Bram@vim.org>
Thu, 4 Mar 2021 11:38:21 +0000 (12:38 +0100)
committerBram Moolenaar <Bram@vim.org>
Thu, 4 Mar 2021 11:38:21 +0000 (12:38 +0100)
Problem:    Vim9: no error if variable is defined for existing function.
Solution:   Check if name isn't already in use. (closes #7897)

src/evalvars.c
src/testdir/test_vim9_script.vim
src/version.c

index d95118b33990cc5c5f50b62050d645870416a1a4..22d39a72f650cd91486791b4754ced8b28e81593 100644 (file)
@@ -909,7 +909,7 @@ ex_let(exarg_T *eap)
 }
 
 /*
- * Assign the typevalue "tv" to the variable or variables at "arg_start".
+ * Assign the typeval "tv" to the variable or variables at "arg_start".
  * Handles both "var" with any type and "[var, var; var]" with a list type.
  * When "op" is not NULL it points to a string with characters that
  * must appear after the variable(s).  Use "+", "-" or "." for add, subtract
@@ -3179,6 +3179,7 @@ set_var_const(
 
     if (di != NULL)
     {
+       // Item already exists.  Allowed to replace when reloading.
        if ((di->di_flags & DI_FLAGS_RELOAD) == 0)
        {
            if (flags & (ASSIGN_CONST | ASSIGN_FINAL))
@@ -3269,6 +3270,14 @@ set_var_const(
     }
     else
     {
+       // Item not found, check if a function already exists.
+       if (is_script_local && (flags & (ASSIGN_NO_DECL | ASSIGN_DECL)) == 0
+                         && lookup_scriptitem(name, STRLEN(name), NULL) == OK)
+       {
+           semsg(_(e_redefining_script_item_str), name);
+           goto failed;
+       }
+
        // add a new variable
        if (vim9script && is_script_local && (flags & ASSIGN_NO_DECL))
        {
index 5d1e4015ada0ddf5926f05db7e647f38ac6ce9eb..2743668ee5f3b5619092fe73085f367a101c8d84 100644 (file)
@@ -1515,6 +1515,17 @@ def Test_script_reload_change_type()
   delete('Xreload.vim')
 enddef
 
+def Test_script_var_shadows_function()
+  var lines =<< trim END
+      vim9script
+      def Func(): number
+        return 123
+      enddef
+      var Func = 1
+  END
+  CheckScriptFailure(lines, 'E1041:', 5)
+enddef
+
 def s:RetSome(): string
   return 'some'
 enddef
index c6913d6aed1c2746baa0cc09008b8f27e99d51c7..879931da51cc26755ecd16aa960b6828ca0faf23 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2567,
 /**/
     2566,
 /**/