summaryrefslogtreecommitdiffstats
path: root/src/testdir
diff options
context:
space:
mode:
authorErnie Rael <errael@raelity.com>2023-12-14 20:11:44 +0100
committerChristian Brabandt <cb@256bit.org>2023-12-14 20:14:13 +0100
commitb077b58809f6bd1078f409829cc1964b8475f9fc (patch)
tree107b60d5e8ef6e8f0471de02f281dbc7e510a919 /src/testdir
parent9a775b4a2ae658e61f9d6582de72ea7a1b241aaa (diff)
patch 9.0.2164: Vim9: can use type a func arg/return valuev9.0.2164
Problem: Vim9: can use type a func arg/return value Solution: Check if using type as function argument or return value closes: #13675 Signed-off-by: Ernie Rael <errael@raelity.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
Diffstat (limited to 'src/testdir')
-rw-r--r--src/testdir/test_vim9_assign.vim4
-rw-r--r--src/testdir/test_vim9_class.vim2
-rw-r--r--src/testdir/test_vim9_typealias.vim234
3 files changed, 237 insertions, 3 deletions
diff --git a/src/testdir/test_vim9_assign.vim b/src/testdir/test_vim9_assign.vim
index 38504f1af9..d582000be1 100644
--- a/src/testdir/test_vim9_assign.vim
+++ b/src/testdir/test_vim9_assign.vim
@@ -3197,7 +3197,7 @@ def Test_func_argtype_check()
assert_fails('IntArg(j)', 'E1013: Argument 1: type mismatch, expected number but got job')
assert_fails('IntArg(ch)', 'E1013: Argument 1: type mismatch, expected number but got channel')
endif
- assert_fails('IntArg(A)', 'E1013: Argument 1: type mismatch, expected number but got class<A>')
+ assert_fails('IntArg(A)', 'E1405: Class "A" cannot be used as a value')
assert_fails('IntArg(o)', 'E1013: Argument 1: type mismatch, expected number but got object<A>')
# Passing a number to functions accepting different argument types
@@ -3262,7 +3262,7 @@ def Test_func_argtype_check()
v9.CheckSourceFailure(lines, 'E1013: Argument 1: type mismatch, expected number but got channel', 2)
endif
lines = pre_lines + ['IntArg(A)'] + post_lines
- v9.CheckSourceFailure(lines, 'E1013: Argument 1: type mismatch, expected number but got class<A>', 1)
+ v9.CheckSourceFailure(lines, 'E1405: Class "A" cannot be used as a value', 1)
lines = pre_lines + ['var o: A = A.new()', 'IntArg(o)'] + post_lines
v9.CheckSourceFailure(lines, 'E1013: Argument 1: type mismatch, expected number but got object<A>', 2)
enddef
diff --git a/src/testdir/test_vim9_class.vim b/src/testdir/test_vim9_class.vim
index 5a9b0f8884..6f9723dfae 100644
--- a/src/testdir/test_vim9_class.vim
+++ b/src/testdir/test_vim9_class.vim
@@ -4149,7 +4149,7 @@ def Test_lockvar_argument()
Lock2(C)
END
- v9.CheckSourceSuccess(lines)
+ v9.CheckSourceFailure(lines, 'E1405: Class "C" cannot be used as a value')
# Lock an object.
lines =<< trim END
diff --git a/src/testdir/test_vim9_typealias.vim b/src/testdir/test_vim9_typealias.vim
index 11aa47aa63..8843cb5d1a 100644
--- a/src/testdir/test_vim9_typealias.vim
+++ b/src/testdir/test_vim9_typealias.vim
@@ -546,4 +546,238 @@ def Test_typealias_class()
v9.CheckScriptSuccess(lines)
enddef
+" Test for typealias as function arg and return value
+def Test_type_as_func_argument_or_return_value()
+ # check typealias as arg, function call in script level
+ var lines =<< trim END
+ vim9script
+ type A = number
+ def Foo(arg: any)
+ enddef
+ Foo(A)
+ END
+ v9.CheckScriptFailure(lines, 'E1403: Type alias "A" cannot be used as a value', 5)
+
+ # check typealias as function return, function call in script level
+ lines =<< trim END
+ vim9script
+ type A = number
+ def Foo(): any
+ return A
+ enddef
+ Foo()
+ END
+ v9.CheckScriptFailure(lines, 'E1407: Cannot use a Typealias as a variable or value', 1)
+
+ # check typealias as arg, function call in :def
+ lines =<< trim END
+ vim9script
+ type A = number
+ def Foo(arg: any)
+ enddef
+ def F()
+ Foo(A)
+ enddef
+ F()
+ END
+ v9.CheckScriptFailure(lines, 'E1407: Cannot use a Typealias as a variable or value', 1)
+
+ # check typealias as function return, function call in :def
+ lines =<< trim END
+ vim9script
+ type A = number
+ def Foo(): any
+ return A
+ enddef
+ def F()
+ Foo()
+ enddef
+ F()
+ END
+ v9.CheckScriptFailure(lines, 'E1407: Cannot use a Typealias as a variable or value', 1)
+
+ # check funcref using typealias as arg at script level
+ lines =<< trim END
+ vim9script
+ type A = number
+ def F(arg: any)
+ echo typename(arg)
+ enddef
+ var Fref: func(any)
+ Fref = F
+
+ Fref(A)
+ END
+ v9.CheckScriptFailure(lines, 'E1403: Type alias "A" cannot be used as a value', 9)
+
+ # check funcref using typealias as arg in :def
+ lines =<< trim END
+ vim9script
+ type A = number
+ def F(arg: any)
+ echo typename(arg)
+ enddef
+ var Fref: func(any)
+ Fref = F
+
+ def G()
+ Fref(A)
+ enddef
+ G()
+ END
+ v9.CheckScriptFailure(lines, 'E1407: Cannot use a Typealias as a variable or value', 1)
+
+ # check funcref using typealias as return
+ lines =<< trim END
+ vim9script
+ type A = number
+ def F(): any
+ return A
+ enddef
+ var Fref: func(): any
+ Fref = F
+
+ Fref()
+ END
+ v9.CheckScriptFailure(lines, 'E1407: Cannot use a Typealias as a variable or value', 1)
+
+ # check defered function using typealias as arg
+ lines =<< trim END
+ vim9script
+ type A = number
+ def F(arg: any)
+ enddef
+ def G()
+ defer F(A)
+ enddef
+ G()
+ END
+ v9.CheckScriptFailure(lines, 'E1407: Cannot use a Typealias as a variable or value', 1)
+enddef
+
+" Test for class typealias as function arg and return value
+def Test_class_as_func_argument_or_return_value()
+ # check class typealias as arg, function call in script level
+ var lines =<< trim END
+ vim9script
+ class C
+ endclass
+ type A = C
+ def Foo(arg: any)
+ enddef
+ Foo(A)
+ END
+ v9.CheckScriptFailure(lines, 'E1405: Class "C" cannot be used as a value', 7)
+
+ # check class typealias as function return, function call in script level
+ lines =<< trim END
+ vim9script
+ class C
+ endclass
+ type A = C
+ def Foo(): any
+ return A
+ enddef
+ Foo()
+ END
+ v9.CheckScriptFailure(lines, 'E1405: Class "C" cannot be used as a value', 1)
+
+ # check class typealias as arg, function call in :def
+ lines =<< trim END
+ vim9script
+ class C
+ endclass
+ type A = C
+ def Foo(arg: any)
+ enddef
+ def F()
+ Foo(A)
+ enddef
+ F()
+ END
+ v9.CheckScriptFailure(lines, 'E1405: Class "C" cannot be used as a value', 1)
+
+ # check class typealias as function return, function call in :def
+ lines =<< trim END
+ vim9script
+ class C
+ endclass
+ type A = C
+ def Foo(): any
+ return A
+ enddef
+ def F()
+ Foo()
+ enddef
+ F()
+ END
+ v9.CheckScriptFailure(lines, 'E1405: Class "C" cannot be used as a value', 1)
+
+ # check funcref using class typealias as arg at script level
+ lines =<< trim END
+ vim9script
+ class C
+ endclass
+ type A = C
+ def F(arg: any)
+ echo typename(arg)
+ enddef
+ var Fref: func(any)
+ Fref = F
+
+ Fref(A)
+ END
+ v9.CheckScriptFailure(lines, 'E1405: Class "C" cannot be used as a value', 11)
+
+ # check funcref using class typealias as arg in :def
+ lines =<< trim END
+ vim9script
+ class C
+ endclass
+ type A = C
+ def F(arg: any)
+ echo typename(arg)
+ enddef
+ var Fref: func(any)
+ Fref = F
+
+ def G()
+ Fref(A)
+ enddef
+ G()
+ END
+ v9.CheckScriptFailure(lines, 'E1405: Class "C" cannot be used as a value', 1)
+
+ # check funcref using class typealias as return
+ lines =<< trim END
+ vim9script
+ class C
+ endclass
+ type A = C
+ def F(): any
+ return A
+ enddef
+ var Fref: func(): any
+ Fref = F
+
+ Fref()
+ END
+ v9.CheckScriptFailure(lines, 'E1405: Class "C" cannot be used as a value', 1)
+
+ # check defered function using class typealias as arg
+ lines =<< trim END
+ vim9script
+ class C
+ endclass
+ type A = C
+ def F(arg: any)
+ enddef
+ def G()
+ defer F(A)
+ enddef
+ G()
+ END
+ v9.CheckScriptFailure(lines, 'E1405: Class "C" cannot be used as a value', 1)
+enddef
+
" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker