Mercurial > vim
diff src/vim9compile.c @ 26372:f5727e2603f0 v8.2.3717
patch 8.2.3717: Vim9: error for constant list size is only given at runtime
Commit: https://github.com/vim/vim/commit/db9ff9ab5d7ce1fcc2c4106e7ad49151a323996c
Author: Bram Moolenaar <Bram@vim.org>
Date: Wed Dec 1 17:38:01 2021 +0000
patch 8.2.3717: Vim9: error for constant list size is only given at runtime
Problem: Vim9: error for constant list size is only given at runtime.
Solution: Give the error at compile time if possible.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Wed, 01 Dec 2021 18:45:03 +0100 |
parents | a3a0885d9dd8 |
children | 1bbb884c8561 |
line wrap: on
line diff
--- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -6999,6 +6999,8 @@ compile_assignment(char_u *arg, exarg_T if (cctx->ctx_skip != SKIP_YES) { type_T *stacktype; + int needed_list_len; + int did_check = FALSE; stacktype = stack->ga_len == 0 ? &t_void : ((type_T **)stack->ga_data)[stack->ga_len - 1]; @@ -7010,9 +7012,26 @@ compile_assignment(char_u *arg, exarg_T if (need_type(stacktype, &t_list_any, -1, 0, cctx, FALSE, FALSE) == FAIL) goto theend; - // TODO: check the length of a constant list here - generate_CHECKLEN(cctx, semicolon ? var_count - 1 : var_count, - semicolon); + // If a constant list was used we can check the length right here. + needed_list_len = semicolon ? var_count - 1 : var_count; + if (instr->ga_len > 0) + { + isn_T *isn = ((isn_T *)instr->ga_data) + instr->ga_len - 1; + + if (isn->isn_type == ISN_NEWLIST) + { + did_check = TRUE; + if (semicolon ? isn->isn_arg.number < needed_list_len + : isn->isn_arg.number != needed_list_len) + { + semsg(_(e_expected_nr_items_but_got_nr), + needed_list_len, isn->isn_arg.number); + goto theend; + } + } + } + if (!did_check) + generate_CHECKLEN(cctx, needed_list_len, semicolon); if (stacktype->tt_member != NULL) rhs_type = stacktype->tt_member; }