patch 8.0.0023
Problem:    "gd" and "gD" may find a match in a comment or string.
Solution:   Ignore matches in comments and strings. (Anton Lindqvist)
diff --git a/src/testdir/test_goto.vim b/src/testdir/test_goto.vim
index 2afd96b..16daaf8 100644
--- a/src/testdir/test_goto.vim
+++ b/src/testdir/test_goto.vim
@@ -1,20 +1,275 @@
 " Test commands that jump somewhere.
 
-func Test_geeDEE()
+" Create a new buffer using "lines" and place the cursor on the word after the
+" first occurrence of return and invoke "cmd". The cursor should now be
+" positioned at the given line and col.
+func XTest_goto_decl(cmd, lines, line, col)
   new
-  call setline(1, ["Filename x;", "", "int Filename", "int func() {", "Filename y;"])
-  /y;/
-  normal gD
-  call assert_equal(1, line('.'))
+  call setline(1, a:lines)
+  /return/
+  normal! W
+  execute 'norm! ' . a:cmd
+  call assert_equal(a:line, line('.'))
+  call assert_equal(a:col, col('.'))
   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!
+func Test_gD()
+  let lines = [
+    \ 'int x;',
+    \ '',
+    \ 'int func(void)',
+    \ '{',
+    \ '  return x;',
+    \ '}',
+    \ ]
+  call XTest_goto_decl('gD', lines, 1, 5)
+endfunc
+
+func Test_gD_too()
+  let lines = [
+	\ 'Filename x;',
+	\ '',
+	\ 'int Filename',
+	\ 'int func() {',
+	\ '  Filename x;',
+	\ '  return x;',
+	\ ]
+  call XTest_goto_decl('gD', lines, 1, 10)
+endfunc
+
+func Test_gD_comment()
+  let lines = [
+    \ '/* int x; */',
+    \ 'int x;',
+    \ '',
+    \ 'int func(void)',
+    \ '{',
+    \ '  return x;',
+    \ '}',
+    \ ]
+  call XTest_goto_decl('gD', lines, 2, 5)
+endfunc
+
+func Test_gD_inline_comment()
+  let lines = [
+    \ 'int y /* , x */;',
+    \ 'int x;',
+    \ '',
+    \ 'int func(void)',
+    \ '{',
+    \ '  return x;',
+    \ '}',
+    \ ]
+  call XTest_goto_decl('gD', lines, 2, 5)
+endfunc
+
+func Test_gD_string()
+  let lines = [
+    \ 'char *s[] = "x";',
+    \ 'int x = 1;',
+    \ '',
+    \ 'int func(void)',
+    \ '{',
+    \ '  return x;',
+    \ '}',
+    \ ]
+  call XTest_goto_decl('gD', lines, 2, 5)
+endfunc
+
+func Test_gD_string_same_line()
+  let lines = [
+    \ 'char *s[] = "x", int x = 1;',
+    \ '',
+    \ 'int func(void)',
+    \ '{',
+    \ '  return x;',
+    \ '}',
+    \ ]
+  call XTest_goto_decl('gD', lines, 1, 22)
+endfunc
+
+func Test_gD_char()
+  let lines = [
+    \ "char c = 'x';",
+    \ 'int x = 1;',
+    \ '',
+    \ 'int func(void)',
+    \ '{',
+    \ '  return x;',
+    \ '}',
+    \ ]
+  call XTest_goto_decl('gD', lines, 2, 5)
+endfunc
+
+func Test_gd()
+  let lines = [
+    \ 'int x;',
+    \ '',
+    \ 'int func(int x)',
+    \ '{',
+    \ '  return x;',
+    \ '}',
+    \ ]
+  call XTest_goto_decl('gd', lines, 3, 14)
+endfunc
+
+func Test_gd_not_local()
+  let lines = [
+    \ 'int func1(void)',
+    \ '{',
+    \ '  return x;',
+    \ '}',
+    \ '',
+    \ 'int func2(int x)',
+    \ '{',
+    \ '  return x;',
+    \ '}',
+    \ ]
+  call XTest_goto_decl('gd', lines, 3, 10)
+endfunc
+
+func Test_gd_kr_style()
+  let lines = [
+    \ 'int func(x)',
+    \ '  int x;',
+    \ '{',
+    \ '  return x;',
+    \ '}',
+    \ ]
+  call XTest_goto_decl('gd', lines, 2, 7)
+endfunc
+
+func Test_gd_missing_braces()
+  let lines = [
+    \ 'def func1(a)',
+    \ '  a + 1',
+    \ 'end',
+    \ '',
+    \ 'a = 1',
+    \ '',
+    \ 'def func2()',
+    \ '  return a',
+    \ 'end',
+    \ ]
+  call XTest_goto_decl('gd', lines, 1, 11)
+endfunc
+
+func Test_gd_comment()
+  let lines = [
+    \ 'int func(void)',
+    \ '{',
+    \ '  /* int x; */',
+    \ '  int x;',
+    \ '  return x;',
+    \ '}',
+    \]
+  call XTest_goto_decl('gd', lines, 4, 7)
+endfunc
+
+func Test_gd_comment_in_string()
+  let lines = [
+    \ 'int func(void)',
+    \ '{',
+    \ '  char *s ="//"; int x;',
+    \ '  int x;',
+    \ '  return x;',
+    \ '}',
+    \]
+  call XTest_goto_decl('gd', lines, 3, 22)
+endfunc
+
+func Test_gd_string_in_comment()
+  set comments=
+  let lines = [
+    \ 'int func(void)',
+    \ '{',
+    \ '  /* " */ int x;',
+    \ '  int x;',
+    \ '  return x;',
+    \ '}',
+    \]
+  call XTest_goto_decl('gd', lines, 3, 15)
+  set comments&
+endfunc
+
+func Test_gd_inline_comment()
+  let lines = [
+    \ 'int func(/* x is an int */ int x)',
+    \ '{',
+    \ '  return x;',
+    \ '}',
+    \ ]
+  call XTest_goto_decl('gd', lines, 1, 32)
+endfunc
+
+func Test_gd_inline_comment_only()
+  let lines = [
+    \ 'int func(void) /* one lonely x */',
+    \ '{',
+    \ '  return x;',
+    \ '}',
+    \ ]
+  call XTest_goto_decl('gd', lines, 3, 10)
+endfunc
+
+func Test_gd_inline_comment_body()
+  let lines = [
+    \ 'int func(void)',
+    \ '{',
+    \ '  int y /* , x */;',
+    \ '',
+    \ '  for (/* int x = 0 */; y < 2; y++);',
+    \ '',
+    \ '  int x = 0;',
+    \ '',
+    \ '  return x;',
+    \ '}',
+  \ ]
+  call XTest_goto_decl('gd', lines, 7, 7)
+endfunc
+
+func Test_gd_trailing_multiline_comment()
+  let lines = [
+    \ 'int func(int x) /* x is an int */',
+    \ '{',
+    \ '  return x;',
+    \ '}',
+    \ ]
+  call XTest_goto_decl('gd', lines, 1, 14)
+endfunc
+
+func Test_gd_trailing_comment()
+  let lines = [
+    \ 'int func(int x) // x is an int',
+    \ '{',
+    \ '  return x;',
+    \ '}',
+    \ ]
+  call XTest_goto_decl('gd', lines, 1, 14)
+endfunc
+
+func Test_gd_string()
+  let lines = [
+    \ 'int func(void)',
+    \ '{',
+    \ '  char *s = "x";',
+    \ '  int x = 1;',
+    \ '',
+    \ '  return x;',
+    \ '}',
+    \ ]
+  call XTest_goto_decl('gd', lines, 4, 7)
+endfunc
+
+func Test_gd_string_only()
+  let lines = [
+    \ 'int func(void)',
+    \ '{',
+    \ '  char *s = "x";',
+    \ '',
+    \ '  return x;',
+    \ '}',
+    \ ]
+  call XTest_goto_decl('gd', lines, 5, 10)
 endfunc