updated for version 7.3.1012
Problem:    \Z does not work properly with the new regexp engine.
Solution:   Make \Z work.  Add tests.
diff --git a/src/regexp_nfa.c b/src/regexp_nfa.c
index 8a90248..02efe0a 100644
--- a/src/regexp_nfa.c
+++ b/src/regexp_nfa.c
@@ -1184,14 +1184,15 @@
 		    EMIT(NFA_CONCAT);
 		}
 		return OK;
-	    }		/* if exists closing ] */
-	    else if (reg_strict)
+	    } /* if exists closing ] */
+
+	    if (reg_strict)
 	    {
 		syntax_error = TRUE;
 		EMSG_RET_FAIL(_(e_missingbracket));
 	    }
+	    /* FALLTHROUGH */
 
-	/* FALLTHROUGH */
 	default:
 	    {
 #ifdef FEAT_MBYTE
@@ -1214,7 +1215,7 @@
 			EMIT(c);
 			if (i > 0)
 			    EMIT(NFA_CONCAT);
-			if (i += utf_char2len(c) >= plen)
+			if ((i += utf_char2len(c)) >= plen)
 			    break;
 			c = utf_ptr2char(old_regparse + i);
 		    }
@@ -2269,7 +2270,7 @@
 	    /* TODO */
 	    if (regflags & RF_ICOMBINE)
 	    {
-		goto normalchar;
+		/* use the base character only */
 	    }
 #endif
 	    /* FALLTHROUGH */
@@ -3145,23 +3146,31 @@
 		result = OK;
 		sta = t->state->out;
 		len = 0;
-		while (sta->c != NFA_END_COMPOSING && len < n)
+		if (ireg_icombine)
 		{
-		    if (len > 0)
-			mc = mb_ptr2char(reginput + len);
-		    if (mc != sta->c)
-			break;
-		    len += mb_char2len(mc);
-		    sta = sta->out;
+		    /* If \Z was present, then ignore composing characters. */
+		    /* TODO: How about negated? */
+		    if (sta->c != c)
+			result = FAIL;
+		    len = n;
+		    while (sta->c != NFA_END_COMPOSING)
+			sta = sta->out;
 		}
+		else
+		    while (sta->c != NFA_END_COMPOSING && len < n)
+		    {
+			if (len > 0)
+			    mc = mb_ptr2char(reginput + len);
+			if (mc != sta->c)
+			    break;
+			len += mb_char2len(mc);
+			sta = sta->out;
+		    }
 
 		/* if input char length doesn't match regexp char length */
 		if (len < n || sta->c != NFA_END_COMPOSING)
 		    result = FAIL;
 		end = t->state->out1;	    /* NFA_END_COMPOSING */
-		/* If \Z was present, then ignore composing characters */
-		if (ireg_icombine)
-		    result = 1 ^ sta->negated;
 		ADD_POS_NEG_STATE(end);
 		break;
 	    }