patch 7.4.1992
Problem:    Values for true and false can be confusing.
Solution:   Update the documentation.  Add a test.  Make v:true evaluate to
            TRUE for a non-zero-arg.
diff --git a/src/Makefile b/src/Makefile
index 4deb4a2..6add935 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -2068,11 +2068,12 @@
 	test_statusline \
 	test_syn_attr \
 	test_syntax \
-	test_usercommands \
 	test_tabline \
 	test_tagjump \
 	test_timers \
+	test_true_false \
 	test_undolevels \
+	test_usercommands \
 	test_unlet \
 	test_viminfo \
 	test_viml \
diff --git a/src/eval.c b/src/eval.c
index 4a1ad4f..69238c1 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -9414,6 +9414,8 @@
 {
     return ((argvars[0].v_type == VAR_NUMBER
 		&& argvars[0].vval.v_number != 0)
+	    || (argvars[0].v_type == VAR_SPECIAL
+		&& argvars[0].vval.v_number == VVAL_TRUE)
 	    || (argvars[0].v_type == VAR_STRING
 		&& argvars[0].vval.v_string != NULL
 		&& *argvars[0].vval.v_string != NUL));
@@ -16350,7 +16352,13 @@
     buf[1] = NUL;
     buf[2] = NUL;
 
-    if (VIsual_active)
+    if (time_for_testing == 93784)
+    {
+	/* Testing the two-character code. */
+	buf[0] = 'x';
+	buf[1] = '!';
+    }
+    else if (VIsual_active)
     {
 	if (VIsual_select)
 	    buf[0] = VIsual_mode + 's' - 'v';
diff --git a/src/testdir/test_alot.vim b/src/testdir/test_alot.vim
index e8546ef..e99e137 100644
--- a/src/testdir/test_alot.vim
+++ b/src/testdir/test_alot.vim
@@ -33,6 +33,7 @@
 source test_tabline.vim
 source test_tagjump.vim
 source test_timers.vim
+source test_true_false.vim
 source test_undolevels.vim
 source test_unlet.vim
 source test_window_cmd.vim
diff --git a/src/testdir/test_true_false.vim b/src/testdir/test_true_false.vim
new file mode 100644
index 0000000..90b4f5e
--- /dev/null
+++ b/src/testdir/test_true_false.vim
@@ -0,0 +1,125 @@
+" Test behavior of boolean-like values.
+
+" Test what is explained at ":help TRUE" and ":help FALSE".
+func Test_if()
+  if v:false
+    call assert_true(false, 'v:false is false')
+  endif
+  if 0
+    call assert_true(false, 'zero is false')
+  endif
+  if "0"
+    call assert_true(false, 'zero string is false')
+  endif
+  if "foo"
+    call assert_true(false, 'foo is false')
+  endif
+  if " "
+    call assert_true(false, 'space is false')
+  endif
+  if empty("foo")
+    call assert_true(false, 'foo is not empty')
+  endif
+
+  if v:true
+  else
+    call assert_true(false, 'v:true is true')
+  endif
+  if 1
+  else
+    call assert_true(false, 'one is true')
+  endif
+  if "1"
+  else
+    call assert_true(false, 'one string is true')
+  endif
+  if "1foo"
+  else
+    call assert_true(false, 'one in string is true')
+  endif
+
+  call assert_fails('if [1]', 'E745')
+  call assert_fails('if {1: 1}', 'E728')
+  call assert_fails('if function("string")', 'E703')
+  call assert_fails('if 1.3")', 'E805')
+endfunc
+
+function Try_arg_true_false(expr, false_val, true_val)
+  for v in ['v:false', '0', '"0"', '"foo"', '" "'] 
+    let r = eval(substitute(a:expr, '%v%', v, ''))
+    call assert_equal(a:false_val, r, 'result for ' . v . ' is not ' . string(a:false_val) . ' but ' . string(r))
+  endfor
+  for v in ['v:true', '1', '"1"', '"1foo"'] 
+    let r = eval(substitute(a:expr, '%v%', v, ''))
+    call assert_equal(a:true_val, r, 'result for ' . v . ' is not ' . string(a:true_val) . ' but ' . string(r))
+  endfor
+endfunc
+
+" Test using TRUE or FALSE values for an argument.
+func Test_true_false_arg()
+  call Try_arg_true_false('count(["a", "A"], "a", %v%)', 1, 2)
+
+  set wildignore=*.swp
+  call Try_arg_true_false('expand("foo.swp", %v%)', "", "foo.swp")
+  call Try_arg_true_false('expand("foo.vim", 0, %v%)', "foo.vim", ["foo.vim"])
+
+  call setreg('a', ['x', 'y'])
+  call Try_arg_true_false('getreg("a", 1, %v%)', "x\ny\n", ['x', 'y'])
+
+  set wildignore=*.vim
+  call Try_arg_true_false('glob("runtest.vim", %v%)', "", "runtest.vim")
+  set wildignore=*.swp
+  call Try_arg_true_false('glob("runtest.vim", 0, %v%)', "runtest.vim", ["runtest.vim"])
+  if has('unix')
+    silent !ln -s doesntexit Xlink
+    call Try_arg_true_false('glob("Xlink", 0, 0, %v%)', "", "Xlink")
+    silent !rm Xlink
+  endif
+
+  set wildignore=*.vim
+  call Try_arg_true_false('globpath(".", "runtest.vim", %v%)', "", "./runtest.vim")
+  set wildignore=*.swp
+  call Try_arg_true_false('globpath(".", "runtest.vim", 0, %v%)', "./runtest.vim", ["./runtest.vim"])
+  if has('unix')
+    silent !ln -s doesntexit Xlink
+    call Try_arg_true_false('globpath(".", "Xlink", 0, 0, %v%)', "", "./Xlink")
+    silent !rm Xlink
+  endif
+endfunc
+
+function Try_arg_non_zero(expr, false_val, true_val)
+  for v in ['v:false', '0', '[1]', '{2:3}', '3.4'] 
+    let r = eval(substitute(a:expr, '%v%', v, ''))
+    call assert_equal(a:false_val, r, 'result for ' . v . ' is not ' . a:false_val . ' but ' . r)
+  endfor
+  for v in ['v:true', '1', '" "', '"0"'] 
+    let r = eval(substitute(a:expr, '%v%', v, ''))
+    call assert_equal(a:true_val, r, 'result for ' . v . ' is not ' . a:true_val . ' but ' . r)
+  endfor
+endfunc
+
+
+" Test using non-zero-arg for an argument.
+func Test_non_zero_arg()
+  call test_settime(93784)
+  call Try_arg_non_zero("mode(%v%)", 'x', 'x!')
+  call test_settime(0)
+
+  call Try_arg_non_zero("shellescape('foo%', %v%)", "'foo%'", "'foo\\%'")
+
+  " visualmode() needs to be called twice to check
+  for v in [v:false, 0, [1], {2:3}, 3.4] 
+    normal vv
+    let r = visualmode(v)
+    call assert_equal('v', r, 'result for ' . string(v) . ' is not "v" but ' . r)
+    let r = visualmode(v)
+    call assert_equal('v', r, 'result for ' . string(v) . ' is not "v" but ' . r)
+  endfor
+  for v in [v:true, 1, " ", "0"] 
+    normal vv
+    let r = visualmode(v)
+    call assert_equal('v', r, 'result for ' . v . ' is not "v" but ' . r)
+    let r = visualmode(v)
+    call assert_equal('', r, 'result for ' . v . ' is not "" but ' . r)
+  endfor
+endfunc
diff --git a/src/version.c b/src/version.c
index c6ab5f4..f235d76 100644
--- a/src/version.c
+++ b/src/version.c
@@ -759,6 +759,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1992,
+/**/
     1991,
 /**/
     1990,