patch 8.2.1795: Vim9: operators && and || have a confusing result
Problem: Vim9: operators && and || have a confusing result.
Solution: Make the result a boolean.
diff --git a/src/testdir/test_vim9_assign.vim b/src/testdir/test_vim9_assign.vim
index 7d32912..189ff4d 100644
--- a/src/testdir/test_vim9_assign.vim
+++ b/src/testdir/test_vim9_assign.vim
@@ -22,11 +22,11 @@
var bool4: bool = 1
assert_equal(true, bool4)
- var bool5: bool = 'yes' && 'no'
+ var bool5: bool = 1 && true
assert_equal(true, bool5)
- var bool6: bool = [] && 99
+ var bool6: bool = 0 && 1
assert_equal(false, bool6)
- var bool7: bool = [] || #{a: 1} && 99
+ var bool7: bool = 0 || 1 && true
assert_equal(true, bool7)
var lines =<< trim END
@@ -41,9 +41,9 @@
assert_equal(false, flag)
flag = 1
assert_equal(true, flag)
- flag = 99 || 123
+ flag = 1 || true
assert_equal(true, flag)
- flag = 'yes' && []
+ flag = 1 && false
assert_equal(false, flag)
END
CheckScriptSuccess(lines)
diff --git a/src/testdir/test_vim9_cmd.vim b/src/testdir/test_vim9_cmd.vim
index 060b083..82d5f32 100644
--- a/src/testdir/test_vim9_cmd.vim
+++ b/src/testdir/test_vim9_cmd.vim
@@ -72,8 +72,8 @@
var lines =<< trim END
vim9script
if 1 &&
- 2
- || 3
+ true
+ || 1
g:res = 42
endif
assert_equal(42, g:res)
diff --git a/src/testdir/test_vim9_disassemble.vim b/src/testdir/test_vim9_disassemble.vim
index a8dbe1a..ceeae0d 100644
--- a/src/testdir/test_vim9_disassemble.vim
+++ b/src/testdir/test_vim9_disassemble.vim
@@ -766,11 +766,11 @@
'\d LOAD arg\[-1]\_s*' ..
'\d PUSHNR 1\_s*' ..
'\d COMPAREANY ==\_s*' ..
- '\d JUMP_AND_KEEP_IF_FALSE -> \d\+\_s*' ..
+ '\d JUMP_IF_COND_FALSE -> \d\+\_s*' ..
'\d LOAD arg\[-1]\_s*' ..
'\d PUSHNR 2\_s*' ..
'\d COMPAREANY !=\_s*' ..
- '\d JUMP_AND_KEEP_IF_TRUE -> \d\+\_s*' ..
+ '\d JUMP_IF_COND_TRUE -> \d\+\_s*' ..
'\d LOAD arg\[-1]\_s*' ..
'\d\+ PUSHNR 4\_s*' ..
'\d\+ COMPAREANY ==\_s*' ..
@@ -1200,22 +1200,23 @@
enddef
def ReturnBool(): bool
- var var: bool = "no" && [] || 123
- return var
+ var name: bool = 1 && 0 || 1
+ return name
enddef
def Test_disassemble_return_bool()
var instr = execute('disassemble ReturnBool')
assert_match('ReturnBool\_s*' ..
- 'var var: bool = "no" && \[\] || 123\_s*' ..
- '0 PUSHS "no"\_s*' ..
- '1 JUMP_AND_KEEP_IF_FALSE -> 3\_s*' ..
- '2 NEWLIST size 0\_s*' ..
- '3 JUMP_AND_KEEP_IF_TRUE -> 5\_s*' ..
- '4 PUSHNR 123\_s*' ..
- '5 2BOOL (!!val)\_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*' ..
'\d STORE $0\_s*' ..
- 'return var\_s*' ..
+ 'return name\_s*' ..
'\d LOAD $0\_s*' ..
'\d RETURN',
instr)
diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim
index 253e469..5158e10 100644
--- a/src/testdir/test_vim9_expr.vim
+++ b/src/testdir/test_vim9_expr.vim
@@ -196,32 +196,32 @@
" test ||
def Test_expr2()
- assert_equal(2, 2 || 0)
- assert_equal(7, 0 ||
+ assert_equal(true, 1 || 0)
+ assert_equal(true, 0 ||
0 ||
- 7)
- assert_equal(0, 0 || 0)
- assert_equal(0, 0
+ 1)
+ assert_equal(false, 0 || 0)
+ assert_equal(false, 0
|| 0)
- assert_equal('', 0 || '')
+ assert_equal(false, 0 || false)
g:vals = []
- assert_equal(3, Record(3) || Record(1))
- assert_equal([3], g:vals)
+ assert_equal(true, Record(1) || Record(3))
+ assert_equal([1], g:vals)
g:vals = []
- assert_equal(5, Record(0) || Record(5))
- assert_equal([0, 5], g:vals)
+ assert_equal(true, Record(0) || Record(1))
+ assert_equal([0, 1], g:vals)
g:vals = []
- assert_equal(4, Record(0)
- || Record(4)
+ assert_equal(true, Record(0)
+ || Record(1)
|| Record(0))
- assert_equal([0, 4], g:vals)
+ assert_equal([0, 1], g:vals)
g:vals = []
- assert_equal(0, Record([]) || Record('') || Record(0))
- assert_equal([[], '', 0], g:vals)
+ assert_equal(false, Record(0) || Record(false) || Record(0))
+ assert_equal([0, false, 0], g:vals)
enddef
def Test_expr2_vimscript()
@@ -230,7 +230,7 @@
vim9script
var name = 0
|| 1
- assert_equal(1, name)
+ assert_equal(true, name)
END
CheckScriptSuccess(lines)
@@ -269,80 +269,85 @@
END
CheckScriptFailure(lines, 'E1004:', 2)
- # check keeping the value
+ # check evaluating to bool
lines =<< trim END
- vim9script
- assert_equal(2, 2 || 0)
- assert_equal(7, 0 ||
+ assert_equal(true, 1 || 0)
+ assert_equal(true, 0 ||
0 ||
- 7)
- assert_equal(0, 0 || 0)
- assert_equal(0, 0
+ !!7)
+ assert_equal(false, 0 || 0)
+ assert_equal(false, 0
|| 0)
- assert_equal('', 0 || '')
+ assert_equal(false, 0 || false)
g:vals = []
- assert_equal(3, Record(3) || Record(1))
- assert_equal([3], g:vals)
+ assert_equal(true, Record(true) || Record(false))
+ assert_equal([true], g:vals)
g:vals = []
- assert_equal(5, Record(0) || Record(5))
- assert_equal([0, 5], g:vals)
+ assert_equal(true, Record(0) || Record(true))
+ assert_equal([0, true], g:vals)
g:vals = []
- assert_equal(4, Record(0)
- || Record(4)
+ assert_equal(true, Record(0)
+ || Record(true)
|| Record(0))
- assert_equal([0, 4], g:vals)
+ assert_equal([0, true], g:vals)
g:vals = []
- assert_equal(0, Record([]) || Record('') || Record(0))
- assert_equal([[], '', 0], g:vals)
+ assert_equal(false, Record(0) || Record(false) || Record(0))
+ assert_equal([0, false, 0], g:vals)
END
- CheckScriptSuccess(lines)
+ CheckDefAndScriptSuccess(lines)
enddef
-func Test_expr2_fails()
- let msg = "White space required before and after '||'"
+def Test_expr2_fails()
+ var msg = "White space required before and after '||'"
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(["var x = 1 || xxx"], 'E1001:', 1)
-endfunc
+
+ # 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
" test &&
def Test_expr3()
- assert_equal(0, 2 && 0)
- assert_equal(0, 0 &&
+ assert_equal(false, 1 && 0)
+ assert_equal(false, 0 &&
0 &&
- 7)
- assert_equal(7, 2
- && 3
- && 7)
- assert_equal(0, 0 && 0)
- assert_equal(0, 0 && '')
- assert_equal('', 8 && '')
+ 1)
+ assert_equal(true, 1
+ && true
+ && 1)
+ assert_equal(false, 0 && 0)
+ assert_equal(false, 0 && false)
+ assert_equal(true, 1 && true)
g:vals = []
- assert_equal(1, Record(3) && Record(1))
- assert_equal([3, 1], g:vals)
+ assert_equal(true, Record(true) && Record(1))
+ assert_equal([true, 1], g:vals)
g:vals = []
- assert_equal(0, Record(0) && Record(5))
+ assert_equal(false, Record(0) && Record(1))
assert_equal([0], g:vals)
g:vals = []
- assert_equal(0, Record(0) && Record(4) && Record(0))
+ assert_equal(false, Record(0) && Record(4) && Record(0))
assert_equal([0], g:vals)
g:vals = []
- assert_equal(0, Record(8) && Record(4) && Record(0))
- assert_equal([8, 4, 0], g:vals)
+ assert_equal(false, Record(1) && Record(true) && Record(0))
+ assert_equal([1, true, 0], g:vals)
g:vals = []
- assert_equal(0, Record([1]) && Record('z') && Record(0))
- assert_equal([[1], 'z', 0], g:vals)
+ assert_equal(false, Record(1) && Record(true) && Record(0))
+ assert_equal([1, true, 0], g:vals)
enddef
def Test_expr3_vimscript()
@@ -351,7 +356,7 @@
vim9script
var name = 0
&& 1
- assert_equal(0, name)
+ assert_equal(false, name)
END
CheckScriptSuccess(lines)
@@ -393,36 +398,32 @@
# check keeping the value
lines =<< trim END
vim9script
- assert_equal(0, 2 && 0)
- assert_equal(0, 0 &&
+ assert_equal(false, 1 && 0)
+ assert_equal(false, 0 &&
0 &&
- 7)
- assert_equal(7, 2
- && 3
- && 7)
- assert_equal(0, 0 && 0)
- assert_equal(0, 0 && '')
- assert_equal('', 8 && '')
+ 1)
+ assert_equal(true, 1
+ && true
+ && 1)
+ assert_equal(false, 0 && 0)
+ assert_equal(false, 0 && false)
+ assert_equal(false, 1 && 0)
g:vals = []
- assert_equal(1, Record(3) && Record(1))
- assert_equal([3, 1], g:vals)
+ assert_equal(true, Record(1) && Record(true))
+ assert_equal([1, true], g:vals)
g:vals = []
- assert_equal(0, Record(0) && Record(5))
+ assert_equal(false, Record(0) && Record(1))
assert_equal([0], g:vals)
g:vals = []
- assert_equal(0, Record(0) && Record(4) && Record(0))
+ assert_equal(false, Record(0) && Record(1) && Record(0))
assert_equal([0], g:vals)
g:vals = []
- assert_equal(0, Record(8) && Record(4) && Record(0))
- assert_equal([8, 4, 0], g:vals)
-
- g:vals = []
- assert_equal(0, Record([1]) && Record('z') && Record(0))
- assert_equal([[1], 'z', 0], g:vals)
+ assert_equal(false, Record(1) && Record(true) && Record(0))
+ assert_equal([1, true, 0], g:vals)
END
CheckScriptSuccess(lines)
enddef