summaryrefslogtreecommitdiff
path: root/Src
diff options
context:
space:
mode:
authorBart Schaefer <schaefer@zsh.org>2025-03-31 15:25:34 -0700
committerBart Schaefer <schaefer@zsh.org>2025-03-31 15:25:34 -0700
commite7163e69d90f8dcd5cdeea054df929b635f89260 (patch)
treefcc4c39b74fe2ffd8685bd12d072febaf147883a /Src
parentb707a60351bb9224fb808b3155dfef3288eef039 (diff)
downloadzsh-e7163e69d90f8dcd5cdeea054df929b635f89260.tar.gz
zsh-e7163e69d90f8dcd5cdeea054df929b635f89260.zip
53431: fix assignment via named reference to parameters in outer scopes
Diffstat (limited to 'Src')
-rw-r--r--Src/params.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/Src/params.c b/Src/params.c
index d1c06b893..c10236a0d 100644
--- a/Src/params.c
+++ b/Src/params.c
@@ -6395,7 +6395,9 @@ setscope(Param pm)
}
} else
pm->base = basepm->level;
- }
+ } else if (pm->base < locallevel && refname &&
+ (basepm = (Param)getparamnode(realparamtab, refname)))
+ pm->base = basepm->level;
if (pm->base > pm->level) {
if (EMULATION(EMULATE_KSH)) {
zerr("%s: global reference cannot refer to local variable",
@@ -6420,6 +6422,8 @@ upscope(Param pm, int reflevel)
{
Param up = pm->old;
while (up && up->level >= reflevel) {
+ if (reflevel < 0 && up->level < locallevel)
+ break;
pm = up;
up = up->old;
}