updated for version 7.0179
diff --git a/src/quickfix.c b/src/quickfix.c
index d0a2e15..f550f11 100644
--- a/src/quickfix.c
+++ b/src/quickfix.c
@@ -86,6 +86,7 @@
 				/*   'O' overread (partial) message */
     char_u	    flags;	/* additional flags given in prefix */
 				/*   '-' do not include this line */
+				/*   '+' include whole line in message */
 };
 
 static int	qf_init_ext __ARGS((char_u *efile, buf_T *buf, typval_T *tv, char_u *errorformat, int newlist, linenr_T lnumfirst, linenr_T lnumlast));
@@ -578,7 +579,7 @@
 		    col = (int)atol((char *)regmatch.startp[i]);
 		if ((i = (int)fmt_ptr->addr[4]) > 0)		/* %t */
 		    type = *regmatch.startp[i];
-		if (fmt_ptr->flags ==  '+' && !multiscan)	/* %+ */
+		if (fmt_ptr->flags == '+' && !multiscan)	/* %+ */
 		    STRCPY(errmsg, IObuff);
 		else if ((i = (int)fmt_ptr->addr[5]) > 0)	/* %m */
 		{
@@ -613,9 +614,9 @@
 	    }
 	}
 	multiscan = FALSE;
-	if (!fmt_ptr || idx == 'D' || idx == 'X')
+	if (fmt_ptr == NULL || idx == 'D' || idx == 'X')
 	{
-	    if (fmt_ptr)
+	    if (fmt_ptr != NULL)
 	    {
 		if (idx == 'D')				/* enter directory */
 		{
@@ -634,10 +635,10 @@
 	    lnum = 0;			/* don't jump to this line */
 	    valid = FALSE;
 	    STRCPY(errmsg, IObuff);	/* copy whole line to error message */
-	    if (!fmt_ptr)
+	    if (fmt_ptr == NULL)
 		multiline = multiignore = FALSE;
 	}
-	else if (fmt_ptr)
+	else if (fmt_ptr != NULL)
 	{
 	    if (vim_strchr((char_u *)"AEWI", idx) != NULL)
 		multiline = TRUE;	/* start of a multi-line message */
@@ -2747,7 +2748,7 @@
     /* Need to set the filename for autocommands. */
     (void)setfname(curbuf, fname, NULL, FALSE);
 
-    if (ml_open() == OK)
+    if (ml_open(curbuf) == OK)
     {
 	/* Create swap file now to avoid the ATTENTION message. */
 	check_need_swap(TRUE);
@@ -2978,7 +2979,7 @@
 
 #if defined(FEAT_EVAL) || defined(PROTO)
 /*
- * ":cexpr {expr}" command.
+ * ":cexpr {expr}" and ":caddexpr {expr}" command.
  */
     void
 ex_cexpr(eap)
@@ -2986,16 +2987,23 @@
 {
     typval_T	*tv;
 
+    /* Evaluate the expression.  When the result is a string or a list we can
+     * use it to fill the errorlist. */
     tv = eval_expr(eap->arg, NULL);
-    if (!tv || (tv->v_type != VAR_STRING && tv->v_type != VAR_LIST) ||
-	(tv->v_type == VAR_STRING && !tv->vval.v_string) ||
-	(tv->v_type == VAR_LIST && !tv->vval.v_list))
-	return;
-
-    if (qf_init_ext(NULL, NULL, tv, p_efm, TRUE, (linenr_T)0, (linenr_T)0) > 0)
-	qf_jump(0, 0, eap->forceit);		/* display first error */
-
-    clear_tv(tv);
+    if (tv != NULL)
+    {
+	if ((tv->v_type == VAR_STRING && tv->vval.v_string != NULL)
+		|| (tv->v_type == VAR_LIST && tv->vval.v_list != NULL))
+	{
+	    if (qf_init_ext(NULL, NULL, tv, p_efm, eap->cmdidx == CMD_cexpr,
+						 (linenr_T)0, (linenr_T)0) > 0
+		    && eap->cmdidx == CMD_cexpr)
+		qf_jump(0, 0, eap->forceit);	/* display first error */
+	}
+	else
+	    EMSG(_("E999: String or List expected"));
+	free_tv(tv);
+    }
 }
 #endif