summary refs log tree commit diff
diff options
context:
space:
mode:
authorPeter Stephenson <p.w.stephenson@ntlworld.com>2017-01-26 19:58:01 +0000
committerPeter Stephenson <p.w.stephenson@ntlworld.com>2017-01-26 19:58:17 +0000
commit80e47a9a5d0db57dfbf90af6d2b892c8a1b0d36b (patch)
treeb84f0cd8b51e744134e82cd2a0bbb4cbe10c098a
parentb3637caa90e30a630fb7e677c54d5f0a1b27985d (diff)
downloadzsh-80e47a9a5d0db57dfbf90af6d2b892c8a1b0d36b.tar.gz
zsh-80e47a9a5d0db57dfbf90af6d2b892c8a1b0d36b.tar.xz
zsh-80e47a9a5d0db57dfbf90af6d2b892c8a1b0d36b.zip
40422: More WARN_NESTED_VAR cases.
Converting type when using a calling scope was broken in the
original patch.
-rw-r--r--ChangeLog5
-rw-r--r--Src/params.c17
-rw-r--r--Test/E01options.ztst12
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  <p.w.stephenson@ntlworld.com>
+
+	* 40422: Src/params.c, Test/E01options.ztst: more
+	WARN_NESTED_VAR cases that were broken in the original patch.
+
 2017-01-25  Peter Stephenson  <p.stephenson@samsung.com>
 
 	* 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; }