patch 7.4.1223
Problem:    Crash when setting v:errors to a number.
Solution:   Free the typval without assuming its type. (Yasuhiro Matsumoto)
diff --git a/src/eval.c b/src/eval.c
index d2ebeb9..db7ae75 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -919,6 +919,8 @@
 	    /* add to compat scope dict */
 	    hash_add(&compat_hashtab, p->vv_di.di_key);
     }
+    vimvars[VV_VERSION].vv_nr = VIM_VERSION_100;
+
     set_vim_var_nr(VV_SEARCHFORWARD, 1L);
     set_vim_var_nr(VV_HLSEARCH, 1L);
     set_vim_var_dict(VV_COMPLETED_ITEM, dict_alloc());
@@ -20616,11 +20618,8 @@
     char_u	*val,
     int		len)	    /* length of "val" to use or -1 (whole string) */
 {
-    /* Need to do this (at least) once, since we can't initialize a union.
-     * Will always be invoked when "v:progname" is set. */
-    vimvars[VV_VERSION].vv_nr = VIM_VERSION_100;
-
-    vim_free(vimvars[idx].vv_str);
+    clear_tv(&vimvars[idx].vv_di.di_tv);
+    vimvars[idx].vv_type = VAR_STRING;
     if (val == NULL)
 	vimvars[idx].vv_str = NULL;
     else if (len == -1)
@@ -20635,7 +20634,8 @@
     void
 set_vim_var_list(int idx, list_T *val)
 {
-    list_unref(vimvars[idx].vv_list);
+    clear_tv(&vimvars[idx].vv_di.di_tv);
+    vimvars[idx].vv_type = VAR_LIST;
     vimvars[idx].vv_list = val;
     if (val != NULL)
 	++val->lv_refcount;
@@ -20650,7 +20650,8 @@
     int		todo;
     hashitem_T	*hi;
 
-    dict_unref(vimvars[idx].vv_dict);
+    clear_tv(&vimvars[idx].vv_di.di_tv);
+    vimvars[idx].vv_type = VAR_DICT;
     vimvars[idx].vv_dict = val;
     if (val != NULL)
     {
diff --git a/src/testdir/test_assert.vim b/src/testdir/test_assert.vim
index 70a303f..22046e2 100644
--- a/src/testdir/test_assert.vim
+++ b/src/testdir/test_assert.vim
@@ -37,6 +37,15 @@
   endtry
 endfunc
 
+func Test_wrong_error_type()
+  let save_verrors = v:errors
+  let v:['errors'] = {'foo': 3}
+  call assert_equal('yes', 'no')
+  let verrors = v:errors
+  let v:errors = save_verrors
+  call assert_equal(type([]), type(verrors))
+endfunc
+
 func Test_user_is_happy()
   smile
   sleep 300m
diff --git a/src/version.c b/src/version.c
index b521511..00d9c0b 100644
--- a/src/version.c
+++ b/src/version.c
@@ -743,6 +743,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1223,
+/**/
     1222,
 /**/
     1221,