From: Yegappan Lakshmanan Date: Mon, 19 Jan 2026 18:21:12 +0000 (+0000) Subject: patch 9.1.2096: Vim9: truthiness issue with objects X-Git-Tag: v9.1.2096^0 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4a08c8b5d4729b4d5eafe11886611d2053672384;p=thirdparty%2Fvim.git patch 9.1.2096: Vim9: truthiness issue with objects Problem: Vim9: truthiness issue with objects (kennypete) Solution: Return true for an non-null object (Yegappan Lakshmanan) related: #19173 closes: #19213 Signed-off-by: Yegappan Lakshmanan Signed-off-by: Christian Brabandt --- diff --git a/runtime/doc/vim9.txt b/runtime/doc/vim9.txt index 57ebec375f..a15b19391f 100644 --- a/runtime/doc/vim9.txt +++ b/runtime/doc/vim9.txt @@ -1,4 +1,4 @@ -*vim9.txt* For Vim version 9.1. Last change: 2025 Dec 03 +*vim9.txt* For Vim version 9.1. Last change: 2026 Jan 19 VIM REFERENCE MANUAL by Bram Moolenaar @@ -1084,8 +1084,11 @@ empty list and dict is falsy: special true or v:true job when not NULL channel when not NULL - class when not NULL - object when not NULL (TODO: when isTrue() returns true) + class not applicable + object when not NULL + enum not applicable + enum value always + typealias not applicable The boolean operators "||" and "&&" expect the values to be boolean, zero or one: > diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim index 8e5a53d51c..87b8216386 100644 --- a/src/testdir/test_vim9_expr.vim +++ b/src/testdir/test_vim9_expr.vim @@ -231,6 +231,38 @@ def Test_expr1_falsy() END v9.CheckDefAndScriptSuccess(lines) + # falsy operator with objects and enum values + lines =<< trim END + vim9script + class C + endclass + + var c = C.new() + assert_equal(c, c ?? 'falsy') + assert_equal('truthy', !c ?? 'truthy') + assert_equal('falsy', null_object ?? 'falsy') + assert_equal(true, !null_object ?? 'truthy') + + enum Color + Red, + Blue + endenum + assert_equal(Color.Red, Color.Red ?? 'falsy') + assert_equal('truthy', !Color.Red ?? 'truthy') + + def Fn() + var c2 = C.new() + assert_equal(c2, c2 ?? 'falsy') + assert_equal('truthy', !c2 ?? 'truthy') + assert_equal('falsy', null_object ?? 'falsy') + assert_equal(true, !null_object ?? 'truthy') + assert_equal(Color.Red, Color.Red ?? 'falsy') + assert_equal('truthy', !Color.Red ?? 'truthy') + enddef + Fn() + END + v9.CheckSourceScriptSuccess(lines) + var msg = "White space required before and after '??'" call v9.CheckDefAndScriptFailure(["var x = 1?? 'one' : 'two'"], msg, 1) call v9.CheckDefAndScriptFailure(["var x = 1 ??'one' : 'two'"], msg, 1) diff --git a/src/version.c b/src/version.c index 4b9fa37d7e..cbf48413c7 100644 --- a/src/version.c +++ b/src/version.c @@ -734,6 +734,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 2096, /**/ 2095, /**/ diff --git a/src/vim9execute.c b/src/vim9execute.c index 2b2d59ad51..9763cd95b1 100644 --- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -8127,12 +8127,15 @@ tv2bool(typval_T *tv) #endif case VAR_BLOB: return tv->vval.v_blob != NULL && tv->vval.v_blob->bv_ga.ga_len > 0; + + case VAR_OBJECT: + return tv->vval.v_object != NULL; + case VAR_UNKNOWN: case VAR_ANY: case VAR_VOID: case VAR_INSTR: case VAR_CLASS: - case VAR_OBJECT: case VAR_TYPEALIAS: break; }