From 80e47a9a5d0db57dfbf90af6d2b892c8a1b0d36b Mon Sep 17 00:00:00 2001
From: Peter Stephenson
Date: Thu, 26 Jan 2017 19:58:01 +0000
Subject: 40422: More WARN_NESTED_VAR cases.
Converting type when using a calling scope was broken in the
original patch.
---
ChangeLog | 5 +++++
Src/params.c | 17 +++++++++--------
Test/E01options.ztst | 12 ++++++++++++
3 files changed, 26 insertions(+), 8 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 8e22e9f4f..feff6f349 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2017-01-26 Peter Stephenson
+
+ * 40422: Src/params.c, Test/E01options.ztst: more
+ WARN_NESTED_VAR cases that were broken in the original patch.
+
2017-01-25 Peter Stephenson
* 40413: Src/params.c, Test/E01options.ztst: no WARN_NESTED_VAR
diff --git a/Src/params.c b/Src/params.c
index c38f2e001..45b37cb4f 100644
--- a/Src/params.c
+++ b/Src/params.c
@@ -2905,7 +2905,7 @@ assignsparam(char *s, char *val, int flags)
char *ss, *copy, *var;
size_t lvar;
mnumber lhs, rhs;
- int sstart;
+ int sstart, created = 0;
if (!isident(s)) {
zerr("not an identifier: %s", s);
@@ -2916,9 +2916,10 @@ assignsparam(char *s, char *val, int flags)
queue_signals();
if ((ss = strchr(s, '['))) {
*ss = '\0';
- if (!(v = getvalue(&vbuf, &s, 1)))
+ if (!(v = getvalue(&vbuf, &s, 1))) {
createparam(t, PM_ARRAY);
- else {
+ created = 1;
+ } else {
if (v->pm->node.flags & PM_READONLY) {
zerr("read-only variable: %s", v->pm->node.nam);
*ss = '[';
@@ -2935,18 +2936,18 @@ assignsparam(char *s, char *val, int flags)
*ss = '[';
v = NULL;
} else {
- if (!(v = getvalue(&vbuf, &s, 1)))
+ if (!(v = getvalue(&vbuf, &s, 1))) {
createparam(t, PM_SCALAR);
- else if ((((v->pm->node.flags & PM_ARRAY) && !(flags & ASSPM_AUGMENT)) ||
+ created = 1;
+ } else if ((((v->pm->node.flags & PM_ARRAY) && !(flags & ASSPM_AUGMENT)) ||
(v->pm->node.flags & PM_HASHED)) &&
!(v->pm->node.flags & (PM_SPECIAL|PM_TIED)) &&
unset(KSHARRAYS)) {
unsetparam(t);
createparam(t, PM_SCALAR);
+ /* not regarded as a new creation */
v = NULL;
}
- else
- flags &= ~ASSPM_WARN_CREATE;
}
if (!v && !(v = getvalue(&vbuf, &t, 1))) {
unqueue_signals();
@@ -2955,7 +2956,7 @@ assignsparam(char *s, char *val, int flags)
return NULL;
}
if (flags & ASSPM_WARN)
- check_warn_pm(v->pm, "scalar", flags & ASSPM_WARN_CREATE);
+ check_warn_pm(v->pm, "scalar", created);
if (flags & ASSPM_AUGMENT) {
if (v->start == 0 && v->end == -1) {
switch (PM_TYPE(v->pm->node.flags)) {
diff --git a/Test/E01options.ztst b/Test/E01options.ztst
index fd3263a8f..c265d78d8 100644
--- a/Test/E01options.ztst
+++ b/Test/E01options.ztst
@@ -1203,6 +1203,18 @@
>association-local
>foo
+ (
+ setopt warnnestedvar
+ () {
+ local var=(one two)
+ () { var=three; }
+ print $var
+ }
+ )
+0:Warn when changing type of nested variable.
+?(anon): scalar parameter var set in enclosing scope in function (anon)
+>three
+
# This really just tests if XTRACE is egregiously broken.
# To test it properly would need a full set of its own.
fn() { print message; }
--
cgit v1.2.3-70-g09d2