From cfb2383c26847e9332d1283fa15753b09d322f2f Mon Sep 17 00:00:00 2001 From: Jan Edmund Lazo Date: Sun, 12 Aug 2018 18:06:17 -0400 Subject: [PATCH] vim-patch:8.0.1397: pattern with \& following nothing gives an error Problem: Pattern with \& following nothing gives an error. Solution: Emit an empty node when needed. https://github.com/vim/vim/commit/890dd05492d88d48eee1dda7f7a1811d027ce7ca --- src/nvim/regexp_nfa.c | 9 +++++---- src/nvim/testdir/test_search.vim | 8 ++++++++ 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/nvim/regexp_nfa.c b/src/nvim/regexp_nfa.c index 3b905f5efc..2536de27c1 100644 --- a/src/nvim/regexp_nfa.c +++ b/src/nvim/regexp_nfa.c @@ -2131,7 +2131,6 @@ static int nfa_regconcat(void) */ static int nfa_regbranch(void) { - int ch; int old_post_pos; old_post_pos = (int)(post_ptr - post_start); @@ -2140,10 +2139,13 @@ static int nfa_regbranch(void) if (nfa_regconcat() == FAIL) return FAIL; - ch = peekchr(); /* Try next concats */ - while (ch == Magic('&')) { + while (peekchr() == Magic('&')) { skipchr(); + // if concat is empty do emit a node + if (old_post_pos == (int)(post_ptr - post_start)) { + EMIT(NFA_EMPTY); + } EMIT(NFA_NOPEN); EMIT(NFA_PREV_ATOM_NO_WIDTH); old_post_pos = (int)(post_ptr - post_start); @@ -2153,7 +2155,6 @@ static int nfa_regbranch(void) if (old_post_pos == (int)(post_ptr - post_start)) EMIT(NFA_EMPTY); EMIT(NFA_CONCAT); - ch = peekchr(); } /* if a branch is empty, emit one node for it */ diff --git a/src/nvim/testdir/test_search.vim b/src/nvim/testdir/test_search.vim index 42c56dced7..7663c9e283 100644 --- a/src/nvim/testdir/test_search.vim +++ b/src/nvim/testdir/test_search.vim @@ -472,3 +472,11 @@ endfunc func Test_search_undefined_behaviour2() call search("\%UC0000000") endfunc + +" This was causing E874. Also causes an invalid read? +func Test_look_behind() + new + call setline(1, '0\|\&\n\@<=') + call search(getline(".")) + bwipe! +endfunc