patch 7.4.1940
Problem: "gd" hangs in some situations. (Eric Biggers)
Solution: Remove the SEARCH_START flag when looping. Add a test.
diff --git a/src/normal.c b/src/normal.c
index d9948ec..c0a54b6 100644
--- a/src/normal.c
+++ b/src/normal.c
@@ -4250,7 +4250,7 @@
int len,
int locally,
int thisblock,
- int searchflags) /* flags passed to searchit() */
+ int flags_arg) /* flags passed to searchit() */
{
char_u *pat;
pos_T old_pos;
@@ -4261,6 +4261,7 @@
int save_p_scs;
int retval = OK;
int incll;
+ int searchflags = flags_arg;
if ((pat = alloc(len + 7)) == NULL)
return FAIL;
@@ -4346,8 +4347,10 @@
/* For finding a local variable and the match is before the "{" search
* to find a later match. For K&R style function declarations this
- * skips the function header without types. */
+ * skips the function header without types. Remove SEARCH_START from
+ * flags to avoid getting stuck at one position. */
found_pos = curwin->w_cursor;
+ searchflags &= ~SEARCH_START;
}
if (t == FAIL)
diff --git a/src/testdir/test_goto.vim b/src/testdir/test_goto.vim
index fb8f190..2afd96b 100644
--- a/src/testdir/test_goto.vim
+++ b/src/testdir/test_goto.vim
@@ -1,6 +1,6 @@
" Test commands that jump somewhere.
-func Test_geedee()
+func Test_geeDEE()
new
call setline(1, ["Filename x;", "", "int Filename", "int func() {", "Filename y;"])
/y;/
@@ -8,3 +8,13 @@
call assert_equal(1, line('.'))
quit!
endfunc
+
+func Test_gee_dee()
+ new
+ call setline(1, ["int x;", "", "int func(int x)", "{", " return x;", "}"])
+ /return/
+ normal $hgd
+ call assert_equal(3, line('.'))
+ call assert_equal(14, col('.'))
+ quit!
+endfunc
diff --git a/src/version.c b/src/version.c
index 9608a7e..f72ad18 100644
--- a/src/version.c
+++ b/src/version.c
@@ -754,6 +754,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1940,
+/**/
1939,
/**/
1938,