about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPeter Stephenson <pws@zsh.org>2015-06-22 10:16:52 +0100
committerPeter Stephenson <pws@zsh.org>2015-06-22 10:16:52 +0100
commitdcb000e53a04c608cbfea4c6b7977d2f6b8fe823 (patch)
treecae0cd1e250a67cc03816c6263d01493cc28a6a9
parentc9ab2bf594acca387cc7f91d2dd99523284de64e (diff)
downloadzsh-dcb000e53a04c608cbfea4c6b7977d2f6b8fe823.tar.gz
zsh-dcb000e53a04c608cbfea4c6b7977d2f6b8fe823.tar.xz
zsh-dcb000e53a04c608cbfea4c6b7977d2f6b8fe823.zip
Add errors for incorrect types of assignment
-rw-r--r--Src/builtin.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/Src/builtin.c b/Src/builtin.c
index dd28c8b47..ba384068d 100644
--- a/Src/builtin.c
+++ b/Src/builtin.c
@@ -2130,6 +2130,12 @@ typeset_single(char *cname, char *pname, Param pm, UNUSED(int func),
      *   ii. we are creating a new local parameter
      */
     if (usepm) {
+	if (asg->is_array ?
+	    (asg->value.array && !(PM_TYPE(pm->node.flags) & (PM_ARRAY|PM_HASHED))) :
+	    (asg->value.scalar && (PM_TYPE(pm->node.flags & (PM_ARRAY|PM_HASHED))))) {
+	    zerrnam(cname, "%s: inconsistent type for assignment", pname);
+	    return NULL;
+	}
 	on &= ~PM_LOCAL;
 	if (!on && !roff && !ASG_VALUEP(asg)) {
 	    if (OPT_ISSET(ops,'p'))
@@ -2203,6 +2209,13 @@ typeset_single(char *cname, char *pname, Param pm, UNUSED(int func),
 	return pm;
     }
 
+    if (asg->is_array ?
+	(asg->value.array && !(on & (PM_ARRAY|PM_HASHED))) :
+	(asg->value.scalar && (on & (PM_ARRAY|PM_HASHED)))) {
+	zerrnam(cname, "%s: inconsistent type for assignment", pname);
+	return NULL;
+    }
+
     /*
      * We're here either because we're creating a new parameter,
      * or we're adding a parameter at a different local level,