patch 8.2.3756: might crash when callback is not valid
Problem: might crash when callback is not valid.
Solution: Check for valid callback. (Yegappan Lakshmanan, closes #9293)
diff --git a/src/testdir/test_iminsert.vim b/src/testdir/test_iminsert.vim
index c3c4725..a53e6f3 100644
--- a/src/testdir/test_iminsert.vim
+++ b/src/testdir/test_iminsert.vim
@@ -257,6 +257,19 @@
set imstatusfunc=()\ =>\ IMstatusfunc1(a)
call assert_fails('normal! i', 'E117:')
+ " set 'imactivatefunc' and 'imstatusfunc' to a non-existing function
+ set imactivatefunc=IMactivatefunc1
+ set imstatusfunc=IMstatusfunc1
+ call assert_fails("set imactivatefunc=function('NonExistingFunc')", 'E700:')
+ call assert_fails("set imstatusfunc=function('NonExistingFunc')", 'E700:')
+ call assert_fails("let &imactivatefunc = function('NonExistingFunc')", 'E700:')
+ call assert_fails("let &imstatusfunc = function('NonExistingFunc')", 'E700:')
+ let g:IMactivatefunc_called = 0
+ let g:IMstatusfunc_called = 0
+ normal! i
+ call assert_equal(2, g:IMactivatefunc_called)
+ call assert_equal(2, g:IMstatusfunc_called)
+
" cleanup
delfunc IMactivatefunc1
delfunc IMstatusfunc1
diff --git a/src/testdir/test_ins_complete.vim b/src/testdir/test_ins_complete.vim
index d508ba0..aa7b24b 100644
--- a/src/testdir/test_ins_complete.vim
+++ b/src/testdir/test_ins_complete.vim
@@ -1074,6 +1074,15 @@
call assert_fails('call feedkeys("A\<C-X>\<C-U>\<Esc>", "x")', 'E117:')
call assert_equal([], g:MycompleteFunc2_args)
+ " set 'completefunc' to a non-existing function
+ set completefunc=MycompleteFunc2
+ call setline(1, 'five')
+ call assert_fails("set completefunc=function('NonExistingFunc')", 'E700:')
+ call assert_fails("let &completefunc = function('NonExistingFunc')", 'E700:')
+ let g:MycompleteFunc2_args = []
+ call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x')
+ call assert_equal([[1, ''], [0, 'five']], g:MycompleteFunc2_args)
+
" cleanup
delfunc MycompleteFunc1
delfunc MycompleteFunc2
@@ -1285,6 +1294,15 @@
call assert_fails('call feedkeys("A\<C-X>\<C-O>\<Esc>", "x")', 'E117:')
call assert_equal([], g:MyomniFunc2_args)
+ " set 'omnifunc' to a non-existing function
+ set omnifunc=MyomniFunc2
+ call setline(1, 'nine')
+ call assert_fails("set omnifunc=function('NonExistingFunc')", 'E700:')
+ call assert_fails("let &omnifunc = function('NonExistingFunc')", 'E700:')
+ let g:MyomniFunc2_args = []
+ call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x')
+ call assert_equal([[1, ''], [0, 'nine']], g:MyomniFunc2_args)
+
" cleanup
delfunc MyomniFunc1
delfunc MyomniFunc2
@@ -1522,6 +1540,16 @@
call feedkeys("A\<C-X>\<C-T>\<Esc>", "x")
call assert_equal('sunday', getline(1))
call assert_equal([[1, ''], [0, 'sun']], g:MytsrFunc4_args)
+ %bw!
+
+ " set 'thesaurusfunc' to a non-existing function
+ set thesaurusfunc=MytsrFunc2
+ call setline(1, 'ten')
+ call assert_fails("set thesaurusfunc=function('NonExistingFunc')", 'E700:')
+ call assert_fails("let &thesaurusfunc = function('NonExistingFunc')", 'E700:')
+ let g:MytsrFunc2_args = []
+ call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x')
+ call assert_equal([[1, ''], [0, 'ten']], g:MytsrFunc2_args)
" cleanup
set thesaurusfunc&
diff --git a/src/testdir/test_tagfunc.vim b/src/testdir/test_tagfunc.vim
index 7f16fb2..b9139d4 100644
--- a/src/testdir/test_tagfunc.vim
+++ b/src/testdir/test_tagfunc.vim
@@ -317,6 +317,11 @@
call assert_fails("tag a17", "E117:")
call assert_equal([], g:MytagFunc3_args)
+ " set 'tagfunc' to a non-existing function
+ call assert_fails("set tagfunc=function('NonExistingFunc')", 'E700:')
+ call assert_fails("let &tagfunc = function('NonExistingFunc')", 'E700:')
+ call assert_fails("tag axb123", 'E426:')
+
" cleanup
delfunc MytagFunc1
delfunc MytagFunc2