diff options
Diffstat (limited to 'src/vim9compile.c')
-rw-r--r-- | src/vim9compile.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/src/vim9compile.c b/src/vim9compile.c index e972033f0b..ead971feba 100644 --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -816,7 +816,8 @@ generate_COND2BOOL(cctx_T *cctx) generate_TYPECHECK( cctx_T *cctx, type_T *expected, - int offset) + int offset, + int argidx) { isn_T *isn; garray_T *stack = &cctx->ctx_type_stack; @@ -826,6 +827,7 @@ generate_TYPECHECK( return FAIL; isn->isn_arg.type.ct_type = alloc_type(expected); isn->isn_arg.type.ct_off = offset; + isn->isn_arg.type.ct_arg_idx = argidx; // type becomes expected ((type_T **)stack->ga_data)[stack->ga_len + offset] = expected; @@ -904,7 +906,7 @@ need_type( // If it's a constant a runtime check makes no sense. if (!actual_is_const && use_typecheck(actual, expected)) { - generate_TYPECHECK(cctx, expected, offset); + generate_TYPECHECK(cctx, expected, offset, arg_idx); return OK; } @@ -1637,7 +1639,7 @@ generate_BCALL(cctx_T *cctx, int func_idx, int argcount, int method_call) if (maptype != NULL && maptype->tt_member != NULL && maptype->tt_member != &t_any) // Check that map() didn't change the item types. - generate_TYPECHECK(cctx, maptype, -1); + generate_TYPECHECK(cctx, maptype, -1, 1); return OK; } @@ -1735,7 +1737,7 @@ generate_CALL(cctx_T *cctx, ufunc_T *ufunc, int pushed_argcount) else expected = ufunc->uf_va_type->tt_member; actual = ((type_T **)stack->ga_data)[stack->ga_len - argcount + i]; - if (need_type(actual, expected, -argcount + i, 0, cctx, + if (need_type(actual, expected, -argcount + i, i + 1, cctx, TRUE, FALSE) == FAIL) { arg_type_mismatch(expected, actual, i + 1); @@ -1852,7 +1854,7 @@ generate_PCALL( type->tt_argcount - 1]->tt_member; else expected = type->tt_args[i]; - if (need_type(actual, expected, offset, 0, + if (need_type(actual, expected, offset, i + 1, cctx, TRUE, FALSE) == FAIL) { arg_type_mismatch(expected, actual, i + 1); |