comparison src/vim9compile.c @ 26680:1b288eb2fcdc v8.2.3869

patch 8.2.3869: Vim9: type checking for "any" is inconsistent Commit: https://github.com/vim/vim/commit/fa46ead31abe66494da775921feefece02ce6d95 Author: Bram Moolenaar <Bram@vim.org> Date: Wed Dec 22 13:18:39 2021 +0000 patch 8.2.3869: Vim9: type checking for "any" is inconsistent Problem: Vim9: type checking for "any" is inconsistent. Solution: Always use a runtime type check for using "any" for a more specific type.
author Bram Moolenaar <Bram@vim.org>
date Wed, 22 Dec 2021 14:30:05 +0100
parents 4b23672d1f0e
children b969fdb8cd46
comparison
equal deleted inserted replaced
26679:2f3b13eae139 26680:1b288eb2fcdc
364 if (actual->tt_type == VAR_ANY 364 if (actual->tt_type == VAR_ANY
365 || actual->tt_type == VAR_UNKNOWN 365 || actual->tt_type == VAR_UNKNOWN
366 || (actual->tt_type == VAR_FUNC 366 || (actual->tt_type == VAR_FUNC
367 && (expected->tt_type == VAR_FUNC 367 && (expected->tt_type == VAR_FUNC
368 || expected->tt_type == VAR_PARTIAL) 368 || expected->tt_type == VAR_PARTIAL)
369 && (actual->tt_member == &t_any || actual->tt_argcount < 0) 369 && (actual->tt_member == &t_any
370 && ((actual->tt_member == &t_void) 370 || actual->tt_member == &t_unknown
371 || actual->tt_argcount < 0)
372 && (actual->tt_member == &t_unknown ||
373 (actual->tt_member == &t_void)
371 == (expected->tt_member == &t_void)))) 374 == (expected->tt_member == &t_void))))
372 return TRUE; 375 return TRUE;
373 if ((actual->tt_type == VAR_LIST || actual->tt_type == VAR_DICT) 376 if ((actual->tt_type == VAR_LIST || actual->tt_type == VAR_DICT)
374 && actual->tt_type == expected->tt_type) 377 && actual->tt_type == expected->tt_type)
375 // This takes care of a nested list or dict. 378 // This takes care of a nested list or dict.
410 if (ret == OK) 413 if (ret == OK)
411 return OK; 414 return OK;
412 415
413 // If the actual type can be the expected type add a runtime check. 416 // If the actual type can be the expected type add a runtime check.
414 // If it's a constant a runtime check makes no sense. 417 // If it's a constant a runtime check makes no sense.
415 if (ret == MAYBE || ((!actual_is_const || actual == &t_any) 418 if (!actual_is_const && ret == MAYBE && use_typecheck(actual, expected))
416 && use_typecheck(actual, expected)))
417 { 419 {
418 generate_TYPECHECK(cctx, expected, offset, where.wt_index); 420 generate_TYPECHECK(cctx, expected, offset, where.wt_index);
419 return OK; 421 return OK;
420 } 422 }
421 423
2545 if (ufunc->uf_arg_types[arg_idx] == &t_unknown) 2547 if (ufunc->uf_arg_types[arg_idx] == &t_unknown)
2546 { 2548 {
2547 did_set_arg_type = TRUE; 2549 did_set_arg_type = TRUE;
2548 ufunc->uf_arg_types[arg_idx] = val_type; 2550 ufunc->uf_arg_types[arg_idx] = val_type;
2549 } 2551 }
2550 else if (check_type(ufunc->uf_arg_types[arg_idx], val_type, 2552 else if (need_type_where(val_type, ufunc->uf_arg_types[arg_idx],
2551 TRUE, where) == FAIL) 2553 -1, where, &cctx, FALSE, FALSE) == FAIL)
2552 goto erret; 2554 goto erret;
2553 2555
2554 if (generate_STORE(&cctx, ISN_STORE, i - count - off, NULL) == FAIL) 2556 if (generate_STORE(&cctx, ISN_STORE, i - count - off, NULL) == FAIL)
2555 goto erret; 2557 goto erret;
2556 2558