# HG changeset patch # User Christian Brabandt # Date 1466021706 -7200 # Node ID 1b4946fa3777e7da5fdb13ffb4b2b38a96d720f9 # Parent 1df449de51996d6ad32bd636d7214891bc4bca97 commit https://github.com/vim/vim/commit/23c60f21b07b04351d846e6fbf4f4abd9aa09345 Author: Bram Moolenaar Date: Wed Jun 15 22:03:48 2016 +0200 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 --- a/src/normal.c +++ b/src/normal.c @@ -4250,7 +4250,7 @@ find_decl( 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 @@ find_decl( 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 @@ find_decl( /* 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 --- 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 @@ func Test_geedee() 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 --- a/src/version.c +++ b/src/version.c @@ -754,6 +754,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1940, +/**/ 1939, /**/ 1938,