To: vim_dev@googlegroups.com Subject: Patch 8.0.0645 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.0.0645 Problem: The new regexp engine does not give an error for using a back reference where it is not allowed. (Dominique Pelle) Solution: Check the back reference like the old engine. (closes #1774) Files: src/regexp.c, src/regexp_nfa.c, src/testdir/test_hlsearch.vim, src/testdir/test_statusline.vim, src/testdir/test_regexp_latin.vim *** ../vim-8.0.0644/src/regexp.c 2017-06-17 18:44:16.994000979 +0200 --- src/regexp.c 2017-06-17 19:27:53.054788101 +0200 *************** *** 1294,1299 **** --- 1294,1327 ---- return p; } + /* + * Return TRUE if the back reference is legal. We must have seen the close + * brace. + * TODO: Should also check that we don't refer to something that is repeated + * (+*=): what instance of the repetition should we match? + */ + static int + seen_endbrace(int refnum) + { + if (!had_endbrace[refnum]) + { + char_u *p; + + /* Trick: check if "@<=" or "@ 0.1) --- 38,48 ---- return endif ! " This pattern takes a long time to match, it should timeout. help let start = reltime() set hlsearch nolazyredraw redrawtime=101 ! let @/ = '\%#=1a*.*X\@<=b*' redraw let elapsed = reltimefloat(reltime(start)) call assert_true(elapsed > 0.1) *** ../vim-8.0.0644/src/testdir/test_statusline.vim 2017-03-06 20:28:05.978797725 +0100 --- src/testdir/test_statusline.vim 2017-06-17 19:48:15.909786928 +0200 *************** *** 223,229 **** set statusline=ab%(cd%q%)de call assert_match('^abde\s*$', s:get_statusline()) copen ! call assert_match('^abcd\[Quickfix List\1]de\s*$', s:get_statusline()) cclose " %#: Set highlight group. The name must follow and then a # again. --- 223,229 ---- set statusline=ab%(cd%q%)de call assert_match('^abde\s*$', s:get_statusline()) copen ! call assert_match('^abcd\[Quickfix List]de\s*$', s:get_statusline()) cclose " %#: Set highlight group. The name must follow and then a # again. *** ../vim-8.0.0644/src/testdir/test_regexp_latin.vim 2016-09-09 20:18:47.000000000 +0200 --- src/testdir/test_regexp_latin.vim 2017-06-17 20:05:45.626002851 +0200 *************** *** 62,64 **** --- 62,74 ---- call assert_equal(expected, actual) endfor endfunc + + func Test_backref() + new + call setline(1, ['one', 'two', 'three', 'four', 'five']) + call assert_equal(3, search('\%#=1\(e\)\1')) + call assert_equal(3, search('\%#=2\(e\)\1')) + call assert_fails('call search("\\%#=1\\(e\\1\\)")', 'E65:') + call assert_fails('call search("\\%#=2\\(e\\1\\)")', 'E65:') + bwipe! + endfunc *** ../vim-8.0.0644/src/version.c 2017-06-17 19:13:44.292958822 +0200 --- src/version.c 2017-06-17 20:04:12.582686258 +0200 *************** *** 766,767 **** --- 766,769 ---- { /* Add new patch number below this line */ + /**/ + 645, /**/ -- Everybody lies, but it doesn't matter since nobody listens. -- Lieberman's Law /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///