aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin M. Keyes <justinkz@gmail.com>2019-02-28 12:18:55 +0100
committerJustin M. Keyes <justinkz@gmail.com>2019-03-01 01:56:17 +0100
commite116b0f61f87a79fd93beb32c337f5bd9e2d3ab9 (patch)
tree726356b432c8fb719cc79792087ecf066dda9917
parentff98f61601d61dcfd902655e70bba07fb768ce01 (diff)
downloadrneovim-e116b0f61f87a79fd93beb32c337f5bd9e2d3ab9.tar.gz
rneovim-e116b0f61f87a79fd93beb32c337f5bd9e2d3ab9.tar.bz2
rneovim-e116b0f61f87a79fd93beb32c337f5bd9e2d3ab9.zip
vim-patch:8.1.0973: pattern with syntax error gives threee error messages
Problem: Pattern with syntax error gives threee error messages. (Kuang-che Wu) Solution: Remove outdated internal error. Don't fall back to other engine after an error. https://github.com/vim/vim/commit/cd62512c5595fa1f7a7f2c6ec1a90ea6bde3ad50
-rw-r--r--src/nvim/regexp.c13
-rw-r--r--src/nvim/regexp_nfa.c10
-rw-r--r--src/nvim/testdir/test_search.vim5
3 files changed, 16 insertions, 12 deletions
diff --git a/src/nvim/regexp.c b/src/nvim/regexp.c
index 7c8d228d45..3b3ca29dad 100644
--- a/src/nvim/regexp.c
+++ b/src/nvim/regexp.c
@@ -7090,6 +7090,7 @@ regprog_T *vim_regcomp(char_u *expr_arg, int re_flags)
{
regprog_T *prog = NULL;
char_u *expr = expr_arg;
+ int save_called_emsg;
regexp_engine = p_re;
@@ -7116,9 +7117,11 @@ regprog_T *vim_regcomp(char_u *expr_arg, int re_flags)
bt_regengine.expr = expr;
nfa_regengine.expr = expr;
- /*
- * First try the NFA engine, unless backtracking was requested.
- */
+ //
+ // First try the NFA engine, unless backtracking was requested.
+ //
+ save_called_emsg = called_emsg;
+ called_emsg = false;
if (regexp_engine != BACKTRACKING_ENGINE) {
prog = nfa_regengine.regcomp(expr,
re_flags + (regexp_engine == AUTOMATIC_ENGINE ? RE_AUTO : 0));
@@ -7143,11 +7146,13 @@ regprog_T *vim_regcomp(char_u *expr_arg, int re_flags)
// If the NFA engine failed, try the backtracking engine. The NFA engine
// also fails for patterns that it can't handle well but are still valid
// patterns, thus a retry should work.
- if (regexp_engine == AUTOMATIC_ENGINE) {
+ // But don't try if an error message was given.
+ if (regexp_engine == AUTOMATIC_ENGINE && !called_emsg) {
regexp_engine = BACKTRACKING_ENGINE;
prog = bt_regengine.regcomp(expr, re_flags);
}
}
+ called_emsg |= save_called_emsg;
if (prog != NULL) {
// Store the info needed to call regcomp() again when the engine turns out
diff --git a/src/nvim/regexp_nfa.c b/src/nvim/regexp_nfa.c
index d1369e4532..95030974d8 100644
--- a/src/nvim/regexp_nfa.c
+++ b/src/nvim/regexp_nfa.c
@@ -6476,16 +6476,10 @@ static regprog_T *nfa_regcomp(char_u *expr, int re_flags)
nfa_regcomp_start(expr, re_flags);
- /* Build postfix form of the regexp. Needed to build the NFA
- * (and count its size). */
+ // Build postfix form of the regexp. Needed to build the NFA
+ // (and count its size).
postfix = re2post();
if (postfix == NULL) {
- // TODO(vim): only give this error for debugging?
- if (post_ptr >= post_end) {
- IEMSGN("Internal error: estimated max number "
- "of states insufficient: %" PRId64,
- post_end - post_start);
- }
goto fail; // Cascaded (syntax?) error
}
diff --git a/src/nvim/testdir/test_search.vim b/src/nvim/testdir/test_search.vim
index 8eec1f7a1e..08ccc8d4fe 100644
--- a/src/nvim/testdir/test_search.vim
+++ b/src/nvim/testdir/test_search.vim
@@ -580,3 +580,8 @@ func Test_large_hex_chars2()
endtry
set re&
endfunc
+
+func Test_one_error_msg()
+ " This was also giving an internal error
+ call assert_fails('call search(" \\((\\v[[=P=]]){185}+ ")', 'E871:')
+endfunc