diff --git a/src/quickfix.c b/src/quickfix.c
index 97bfb37ca..2a70ab0cb 100644
--- a/src/quickfix.c
+++ b/src/quickfix.c
@@ -1307,6 +1307,17 @@ restofline:
     return QF_OK;
 }
 
+/*
+ * Returns TRUE if the specified quickfix/location list is empty.
+ */
+    static int
+qf_list_empty(qf_info_T *qi, int qf_idx)
+{
+    if (qi == NULL || qf_idx < 0 || qf_idx >= LISTCOUNT)
+	return TRUE;
+    return qi->qf_lists[qf_idx].qf_count <= 0;
+}
+
 /*
  * Allocate the fields used for parsing lines and populating a quickfix list.
  */
@@ -1450,7 +1461,7 @@ qf_init_ext(
     {
 	/* Adding to existing list, use last entry. */
 	adding = TRUE;
-	if (qi->qf_lists[qf_idx].qf_count > 0)
+	if (!qf_list_empty(qi, qf_idx))
 	    old_last = qi->qf_lists[qf_idx].qf_last;
     }
 
@@ -1777,8 +1788,7 @@ qf_add_entry(
     qfp->qf_valid = valid;
 
     lastp = &qi->qf_lists[qf_idx].qf_last;
-    if (qi->qf_lists[qf_idx].qf_count == 0)
-				/* first element in the list */
+    if (qf_list_empty(qi, qf_idx))	/* first element in the list */
     {
 	qi->qf_lists[qf_idx].qf_start = qfp;
 	qi->qf_lists[qf_idx].qf_ptr = qfp;
@@ -2907,7 +2917,7 @@ qf_jump(qf_info_T	*qi,
 	qi = &ql_info;
 
     if (qi->qf_curlist >= qi->qf_listcount
-	|| qi->qf_lists[qi->qf_curlist].qf_count == 0)
+	|| qf_list_empty(qi, qi->qf_curlist))
     {
 	EMSG(_(e_quickfix));
 	return;
@@ -3066,7 +3076,7 @@ qf_list(exarg_T *eap)
     }
 
     if (qi->qf_curlist >= qi->qf_listcount
-	|| qi->qf_lists[qi->qf_curlist].qf_count == 0)
+	|| qf_list_empty(qi, qi->qf_curlist))
     {
 	EMSG(_(e_quickfix));
 	return;
@@ -3320,7 +3330,7 @@ qf_history(exarg_T *eap)
     if (eap->cmdidx == CMD_lhistory)
 	qi = GET_LOC_LIST(curwin);
     if (qi == NULL || (qi->qf_listcount == 0
-				&& qi->qf_lists[qi->qf_curlist].qf_count == 0))
+				&& qf_list_empty(qi, qi->qf_curlist)))
 	MSG(_("No entries"));
     else
 	for (i = 0; i < qi->qf_listcount; ++i)
@@ -3421,7 +3431,7 @@ qf_mark_adjust(
     }
 
     for (idx = 0; idx < qi->qf_listcount; ++idx)
-	if (qi->qf_lists[idx].qf_count)
+	if (!qf_list_empty(qi, idx))
 	    for (i = 0, qfp = qi->qf_lists[idx].qf_start;
 			i < qi->qf_lists[idx].qf_count && qfp != NULL;
 			++i, qfp = qfp->qf_next)
@@ -3552,7 +3562,7 @@ ex_cwindow(exarg_T *eap)
      * it if we have errors; otherwise, leave it closed.
      */
     if (qi->qf_lists[qi->qf_curlist].qf_nonevalid
-	    || qi->qf_lists[qi->qf_curlist].qf_count == 0
+	    || qf_list_empty(qi, qi->qf_curlist)
 	    || qi->qf_curlist >= qi->qf_listcount)
     {
 	if (win != NULL)
@@ -4251,7 +4261,9 @@ ex_make(exarg_T *eap)
 	// If autocommands changed the current list, then restore it
 	if (qi->qf_lists[qi->qf_curlist].qf_id != save_qfid)
 	    qi->qf_curlist = qf_id2nr(qi, save_qfid);
-	qf_jump(qi, 0, 0, FALSE);		/* display first error */
+	// Autocommands might have cleared the list, check for it
+	if (!qf_list_empty(qi, qi->qf_curlist))
+	    qf_jump(qi, 0, 0, FALSE);		/* display first error */
     }
 
 cleanup:
@@ -4653,7 +4665,9 @@ ex_cfile(exarg_T *eap)
 	// If autocommands changed the current list, then restore it
 	if (qi->qf_lists[qi->qf_curlist].qf_id != save_qfid)
 	    qi->qf_curlist = qf_id2nr(qi, save_qfid);
-	qf_jump(qi, 0, 0, eap->forceit);	/* display first error */
+	// Autocommands might have cleared the list, check for it
+	if (!qf_list_empty(qi, qi->qf_curlist))
+	    qf_jump(qi, 0, 0, eap->forceit);	/* display first error */
     }
 }
 
@@ -5146,7 +5160,7 @@ ex_vimgrep(exarg_T *eap)
 	qi->qf_curlist = qf_id2nr(qi, save_qfid);
 
     /* Jump to first match. */
