summaryrefslogtreecommitdiff
path: root/Src/builtin.c
diff options
context:
space:
mode:
authorPeter Stephenson <pws@zsh.org>2015-11-20 11:18:16 +0000
committerPeter Stephenson <pws@zsh.org>2015-11-20 11:18:16 +0000
commit72a67716aca9896cb75a2b92457fdaed060d8e9e (patch)
treec363f3aa4d587bed22ea3737da1b7f666e96bcd9 /Src/builtin.c
parentc563f1ba83c40aab632ac958a1d3a57277ca22cc (diff)
downloadzsh-72a67716aca9896cb75a2b92457fdaed060d8e9e.tar.gz
zsh-72a67716aca9896cb75a2b92457fdaed060d8e9e.zip
20974: Bug with scalar assignment to special array in typeset
Diffstat (limited to 'Src/builtin.c')
-rw-r--r--Src/builtin.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/Src/builtin.c b/Src/builtin.c
index 18dfdce05..01eb5b84c 100644
--- a/Src/builtin.c
+++ b/Src/builtin.c
@@ -2438,10 +2438,26 @@ typeset_single(char *cname, char *pname, Param pm, UNUSED(int func),
if (ASG_VALUEP(asg) && !dont_set) {
Param ipm = pm;
if (pm->node.flags & (PM_ARRAY|PM_HASHED)) {
- DPUTS(!ASG_ARRAYP(asg), "BUG: inconsistent scalar value for array");
- if (!(pm=assignaparam(pname, asg->value.array ?
- zlinklist2array(asg->value.array) :
- mkarray(NULL), 0)))
+ char **arrayval;
+ if (!ASG_ARRAYP(asg)) {
+ /*
+ * Attempt to assign a scalar value to an array.
+ * This can happen if the array is special.
+ * We'll be lenient and guess what the user meant.
+ * This is how normal assigment works.
+ */
+ if (*asg->value.scalar) {
+ /* Array with one value */
+ arrayval = mkarray(ztrdup(asg->value.scalar));
+ } else {
+ /* Empty array */
+ arrayval = mkarray(NULL);
+ }
+ } else if (asg->value.array)
+ arrayval = zlinklist2array(asg->value.array);
+ else
+ arrayval = mkarray(NULL);
+ if (!(pm=assignaparam(pname, arrayval, 0)))
return NULL;
} else {
DPUTS(ASG_ARRAYP(asg), "BUG: inconsistent array value for scalar");