Skip to content

Commit 4c68375

Browse files
committed
patch 8.2.0517: Vim9: cannot separate "func" and "func(): void"
Problem: Vim9: cannot separate "func" and "func(): void". Solution: Use VAR_ANY for "any" and VAR_UNKNOWN for "no type".
1 parent f87a040 commit 4c68375

13 files changed

Lines changed: 88 additions & 29 deletions

File tree

src/eval.c

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1272,6 +1272,7 @@ tv_op(typval_T *tv1, typval_T *tv2, char_u *op)
12721272
switch (tv1->v_type)
12731273
{
12741274
case VAR_UNKNOWN:
1275+
case VAR_ANY:
12751276
case VAR_VOID:
12761277
case VAR_DICT:
12771278
case VAR_FUNC:
@@ -2967,6 +2968,7 @@ eval_index(
29672968
emsg(_("E909: Cannot index a special variable"));
29682969
return FAIL;
29692970
case VAR_UNKNOWN:
2971+
case VAR_ANY:
29702972
case VAR_VOID:
29712973
if (evaluate)
29722974
return FAIL;
@@ -3073,6 +3075,7 @@ eval_index(
30733075
switch (rettv->v_type)
30743076
{
30753077
case VAR_UNKNOWN:
3078+
case VAR_ANY:
30763079
case VAR_VOID:
30773080
case VAR_FUNC:
30783081
case VAR_PARTIAL:
@@ -3668,7 +3671,7 @@ get_lit_string_tv(char_u **arg, typval_T *rettv, int evaluate)
36683671
}
36693672

36703673
/*
3671-
* Return the function name of the partial.
3674+
* Return the function name of partial "pt".
36723675
*/
36733676
char_u *
36743677
partial_name(partial_T *pt)
@@ -3856,6 +3859,7 @@ tv_equal(
38563859
return tv1->vval.v_string == tv2->vval.v_string;
38573860

38583861
case VAR_UNKNOWN:
3862+
case VAR_ANY:
38593863
case VAR_VOID:
38603864
break;
38613865
}
@@ -4570,6 +4574,7 @@ echo_string_core(
45704574

45714575
case VAR_NUMBER:
45724576
case VAR_UNKNOWN:
4577+
case VAR_ANY:
45734578
case VAR_VOID:
45744579
*tofree = NULL;
45754580
r = tv_get_string_buf(tv, numbuf);
@@ -5422,6 +5427,7 @@ free_tv(typval_T *varp)
54225427
#endif
54235428
case VAR_NUMBER:
54245429
case VAR_FLOAT:
5430+
case VAR_ANY:
54255431
case VAR_UNKNOWN:
54265432
case VAR_VOID:
54275433
case VAR_BOOL:
@@ -5486,6 +5492,7 @@ clear_tv(typval_T *varp)
54865492
varp->vval.v_channel = NULL;
54875493
#endif
54885494
case VAR_UNKNOWN:
5495+
case VAR_ANY:
54895496
case VAR_VOID:
54905497
break;
54915498
}
@@ -5565,6 +5572,7 @@ tv_get_number_chk(typval_T *varp, int *denote)
55655572
emsg(_("E974: Using a Blob as a Number"));
55665573
break;
55675574
case VAR_UNKNOWN:
5575+
case VAR_ANY:
55685576
case VAR_VOID:
55695577
internal_error_no_abort("tv_get_number(UNKNOWN)");
55705578
break;
@@ -5619,6 +5627,7 @@ tv_get_float(typval_T *varp)
56195627
emsg(_("E975: Using a Blob as a Float"));
56205628
break;
56215629
case VAR_UNKNOWN:
5630+
case VAR_ANY:
56225631
case VAR_VOID:
56235632
internal_error_no_abort("tv_get_float(UNKNOWN)");
56245633
break;
@@ -5742,6 +5751,7 @@ tv_get_string_buf_chk(typval_T *varp, char_u *buf)
57425751
#endif
57435752
break;
57445753
case VAR_UNKNOWN:
5754+
case VAR_ANY:
57455755
case VAR_VOID:
57465756
emsg(_(e_inval_string));
57475757
break;
@@ -5891,6 +5901,7 @@ copy_tv(typval_T *from, typval_T *to)
58915901
}
58925902
break;
58935903
case VAR_UNKNOWN:
5904+
case VAR_ANY:
58945905
case VAR_VOID:
58955906
internal_error_no_abort("copy_tv(UNKNOWN)");
58965907
break;
@@ -5970,6 +5981,7 @@ item_copy(
59705981
ret = FAIL;
59715982
break;
59725983
case VAR_UNKNOWN:
5984+
case VAR_ANY:
59735985
case VAR_VOID:
59745986
internal_error_no_abort("item_copy(UNKNOWN)");
59755987
ret = FAIL;

src/evalfunc.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2042,6 +2042,7 @@ f_empty(typval_T *argvars, typval_T *rettv)
20422042
break;
20432043
#endif
20442044
case VAR_UNKNOWN:
2045+
case VAR_ANY:
20452046
case VAR_VOID:
20462047
internal_error_no_abort("f_empty(UNKNOWN)");
20472048
n = TRUE;
@@ -5217,6 +5218,7 @@ f_len(typval_T *argvars, typval_T *rettv)
52175218
rettv->vval.v_number = dict_len(argvars[0].vval.v_dict);
52185219
break;
52195220
case VAR_UNKNOWN:
5221+
case VAR_ANY:
52205222
case VAR_VOID:
52215223
case VAR_BOOL:
52225224
case VAR_SPECIAL:
@@ -8805,6 +8807,7 @@ f_type(typval_T *argvars, typval_T *rettv)
88058807
case VAR_CHANNEL: n = VAR_TYPE_CHANNEL; break;
88068808
case VAR_BLOB: n = VAR_TYPE_BLOB; break;
88078809
case VAR_UNKNOWN:
8810+
case VAR_ANY:
88088811
case VAR_VOID:
88098812
internal_error_no_abort("f_type(UNKNOWN)");
88108813
n = -1;

src/evalvars.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1668,6 +1668,7 @@ item_lock(typval_T *tv, int deep, int lock)
16681668
switch (tv->v_type)
16691669
{
16701670
case VAR_UNKNOWN:
1671+
case VAR_ANY:
16711672
case VAR_VOID:
16721673
case VAR_NUMBER:
16731674
case VAR_BOOL:

src/globals.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -379,7 +379,8 @@ EXTERN sctx_T current_sctx INIT4(0, 0, 0, 0);
379379

380380

381381
// Commonly used types.
382-
EXTERN type_T t_any INIT6(VAR_UNKNOWN, 0, 0, 0, NULL, NULL);
382+
EXTERN type_T t_unknown INIT6(VAR_UNKNOWN, 0, 0, 0, NULL, NULL);
383+
EXTERN type_T t_any INIT6(VAR_ANY, 0, 0, 0, NULL, NULL);
383384
EXTERN type_T t_void INIT6(VAR_VOID, 0, 0, 0, NULL, NULL);
384385
EXTERN type_T t_bool INIT6(VAR_BOOL, 0, 0, 0, NULL, NULL);
385386
EXTERN type_T t_special INIT6(VAR_SPECIAL, 0, 0, 0, NULL, NULL);
@@ -390,6 +391,7 @@ EXTERN type_T t_blob INIT6(VAR_BLOB, 0, 0, 0, NULL, NULL);
390391
EXTERN type_T t_job INIT6(VAR_JOB, 0, 0, 0, NULL, NULL);
391392
EXTERN type_T t_channel INIT6(VAR_CHANNEL, 0, 0, 0, NULL, NULL);
392393

394+
EXTERN type_T t_func_unknown INIT6(VAR_FUNC, -1, 0, 0, &t_unknown, NULL);
393395
EXTERN type_T t_func_void INIT6(VAR_FUNC, -1, 0, 0, &t_void, NULL);
394396
EXTERN type_T t_func_any INIT6(VAR_FUNC, -1, 0, 0, &t_any, NULL);
395397
EXTERN type_T t_func_number INIT6(VAR_FUNC, -1, 0, 0, &t_number, NULL);
@@ -401,8 +403,8 @@ EXTERN type_T t_func_0_string INIT6(VAR_FUNC, 0, 0, 0, &t_string, NULL);
401403

402404
EXTERN type_T t_list_any INIT6(VAR_LIST, 0, 0, 0, &t_any, NULL);
403405
EXTERN type_T t_dict_any INIT6(VAR_DICT, 0, 0, 0, &t_any, NULL);
404-
EXTERN type_T t_list_empty INIT6(VAR_LIST, 0, 0, 0, &t_void, NULL);
405-
EXTERN type_T t_dict_empty INIT6(VAR_DICT, 0, 0, 0, &t_void, NULL);
406+
EXTERN type_T t_list_empty INIT6(VAR_LIST, 0, 0, 0, &t_unknown, NULL);
407+
EXTERN type_T t_dict_empty INIT6(VAR_DICT, 0, 0, 0, &t_unknown, NULL);
406408

407409
EXTERN type_T t_list_bool INIT6(VAR_LIST, 0, 0, 0, &t_bool, NULL);
408410
EXTERN type_T t_list_number INIT6(VAR_LIST, 0, 0, 0, &t_number, NULL);

src/if_py_both.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6390,6 +6390,7 @@ ConvertToPyObject(typval_T *tv)
63906390
(char*) tv->vval.v_blob->bv_ga.ga_data,
63916391
(Py_ssize_t) tv->vval.v_blob->bv_ga.ga_len);
63926392
case VAR_UNKNOWN:
6393+
case VAR_ANY:
63936394
case VAR_VOID:
63946395
case VAR_CHANNEL:
63956396
case VAR_JOB:

src/json.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,7 @@ json_encode_item(garray_T *gap, typval_T *val, int copyID, int options)
351351
break;
352352
#endif
353353
case VAR_UNKNOWN:
354+
case VAR_ANY:
354355
case VAR_VOID:
355356
internal_error_no_abort("json_encode_item()");
356357
return FAIL;

src/structs.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1321,8 +1321,9 @@ typedef struct cctx_S cctx_T;
13211321

13221322
typedef enum
13231323
{
1324-
VAR_UNKNOWN = 0, // not set, also used for "any" type
1325-
VAR_VOID, // no value
1324+
VAR_UNKNOWN = 0, // not set, any type or "void" allowed
1325+
VAR_ANY, // used for "any" type
1326+
VAR_VOID, // no value (function not returning anything)
13261327
VAR_BOOL, // "v_number" is used: VVAL_TRUE or VVAL_FALSE
13271328
VAR_SPECIAL, // "v_number" is used: VVAL_NULL or VVAL_NONE
13281329
VAR_NUMBER, // "v_number" is used

src/testdir/test_vim9_func.vim

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,27 @@ def Test_func_type()
386386
Ref1 = FuncNoArgNoRet
387387
Ref1()
388388
assert_equal(11, funcResult)
389+
390+
let Ref2: func
391+
funcResult = 0
392+
Ref2 = FuncNoArgNoRet
393+
Ref2()
394+
assert_equal(11, funcResult)
395+
396+
funcResult = 0
397+
Ref2 = FuncOneArgNoRet
398+
Ref2(12)
399+
assert_equal(12, funcResult)
400+
401+
funcResult = 0
402+
Ref2 = FuncNoArgRetNumber
403+
assert_equal(1234, Ref2())
404+
assert_equal(22, funcResult)
405+
406+
funcResult = 0
407+
Ref2 = FuncOneArgRetNumber
408+
assert_equal(13, Ref2(13))
409+
assert_equal(13, funcResult)
389410
enddef
390411

391412
def Test_func_type_fails()

src/testing.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -764,6 +764,7 @@ f_test_refcount(typval_T *argvars, typval_T *rettv)
764764
switch (argvars[0].v_type)
765765
{
766766
case VAR_UNKNOWN:
767+
case VAR_ANY:
767768
case VAR_VOID:
768769
case VAR_NUMBER:
769770
case VAR_BOOL:

src/version.c

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

739739
static int included_patches[] =
740740
{ /* Add new patch number below this line */
741+
/**/
742+
517,
741743
/**/
742744
516,
743745
/**/

0 commit comments

Comments
 (0)