updated for version 7.4.249
Problem:    Using setreg() with a list of numbers does not work.
Solution:   Use a separate buffer for numbers. (ZyX)
diff --git a/src/eval.c b/src/eval.c
index be8d4da..2014deb 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -16827,24 +16827,36 @@
     if (argvars[1].v_type == VAR_LIST)
     {
 	char_u		**lstval;
+	char_u		**allocval;
+	char_u		buf[NUMBUFLEN];
 	char_u		**curval;
+	char_u		**curallocval;
 	int		len = argvars[1].vval.v_list->lv_len;
 	listitem_T	*li;
 
-	lstval = (char_u **)alloc(sizeof(char_u *) * (len + 1));
+	/* First half: use for pointers to result lines; second half: use for
+	 * pointers to allocated copies. */
+	lstval = (char_u **)alloc(sizeof(char_u *) * ((len + 1) * 2));
 	if (lstval == NULL)
 	    return;
 	curval = lstval;
+	allocval = lstval + len + 2;
+	curallocval = allocval;
 
 	for (li = argvars[1].vval.v_list->lv_first; li != NULL;
 							     li = li->li_next)
 	{
-	    /* TODO: this may use a static buffer several times. */
-	    strval = get_tv_string_chk(&li->li_tv);
+	    strval = get_tv_string_buf_chk(&li->li_tv, buf);
 	    if (strval == NULL)
+		goto free_lstval;
+	    if (strval == buf)
 	    {
-		vim_free(lstval);
-		return;
+		/* Need to make a copy, next get_tv_string_buf_chk() will
+		 * overwrite the string. */
+		strval = vim_strsave(buf);
+		if (strval == NULL)
+		    goto free_lstval;
+		*curallocval++ = strval;
 	    }
 	    *curval++ = strval;
 	}
@@ -16852,6 +16864,9 @@
 
 	write_reg_contents_lst(regname, lstval, -1,
 						append, yank_type, block_len);
+free_lstval:
+	while (curallocval > allocval)
+	    vim_free(*--curallocval);
 	vim_free(lstval);
     }
     else
@@ -20453,6 +20468,9 @@
     return res != NULL ? res : (char_u *)"";
 }
 
+/*
+ * Careful: This uses a single, static buffer.  YOU CAN ONLY USE IT ONCE!
+ */
     char_u *
 get_tv_string_chk(varp)
     typval_T	*varp;
diff --git a/src/testdir/test_eval.in b/src/testdir/test_eval.in
index 0a7ede6..b102be2 100644
--- a/src/testdir/test_eval.in
+++ b/src/testdir/test_eval.in
@@ -90,6 +90,8 @@
 call SetReg('b', ['abcB3'], 'l')
 call SetReg('c', ['abcC3'], 'b')
 call SetReg('d', ['abcD3'])
+call SetReg('e', [1, 2, 'abc', 3])
+call SetReg('f', [1, 2, 3])
 
 $put ='{{{1 Appending lists with setreg()'
 call SetReg('A', ['abcA3c'], 'c')
@@ -128,8 +130,8 @@
 call ErrExe('call setreg([], 2)')
 call ErrExe('call setreg(1, {})')
 call ErrExe('call setreg(1, 2, [])')
-call ErrExe('call setreg("/", [1, 2])')
-call ErrExe('call setreg("=", [1, 2])')
+call ErrExe('call setreg("/", ["1", "2"])')
+call ErrExe('call setreg("=", ["1", "2"])')
 call ErrExe('call setreg(1, ["", "", [], ""])')
 endfun
 :"
diff --git a/src/testdir/test_eval.ok b/src/testdir/test_eval.ok
index 7fe5f1b..061e0cf 100644
--- a/src/testdir/test_eval.ok
+++ b/src/testdir/test_eval.ok
Binary files differ
diff --git a/src/version.c b/src/version.c
index eaa74cd..c002107 100644
--- a/src/version.c
+++ b/src/version.c
@@ -735,6 +735,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    249,
+/**/
     248,
 /**/
     247,