patch 8.2.1290: Vim9: cannot replace a global function

Problem:    Vim9: cannot replace a global function.
Solution:   Allow for "!" on a global function. (closes #6524)  Also fix that
            :delfunc on a :def function only made it empty.
diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim
index 3e2ced0..f7d195e 100644
--- a/src/testdir/test_vim9_script.vim
+++ b/src/testdir/test_vim9_script.vim
@@ -468,6 +468,54 @@
       'enddef',
       'DoThat()',
       ], 'E1084:')
+
+  # Check that global :def function can be replaced and deleted
+  let lines =<< trim END
+      vim9script
+      def g:Global(): string
+        return "yes"
+      enddef
+      assert_equal("yes", g:Global())
+      def! g:Global(): string
+        return "no"
+      enddef
+      assert_equal("no", g:Global())
+      delfunc g:Global
+      assert_false(exists('*g:Global'))
+  END
+  CheckScriptSuccess(lines)
+
+  # Check that global function can be replaced by a :def function and deleted
+  lines =<< trim END
+      vim9script
+      func g:Global()
+        return "yes"
+      endfunc
+      assert_equal("yes", g:Global())
+      def! g:Global(): string
+        return "no"
+      enddef
+      assert_equal("no", g:Global())
+      delfunc g:Global
+      assert_false(exists('*g:Global'))
+  END
+  CheckScriptSuccess(lines)
+
+  # Check that global :def function can be replaced by a function and deleted
+  lines =<< trim END
+      vim9script
+      def g:Global(): string
+        return "yes"
+      enddef
+      assert_equal("yes", g:Global())
+      func! g:Global()
+        return "no"
+      endfunc
+      assert_equal("no", g:Global())
+      delfunc g:Global
+      assert_false(exists('*g:Global'))
+  END
+  CheckScriptSuccess(lines)
 enddef
 
 func Test_wrong_type()
diff --git a/src/userfunc.c b/src/userfunc.c
index bf026d8..3e566f3 100644
--- a/src/userfunc.c
+++ b/src/userfunc.c
@@ -1148,6 +1148,8 @@
     func_clear(fp, force);
     if (force || fp->uf_dfunc_idx == 0)
 	func_free(fp, force);
+    else
+	fp->uf_flags |= FC_DEAD;
 }
 
 
@@ -2557,12 +2559,6 @@
     char_u	*heredoc_trimmed = NULL;
     int		vim9script = in_vim9script();
 
-    if (vim9script && eap->forceit)
-    {
-	emsg(_(e_nobang));
-	return NULL;
-    }
-
     /*
      * ":function" without argument: list functions.
      */
@@ -2732,6 +2728,13 @@
     }
     p = skipwhite(p + 1);
 
+    // In Vim9 script only global functions can be redefined.
+    if (vim9script && eap->forceit && !is_global)
+    {
+	emsg(_(e_nobang));
+	goto ret_free;
+    }
+
     ga_init2(&newlines, (int)sizeof(char_u *), 3);
 
     if (!eap->skip && name_arg == NULL)
diff --git a/src/version.c b/src/version.c
index 0bd3cb2..20365a0 100644
--- a/src/version.c
+++ b/src/version.c
@@ -755,6 +755,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1290,
+/**/
     1289,
 /**/
     1288,