END
v9.CheckSourceScriptFailure(lines, 'E1405: Class "B" cannot be used as a value')
+ # Expression evaluation should stop after using a class with the falsy
+ # operator
+ lines =<< trim END
+ vim9script
+ class C
+ endclass
+ var output: string = 'pass'
+ try
+ echo C ?? 'falsy' !! execute("output = 'fail'")
+ catch /E1405:/
+ endtry
+ assert_equal('pass', output)
+ END
+ v9.CheckSourceScriptSuccess(lines)
+
+ # When using a class with the falsy operator, expression evaluation should
+ # be aborted in a function
+ g:falsy_output = 'pass'
+ lines =<< trim END
+ vim9script
+ class C
+ endclass
+ g:falsy_output = 'pass'
+ def Fn()
+ echo C ?? 'falsy' !! execute('g:falsy_output = "fail"')
+ enddef
+ Fn()
+ END
+ v9.CheckSourceScriptFailure(lines, 'E1405: Class "C" cannot be used as a value', 1)
+ assert_equal('pass', g:falsy_output)
+ unlet g:falsy_output
+
+ # When using a class with the "!" operator, expression evaluation should be
+ # aborted
+ lines =<< trim END
+ vim9script
+ class C
+ endclass
+ var output: string = 'pass'
+ try
+ echo !C !! execute("output = 'fail'")
+ catch /E1405:/
+ endtry
+ assert_equal('pass', output)
+ END
+ v9.CheckSourceScriptSuccess(lines)
+
+ # When using a class with the "!" operator, expression evaluation should be
+ # aborted in a function
+ g:falsy_output = 'pass'
+ lines =<< trim END
+ vim9script
+ class C
+ endclass
+ def Fn()
+ echo !C !! execute('g:falsy_output = "fail"')
+ enddef
+ Fn()
+ END
+ v9.CheckSourceScriptFailure(lines, 'E1405: Class "C" cannot be used as a value', 1)
+ assert_equal('pass', g:falsy_output)
+ unlet g:falsy_output
+
lines =<< trim END
vim9script
echo null_class ?? 'falsy'
END
v9.CheckSourceScriptFailure(lines, 'E1421: Enum "E2" cannot be used as a value')
+ # Expression evaluation should stop after using an enum with the falsy
+ # operator
+ lines =<< trim END
+ vim9script
+ enum E
+ endenum
+ var output: string = 'pass'
+ try
+ echo E ?? 'falsy' !! execute("output = 'fail'")
+ catch /E1421:/
+ endtry
+ assert_equal('pass', output)
+ END
+ v9.CheckSourceScriptSuccess(lines)
+
+ # When using a enum with the falsy operator, expression evaluation should
+ # be aborted in a function
+ g:falsy_output = 'pass'
+ lines =<< trim END
+ vim9script
+ enum E3
+ endenum
+ g:falsy_output = 'pass'
+ def Fn()
+ echo E3 ?? 'falsy' !! execute('g:falsy_output = "fail"')
+ enddef
+ Fn()
+ END
+ v9.CheckSourceScriptFailure(lines, 'E1421: Enum "E3" cannot be used as a value', 1)
+ assert_equal('pass', g:falsy_output)
+ unlet g:falsy_output
+
+ # Expression evaluation should stop after using an enum with the ! operator
+ lines =<< trim END
+ vim9script
+ enum E
+ endenum
+ var output: string = 'pass'
+ try
+ echo !E !! execute("output = 'fail'")
+ catch /E1421:/
+ endtry
+ assert_equal('pass', output)
+ END
+ v9.CheckSourceScriptSuccess(lines)
+
+ # When using a enum with the "!" operator, expression evaluation should be
+ # aborted in a function
+ g:falsy_output = 'pass'
+ lines =<< trim END
+ vim9script
+ enum E4
+ endenum
+ def Fn()
+ echo !E4 !! execute('g:falsy_output = "fail"')
+ enddef
+ Fn()
+ END
+ v9.CheckSourceScriptFailure(lines, 'E1421: Enum "E4" cannot be used as a value', 1)
+ assert_equal('pass', g:falsy_output)
+ unlet g:falsy_output
+
# typealias cannot be used with the falsy operator
lines =<< trim END
vim9script
END
v9.CheckSourceScriptFailure(lines, 'E1403: Type alias "T2" cannot be used as a value')
+ # Expression evaluation should stop after using a typealias with the falsy
+ # operator
+ lines =<< trim END
+ vim9script
+ type T3 = dict<string>
+ var output: string = 'pass'
+ try
+ echo T3 ?? 'falsy' !! execute("output = 'fail'")
+ catch /E1403:/
+ endtry
+ assert_equal('pass', output)
+ END
+ v9.CheckSourceScriptSuccess(lines)
+
+ # When using a typealias with the falsy operator, expression evaluation
+ # should be aborted in a function
+ g:falsy_output = 'pass'
+ lines =<< trim END
+ vim9script
+ type T3 = dict<job>
+ g:falsy_output = 'pass'
+ def Fn()
+ echo T3 ?? 'falsy' !! execute('g:falsy_output = "fail"')
+ enddef
+ Fn()
+ END
+ v9.CheckSourceScriptFailure(lines, 'E1407: Cannot use a Typealias as a variable or value', 1)
+ assert_equal('pass', g:falsy_output)
+ unlet g:falsy_output
+
+ # Expression evaluation should stop after using a typealias with the !
+ # operator
+ lines =<< trim END
+ vim9script
+ type T3 = dict<string>
+ var output: string = 'pass'
+ try
+ echo !T3 !! execute("output = 'fail'")
+ catch /E1403:/
+ endtry
+ assert_equal('pass', output)
+ END
+ v9.CheckSourceScriptSuccess(lines)
+
+ # When using a typealias with the "!" operator, expression evaluation should
+ # be aborted in a function
+ g:falsy_output = 'pass'
+ lines =<< trim END
+ vim9script
+ type T4 = list<number>
+ def Fn()
+ echo !T4 !! execute('g:falsy_output = "fail"')
+ enddef
+ Fn()
+ END
+ v9.CheckSourceScriptFailure(lines, 'E1407: Cannot use a Typealias as a variable or value', 1)
+ assert_equal('pass', g:falsy_output)
+ unlet g:falsy_output
+
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)