diff options
author | Bart Schaefer <schaefer@zsh.org> | 2024-03-01 15:43:50 -0800 |
---|---|---|
committer | Bart Schaefer <schaefer@zsh.org> | 2024-03-01 15:43:50 -0800 |
commit | 13f73d84d3a69085df148e7cfe03ed6448a1238b (patch) | |
tree | 253e194e86dfe61dc2b1895ceb24346e10a76b0b /Src/builtin.c | |
parent | 85172998f499cb789570714ffdd43f1ca3b53e58 (diff) | |
download | zsh-13f73d84d3a69085df148e7cfe03ed6448a1238b.tar.gz zsh-13f73d84d3a69085df148e7cfe03ed6448a1238b.tar.xz zsh-13f73d84d3a69085df148e7cfe03ed6448a1238b.zip |
52645: unset through a nameref keep up-scope parameters declared unset
Othewise unset of a reference to a global wipes out all parameters of the same name.
Diffstat (limited to 'Src/builtin.c')
-rw-r--r-- | Src/builtin.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/Src/builtin.c b/Src/builtin.c index 44dfed651..83144677b 100644 --- a/Src/builtin.c +++ b/Src/builtin.c @@ -3932,8 +3932,14 @@ bin_unset(char *name, char **argv, Options ops, int func) } } else { if (!OPT_ISSET(ops,'n')) { + int ref = (pm->node.flags & PM_NAMEREF); if (!(pm = (Param)resolve_nameref(pm, NULL))) continue; + if (ref && pm->level < locallevel) { + /* Just mark unset, do not remove from table */ + pm->node.flags |= PM_DECLARED|PM_UNSET; + continue; + } } if (unsetparam_pm(pm, 0, 1)) returnval = 1; |