Skip to content

Commit 6e4cfff

Browse files
committed
patch 8.2.1412: Vim: not operator does not result in boolean
Problem: Vim: not operator does not result in boolean. Solution: Make type depend on operator. (issue 6678) Fix using "false" and "true" in Vim9 script.
1 parent a9a47d1 commit 6e4cfff

3 files changed

Lines changed: 33 additions & 1 deletion

File tree

src/eval.c

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3222,12 +3222,14 @@ eval7(
32223222
{
32233223
rettv->v_type = VAR_BOOL;
32243224
rettv->vval.v_number = VVAL_TRUE;
3225+
ret = OK;
32253226
}
32263227
else if (len == 5 && in_vim9script()
32273228
&& STRNCMP(s, "false", 4) == 0)
32283229
{
32293230
rettv->v_type = VAR_BOOL;
32303231
rettv->vval.v_number = VVAL_FALSE;
3232+
ret = OK;
32313233
}
32323234
else
32333235
ret = eval_variable(s, len, rettv, NULL, TRUE, FALSE);
@@ -3271,6 +3273,7 @@ eval7_leader(
32713273
int ret = OK;
32723274
int error = FALSE;
32733275
varnumber_T val = 0;
3276+
vartype_T type = rettv->v_type;
32743277
#ifdef FEAT_FLOAT
32753278
float_T f = 0.0;
32763279

@@ -3301,7 +3304,10 @@ eval7_leader(
33013304
f = !f;
33023305
else
33033306
#endif
3307+
{
33043308
val = !val;
3309+
type = VAR_BOOL;
3310+
}
33053311
}
33063312
else if (*end_leader == '-')
33073313
{
@@ -3310,7 +3316,10 @@ eval7_leader(
33103316
f = -f;
33113317
else
33123318
#endif
3319+
{
33133320
val = -val;
3321+
type = VAR_NUMBER;
3322+
}
33143323
}
33153324
}
33163325
#ifdef FEAT_FLOAT
@@ -3323,7 +3332,10 @@ eval7_leader(
33233332
#endif
33243333
{
33253334
clear_tv(rettv);
3326-
rettv->v_type = VAR_NUMBER;
3335+
if (in_vim9script())
3336+
rettv->v_type = type;
3337+
else
3338+
rettv->v_type = VAR_NUMBER;
33273339
rettv->vval.v_number = val;
33283340
}
33293341
}

src/testdir/test_vim9_expr.vim

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1313,6 +1313,16 @@ def Test_expr7_special()
13131313
assert_equal(g:special_false, false)
13141314
assert_equal(g:special_true, v:true)
13151315
assert_equal(g:special_false, v:false)
1316+
1317+
assert_equal(true, !false)
1318+
assert_equal(false, !true)
1319+
assert_equal(true, !0)
1320+
assert_equal(false, !1)
1321+
assert_equal(false, !!false)
1322+
assert_equal(true, !!true)
1323+
assert_equal(false, !!0)
1324+
assert_equal(true, !!1)
1325+
13161326
assert_equal(g:special_null, v:null)
13171327
assert_equal(g:special_none, v:none)
13181328

@@ -1332,6 +1342,14 @@ def Test_expr7_special_vim9script()
13321342
assert_equal(true, t)
13331343
assert_equal(v:false, false)
13341344
assert_equal(false, f)
1345+
assert_equal(true, !false)
1346+
assert_equal(false, !true)
1347+
assert_equal(true, !0)
1348+
assert_equal(false, !1)
1349+
assert_equal(false, !!false)
1350+
assert_equal(true, !!true)
1351+
assert_equal(false, !!0)
1352+
assert_equal(true, !!1)
13351353
END
13361354
CheckScriptSuccess(lines)
13371355
enddef

src/version.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -754,6 +754,8 @@ static char *(features[]) =
754754

755755
static int included_patches[] =
756756
{ /* Add new patch number below this line */
757+
/**/
758+
1412,
757759
/**/
758760
1411,
759761
/**/

0 commit comments

Comments
 (0)