Mercurial > vim
changeset 28325:a3a760ee765f v8.2.4688
patch 8.2.4688: new regexp engine does not give an error for "%v"
Commit: https://github.com/vim/vim/commit/91ff3d4f52a55a7c37a52aaad524cd9dd12efae4
Author: Bram Moolenaar <Bram@vim.org>
Date: Mon Apr 4 18:32:32 2022 +0100
patch 8.2.4688: new regexp engine does not give an error for "\%v"
Problem: New regexp engine does not give an error for "\%v".
Solution: Check for a value argument. (issue https://github.com/vim/vim/issues/10079)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Mon, 04 Apr 2022 19:45:04 +0200 |
parents | 8b0d6c2190c0 |
children | 8c2459201a51 |
files | src/errors.h src/regexp_bt.c src/regexp_nfa.c src/testdir/test_regexp_latin.vim src/version.c |
diffstat | 5 files changed, 26 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/src/errors.h +++ b/src/errors.h @@ -3082,7 +3082,7 @@ EXTERN char e_no_white_space_allowed_aft EXTERN char e_dot_can_only_be_used_on_dictionary_str[] INIT(= N_("E1203: Dot can only be used on a dictionary: %s")); #endif -EXTERN char e_regexp_number_after_dot_pos_search[] +EXTERN char e_regexp_number_after_dot_pos_search_chr[] INIT(= N_("E1204: No Number allowed after .: '\\%%%c'")); EXTERN char e_no_white_space_allowed_between_option_and[] INIT(= N_("E1205: No white space allowed between option and")); @@ -3256,3 +3256,5 @@ EXTERN char e_compiling_closure_without_ EXTERN char e_using_type_not_in_script_context_str[] INIT(= N_("E1272: Using type not in a script context: %s")); #endif +EXTERN char e_nfa_regexp_missing_value_in_chr[] + INIT(= N_("E1273: (NFA regexp) missing value in '\\%%%c'"));
--- a/src/regexp_bt.c +++ b/src/regexp_bt.c @@ -1649,7 +1649,8 @@ regatom(int *flagp) { if (cur && n) { - semsg(_(e_regexp_number_after_dot_pos_search), no_Magic(c)); + semsg(_(e_regexp_number_after_dot_pos_search_chr), + no_Magic(c)); rc_did_emsg = TRUE; return NULL; }
--- a/src/regexp_nfa.c +++ b/src/regexp_nfa.c @@ -1654,7 +1654,7 @@ nfa_regatom(void) if (cur) { - semsg(_(e_regexp_number_after_dot_pos_search), + semsg(_(e_regexp_number_after_dot_pos_search_chr), no_Magic(c)); return FAIL; } @@ -1673,6 +1673,12 @@ nfa_regatom(void) { long_u limit = INT_MAX; + if (!cur && n == 0) + { + semsg(_(e_nfa_regexp_missing_value_in_chr), + no_Magic(c)); + return FAIL; + } if (c == 'l') { if (cur)
--- a/src/testdir/test_regexp_latin.vim +++ b/src/testdir/test_regexp_latin.vim @@ -91,6 +91,18 @@ func Test_multi_failure() set re=0 endfunc +func Test_column_failure() + set re=1 + call assert_fails('/\%v', 'E71:') + call assert_fails('/\%c', 'E71:') + call assert_fails('/\%l', 'E71:') + set re=2 + call assert_fails('/\%v', 'E1273:') + call assert_fails('/\%c', 'E1273:') + call assert_fails('/\%l', 'E1273:') + set re=0 +endfunc + func Test_recursive_addstate() " This will call addstate() recursively until it runs into the limit. let lnum = search('\v((){328}){389}')