mirror of
https://github.com/vim/vim.git
synced 2025-08-22 19:27:53 -04:00
patch 9.0.0703: failing check for argument type for const any
Problem: Failing check for argument type for const any. Solution: Check for any type properly. (closes #11316)
This commit is contained in:
parent
30c0c467d6
commit
330d64d32c
184
src/evalfunc.c
184
src/evalfunc.c
@ -257,10 +257,9 @@ arg_type_modifiable(type_T *type, int arg_idx)
|
|||||||
static int
|
static int
|
||||||
arg_float_or_nr(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
arg_float_or_nr(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
||||||
{
|
{
|
||||||
if (type->tt_type == VAR_ANY
|
if (type->tt_type == VAR_FLOAT
|
||||||
|| type->tt_type == VAR_UNKNOWN
|
|| type->tt_type == VAR_NUMBER
|
||||||
|| type->tt_type == VAR_FLOAT
|
|| type_any_or_unknown(type))
|
||||||
|| type->tt_type == VAR_NUMBER)
|
|
||||||
return OK;
|
return OK;
|
||||||
arg_type_mismatch(&t_number, type, context->arg_idx + 1);
|
arg_type_mismatch(&t_number, type, context->arg_idx + 1);
|
||||||
return FAIL;
|
return FAIL;
|
||||||
@ -356,10 +355,9 @@ arg_bool(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
|||||||
static int
|
static int
|
||||||
arg_list_or_blob(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
arg_list_or_blob(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
||||||
{
|
{
|
||||||
if (type->tt_type == VAR_ANY
|
if (type->tt_type == VAR_LIST
|
||||||
|| type->tt_type == VAR_UNKNOWN
|
|| type->tt_type == VAR_BLOB
|
||||||
|| type->tt_type == VAR_LIST
|
|| type_any_or_unknown(type))
|
||||||
|| type->tt_type == VAR_BLOB)
|
|
||||||
return OK;
|
return OK;
|
||||||
arg_type_mismatch(&t_list_any, type, context->arg_idx + 1);
|
arg_type_mismatch(&t_list_any, type, context->arg_idx + 1);
|
||||||
return FAIL;
|
return FAIL;
|
||||||
@ -385,10 +383,9 @@ arg_list_or_blob_mod(
|
|||||||
static int
|
static int
|
||||||
arg_string_or_nr(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
arg_string_or_nr(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
||||||
{
|
{
|
||||||
if (type->tt_type == VAR_ANY
|
if (type->tt_type == VAR_STRING
|
||||||
|| type->tt_type == VAR_UNKNOWN
|
|| type->tt_type == VAR_NUMBER
|
||||||
|| type->tt_type == VAR_STRING
|
|| type_any_or_unknown(type))
|
||||||
|| type->tt_type == VAR_NUMBER)
|
|
||||||
return OK;
|
return OK;
|
||||||
arg_type_mismatch(&t_string, type, context->arg_idx + 1);
|
arg_type_mismatch(&t_string, type, context->arg_idx + 1);
|
||||||
return FAIL;
|
return FAIL;
|
||||||
@ -400,10 +397,9 @@ arg_string_or_nr(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
|||||||
static int
|
static int
|
||||||
arg_buffer(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
arg_buffer(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
||||||
{
|
{
|
||||||
if (type->tt_type == VAR_ANY
|
if (type->tt_type == VAR_STRING
|
||||||
|| type->tt_type == VAR_UNKNOWN
|
|| type->tt_type == VAR_NUMBER
|
||||||
|| type->tt_type == VAR_STRING
|
|| type_any_or_unknown(type))
|
||||||
|| type->tt_type == VAR_NUMBER)
|
|
||||||
return OK;
|
return OK;
|
||||||
arg_type_mismatch(&t_string, type, context->arg_idx + 1);
|
arg_type_mismatch(&t_string, type, context->arg_idx + 1);
|
||||||
return FAIL;
|
return FAIL;
|
||||||
@ -415,11 +411,10 @@ arg_buffer(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
|||||||
static int
|
static int
|
||||||
arg_buffer_or_dict_any(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
arg_buffer_or_dict_any(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
||||||
{
|
{
|
||||||
if (type->tt_type == VAR_ANY
|
if (type->tt_type == VAR_STRING
|
||||||
|| type->tt_type == VAR_UNKNOWN
|
|
||||||
|| type->tt_type == VAR_STRING
|
|
||||||
|| type->tt_type == VAR_NUMBER
|
|| type->tt_type == VAR_NUMBER
|
||||||
|| type->tt_type == VAR_DICT)
|
|| type->tt_type == VAR_DICT
|
||||||
|
|| type_any_or_unknown(type))
|
||||||
return OK;
|
return OK;
|
||||||
arg_type_mismatch(&t_string, type, context->arg_idx + 1);
|
arg_type_mismatch(&t_string, type, context->arg_idx + 1);
|
||||||
return FAIL;
|
return FAIL;
|
||||||
@ -431,10 +426,9 @@ arg_buffer_or_dict_any(type_T *type, type_T *decl_type UNUSED, argcontext_T *con
|
|||||||
static int
|
static int
|
||||||
arg_lnum(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
arg_lnum(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
||||||
{
|
{
|
||||||
if (type->tt_type == VAR_ANY
|
if (type->tt_type == VAR_STRING
|
||||||
|| type->tt_type == VAR_UNKNOWN
|
|| type->tt_type == VAR_NUMBER
|
||||||
|| type->tt_type == VAR_STRING
|
|| type_any_or_unknown(type))
|
||||||
|| type->tt_type == VAR_NUMBER)
|
|
||||||
return OK;
|
return OK;
|
||||||
arg_type_mismatch(&t_string, type, context->arg_idx + 1);
|
arg_type_mismatch(&t_string, type, context->arg_idx + 1);
|
||||||
return FAIL;
|
return FAIL;
|
||||||
@ -446,9 +440,8 @@ arg_lnum(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
|||||||
static int
|
static int
|
||||||
arg_string_or_list_string(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
arg_string_or_list_string(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
||||||
{
|
{
|
||||||
if (type->tt_type == VAR_ANY
|
if (type->tt_type == VAR_STRING
|
||||||
|| type->tt_type == VAR_UNKNOWN
|
|| type_any_or_unknown(type))
|
||||||
|| type->tt_type == VAR_STRING)
|
|
||||||
return OK;
|
return OK;
|
||||||
if (type->tt_type != VAR_LIST)
|
if (type->tt_type != VAR_LIST)
|
||||||
{
|
{
|
||||||
@ -469,10 +462,9 @@ arg_string_or_list_string(type_T *type, type_T *decl_type UNUSED, argcontext_T *
|
|||||||
static int
|
static int
|
||||||
arg_string_or_list_any(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
arg_string_or_list_any(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
||||||
{
|
{
|
||||||
if (type->tt_type == VAR_ANY
|
if (type->tt_type == VAR_STRING
|
||||||
|| type->tt_type == VAR_UNKNOWN
|
|| type->tt_type == VAR_LIST
|
||||||
|| type->tt_type == VAR_STRING
|
|| type_any_or_unknown(type))
|
||||||
|| type->tt_type == VAR_LIST)
|
|
||||||
return OK;
|
return OK;
|
||||||
arg_type_mismatch(&t_string, type, context->arg_idx + 1);
|
arg_type_mismatch(&t_string, type, context->arg_idx + 1);
|
||||||
return FAIL;
|
return FAIL;
|
||||||
@ -484,10 +476,9 @@ arg_string_or_list_any(type_T *type, type_T *decl_type UNUSED, argcontext_T *con
|
|||||||
static int
|
static int
|
||||||
arg_string_or_dict_any(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
arg_string_or_dict_any(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
||||||
{
|
{
|
||||||
if (type->tt_type == VAR_ANY
|
if (type->tt_type == VAR_STRING
|
||||||
|| type->tt_type == VAR_UNKNOWN
|
|| type->tt_type == VAR_DICT
|
||||||
|| type->tt_type == VAR_STRING
|
|| type_any_or_unknown(type))
|
||||||
|| type->tt_type == VAR_DICT)
|
|
||||||
return OK;
|
return OK;
|
||||||
arg_type_mismatch(&t_string, type, context->arg_idx + 1);
|
arg_type_mismatch(&t_string, type, context->arg_idx + 1);
|
||||||
return FAIL;
|
return FAIL;
|
||||||
@ -499,10 +490,9 @@ arg_string_or_dict_any(type_T *type, type_T *decl_type UNUSED, argcontext_T *con
|
|||||||
static int
|
static int
|
||||||
arg_string_or_blob(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
arg_string_or_blob(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
||||||
{
|
{
|
||||||
if (type->tt_type == VAR_ANY
|
if (type->tt_type == VAR_STRING
|
||||||
|| type->tt_type == VAR_UNKNOWN
|
|| type->tt_type == VAR_BLOB
|
||||||
|| type->tt_type == VAR_STRING
|
|| type_any_or_unknown(type))
|
||||||
|| type->tt_type == VAR_BLOB)
|
|
||||||
return OK;
|
return OK;
|
||||||
arg_type_mismatch(&t_string, type, context->arg_idx + 1);
|
arg_type_mismatch(&t_string, type, context->arg_idx + 1);
|
||||||
return FAIL;
|
return FAIL;
|
||||||
@ -514,10 +504,9 @@ arg_string_or_blob(type_T *type, type_T *decl_type UNUSED, argcontext_T *context
|
|||||||
static int
|
static int
|
||||||
arg_list_or_dict(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
arg_list_or_dict(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
||||||
{
|
{
|
||||||
if (type->tt_type == VAR_ANY
|
if (type->tt_type == VAR_LIST
|
||||||
|| type->tt_type == VAR_UNKNOWN
|
|| type->tt_type == VAR_DICT
|
||||||
|| type->tt_type == VAR_LIST
|
|| type_any_or_unknown(type))
|
||||||
|| type->tt_type == VAR_DICT)
|
|
||||||
return OK;
|
return OK;
|
||||||
arg_type_mismatch(&t_list_any, type, context->arg_idx + 1);
|
arg_type_mismatch(&t_list_any, type, context->arg_idx + 1);
|
||||||
return FAIL;
|
return FAIL;
|
||||||
@ -547,11 +536,10 @@ arg_list_or_dict_or_blob_mod(
|
|||||||
type_T *decl_type UNUSED,
|
type_T *decl_type UNUSED,
|
||||||
argcontext_T *context)
|
argcontext_T *context)
|
||||||
{
|
{
|
||||||
if (type->tt_type == VAR_ANY
|
if (type->tt_type == VAR_LIST
|
||||||
|| type->tt_type == VAR_UNKNOWN
|
|
||||||
|| type->tt_type == VAR_LIST
|
|
||||||
|| type->tt_type == VAR_DICT
|
|| type->tt_type == VAR_DICT
|
||||||
|| type->tt_type == VAR_BLOB)
|
|| type->tt_type == VAR_BLOB
|
||||||
|
|| type_any_or_unknown(type))
|
||||||
return arg_type_modifiable(type, context->arg_idx + 1);
|
return arg_type_modifiable(type, context->arg_idx + 1);
|
||||||
arg_type_mismatch(&t_list_any, type, context->arg_idx + 1);
|
arg_type_mismatch(&t_list_any, type, context->arg_idx + 1);
|
||||||
return FAIL;
|
return FAIL;
|
||||||
@ -563,12 +551,11 @@ arg_list_or_dict_or_blob_mod(
|
|||||||
static int
|
static int
|
||||||
arg_list_or_dict_or_blob_or_string(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
arg_list_or_dict_or_blob_or_string(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
||||||
{
|
{
|
||||||
if (type->tt_type == VAR_ANY
|
if (type->tt_type == VAR_LIST
|
||||||
|| type->tt_type == VAR_UNKNOWN
|
|
||||||
|| type->tt_type == VAR_LIST
|
|
||||||
|| type->tt_type == VAR_DICT
|
|| type->tt_type == VAR_DICT
|
||||||
|| type->tt_type == VAR_BLOB
|
|| type->tt_type == VAR_BLOB
|
||||||
|| type->tt_type == VAR_STRING)
|
|| type->tt_type == VAR_STRING
|
||||||
|
|| type_any_or_unknown(type))
|
||||||
return OK;
|
return OK;
|
||||||
arg_type_mismatch(&t_list_any, type, context->arg_idx + 1);
|
arg_type_mismatch(&t_list_any, type, context->arg_idx + 1);
|
||||||
return FAIL;
|
return FAIL;
|
||||||
@ -642,15 +629,13 @@ check_map_filter_arg2(type_T *type, argcontext_T *context, int is_map)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((type->tt_member != &t_any && type->tt_member != &t_unknown)
|
if (!type_any_or_unknown(type->tt_member) || args[0] != NULL)
|
||||||
|| args[0] != NULL)
|
|
||||||
{
|
{
|
||||||
where_T where = WHERE_INIT;
|
where_T where = WHERE_INIT;
|
||||||
|
|
||||||
if (is_map)
|
if (is_map)
|
||||||
t_func_exp.tt_member = expected_member == NULL
|
t_func_exp.tt_member = expected_member == NULL
|
||||||
|| type->tt_member == &t_any
|
|| type_any_or_unknown(type->tt_member)
|
||||||
|| type->tt_member == &t_unknown
|
|
||||||
? &t_any : expected_member;
|
? &t_any : expected_member;
|
||||||
else
|
else
|
||||||
t_func_exp.tt_member = &t_bool;
|
t_func_exp.tt_member = &t_bool;
|
||||||
@ -673,8 +658,7 @@ arg_filter_func(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
|||||||
{
|
{
|
||||||
if (type->tt_type == VAR_STRING
|
if (type->tt_type == VAR_STRING
|
||||||
|| type->tt_type == VAR_PARTIAL
|
|| type->tt_type == VAR_PARTIAL
|
||||||
|| type == &t_unknown
|
|| type_any_or_unknown(type))
|
||||||
|| type == &t_any)
|
|
||||||
return OK;
|
return OK;
|
||||||
|
|
||||||
if (type->tt_type == VAR_FUNC)
|
if (type->tt_type == VAR_FUNC)
|
||||||
@ -691,8 +675,7 @@ arg_map_func(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
|||||||
{
|
{
|
||||||
if (type->tt_type == VAR_STRING
|
if (type->tt_type == VAR_STRING
|
||||||
|| type->tt_type == VAR_PARTIAL
|
|| type->tt_type == VAR_PARTIAL
|
||||||
|| type == &t_unknown
|
|| type_any_or_unknown(type))
|
||||||
|| type == &t_any)
|
|
||||||
return OK;
|
return OK;
|
||||||
|
|
||||||
if (type->tt_type == VAR_FUNC)
|
if (type->tt_type == VAR_FUNC)
|
||||||
@ -709,8 +692,7 @@ arg_sort_how(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
|||||||
{
|
{
|
||||||
if (type->tt_type == VAR_STRING
|
if (type->tt_type == VAR_STRING
|
||||||
|| type->tt_type == VAR_PARTIAL
|
|| type->tt_type == VAR_PARTIAL
|
||||||
|| type == &t_unknown
|
|| type_any_or_unknown(type))
|
||||||
|| type == &t_any)
|
|
||||||
return OK;
|
return OK;
|
||||||
|
|
||||||
if (type->tt_type == VAR_FUNC)
|
if (type->tt_type == VAR_FUNC)
|
||||||
@ -722,8 +704,7 @@ arg_sort_how(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
|||||||
args[0] = context->arg_types[0].type_curr->tt_member;
|
args[0] = context->arg_types[0].type_curr->tt_member;
|
||||||
else
|
else
|
||||||
args[0] = &t_unknown;
|
args[0] = &t_unknown;
|
||||||
if ((type->tt_member != &t_any && type->tt_member != &t_unknown)
|
if (!type_any_or_unknown(type->tt_member) || args[0] != &t_unknown)
|
||||||
|| args[0] != &t_unknown)
|
|
||||||
{
|
{
|
||||||
where_T where = WHERE_INIT;
|
where_T where = WHERE_INIT;
|
||||||
|
|
||||||
@ -748,13 +729,12 @@ arg_sort_how(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
|||||||
static int
|
static int
|
||||||
arg_string_or_func(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
arg_string_or_func(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
||||||
{
|
{
|
||||||
if (type->tt_type == VAR_ANY
|
if (type->tt_type == VAR_STRING
|
||||||
|| type->tt_type == VAR_UNKNOWN
|
|
||||||
|| type->tt_type == VAR_STRING
|
|
||||||
|| type->tt_type == VAR_PARTIAL
|
|| type->tt_type == VAR_PARTIAL
|
||||||
|| type->tt_type == VAR_FUNC
|
|| type->tt_type == VAR_FUNC
|
||||||
|| type->tt_type == VAR_BOOL
|
|| type->tt_type == VAR_BOOL
|
||||||
|| type->tt_type == VAR_NUMBER)
|
|| type->tt_type == VAR_NUMBER
|
||||||
|
|| type_any_or_unknown(type))
|
||||||
return OK;
|
return OK;
|
||||||
arg_type_mismatch(&t_func_any, type, context->arg_idx + 1);
|
arg_type_mismatch(&t_func_any, type, context->arg_idx + 1);
|
||||||
return FAIL;
|
return FAIL;
|
||||||
@ -766,11 +746,10 @@ arg_string_or_func(type_T *type, type_T *decl_type UNUSED, argcontext_T *context
|
|||||||
static int
|
static int
|
||||||
arg_string_list_or_blob(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
arg_string_list_or_blob(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
||||||
{
|
{
|
||||||
if (type->tt_type == VAR_ANY
|
if (type->tt_type == VAR_LIST
|
||||||
|| type->tt_type == VAR_UNKNOWN
|
|
||||||
|| type->tt_type == VAR_LIST
|
|
||||||
|| type->tt_type == VAR_BLOB
|
|| type->tt_type == VAR_BLOB
|
||||||
|| type->tt_type == VAR_STRING)
|
|| type->tt_type == VAR_STRING
|
||||||
|
|| type_any_or_unknown(type))
|
||||||
return OK;
|
return OK;
|
||||||
arg_type_mismatch(&t_list_any, type, context->arg_idx + 1);
|
arg_type_mismatch(&t_list_any, type, context->arg_idx + 1);
|
||||||
return FAIL;
|
return FAIL;
|
||||||
@ -791,10 +770,9 @@ arg_job(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
|||||||
static int
|
static int
|
||||||
arg_chan_or_job(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
arg_chan_or_job(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
||||||
{
|
{
|
||||||
if (type->tt_type == VAR_ANY
|
if (type->tt_type == VAR_CHANNEL
|
||||||
|| type->tt_type == VAR_UNKNOWN
|
|| type->tt_type == VAR_JOB
|
||||||
|| type->tt_type == VAR_CHANNEL
|
|| type_any_or_unknown(type))
|
||||||
|| type->tt_type == VAR_JOB)
|
|
||||||
return OK;
|
return OK;
|
||||||
arg_type_mismatch(&t_channel, type, context->arg_idx + 1);
|
arg_type_mismatch(&t_channel, type, context->arg_idx + 1);
|
||||||
return FAIL;
|
return FAIL;
|
||||||
@ -854,11 +832,10 @@ arg_item_of_prev(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
|||||||
static int
|
static int
|
||||||
arg_str_or_nr_or_list(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
arg_str_or_nr_or_list(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
||||||
{
|
{
|
||||||
if (type->tt_type == VAR_ANY
|
if (type->tt_type == VAR_STRING
|
||||||
|| type->tt_type == VAR_UNKNOWN
|
|
||||||
|| type->tt_type == VAR_STRING
|
|
||||||
|| type->tt_type == VAR_NUMBER
|
|| type->tt_type == VAR_NUMBER
|
||||||
|| type->tt_type == VAR_LIST)
|
|| type->tt_type == VAR_LIST
|
||||||
|
|| type_any_or_unknown(type))
|
||||||
return OK;
|
return OK;
|
||||||
arg_type_mismatch(&t_string, type, context->arg_idx + 1);
|
arg_type_mismatch(&t_string, type, context->arg_idx + 1);
|
||||||
return FAIL;
|
return FAIL;
|
||||||
@ -870,10 +847,9 @@ arg_str_or_nr_or_list(type_T *type, type_T *decl_type UNUSED, argcontext_T *cont
|
|||||||
static int
|
static int
|
||||||
arg_dict_any_or_string(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
arg_dict_any_or_string(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
||||||
{
|
{
|
||||||
if (type->tt_type == VAR_ANY
|
if (type->tt_type == VAR_DICT
|
||||||
|| type->tt_type == VAR_UNKNOWN
|
|| type->tt_type == VAR_STRING
|
||||||
|| type->tt_type == VAR_DICT
|
|| type_any_or_unknown(type))
|
||||||
|| type->tt_type == VAR_STRING)
|
|
||||||
return OK;
|
return OK;
|
||||||
arg_type_mismatch(&t_string, type, context->arg_idx + 1);
|
arg_type_mismatch(&t_string, type, context->arg_idx + 1);
|
||||||
return FAIL;
|
return FAIL;
|
||||||
@ -902,13 +878,12 @@ arg_extend3(type_T *type, type_T *decl_type, argcontext_T *context)
|
|||||||
static int
|
static int
|
||||||
arg_get1(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
arg_get1(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
||||||
{
|
{
|
||||||
if (type->tt_type == VAR_ANY
|
if (type->tt_type == VAR_BLOB
|
||||||
|| type->tt_type == VAR_UNKNOWN
|
|
||||||
|| type->tt_type == VAR_BLOB
|
|
||||||
|| type->tt_type == VAR_LIST
|
|| type->tt_type == VAR_LIST
|
||||||
|| type->tt_type == VAR_DICT
|
|| type->tt_type == VAR_DICT
|
||||||
|| type->tt_type == VAR_FUNC
|
|| type->tt_type == VAR_FUNC
|
||||||
|| type->tt_type == VAR_PARTIAL)
|
|| type->tt_type == VAR_PARTIAL
|
||||||
|
|| type_any_or_unknown(type))
|
||||||
return OK;
|
return OK;
|
||||||
|
|
||||||
arg_type_mismatch(&t_list_any, type, context->arg_idx + 1);
|
arg_type_mismatch(&t_list_any, type, context->arg_idx + 1);
|
||||||
@ -922,13 +897,12 @@ arg_get1(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
|||||||
static int
|
static int
|
||||||
arg_len1(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
arg_len1(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
||||||
{
|
{
|
||||||
if (type->tt_type == VAR_ANY
|
if (type->tt_type == VAR_STRING
|
||||||
|| type->tt_type == VAR_UNKNOWN
|
|
||||||
|| type->tt_type == VAR_STRING
|
|
||||||
|| type->tt_type == VAR_NUMBER
|
|| type->tt_type == VAR_NUMBER
|
||||||
|| type->tt_type == VAR_BLOB
|
|| type->tt_type == VAR_BLOB
|
||||||
|| type->tt_type == VAR_LIST
|
|| type->tt_type == VAR_LIST
|
||||||
|| type->tt_type == VAR_DICT)
|
|| type->tt_type == VAR_DICT
|
||||||
|
|| type_any_or_unknown(type))
|
||||||
return OK;
|
return OK;
|
||||||
|
|
||||||
arg_type_mismatch(&t_list_any, type, context->arg_idx + 1);
|
arg_type_mismatch(&t_list_any, type, context->arg_idx + 1);
|
||||||
@ -958,12 +932,11 @@ arg_remove2(type_T *type, type_T *decl_type, argcontext_T *context)
|
|||||||
static int
|
static int
|
||||||
arg_repeat1(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
arg_repeat1(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
||||||
{
|
{
|
||||||
if (type->tt_type == VAR_ANY
|
if (type->tt_type == VAR_STRING
|
||||||
|| type->tt_type == VAR_UNKNOWN
|
|
||||||
|| type->tt_type == VAR_STRING
|
|
||||||
|| type->tt_type == VAR_NUMBER
|
|| type->tt_type == VAR_NUMBER
|
||||||
|| type->tt_type == VAR_BLOB
|
|| type->tt_type == VAR_BLOB
|
||||||
|| type->tt_type == VAR_LIST)
|
|| type->tt_type == VAR_LIST
|
||||||
|
|| type_any_or_unknown(type))
|
||||||
return OK;
|
return OK;
|
||||||
|
|
||||||
arg_type_mismatch(&t_string, type, context->arg_idx + 1);
|
arg_type_mismatch(&t_string, type, context->arg_idx + 1);
|
||||||
@ -977,11 +950,10 @@ arg_repeat1(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
|||||||
static int
|
static int
|
||||||
arg_slice1(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
arg_slice1(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
||||||
{
|
{
|
||||||
if (type->tt_type == VAR_ANY
|
if (type->tt_type == VAR_LIST
|
||||||
|| type->tt_type == VAR_UNKNOWN
|
|
||||||
|| type->tt_type == VAR_LIST
|
|
||||||
|| type->tt_type == VAR_BLOB
|
|| type->tt_type == VAR_BLOB
|
||||||
|| type->tt_type == VAR_STRING)
|
|| type->tt_type == VAR_STRING
|
||||||
|
|| type_any_or_unknown(type))
|
||||||
return OK;
|
return OK;
|
||||||
|
|
||||||
arg_type_mismatch(&t_list_any, type, context->arg_idx + 1);
|
arg_type_mismatch(&t_list_any, type, context->arg_idx + 1);
|
||||||
@ -995,11 +967,10 @@ arg_slice1(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
|||||||
static int
|
static int
|
||||||
arg_string_or_list_or_dict(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
arg_string_or_list_or_dict(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
||||||
{
|
{
|
||||||
if (type->tt_type == VAR_ANY
|
if (type->tt_type == VAR_STRING
|
||||||
|| type->tt_type == VAR_UNKNOWN
|
|
||||||
|| type->tt_type == VAR_STRING
|
|
||||||
|| type->tt_type == VAR_LIST
|
|| type->tt_type == VAR_LIST
|
||||||
|| type->tt_type == VAR_DICT)
|
|| type->tt_type == VAR_DICT
|
||||||
|
|| type_any_or_unknown(type))
|
||||||
return OK;
|
return OK;
|
||||||
|
|
||||||
semsg(_(e_string_list_or_dict_required_for_argument_nr),
|
semsg(_(e_string_list_or_dict_required_for_argument_nr),
|
||||||
@ -1014,11 +985,10 @@ arg_string_or_list_or_dict(type_T *type, type_T *decl_type UNUSED, argcontext_T
|
|||||||
static int
|
static int
|
||||||
arg_cursor1(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
arg_cursor1(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
||||||
{
|
{
|
||||||
if (type->tt_type == VAR_ANY
|
if (type->tt_type == VAR_NUMBER
|
||||||
|| type->tt_type == VAR_UNKNOWN
|
|
||||||
|| type->tt_type == VAR_NUMBER
|
|
||||||
|| type->tt_type == VAR_STRING
|
|| type->tt_type == VAR_STRING
|
||||||
|| type->tt_type == VAR_LIST)
|
|| type->tt_type == VAR_LIST
|
||||||
|
|| type_any_or_unknown(type))
|
||||||
return OK;
|
return OK;
|
||||||
|
|
||||||
arg_type_mismatch(&t_number, type, context->arg_idx + 1);
|
arg_type_mismatch(&t_number, type, context->arg_idx + 1);
|
||||||
|
@ -9,6 +9,7 @@ type_T *get_dict_type(type_T *member_type, garray_T *type_gap);
|
|||||||
type_T *alloc_func_type(type_T *ret_type, int argcount, garray_T *type_gap);
|
type_T *alloc_func_type(type_T *ret_type, int argcount, garray_T *type_gap);
|
||||||
type_T *get_func_type(type_T *ret_type, int argcount, garray_T *type_gap);
|
type_T *get_func_type(type_T *ret_type, int argcount, garray_T *type_gap);
|
||||||
int func_type_add_arg_types(type_T *functype, int argcount, garray_T *type_gap);
|
int func_type_add_arg_types(type_T *functype, int argcount, garray_T *type_gap);
|
||||||
|
int type_any_or_unknown(type_T *type);
|
||||||
int need_convert_to_bool(type_T *type, typval_T *tv);
|
int need_convert_to_bool(type_T *type, typval_T *tv);
|
||||||
type_T *typval2type(typval_T *tv, int copyID, garray_T *type_gap, int flags);
|
type_T *typval2type(typval_T *tv, int copyID, garray_T *type_gap, int flags);
|
||||||
type_T *typval2type_vimvar(typval_T *tv, garray_T *type_gap);
|
type_T *typval2type_vimvar(typval_T *tv, garray_T *type_gap);
|
||||||
|
@ -305,6 +305,25 @@ def Test_const()
|
|||||||
assert_equal(v:t_number, type(foo.bar))
|
assert_equal(v:t_number, type(foo.bar))
|
||||||
END
|
END
|
||||||
v9.CheckDefAndScriptSuccess(lines)
|
v9.CheckDefAndScriptSuccess(lines)
|
||||||
|
|
||||||
|
# also when used as a builtin function argument
|
||||||
|
lines =<< trim END
|
||||||
|
vim9script
|
||||||
|
|
||||||
|
def SorterFunc(lhs: dict<string>, rhs: dict<string>): number
|
||||||
|
return lhs.name <# rhs.name ? -1 : 1
|
||||||
|
enddef
|
||||||
|
|
||||||
|
def Run(): void
|
||||||
|
var list = [{name: "3"}, {name: "2"}]
|
||||||
|
const Sorter = get({}, "unknown", SorterFunc)
|
||||||
|
sort(list, Sorter)
|
||||||
|
assert_equal([{name: "2"}, {name: "3"}], list)
|
||||||
|
enddef
|
||||||
|
|
||||||
|
Run()
|
||||||
|
END
|
||||||
|
v9.CheckScriptSuccess(lines)
|
||||||
enddef
|
enddef
|
||||||
|
|
||||||
def Test_const_bang()
|
def Test_const_bang()
|
||||||
|
@ -699,6 +699,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
703,
|
||||||
/**/
|
/**/
|
||||||
702,
|
702,
|
||||||
/**/
|
/**/
|
||||||
|
@ -336,6 +336,17 @@ func_type_add_arg_types(
|
|||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return TRUE if "type" is NULL, any or unknown.
|
||||||
|
* This also works for const (comparing with &t_any and &t_unknown doesn't).
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
type_any_or_unknown(type_T *type)
|
||||||
|
{
|
||||||
|
return type == NULL || type->tt_type == VAR_ANY
|
||||||
|
|| type->tt_type == VAR_UNKNOWN;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get a type_T for a typval_T.
|
* Get a type_T for a typval_T.
|
||||||
* "type_gap" is used to temporarily create types in.
|
* "type_gap" is used to temporarily create types in.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user