updated for version 7.0071
diff --git a/src/eval.c b/src/eval.c
index edcb2fa..b33412e 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -12061,6 +12061,7 @@
     char_u	*pat, *pat2, *pat3;
     pos_T	pos;
     pos_T	firstpos;
+    pos_T	foundpos;
     pos_T	save_cursor;
     pos_T	save_pos;
     int		save_p_ws = p_ws;
@@ -12114,6 +12115,7 @@
     save_cursor = curwin->w_cursor;
     pos = curwin->w_cursor;
     firstpos.lnum = 0;
+    foundpos.lnum = 0;
     pat = pat3;
     for (;;)
     {
@@ -12125,6 +12127,17 @@
 
 	if (firstpos.lnum == 0)
 	    firstpos = pos;
+	if (equalpos(pos, foundpos))
+	{
+	    /* Found the same position again.  Can happen with a pattern that
+	     * has "\zs" at the end and searching backwards.  Advance one
+	     * character and try again. */
+	    if (dir == BACKWARD)
+		decl(&pos);
+	    else
+		incl(&pos);
+	}
+	foundpos = pos;
 
 	/* If the skip pattern matches, ignore this match. */
 	if (*skip != NUL)