diff options
author | Oliver Kiddle <opk@users.sourceforge.net> | 2002-10-10 11:06:42 +0000 |
---|---|---|
committer | Oliver Kiddle <opk@users.sourceforge.net> | 2002-10-10 11:06:42 +0000 |
commit | 7a0ab2444d96365a7aec2c55a4e470513d8e4a10 (patch) | |
tree | c0256d226406f3941b8923481c1307c62c9c9f2e /Src/params.c | |
parent | 114d799efd1463eb1d46c0ee33c5e45948fa9e7d (diff) | |
download | zsh-7a0ab2444d96365a7aec2c55a4e470513d8e4a10.tar.gz zsh-7a0ab2444d96365a7aec2c55a4e470513d8e4a10.tar.xz zsh-7a0ab2444d96365a7aec2c55a4e470513d8e4a10.zip |
17794: fix bugs with tied parameters
Diffstat (limited to 'Src/params.c')
-rw-r--r-- | Src/params.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/Src/params.c b/Src/params.c index 72b0f2991..0b3a065ba 100644 --- a/Src/params.c +++ b/Src/params.c @@ -2234,8 +2234,21 @@ unsetparam_pm(Param pm, int altflag, int exp) /* remove it under its alternate name if necessary */ if (pm->ename && !altflag) { altpm = (Param) paramtab->getnode(paramtab, pm->ename); - if (altpm) + /* tied parameters are at the same local level as each other */ + oldpm = NULL; + while (altpm && altpm->level > pm->level) { + /* param under alternate name hidden by a local */ + oldpm = altpm; + altpm = altpm->old; + } + if (altpm) { + if (oldpm && !altpm->level) { + oldpm->old = NULL; + /* fudge things so removenode isn't called */ + altpm->level = 1; + } unsetparam_pm(altpm, 1, exp); + } } /* |