patch 8.2.2295: incsearch does not detect empty pattern properly

Problem:    Incsearch does not detect empty pattern properly.
Solution:   Return magic state when skipping over a pattern. (Christian
            Brabandt, closes #7612, closes #6420)
diff --git a/src/ex_getln.c b/src/ex_getln.c
index 04b10ea..a3e1f49 100644
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -52,6 +52,9 @@
 static int	cmdline_paste(int regname, int literally, int remcr);
 static void	redrawcmdprompt(void);
 static int	ccheck_abbr(int);
+#ifdef FEAT_SEARCH_EXTRA
+static int	empty_pattern_magic(char_u *pat, size_t len, magic_T magic_val);
+#endif
 
 #ifdef FEAT_CMDWIN
 static int	open_cmdwin(void);
@@ -89,15 +92,34 @@
  * as a trailing \|, which can happen while typing a pattern.
  */
     static int
-empty_pattern(char_u *p)
+empty_pattern(char_u *p, int delim)
 {
-    size_t n = STRLEN(p);
+    size_t	n = STRLEN(p);
+    magic_T	magic_val = MAGIC_ON;
 
+    if (n > 0)
+	(void) skip_regexp_ex(p, delim, magic_isset(), NULL, NULL, &magic_val);
+    else
+	return TRUE;
+
+    return empty_pattern_magic(p, n, magic_val);
+}
+
+    static int
+empty_pattern_magic(char_u *p, size_t len, magic_T magic_val)
+{
     // remove trailing \v and the like
-    while (n >= 2 && p[n - 2] == '\\'
-			  && vim_strchr((char_u *)"mMvVcCZ", p[n - 1]) != NULL)
-	n -= 2;
-    return n == 0 || (n >= 2 && p[n - 2] == '\\' && p[n - 1] == '|');
+    while (len >= 2 && p[len - 2] == '\\'
+                        && vim_strchr((char_u *)"mMvVcCZ", p[len - 1]) != NULL)
+       len -= 2;
+
+    // true, if the pattern is empty, or the pattern ends with \| and magic is
+    // set (or it ends with '|' and very magic is set)
+    return len == 0 || (len > 1
+	    && ((p[len - 2] == '\\'
+				 && p[len - 1] == '|' && magic_val == MAGIC_ON)
+		|| (p[len - 2] != '\\'
+			     && p[len - 1] == '|' && magic_val == MAGIC_ALL)));
 }
 
 // Struct to store the viewstate during 'incsearch' highlighting.
@@ -149,7 +171,7 @@
     pos_T	match_end;
     int		did_incsearch;
     int		incsearch_postponed;
-    magic_T	magic_overruled_save;
+    optmagic_T	magic_overruled_save;
 } incsearch_state_T;
 
     static void
@@ -207,6 +229,7 @@
     pos_T	save_cursor;
     int		use_last_pat;
     int		retval = FALSE;
+    magic_T     magic = 0;
 
     *skiplen = 0;
     *patlen = ccline.cmdlen;
@@ -252,9 +275,9 @@
 	    || STRNCMP(cmd, "vglobal", p - cmd) == 0)
     {
 	if (*cmd == 's' && cmd[1] == 'm')
-	    magic_overruled = MAGIC_ON;
+	    magic_overruled = OPTION_MAGIC_ON;
 	else if (*cmd == 's' && cmd[1] == 'n')
-	    magic_overruled = MAGIC_OFF;
+	    magic_overruled = OPTION_MAGIC_OFF;
     }
     else if (STRNCMP(cmd, "sort", MAX(p - cmd, 3)) == 0)
     {
@@ -288,7 +311,7 @@
     p = skipwhite(p);
     delim = (delim_optional && vim_isIDc(*p)) ? ' ' : *p++;
     *search_delim = delim;
-    end = skip_regexp(p, delim, magic_isset());
+    end = skip_regexp_ex(p, delim, magic_isset(), NULL, NULL, &magic);
 
     use_last_pat = end == p && *end == delim;
 
@@ -302,7 +325,7 @@
 	int  empty;
 
 	*end = NUL;
-	empty = empty_pattern(p);
+	empty = empty_pattern_magic(p, STRLEN(p), magic);
 	*end = c;
 	if (empty)
 	    goto theend;
@@ -535,7 +558,8 @@
     {
 	next_char = ccline.cmdbuff[skiplen + patlen];
 	ccline.cmdbuff[skiplen + patlen] = NUL;
-	if (empty_pattern(ccline.cmdbuff) && !no_hlsearch)
+	if (empty_pattern(ccline.cmdbuff + skiplen, search_delim)
+							       && !no_hlsearch)
 	{
 	    redraw_all_later(SOME_VALID);
 	    set_no_hlsearch(TRUE);