changeset 31802:ddbc560ecc41 v9.0.1233

patch 9.0.1233: search() loops forever if "skip" is TRUE for all matches Commit: https://github.com/vim/vim/commit/3d79f0a4309995956bd8889940cca22f7a15881d Author: Bram Moolenaar <Bram@vim.org> Date: Sun Jan 22 20:14:26 2023 +0000 patch 9.0.1233: search() loops forever if "skip" is TRUE for all matches Problem: search() loops forever if "skip" is TRUE for all matches. Solution: Keep the position of the first match.
author Bram Moolenaar <Bram@vim.org>
date Sun, 22 Jan 2023 21:15:03 +0100
parents c476ed5d66ef
children 7a9569aecc51
files src/evalfunc.c src/testdir/test_search.vim src/version.c
diffstat 3 files changed, 20 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -8794,7 +8794,8 @@ search_cmn(typval_T *argvars, pos_T *mat
 	if (subpatnum == FAIL || !use_skip)
 	    // didn't find it or no skip argument
 	    break;
-	firstpos = pos;
+	if (firstpos.lnum == 0)
+	    firstpos = pos;
 
 	// If the skip expression matches, ignore this match.
 	{
--- a/src/testdir/test_search.vim
+++ b/src/testdir/test_search.vim
@@ -1411,6 +1411,22 @@ func Test_subst_word_under_cursor()
   set noincsearch
 endfunc
 
+func Test_search_skip_all_matches()
+  enew
+  call setline(1, ['no match here',
+        \ 'match this line',
+        \ 'nope',
+        \ 'match in this line',
+        \ 'last line',
+        \ ])
+  call cursor(1, 1)
+  let lnum = search('this', '', 0, 0, 'getline(".") =~ "this line"')
+  " Only check that no match is found.  Previously it searched forever.
+  call assert_equal(0, lnum)
+
+  bwipe!
+endfunc
+
 func Test_search_undefined_behaviour()
   CheckFeature terminal
 
--- a/src/version.c
+++ b/src/version.c
@@ -696,6 +696,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1233,
+/**/
     1232,
 /**/
     1231,