forked from aniani/vim
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 */
|
/* vim9type.c */
|
||||||
|
type_T *alloc_type(garray_T *type_gap);
|
||||||
void clear_type_list(garray_T *gap);
|
void clear_type_list(garray_T *gap);
|
||||||
type_T *get_list_type(type_T *member_type, garray_T *type_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);
|
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_VARARGS 1 // func args ends with "..."
|
||||||
#define TTFLAG_OPTARG 2 // func arg type 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.
|
* Structure to hold an internal variable without a name.
|
||||||
|
@@ -45,6 +45,11 @@ def Test_assignment()
|
|||||||
let bool2: bool = false
|
let bool2: bool = false
|
||||||
assert_equal(v:false, bool2)
|
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'], 'E1069:')
|
||||||
CheckDefFailure(['let x:string = "x"'], 'E1069:')
|
CheckDefFailure(['let x:string = "x"'], 'E1069:')
|
||||||
CheckDefFailure(['let a:string = "x"'], 'E1069:')
|
CheckDefFailure(['let a:string = "x"'], 'E1069:')
|
||||||
|
@@ -754,6 +754,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 */
|
||||||
|
/**/
|
||||||
|
1641,
|
||||||
/**/
|
/**/
|
||||||
1640,
|
1640,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -751,12 +751,25 @@ need_type(
|
|||||||
generate_PUSHNR(cctx_T *cctx, varnumber_T number)
|
generate_PUSHNR(cctx_T *cctx, varnumber_T number)
|
||||||
{
|
{
|
||||||
isn_T *isn;
|
isn_T *isn;
|
||||||
|
garray_T *stack = &cctx->ctx_type_stack;
|
||||||
|
|
||||||
RETURN_OK_IF_SKIP(cctx);
|
RETURN_OK_IF_SKIP(cctx);
|
||||||
if ((isn = generate_instr_type(cctx, ISN_PUSHNR, &t_number)) == NULL)
|
if ((isn = generate_instr_type(cctx, ISN_PUSHNR, &t_number)) == NULL)
|
||||||
return FAIL;
|
return FAIL;
|
||||||
isn->isn_arg.number = number;
|
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;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -24,7 +24,7 @@
|
|||||||
* Allocate memory for a type_T and add the pointer to type_gap, so that it can
|
* Allocate memory for a type_T and add the pointer to type_gap, so that it can
|
||||||
* be freed later.
|
* be freed later.
|
||||||
*/
|
*/
|
||||||
static type_T *
|
type_T *
|
||||||
alloc_type(garray_T *type_gap)
|
alloc_type(garray_T *type_gap)
|
||||||
{
|
{
|
||||||
type_T *type;
|
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 != 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)
|
if (give_msg)
|
||||||
arg_type_mismatch(expected, actual, argidx);
|
arg_type_mismatch(expected, actual, argidx);
|
||||||
return FAIL;
|
return FAIL;
|
||||||
|
Reference in New Issue
Block a user