patch 8.2.1977: Vim9: error for using a string in a condition is confusing
Problem: Vim9: error for using a string in a condition is confusing.
Solution: Give a more specific error. Also adjust the compile time type
checking for || and &&.
diff --git a/src/testdir/test_vim9_cmd.vim b/src/testdir/test_vim9_cmd.vim
index 6751483..0e6e946 100644
--- a/src/testdir/test_vim9_cmd.vim
+++ b/src/testdir/test_vim9_cmd.vim
@@ -74,7 +74,7 @@
if 'text'
endif
END
- CheckDefAndScriptFailure(lines, 'E1030:', 1)
+ CheckDefAndScriptFailure(lines, 'E1135:', 1)
lines =<< trim END
if [1]
@@ -88,7 +88,7 @@
if g:cond
endif
END
- CheckDefExecAndScriptFailure(lines, 'E1030:', 2)
+ CheckDefExecAndScriptFailure(lines, 'E1135:', 2)
lines =<< trim END
g:cond = 0
@@ -97,7 +97,7 @@
endif
END
CheckDefFailure(lines, 'E1012:', 3)
- CheckScriptFailure(['vim9script'] + lines, 'E1030:', 4)
+ CheckScriptFailure(['vim9script'] + lines, 'E1135:', 4)
lines =<< trim END
if g:cond
@@ -113,14 +113,14 @@
elseif g:cond
endif
END
- CheckDefExecAndScriptFailure(lines, 'E1030:', 3)
+ CheckDefExecAndScriptFailure(lines, 'E1135:', 3)
lines =<< trim END
while 'text'
endwhile
END
CheckDefFailure(lines, 'E1012:', 1)
- CheckScriptFailure(['vim9script'] + lines, 'E1030:', 2)
+ CheckScriptFailure(['vim9script'] + lines, 'E1135:', 2)
lines =<< trim END
while [1]
@@ -134,7 +134,7 @@
while g:cond
endwhile
END
- CheckDefExecAndScriptFailure(lines, 'E1030:', 2)
+ CheckDefExecAndScriptFailure(lines, 'E1135:', 2)
enddef
def Test_if_linebreak()
diff --git a/src/testdir/test_vim9_disassemble.vim b/src/testdir/test_vim9_disassemble.vim
index 07974d3..37748a1 100644
--- a/src/testdir/test_vim9_disassemble.vim
+++ b/src/testdir/test_vim9_disassemble.vim
@@ -707,6 +707,7 @@
'if has("gui_running")\_s*' ..
'\d PUSHS "gui_running"\_s*' ..
'\d BCALL has(argc 1)\_s*' ..
+ '\d COND2BOOL\_s*' ..
'\d JUMP_IF_FALSE -> \d\_s*' ..
' echo "yes"\_s*' ..
'\d PUSHS "yes"\_s*' ..
@@ -760,14 +761,15 @@
assert_match('ReturnInIf\_s*' ..
'if g:cond\_s*' ..
'0 LOADG g:cond\_s*' ..
- '1 JUMP_IF_FALSE -> 4\_s*' ..
+ '1 COND2BOOL\_s*' ..
+ '2 JUMP_IF_FALSE -> 5\_s*' ..
'return "yes"\_s*' ..
- '2 PUSHS "yes"\_s*' ..
- '3 RETURN\_s*' ..
+ '3 PUSHS "yes"\_s*' ..
+ '4 RETURN\_s*' ..
'else\_s*' ..
' return "no"\_s*' ..
- '4 PUSHS "no"\_s*' ..
- '5 RETURN$',
+ '5 PUSHS "no"\_s*' ..
+ '6 RETURN$',
instr)
enddef
@@ -1357,16 +1359,17 @@
assert_match('ReturnBool\_s*' ..
'var name: bool = 1 && 0 || 1\_s*' ..
'0 PUSHNR 1\_s*' ..
- '1 JUMP_IF_COND_FALSE -> 3\_s*' ..
- '2 PUSHNR 0\_s*' ..
- '3 COND2BOOL\_s*' ..
- '4 JUMP_IF_COND_TRUE -> 6\_s*' ..
- '5 PUSHNR 1\_s*' ..
- '6 2BOOL (!!val)\_s*' ..
+ '1 2BOOL (!!val)\_s*' ..
+ '2 JUMP_IF_COND_FALSE -> 5\_s*' ..
+ '3 PUSHNR 0\_s*' ..
+ '4 2BOOL (!!val)\_s*' ..
+ '5 JUMP_IF_COND_TRUE -> 8\_s*' ..
+ '6 PUSHNR 1\_s*' ..
+ '7 2BOOL (!!val)\_s*' ..
'\d STORE $0\_s*' ..
'return name\_s*' ..
- '\d LOAD $0\_s*' ..
- '\d RETURN',
+ '\d\+ LOAD $0\_s*' ..
+ '\d\+ RETURN',
instr)
assert_equal(true, InvertBool())
enddef
diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim
index 83db715..24d30e2 100644
--- a/src/testdir/test_vim9_expr.vim
+++ b/src/testdir/test_vim9_expr.vim
@@ -131,7 +131,7 @@
vim9script
var name = 'x' ? 1 : 2
END
- CheckScriptFailure(lines, 'E1030:', 2)
+ CheckScriptFailure(lines, 'E1135:', 2)
lines =<< trim END
vim9script
@@ -180,7 +180,7 @@
call CheckDefFailure(["var x = 1 ? 'one' :'two'"], msg, 1)
call CheckDefFailure(["var x = 1 ? 'one':'two'"], msg, 1)
- call CheckDefFailure(["var x = 'x' ? 'one' : 'two'"], 'E1030:', 1)
+ call CheckDefFailure(["var x = 'x' ? 'one' : 'two'"], 'E1135:', 1)
call CheckDefFailure(["var x = 0z1234 ? 'one' : 'two'"], 'E974:', 1)
call CheckDefExecFailure(["var x = [] ? 'one' : 'two'"], 'E745:', 1)
call CheckDefExecFailure(["var x = {} ? 'one' : 'two'"], 'E728:', 1)
@@ -356,11 +356,12 @@
call CheckDefFailure(["var x = 1|| 2"], msg, 1)
call CheckDefFailure(["var x = 1 || xxx"], 'E1001:', 1)
+ call CheckDefFailure(["var x = [] || false"], 'E1012:', 1)
+ call CheckDefFailure(["if 'yes' || 0", 'echo 0', 'endif'], 'E1012: Type mismatch; expected bool but got string', 1)
# TODO: should fail at compile time
call CheckDefExecFailure(["var x = 3 || 7"], 'E1023:', 1)
call CheckScriptFailure(["vim9script", "var x = 3 || 7"], 'E1023:', 2)
- call CheckDefExecFailure(["var x = [] || false"], 'E745:', 1)
call CheckScriptFailure(["vim9script", "var x = [] || false"], 'E745:', 2)
enddef
@@ -492,6 +493,8 @@
call CheckDefFailure(["var x = 1&&2"], msg, 1)
call CheckDefFailure(["var x = 1 &&2"], msg, 1)
call CheckDefFailure(["var x = 1&& 2"], msg, 1)
+
+ call CheckDefFailure(["if 'yes' && 0", 'echo 0', 'endif'], 'E1012: Type mismatch; expected bool but got string', 1)
endfunc
" global variables to use for tests with the "any" type