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,