changeset 11480:99ce30ac4226 v8.0.0623

patch 8.0.0623: error for invalid regexp is not very informative commit https://github.com/vim/vim/commit/966e58e413ffa88af8d748e697aa2999571fcd7b Author: Bram Moolenaar <Bram@vim.org> Date: Mon Jun 5 16:54:08 2017 +0200 patch 8.0.0623: error for invalid regexp is not very informative Problem: The message "Invalid range" is used for multiple errors. Solution: Add two more specific error messages. (Itchyny, Ken Hamada)
author Christian Brabandt <cb@256bit.org>
date Mon, 05 Jun 2017 17:00:03 +0200
parents d4000f7e96c7
children 795d1ba61c1b
files src/regexp.c src/regexp_nfa.c src/testdir/test_regexp_utf8.vim src/version.c
diffstat 4 files changed, 25 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/regexp.c
+++ b/src/regexp.c
@@ -358,6 +358,8 @@ static char_u	*regprop(char_u *);
 static int re_mult_next(char *what);
 
 static char_u e_missingbracket[] = N_("E769: Missing ] after %s[");
+static char_u e_reverse_range[] = N_("E944: Reverse range in character class");
+static char_u e_large_class[] = N_("E945: Range too large in character class");
 static char_u e_unmatchedpp[] = N_("E53: Unmatched %s%%(");
 static char_u e_unmatchedp[] = N_("E54: Unmatched %s(");
 static char_u e_unmatchedpar[] = N_("E55: Unmatched %s)");
@@ -2426,14 +2428,14 @@ collection:
 				endc = coll_get_char();
 
 			    if (startc > endc)
-				EMSG_RET_NULL(_(e_invrange));
+				EMSG_RET_NULL(_(e_reverse_range));
 #ifdef FEAT_MBYTE
 			    if (has_mbyte && ((*mb_char2len)(startc) > 1
 						 || (*mb_char2len)(endc) > 1))
 			    {
-				/* Limit to a range of 256 chars */
+				/* Limit to a range of 256 chars. */
 				if (endc > startc + 256)
-				    EMSG_RET_NULL(_(e_invrange));
+				    EMSG_RET_NULL(_(e_large_class));
 				while (++startc <= endc)
 				    regmbc(startc);
 			    }
--- a/src/regexp_nfa.c
+++ b/src/regexp_nfa.c
@@ -1853,7 +1853,7 @@ collection:
 			endc = startc;
 			startc = oldstartc;
 			if (startc > endc)
-			    EMSG_RET_FAIL(_(e_invrange));
+			    EMSG_RET_FAIL(_(e_reverse_range));
 
 			if (endc > startc + 2)
 			{
--- a/src/testdir/test_regexp_utf8.vim
+++ b/src/testdir/test_regexp_utf8.vim
@@ -137,3 +137,20 @@ func Test_classes_re2()
   call s:classes_test()
   set re=0
 endfunc
+
+func Test_reversed_range()
+  for re in range(0, 2)
+    exe 'set re=' . re
+    call assert_fails('call match("abc def", "[c-a]")', 'E944:')
+  endfor
+  set re=0
+endfunc
+
+func Test_large_class()
+  set re=1
+  call assert_fails('call match("abc def", "[\u3000-\u4000]")', 'E945:')
+  set re=2
+  call assert_equal(0, 'abc def' =~# '[\u3000-\u4000]')
+  call assert_equal(1, "\u3042" =~# '[\u3000-\u4000]')
+  set re=0
+endfunc
--- a/src/version.c
+++ b/src/version.c
@@ -765,6 +765,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    623,
+/**/
     622,
 /**/
     621,