summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2021-11-30 11:56:22 +0000
committerBram Moolenaar <Bram@vim.org>2021-11-30 11:56:22 +0000
commit98cb90ef865089a5ddd20bc0303d449fb7d97fb2 (patch)
tree34a47025742f1c635e583c5aeced5f0fe7e92476
parentc750d91a07ace532e993349aa5c13dda5c888cc0 (diff)
downloadvim-git-98cb90ef865089a5ddd20bc0303d449fb7d97fb2.tar.gz
patch 8.2.3702: first key in dict is seen as curly expression and failsv8.2.3702
Problem: First key in dict is seen as curly expression and fails. Solution: Ignore failure of curly expression. (closes #9247)
-rw-r--r--src/dict.c14
-rw-r--r--src/testdir/test_listdict.vim3
-rw-r--r--src/typval.c3
-rw-r--r--src/version.c2
4 files changed, 13 insertions, 9 deletions
diff --git a/src/dict.c b/src/dict.c
index 032c1b5a8..98be26310 100644
--- a/src/dict.c
+++ b/src/dict.c
@@ -891,7 +891,7 @@ eval_dict(char_u **arg, typval_T *rettv, evalarg_T *evalarg, int literal)
typval_T tv;
char_u *key = NULL;
dictitem_T *item;
- char_u *start = skipwhite(*arg + 1);
+ char_u *curly_expr = skipwhite(*arg + 1);
char_u buf[NUMBUFLEN];
int vim9script = in_vim9script();
int had_comma;
@@ -903,13 +903,11 @@ eval_dict(char_u **arg, typval_T *rettv, evalarg_T *evalarg, int literal)
* first item.
* But {} is an empty Dictionary.
*/
- if (!vim9script && *start != '}')
- {
- if (eval1(&start, &tv, NULL) == FAIL) // recursive!
- return FAIL;
- if (*skipwhite(start) == '}')
- return NOTDONE;
- }
+ if (!vim9script
+ && *curly_expr != '}'
+ && eval1(&curly_expr, &tv, NULL) == OK
+ && *skipwhite(curly_expr) == '}')
+ return NOTDONE;
if (evaluate)
{
diff --git a/src/testdir/test_listdict.vim b/src/testdir/test_listdict.vim
index 0b024a0f6..10cb78662 100644
--- a/src/testdir/test_listdict.vim
+++ b/src/testdir/test_listdict.vim
@@ -297,6 +297,9 @@ func Test_dict()
call assert_fails('let d={[] : 10}', 'E730:')
" undefined variable as value
call assert_fails("let d={'k' : i}", 'E121:')
+
+ " allow key starting with number at the start, not a curly expression
+ call assert_equal({'1foo': 77}, #{1foo: 77})
endfunc
" This was allowed in legacy Vim script
diff --git a/src/typval.c b/src/typval.c
index c859122ee..fb945cb13 100644
--- a/src/typval.c
+++ b/src/typval.c
@@ -1822,7 +1822,8 @@ eval_number(
: STR2NR_ALL, &n, NULL, 0, TRUE);
if (len == 0)
{
- semsg(_(e_invalid_expression_str), *arg);
+ if (evaluate)
+ semsg(_(e_invalid_expression_str), *arg);
return FAIL;
}
*arg += len;
diff --git a/src/version.c b/src/version.c
index b8dbf37b5..302db8e0b 100644
--- a/src/version.c
+++ b/src/version.c
@@ -754,6 +754,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 3702,
+/**/
3701,
/**/
3700,