-    if (qi->qf_lists[qi->qf_curlist].qf_count > 0)
+    if (!qf_list_empty(qi, qi->qf_curlist))
     {
 	if ((flags & VGR_NOJUMP) == 0)
 	    vgr_jump_to_match(qi, eap->forceit, &redraw_for_dummy,
@@ -5379,8 +5393,7 @@ get_errorlist(qf_info_T *qi_arg, win_T *wp, int qf_idx, list_T *list)
     if (qf_idx == INVALID_QFIDX)
 	qf_idx = qi->qf_curlist;
 
-    if (qf_idx >= qi->qf_listcount
-	    || qi->qf_lists[qf_idx].qf_count == 0)
+    if (qf_idx >= qi->qf_listcount || qf_list_empty(qi, qf_idx))
 	return FAIL;
 
     qfp = qi->qf_lists[qf_idx].qf_start;
@@ -5701,7 +5714,7 @@ qf_getprop_ctx(qf_info_T *qi, int qf_idx, dict_T *retdict)
 qf_getprop_idx(qf_info_T *qi, int qf_idx, dict_T *retdict)
 {
     int idx = qi->qf_lists[qf_idx].qf_index;
-    if (qi->qf_lists[qf_idx].qf_count == 0)
+    if (qf_list_empty(qi, qf_idx))
 	/* For empty lists, qf_index is set to 1 */
 	idx = 0;
     return dict_add_number(retdict, "idx", idx);
@@ -5790,7 +5803,7 @@ qf_add_entries(
 	qf_new_list(qi, title);
 	qf_idx = qi->qf_curlist;
     }
-    else if (action == 'a' && qi->qf_lists[qf_idx].qf_count > 0)
+    else if (action == 'a' && !qf_list_empty(qi, qf_idx))
 	/* Adding to existing list, use last entry. */
 	old_last = qi->qf_lists[qf_idx].qf_last;
     else if (action == 'r')
@@ -5879,7 +5892,7 @@ qf_add_entries(
     {
 	qi->qf_lists[qf_idx].qf_ptr =
 	    qi->qf_lists[qf_idx].qf_start;
-	if (qi->qf_lists[qf_idx].qf_count > 0)
+	if (!qf_list_empty(qi, qf_idx))
 	    qi->qf_lists[qf_idx].qf_index = 1;
     }
 
@@ -6364,7 +6377,9 @@ ex_cbuffer(exarg_T *eap)
 		// If autocommands changed the current list, then restore it
 		if (qi->qf_lists[qi->qf_curlist].qf_id != save_qfid)
 		    qi->qf_curlist = qf_id2nr(qi, save_qfid);
-		qf_jump(qi, 0, 0, eap->forceit);  /* display first error */
+		// Autocommands might have cleared the list, check for it
+		if (!qf_list_empty(qi, qi->qf_curlist))
+		    qf_jump(qi, 0, 0, eap->forceit);  /* display first error */
 	    }
 	}
     }
@@ -6446,7 +6461,9 @@ ex_cexpr(exarg_T *eap)
 		// If autocommands changed the current list, then restore it
 		if (qi->qf_lists[qi->qf_curlist].qf_id != save_qfid)
 		    qi->qf_curlist = qf_id2nr(qi, save_qfid);
-		qf_jump(qi, 0, 0, eap->forceit);
+		// Autocommands might have cleared the list, check for it
+		if (!qf_list_empty(qi, qi->qf_curlist))
+		    qf_jump(qi, 0, 0, eap->forceit);
 	    }
 	}
 	else
@@ -6742,7 +6759,7 @@ ex_helpgrep(exarg_T *eap)
     }
 
     /* Jump to first match. */
-    if (qi->qf_lists[qi->qf_curlist].qf_count > 0)
+    if (!qf_list_empty(qi, qi->qf_curlist))
 	qf_jump(qi, 0, 0, FALSE);
     else
 	EMSG2(_(e_nomatch2), eap->arg);
diff --git a/src/testdir/test_quickfix.vim b/src/testdir/test_quickfix.vim
index d41815f3c..8fa3e0691 100644
--- a/src/testdir/test_quickfix.vim
+++ b/src/testdir/test_quickfix.vim
@@ -3478,6 +3478,31 @@ func Xautocmd_changelist(cchar)
   call assert_equal(5, line('.'))
   autocmd! QuickFixCmdPost
 
+  " Test for autocommands clearing the quickfix list before jumping to the
+  " first error. This should not result in an error
+
+  autocmd QuickFixCmdPost * call g:Xsetlist([], 'r')
+  let v:errmsg = ''
+  " Test for cfile/lfile
+  Xfile Xerr
+  call assert_true(v:errmsg !~# 'E42:')
+  " Test for cbuffer/lbuffer
+  edit Xerr
+  Xbuffer
+  call assert_true(v:errmsg !~# 'E42:')
+  " Test for cexpr/lexpr
+  Xexpr 'Xtestfile2:4:Line4'
+  call assert_true(v:errmsg !~# 'E42:')
+  " Test for grep/lgrep
+  " The grepprg may not be set on non-Unix systems
+  if has('unix')
+    silent Xgrep Line5 Xtestfile2
+    call assert_true(v:errmsg !~# 'E42:')
+  endif
+  " Test for vimgrep/lvimgrep
+  call assert_fails('silent Xvimgrep Line5 Xtestfile2', 'E480:')
+  autocmd! QuickFixCmdPost
+
   call delete('Xerr')
   call delete('Xtestfile1')
   call delete('Xtestfile2')
