patch 8.0.0522: Win32: when 'clipboard' is "unnamed" yyp does not work

Problem:    MS-Windows: when 'clipboard' is "unnamed" yyp does not work in a
            :global command.
Solution:   When setting the clipboard was postponed, do not clear the
            register.
diff --git a/src/Makefile b/src/Makefile
index e8314ea..82da653 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -2145,6 +2145,7 @@
 	test_ga \
 	test_gf \
 	test_glob2regpat \
+	test_global \
 	test_gn \
 	test_goto \
 	test_gui \
diff --git a/src/globals.h b/src/globals.h
index 59193e0..28b71ac 100644
--- a/src/globals.h
+++ b/src/globals.h
@@ -532,7 +532,6 @@
 EXTERN int	clip_autoselectml INIT(= FALSE);
 EXTERN int	clip_html INIT(= FALSE);
 EXTERN regprog_T *clip_exclude_prog INIT(= NULL);
-EXTERN int	clip_did_set_selection INIT(= TRUE);
 EXTERN int	clip_unnamed_saved INIT(= 0);
 #endif
 
diff --git a/src/ops.c b/src/ops.c
index 9cff1bc..7cbc0c2 100644
--- a/src/ops.c
+++ b/src/ops.c
@@ -6466,7 +6466,7 @@
 	VIsual = old_visual;
 	VIsual_mode = old_visual_mode;
     }
-    else
+    else if (!is_clipboard_needs_update())
     {
 	clip_free_selection(cbd);
 
diff --git a/src/proto/ui.pro b/src/proto/ui.pro
index dbb7213..47c0fef 100644
--- a/src/proto/ui.pro
+++ b/src/proto/ui.pro
@@ -16,6 +16,7 @@
 void clip_own_selection(VimClipboard *cbd);
 void clip_lose_selection(VimClipboard *cbd);
 void start_global_changes(void);
+int is_clipboard_needs_update(void);
 void end_global_changes(void);
 void clip_auto_select(void);
 int clip_isautosel_star(void);
diff --git a/src/testdir/test_alot.vim b/src/testdir/test_alot.vim
index 7b31575..56a3f8e 100644
--- a/src/testdir/test_alot.vim
+++ b/src/testdir/test_alot.vim
@@ -21,8 +21,9 @@
 source test_float_func.vim
 source test_fnamemodify.vim
 source test_functions.vim
-source test_glob2regpat.vim
 source test_ga.vim
+source test_glob2regpat.vim
+source test_global.vim
 source test_goto.vim
 source test_help_tagjump.vim
 source test_join.vim
diff --git a/src/testdir/test_global.vim b/src/testdir/test_global.vim
new file mode 100644
index 0000000..be8aa69
--- /dev/null
+++ b/src/testdir/test_global.vim
@@ -0,0 +1,11 @@
+
+func Test_yank_put_clipboard()
+  new
+  call setline(1, ['a', 'b', 'c'])
+  set clipboard=unnamed
+  g/^/normal yyp
+  call assert_equal(['a', 'a', 'b', 'b', 'c', 'c'], getline(1, 6))
+
+  set clipboard&
+  bwipe!
+endfunc
diff --git a/src/ui.c b/src/ui.c
index 0bd2edc..8691ab7 100644
--- a/src/ui.c
+++ b/src/ui.c
@@ -392,8 +392,6 @@
 
 #if defined(FEAT_CLIPBOARD) || defined(PROTO)
 
-static void clip_copy_selection(VimClipboard *clip);
-
 /*
  * Selection stuff using Visual mode, for cutting and pasting text to other
  * windows.
@@ -569,7 +567,8 @@
  * considerably.
  */
 static int global_change_count = 0; /* if set, inside a start_global_changes */
-static int clipboard_needs_update; /* clipboard needs to be updated */
+static int clipboard_needs_update = FALSE; /* clipboard needs to be updated */
+static int clip_did_set_selection = TRUE;
 
 /*
  * Save clip_unnamed and reset it.
@@ -590,6 +589,16 @@
 }
 
 /*
+ * Return TRUE if setting the clipboard was postponed, it already contains the
+ * right text.
+ */
+    int
+is_clipboard_needs_update()
+{
+    return clipboard_needs_update;
+}
+
+/*
  * Restore clip_unnamed and set the selection when needed.
  */
     void
@@ -619,6 +628,7 @@
 	    }
 	}
     }
+    clipboard_needs_update = FALSE;
 }
 
 /*
diff --git a/src/version.c b/src/version.c
index 539052b..90ec27b 100644
--- a/src/version.c
+++ b/src/version.c
@@ -765,6 +765,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    522,
+/**/
     521,
 /**/
     520,