diff --git a/runtime/doc/vim9.txt b/runtime/doc/vim9.txt index 57ebec375fda5c..c6c012b45e1814 100644 --- a/runtime/doc/vim9.txt +++ b/runtime/doc/vim9.txt @@ -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 8e5a53d51cb75b..87b82163869b00 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/vim9execute.c b/src/vim9execute.c index 2b2d59ad51d5ae..9763cd95b1e7cb 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; }