patch 8.0.0201: completion of highlight groups includes cleared names

Problem:    When completing a group name for a highlight or syntax command
            cleared groups are included.
Solution:   Skip groups that have been cleared.
diff --git a/src/syntax.c b/src/syntax.c
index aed7ee6..68f01c1 100644
--- a/src/syntax.c
+++ b/src/syntax.c
@@ -22,6 +22,7 @@
 {
     char_u	*sg_name;	/* highlight group name */
     char_u	*sg_name_u;	/* uppercase of sg_name */
+    int		sg_cleared;	/* "hi clear" was used */
 /* for normal terminals */
     int		sg_term;	/* "term=" highlighting attributes */
     char_u	*sg_start;	/* terminal string for start highl */
@@ -7327,6 +7328,7 @@
 #ifdef FEAT_EVAL
 		HL_TABLE()[from_id - 1].sg_scriptID = current_SID;
 #endif
+		HL_TABLE()[from_id - 1].sg_cleared = FALSE;
 		redraw_all_later(SOME_VALID);
 	    }
 	}
@@ -8034,6 +8036,7 @@
 	    error = TRUE;
 	    break;
 	}
+	HL_TABLE()[idx].sg_cleared = FALSE;
 
 	/*
 	 * When highlighting has been given for a group, don't link it.
@@ -8171,6 +8174,8 @@
     static void
 highlight_clear(int idx)
 {
+    HL_TABLE()[idx].sg_cleared = TRUE;
+
     HL_TABLE()[idx].sg_term = 0;
     vim_free(HL_TABLE()[idx].sg_start);
     HL_TABLE()[idx].sg_start = NULL;
@@ -9958,7 +9963,13 @@
 							 && include_link != 0)
 	return (char_u *)"clear";
 #endif
-    if (idx < 0 || idx >= highlight_ga.ga_len)
+    if (idx < 0)
+	return NULL;
+    /* Items are never removed from the table, skip the ones that were cleared.
+     */
+    while (idx < highlight_ga.ga_len && HL_TABLE()[idx].sg_cleared)
+	++idx;
+    if (idx >= highlight_ga.ga_len)
 	return NULL;
     return HL_TABLE()[idx].sg_name;
 }
diff --git a/src/testdir/test_syntax.vim b/src/testdir/test_syntax.vim
index c93f8b7..232da75 100644
--- a/src/testdir/test_syntax.vim
+++ b/src/testdir/test_syntax.vim
@@ -156,6 +156,12 @@
   call feedkeys(":syn sync \<C-A>\<C-B>\"\<CR>", 'tx')
   call assert_equal('"syn sync ccomment clear fromstart linebreaks= linecont lines= match maxlines= minlines= region', @:)
 
+  " Check that clearing "Aap" avoids it showing up before Boolean.
+  hi Aap ctermfg=blue
+  call feedkeys(":syn list \<C-A>\<C-B>\"\<CR>", 'tx')
+  call assert_match('^"syn list Aap Boolean Character ', @:)
+  hi clear Aap
+
   call feedkeys(":syn list \<C-A>\<C-B>\"\<CR>", 'tx')
   call assert_match('^"syn list Boolean Character ', @:)
 
@@ -192,11 +198,11 @@
     call assert_match('conceal off', execute('syntax conceal'))
   endif
 
-  syntax region Tar start=/</ end=/>/
+  syntax region Bar start=/</ end=/>/
   if 0
     syntax region NotTest start=/</ end=/>/ contains=@Spell
   endif
-  call assert_match('Tar', execute('syntax'))
+  call assert_match('Bar', execute('syntax'))
   call assert_notmatch('NotTest', execute('syntax'))
   call assert_notmatch('Spell', execute('syntax'))
 
@@ -206,6 +212,8 @@
     syntax rest
   endif
   call assert_equal(a, execute('hi Foo'))
+  hi clear Bar
+  hi clear Foo
 
   set ft=tags
   syn off
@@ -298,7 +306,9 @@
 
 func Test_invalid_arg()
   call assert_fails('syntax case asdf', 'E390:')
-  call assert_fails('syntax conceal asdf', 'E390:')
+  if has('conceal')
+    call assert_fails('syntax conceal asdf', 'E390:')
+  endif
   call assert_fails('syntax spell asdf', 'E390:')
 endfunc
 
@@ -313,13 +323,15 @@
 
 func Test_syn_clear()
   syntax keyword Foo foo
-  syntax keyword Tar tar
+  syntax keyword Bar tar
   call assert_match('Foo', execute('syntax'))
-  call assert_match('Tar', execute('syntax'))
+  call assert_match('Bar', execute('syntax'))
   syn clear Foo
   call assert_notmatch('Foo', execute('syntax'))
-  call assert_match('Tar', execute('syntax'))
-  syn clear Foo Tar
+  call assert_match('Bar', execute('syntax'))
+  syn clear Foo Bar
   call assert_notmatch('Foo', execute('syntax'))
-  call assert_notmatch('Tar', execute('syntax'))
+  call assert_notmatch('Bar', execute('syntax'))
+  hi clear Foo
+  hi clear Bar
 endfunc
diff --git a/src/version.c b/src/version.c
index 1d7af33..8184b66 100644
--- a/src/version.c
+++ b/src/version.c
@@ -765,6 +765,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    201,
+/**/
     200,
 /**/
     199,