mirror of
https://github.com/vim/vim.git
synced 2025-09-23 03:43:49 -04:00
patch 8.2.1641: Vim9: cannot use 0 or 1 where a bool is expected
Problem: Vim9: cannot use 0 or 1 where a bool is expected. Solution: Allow using 0 and 1 for a bool type. (closes #6903)
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
/* vim9type.c */
|
||||
type_T *alloc_type(garray_T *type_gap);
|
||||
void clear_type_list(garray_T *gap);
|
||||
type_T *get_list_type(type_T *member_type, garray_T *type_gap);
|
||||
type_T *get_dict_type(type_T *member_type, garray_T *type_gap);
|
||||
|
@@ -1373,6 +1373,7 @@ struct type_S {
|
||||
|
||||
#define TTFLAG_VARARGS 1 // func args ends with "..."
|
||||
#define TTFLAG_OPTARG 2 // func arg type with "?"
|
||||
#define TTFLAG_BOOL_OK 4 // can be converted to bool
|
||||
|
||||
/*
|
||||
* Structure to hold an internal variable without a name.
|
||||
|
@@ -45,6 +45,11 @@ def Test_assignment()
|
||||
let bool2: bool = false
|
||||
assert_equal(v:false, bool2)
|
||||
|
||||
let bool3: bool = 0
|
||||
assert_equal(0, bool3)
|
||||
let bool4: bool = 1
|
||||
assert_equal(1, bool4)
|
||||
|
||||
CheckDefFailure(['let x:string'], 'E1069:')
|
||||
CheckDefFailure(['let x:string = "x"'], 'E1069:')
|
||||
CheckDefFailure(['let a:string = "x"'], 'E1069:')
|
||||
|
@@ -754,6 +754,8 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
1641,
|
||||
/**/
|
||||
1640,
|
||||
/**/
|
||||
|
@@ -751,12 +751,25 @@ need_type(
|
||||
generate_PUSHNR(cctx_T *cctx, varnumber_T number)
|
||||
{
|
||||
isn_T *isn;
|
||||
garray_T *stack = &cctx->ctx_type_stack;
|
||||
|
||||
RETURN_OK_IF_SKIP(cctx);
|
||||
if ((isn = generate_instr_type(cctx, ISN_PUSHNR, &t_number)) == NULL)
|
||||
return FAIL;
|
||||
isn->isn_arg.number = number;
|
||||
|
||||
if (number == 0 || number == 1)
|
||||
{
|
||||
type_T *type = alloc_type(cctx->ctx_type_list);
|
||||
|
||||
// A 0 or 1 number can also be used as a bool.
|
||||
if (type != NULL)
|
||||
{
|
||||
type->tt_type = VAR_NUMBER;
|
||||
type->tt_flags = TTFLAG_BOOL_OK;
|
||||
((type_T **)stack->ga_data)[stack->ga_len - 1] = type;
|
||||
}
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
|
||||
|
@@ -24,7 +24,7 @@
|
||||
* Allocate memory for a type_T and add the pointer to type_gap, so that it can
|
||||
* be freed later.
|
||||
*/
|
||||
static type_T *
|
||||
type_T *
|
||||
alloc_type(garray_T *type_gap)
|
||||
{
|
||||
type_T *type;
|
||||
@@ -359,6 +359,10 @@ check_type(type_T *expected, type_T *actual, int give_msg, int argidx)
|
||||
{
|
||||
if (expected->tt_type != actual->tt_type)
|
||||
{
|
||||
if (expected->tt_type == VAR_BOOL && actual->tt_type == VAR_NUMBER
|
||||
&& (actual->tt_flags & TTFLAG_BOOL_OK))
|
||||
// Using number 0 or 1 for bool is OK.
|
||||
return OK;
|
||||
if (give_msg)
|
||||
arg_type_mismatch(expected, actual, argidx);
|
||||
return FAIL;
|
||||
|
Reference in New Issue
Block a user