# HG changeset patch # User Bram Moolenaar # Date 1609526703 -3600 # Node ID 8f31b990ab1eefb151538caa8bb4c5a1f49896aa # Parent 15d05ad7a3a55cd4a6d1de3817297b9cd90551c0 patch 8.2.2267: Vim9: cannot use unlet for a dict member Commit: https://github.com/vim/vim/commit/c368957b1904bfaa2b0b52bbcade51b20173f3ed Author: Bram Moolenaar Date: Fri Jan 1 19:40:02 2021 +0100 patch 8.2.2267: Vim9: cannot use unlet for a dict member Problem: Vim9: cannot use unlet for a dict member. Solution: Pass GLV_NO_DECL to get_lval(). (closes https://github.com/vim/vim/issues/7585) diff --git a/src/evalvars.c b/src/evalvars.c --- a/src/evalvars.c +++ b/src/evalvars.c @@ -1566,7 +1566,7 @@ ex_unletlock( { // Parse the name and find the end. name_end = get_lval(arg, NULL, &lv, TRUE, eap->skip || error, - glv_flags, FNE_CHECK_START); + glv_flags | GLV_NO_DECL, FNE_CHECK_START); if (lv.ll_name == NULL) error = TRUE; // error but continue parsing if (name_end == NULL || (!VIM_ISWHITE(*name_end) diff --git a/src/testdir/test_vim9_assign.vim b/src/testdir/test_vim9_assign.vim --- a/src/testdir/test_vim9_assign.vim +++ b/src/testdir/test_vim9_assign.vim @@ -984,19 +984,39 @@ def Test_assign_list() enddef def Test_assign_dict() - var d: dict = {} - d['key'] = 'value' - assert_equal('value', d['key']) + var lines =<< trim END + var d: dict = {} + d['key'] = 'value' + assert_equal('value', d['key']) + + d[123] = 'qwerty' + assert_equal('qwerty', d[123]) + assert_equal('qwerty', d['123']) + + var nrd: dict = {} + for i in range(3) + nrd[i] = i + endfor + assert_equal({0: 0, 1: 1, 2: 2}, nrd) - d[123] = 'qwerty' - assert_equal('qwerty', d[123]) - assert_equal('qwerty', d['123']) + d.somekey = 'someval' + assert_equal({key: 'value', '123': 'qwerty', somekey: 'someval'}, d) + # unlet d.somekey + # assert_equal({key: 'value', '123': 'qwerty'}, d) + END + CheckDefAndScriptSuccess(lines) - var nrd: dict = {} - for i in range(3) - nrd[i] = i - endfor - assert_equal({0: 0, 1: 1, 2: 2}, nrd) + # TODO: move to above once "unlet d.somekey" in :def is implemented + lines =<< trim END + vim9script + var d: dict = {} + d['key'] = 'value' + d.somekey = 'someval' + assert_equal({key: 'value', somekey: 'someval'}, d) + unlet d.somekey + assert_equal({key: 'value'}, d) + END + CheckScriptSuccess(lines) CheckDefFailure(["var d: dict = {a: '', b: true}"], 'E1012: Type mismatch; expected dict but got dict', 1) CheckDefFailure(["var d: dict> = {x: {a: '', b: true}}"], 'E1012: Type mismatch; expected dict> but got dict>', 1) diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2267, +/**/ 2266, /**/ 2265,