diff options
-rw-r--r-- | src/nvim/quickfix.c | 10 | ||||
-rw-r--r-- | src/nvim/testdir/test_quickfix.vim | 14 |
2 files changed, 24 insertions, 0 deletions
diff --git a/src/nvim/quickfix.c b/src/nvim/quickfix.c index 9d4fb52dc3..47b8e4a3e0 100644 --- a/src/nvim/quickfix.c +++ b/src/nvim/quickfix.c @@ -5166,6 +5166,16 @@ bool set_ref_in_quickfix(int copyID) return abort; } } + + if (IS_LL_WINDOW(win) && (win->w_llist_ref->qf_refcount == 1)) { + // In a location list window and none of the other windows is + // referring to this location list. Mark the location list + // context as still in use. + abort = mark_quickfix_ctx(win->w_llist_ref, copyID); + if (abort) { + return abort; + } + } } return abort; diff --git a/src/nvim/testdir/test_quickfix.vim b/src/nvim/testdir/test_quickfix.vim index b009df26b9..db84f6d4a1 100644 --- a/src/nvim/testdir/test_quickfix.vim +++ b/src/nvim/testdir/test_quickfix.vim @@ -3298,3 +3298,17 @@ func Test_qfjump() call Xqfjump_tests('c') call Xqfjump_tests('l') endfunc + +" The following test used to crash Vim. +" Open the location list window and close the regular window associated with +" the location list. When the garbage collection runs now, it incorrectly +" marks the location list context as not in use and frees the context. +func Test_ll_window_ctx() + call setloclist(0, [], 'f') + call setloclist(0, [], 'a', {'context' : []}) + lopen | only + call test_garbagecollect_now() + echo getloclist(0, {'context' : 1}).context + enew | only +endfunc + |