summaryrefslogtreecommitdiffstats
path: root/Src/params.c
diff options
context:
space:
mode:
Diffstat (limited to 'Src/params.c')
-rw-r--r--Src/params.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/Src/params.c b/Src/params.c
index 1a2bf62d2..fec1b2c02 100644
--- a/Src/params.c
+++ b/Src/params.c
@@ -5899,9 +5899,8 @@ scanendscope(HashNode hn, UNUSED(int flags))
pm = hidden;
if (pm && (pm->node.flags & PM_NAMEREF) &&
pm->base >= pm->level && pm->base >= locallevel) {
+ /* Should never get here for a -u reference */
pm->base = locallevel;
- if (pm->level < locallevel && (pm->node.flags & PM_UPPER))
- pm->node.flags &= ~PM_UPPER;
}
}
@@ -6307,7 +6306,9 @@ resolve_nameref(Param pm, const Asgment stop)
if (pm) {
if (!(stop && (stop->flags & (PM_LOCAL)))) {
int scope = ((pm->node.flags & PM_NAMEREF) ?
- ((pm->node.flags & PM_UPPER) ? -(pm->base) :
+ ((pm->node.flags & PM_UPPER) ?
+ /* pm->base == 0 means not set yet */
+ -(pm->base ? pm->base : pm->level) :
pm->base) : ((Param)hn)->level);
hn = (HashNode)upscope((Param)hn, scope);
}
@@ -6413,14 +6414,14 @@ setscope(Param pm)
} else if (!pm->base) {
pm->base = basepm->level;
if ((pm->node.flags & PM_UPPER) &&
- (basepm = upscope(basepm, -locallevel)))
+ (basepm = upscope(basepm, -(pm->level))))
pm->base = basepm->level;
}
} else if (pm->base < locallevel && refname &&
(basepm = (Param)getparamnode(realparamtab, refname))) {
pm->base = basepm->level;
if ((pm->node.flags & PM_UPPER) &&
- (basepm = upscope(basepm, -locallevel)))
+ (basepm = upscope(basepm, -(pm->level))))
pm->base = basepm->level;
}
if (pm->base > pm->level) {