patch 9.0.0176: checking character options is duplicated and incomplete

Problem:    Checking character options is duplicated and incomplete.
Solution:   Move checking to check_chars_options(). (closes #10863)
diff --git a/src/mbyte.c b/src/mbyte.c
index 691c160..941411b 100644
--- a/src/mbyte.c
+++ b/src/mbyte.c
@@ -5645,31 +5645,9 @@
     cw_table = table;
     cw_table_size = l->lv_len;
 
-    // Check that the new value does not conflict with 'fillchars' or
-    // 'listchars'.
-    if (set_chars_option(curwin, &p_fcs, FALSE) != NULL)
-	error = e_conflicts_with_value_of_fillchars;
-    else if (set_chars_option(curwin, &p_lcs, FALSE) != NULL)
-	error = e_conflicts_with_value_of_listchars;
-    else
-    {
-	tabpage_T   *tp;
-	win_T	    *wp;
-
-	FOR_ALL_TAB_WINDOWS(tp, wp)
-	{
-	    if (set_chars_option(wp, &wp->w_p_lcs, FALSE) != NULL)
-	    {
-		error = e_conflicts_with_value_of_listchars;
-		break;
-	    }
-	    if (set_chars_option(wp, &wp->w_p_fcs, FALSE) != NULL)
-	    {
-		error = e_conflicts_with_value_of_fillchars;
-		break;
-	    }
-	}
-    }
+    // Check that the new value does not conflict with 'listchars' or
+    // 'fillchars'.
+    error = check_chars_options();
     if (error != NULL)
     {
 	emsg(_(error));
diff --git a/src/optionstr.c b/src/optionstr.c
index 331207b..7f5a940 100644
--- a/src/optionstr.c
+++ b/src/optionstr.c
@@ -866,24 +866,8 @@
     {
 	if (check_opt_strings(p_ambw, p_ambw_values, FALSE) != OK)
 	    errmsg = e_invalid_argument;
-	else if (set_chars_option(curwin, &p_fcs, FALSE) != NULL)
-	    errmsg = e_conflicts_with_value_of_fillchars;
 	else
-	{
-	    tabpage_T	*tp;
-	    win_T	*wp;
-
-	    FOR_ALL_TAB_WINDOWS(tp, wp)
-	    {
-		if (set_chars_option(wp, &wp->w_p_lcs, FALSE) != NULL)
-		{
-		    errmsg = e_conflicts_with_value_of_listchars;
-		    goto ambw_end;
-		}
-	    }
-	}
-ambw_end:
-	{}
+	    errmsg = check_chars_options();
     }
 
     // 'background'
diff --git a/src/proto/screen.pro b/src/proto/screen.pro
index 66fc0f3..81e5e10 100644
--- a/src/proto/screen.pro
+++ b/src/proto/screen.pro
@@ -56,4 +56,5 @@
 int screen_screencol(void);
 int screen_screenrow(void);
 char *set_chars_option(win_T *wp, char_u **varp, int apply);
+char *check_chars_options(void);
 /* vim: set ft=c : */
diff --git a/src/screen.c b/src/screen.c
index 1f223f9..6929501 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -5155,3 +5155,28 @@
 
     return NULL;	// no error
 }
+
+/*
+ * Check all global and local values of 'listchars' and 'fillchars'.
+ * Return an untranslated error messages if any of them is invalid, NULL
+ * otherwise.
+ */
+    char *
+check_chars_options(void)
+{
+    tabpage_T   *tp;
+    win_T	    *wp;
+
+    if (set_chars_option(curwin, &p_lcs, FALSE) != NULL)
+	return e_conflicts_with_value_of_listchars;
+    if (set_chars_option(curwin, &p_fcs, FALSE) != NULL)
+	return e_conflicts_with_value_of_fillchars;
+    FOR_ALL_TAB_WINDOWS(tp, wp)
+    {
+	if (set_chars_option(wp, &wp->w_p_lcs, FALSE) != NULL)
+	    return e_conflicts_with_value_of_listchars;
+	if (set_chars_option(wp, &wp->w_p_fcs, FALSE) != NULL)
+	    return e_conflicts_with_value_of_fillchars;
+    }
+    return NULL;
+}
diff --git a/src/testdir/test_options.vim b/src/testdir/test_options.vim
index 01418bd..ba08dd7 100644
--- a/src/testdir/test_options.vim
+++ b/src/testdir/test_options.vim
@@ -466,9 +466,17 @@
   call assert_fails('set sessionoptions=curdir,sesdir', 'E474:')
   call assert_fails('set foldmarker={{{,', 'E474:')
   call assert_fails('set sessionoptions=sesdir,curdir', 'E474:')
-  call assert_fails('set listchars=trail:· ambiwidth=double', 'E834:')
+  setlocal listchars=trail:·
+  call assert_fails('set ambiwidth=double', 'E834:')
+  setlocal listchars=trail:-
+  setglobal listchars=trail:·
+  call assert_fails('set ambiwidth=double', 'E834:')
   set listchars&
-  call assert_fails('set fillchars=stl:· ambiwidth=double', 'E835:')
+  setlocal fillchars=stl:·
+  call assert_fails('set ambiwidth=double', 'E835:')
+  setlocal fillchars=stl:-
+  setglobal fillchars=stl:·
+  call assert_fails('set ambiwidth=double', 'E835:')
   set fillchars&
   call assert_fails('set fileencoding=latin1,utf-8', 'E474:')
   set nomodifiable
diff --git a/src/version.c b/src/version.c
index 3944953..0334bf0 100644
--- a/src/version.c
+++ b/src/version.c
@@ -736,6 +736,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    176,
+/**/
     175,
 /**/
     174,