changeset 26678:e16806237a70 v8.2.3868

patch 8.2.3868: Vim9: function test fails Commit: https://github.com/vim/vim/commit/1b5f7a6202406b7d7ac804960602350e42b8be80 Author: Bram Moolenaar <Bram@vim.org> Date: Tue Dec 21 13:30:42 2021 +0000 patch 8.2.3868: Vim9: function test fails Problem: Vim9: function test fails. Solution: Add missing changes. Add test for earlier patch.
author Bram Moolenaar <Bram@vim.org>
date Tue, 21 Dec 2021 14:45:03 +0100
parents 51db19c22522
children 2f3b13eae139
files src/testdir/test_vim9_disassemble.vim src/version.c src/vim9type.c
diffstat 3 files changed, 33 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_vim9_disassemble.vim
+++ b/src/testdir/test_vim9_disassemble.vim
@@ -2328,27 +2328,43 @@ def s:ElseifConstant()
   elseif false
     echo "false"
   endif
+  if 0
+    echo "yes"
+  elseif 0
+    echo "no"
+  endif
 enddef
 
 def Test_debug_elseif_constant()
-  var res = execute('disass s:ElseifConstant')
+  var res = execute('disass debug s:ElseifConstant')
   assert_match('<SNR>\d*_ElseifConstant\_s*' ..
           'if g:value\_s*' ..
-          '0 LOADG g:value\_s*' ..
-          '1 COND2BOOL\_s*' ..
-          '2 JUMP_IF_FALSE -> 6\_s*' ..
+          '0 DEBUG line 1-1 varcount 0\_s*' ..
+          '1 LOADG g:value\_s*' ..
+          '2 COND2BOOL\_s*' ..
+          '3 JUMP_IF_FALSE -> 8\_s*' ..
           'echo "one"\_s*' ..
-          '3 PUSHS "one"\_s*' ..
-          '4 ECHO 1\_s*' ..
+          '4 DEBUG line 2-2 varcount 0\_s*' ..
+          '5 PUSHS "one"\_s*' ..
+          '6 ECHO 1\_s*' ..
           'elseif true\_s*' ..
-          '5 JUMP -> 8\_s*' ..
+          '7 JUMP -> 12\_s*' ..
+          '8 DEBUG line 3-3 varcount 0\_s*' ..
           'echo "true"\_s*' ..
-          '6 PUSHS "true"\_s*' ..
-          '7 ECHO 1\_s*' ..
+          '9 DEBUG line 4-4 varcount 0\_s*' ..
+          '10 PUSHS "true"\_s*' ..
+          '11 ECHO 1\_s*' ..
           'elseif false\_s*' ..
           'echo "false"\_s*' ..
           'endif\_s*' ..
-          '\d RETURN void*',
+          'if 0\_s*' ..
+          '12 DEBUG line 8-8 varcount 0\_s*' ..
+          'echo "yes"\_s*' ..
+          'elseif 0\_s*' ..
+          '13 DEBUG line 11-10 varcount 0\_s*' ..
+          'echo "no"\_s*' ..
+          'endif\_s*' ..
+          '14 RETURN void*',
         res)
 enddef
 
--- a/src/version.c
+++ b/src/version.c
@@ -750,6 +750,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    3868,
+/**/
     3867,
 /**/
     3866,
--- a/src/vim9type.c
+++ b/src/vim9type.c
@@ -567,7 +567,9 @@ check_type_maybe(
     {
 	// tt_type should match, except that a "partial" can be assigned to a
 	// variable with type "func".
+	// And "unknown" (using global variable) needs a runtime type check.
 	if (!(expected->tt_type == actual->tt_type
+		    || actual->tt_type == VAR_UNKNOWN
 		    || (expected->tt_type == VAR_FUNC
 					   && actual->tt_type == VAR_PARTIAL)))
 	{
@@ -582,7 +584,7 @@ check_type_maybe(
 	if (expected->tt_type == VAR_DICT || expected->tt_type == VAR_LIST)
 	{
 	    // "unknown" is used for an empty list or dict
-	    if (actual->tt_member != &t_unknown)
+	    if (actual->tt_member != NULL && actual->tt_member != &t_unknown)
 		ret = check_type(expected->tt_member, actual->tt_member,
 								 FALSE, where);
 	}
@@ -592,7 +594,8 @@ check_type_maybe(
 	    // nothing, thus there is no point in checking.
 	    if (expected->tt_member != &t_unknown)
 	    {
-		if (actual->tt_member != &t_unknown)
+		if (actual->tt_member != NULL
+					    && actual->tt_member != &t_unknown)
 		    ret = check_type(expected->tt_member, actual->tt_member,
 								 FALSE, where);
 		else