changeset 28335:786707ef91de v8.2.4693

patch 8.2.4693: new regexp does not accept pattern "%>0v" Commit: https://github.com/vim/vim/commit/72bb10df1fb3eb69bc91f5babfb8881ce098cba1 Author: Bram Moolenaar <Bram@vim.org> Date: Tue Apr 5 14:00:32 2022 +0100 patch 8.2.4693: new regexp does not accept pattern "\%>0v" Problem: new regexp does not accept pattern "\%>0v". Solution: Do accept digit zero.
author Bram Moolenaar <Bram@vim.org>
date Tue, 05 Apr 2022 15:15:04 +0200
parents a72c164495e0
children 16ec610b5b68
files src/regexp_bt.c src/regexp_nfa.c src/testdir/test_regexp_latin.vim src/version.c
diffstat 4 files changed, 23 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/regexp_bt.c
+++ b/src/regexp_bt.c
@@ -1617,6 +1617,7 @@ regatom(int *flagp)
 			      long_u	n = 0;
 			      int	cmp;
 			      int	cur = FALSE;
+			      int	got_digit = FALSE;
 
 			      cmp = c;
 			      if (cmp == '<' || cmp == '>')
@@ -1628,6 +1629,7 @@ regatom(int *flagp)
 			      }
 			      while (VIM_ISDIGIT(c))
 			      {
+				  got_digit = TRUE;
 				  n = n * 10 + (c - '0');
 				  c = getchr();
 			      }
@@ -1645,7 +1647,8 @@ regatom(int *flagp)
 				  }
 				  break;
 			      }
-			      else if (c == 'l' || c == 'c' || c == 'v')
+			      else if ((c == 'l' || c == 'c' || c == 'v')
+					  && (cur || got_digit))
 			      {
 				  if (cur && n)
 				  {
--- a/src/regexp_nfa.c
+++ b/src/regexp_nfa.c
@@ -1640,6 +1640,7 @@ nfa_regatom(void)
 			long_u	n = 0;
 			int	cmp = c;
 			int	cur = FALSE;
+			int	got_digit = FALSE;
 
 			if (c == '<' || c == '>')
 			    c = getchr();
@@ -1668,12 +1669,13 @@ nfa_regatom(void)
 			    }
 			    n = tmp;
 			    c = getchr();
+			    got_digit = TRUE;
 			}
 			if (c == 'l' || c == 'c' || c == 'v')
 			{
 			    long_u limit = INT_MAX;
 
-			    if (!cur && n == 0)
+			    if (!cur && !got_digit)
 			    {
 				semsg(_(e_nfa_regexp_missing_value_in_chr),
 								  no_Magic(c));
--- a/src/testdir/test_regexp_latin.vim
+++ b/src/testdir/test_regexp_latin.vim
@@ -91,16 +91,29 @@ func Test_multi_failure()
   set re=0
 endfunc
 
-func Test_column_failure()
+func Test_column_success_failure()
+  new
+  call setline(1, 'xbar')
+
   set re=1
+  %s/\%>0v./A/
+  call assert_equal('Abar', getline(1))
   call assert_fails('/\%v', 'E71:')
+  call assert_fails('/\%>v', 'E71:')
   call assert_fails('/\%c', 'E71:')
+  call assert_fails('/\%<c', 'E71:')
   call assert_fails('/\%l', 'E71:')
   set re=2
+  %s/\%>0v./B/
+  call assert_equal('Bbar', getline(1))
   call assert_fails('/\%v', 'E1273:')
+  call assert_fails('/\%>v', 'E1273:')
   call assert_fails('/\%c', 'E1273:')
+  call assert_fails('/\%<c', 'E1273:')
   call assert_fails('/\%l', 'E1273:')
+
   set re=0
+  bwipe!
 endfunc
 
 func Test_recursive_addstate()
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    4693,
+/**/
     4692,
 /**/
     4691,