]> granicus.if.org Git - vim/commitdiff
patch 8.2.1352: Vim9: no error for shadowing a script-local function v8.2.1352
authorBram Moolenaar <Bram@vim.org>
Sat, 1 Aug 2020 21:22:18 +0000 (23:22 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 1 Aug 2020 21:22:18 +0000 (23:22 +0200)
Problem:    Vim9: no error for shadowing a script-local function by a nested
            function.
Solution:   Check for script-local function. (closes #6586)

src/testdir/test_vim9_func.vim
src/version.c
src/vim9compile.c

index 1ccaeb308a1385003578d7ee5b90f7435786b3e1..f3fc4c7bee4d06c0a449e59b23ceeec35865fed6 100644 (file)
@@ -174,6 +174,20 @@ def Test_nested_global_function()
       Outer()
   END
   CheckScriptFailure(lines, "E122:")
+
+  lines =<< trim END
+      vim9script
+      def Func()
+        echo 'script'
+      enddef
+      def Outer()
+        def Func()
+          echo 'inner'
+        enddef
+      enddef
+      defcompile
+  END
+  CheckScriptFailure(lines, "E1073:")
 enddef
 
 def Test_global_local_function()
index f032581c0cdd1e672afa8ffc619a5e8ac5fdb42d..70d90c5764409a528d4fd397368b3a31ddfbe285 100644 (file)
@@ -754,6 +754,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1352,
 /**/
     1351,
 /**/
index 61be54d7b726d919f63898ccfcf91724a720da34..3c7e1218ed553cdf27a1668d7b3464d1895bd3ff 100644 (file)
@@ -291,15 +291,21 @@ lookup_script(char_u *name, size_t len)
     int
 check_defined(char_u *p, size_t len, cctx_T *cctx)
 {
+    int c = p[len];
+
+    p[len] = NUL;
     if (lookup_script(p, len) == OK
            || (cctx != NULL
                && (lookup_local(p, len, cctx) != NULL
                    || lookup_arg(p, len, NULL, NULL, NULL, cctx) == OK))
-           || find_imported(p, len, cctx) != NULL)
+           || find_imported(p, len, cctx) != NULL
+           || find_func_even_dead(p, FALSE, cctx) != NULL)
     {
+       p[len] = c;
        semsg(_(e_already_defined), p);
        return FAIL;
     }
+    p[len] = c;
     return OK;
 }