diff options
author | Peter Stephenson <pws@zsh.org> | 2015-06-22 10:16:52 +0100 |
---|---|---|
committer | Peter Stephenson <pws@zsh.org> | 2015-06-22 10:16:52 +0100 |
commit | dcb000e53a04c608cbfea4c6b7977d2f6b8fe823 (patch) | |
tree | cae0cd1e250a67cc03816c6263d01493cc28a6a9 | |
parent | c9ab2bf594acca387cc7f91d2dd99523284de64e (diff) | |
download | zsh-dcb000e53a04c608cbfea4c6b7977d2f6b8fe823.tar.gz zsh-dcb000e53a04c608cbfea4c6b7977d2f6b8fe823.tar.xz zsh-dcb000e53a04c608cbfea4c6b7977d2f6b8fe823.zip |
Add errors for incorrect types of assignment
-rw-r--r-- | Src/builtin.c | 13 |
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, |