Mercurial > vim
diff src/vim9compile.c @ 24956:d0b6a8d82cef v8.2.3015
patch 8.2.3015: Vim9: Assigning to @# requires a string
Commit: https://github.com/vim/vim/commit/74f4a965bc6e2a9c41cce2f644e861168702922f
Author: Bram Moolenaar <Bram@vim.org>
Date: Thu Jun 17 21:03:07 2021 +0200
patch 8.2.3015: Vim9: Assigning to @# requires a string
Problem: Vim9: Assigning to @# requires a string. (Naohiro Ono)
Solution: Accent a number or a string. (closes https://github.com/vim/vim/issues/8396)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Thu, 17 Jun 2021 21:15:03 +0200 |
parents | 5c418c774f95 |
children | 71b1e2ef0069 |
line wrap: on
line diff
--- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -5852,7 +5852,7 @@ get_var_dest( return FAIL; } *dest = dest_reg; - *type = &t_string; + *type = name[1] == '#' ? &t_number_or_string : &t_string; } else if (STRNCMP(name, "g:", 2) == 0) { @@ -5927,7 +5927,8 @@ generate_store_var( case dest_env: return generate_STORE(cctx, ISN_STOREENV, 0, name + 1); case dest_reg: - return generate_STORE(cctx, ISN_STOREREG, name[1], NULL); + return generate_STORE(cctx, ISN_STOREREG, + name[1] == '@' ? '"' : name[1], NULL); case dest_vimvar: return generate_STORE(cctx, ISN_STOREV, vimvaridx, NULL); case dest_script: @@ -6843,9 +6844,19 @@ compile_assignment(char_u *arg, exarg_T goto theend; } } - else if (*p != '=' && need_type(rhs_type, lhs.lhs_member_type, + else + { + type_T *lhs_type = lhs.lhs_member_type; + + // Special case: assigning to @# can use a number or a + // string. + if (lhs_type == &t_number_or_string + && rhs_type->tt_type == VAR_NUMBER) + lhs_type = &t_number; + if (*p != '=' && need_type(rhs_type, lhs_type, -1, 0, cctx, FALSE, FALSE) == FAIL) goto theend; + } } else if (cmdidx == CMD_final) {