diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/regexp.c | 13 | ||||
-rw-r--r-- | src/nvim/regexp_nfa.c | 10 | ||||
-rw-r--r-- | src/nvim/testdir/test_search.vim | 5 |
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 |