summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--Src/builtin.c15
-rw-r--r--Test/B02typeset.ztst9
3 files changed, 25 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index 84ed5c287..97bf9bb77 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2008-09-13 Peter Stephenson <p.w.stephenson@ntlworld.com>
+
+ * 25662: Src/builtin.c, Test/B02typeset.ztst: declare -p
+ should never create variables.
+
2008-09-13 Clint Adams <clint@zsh.org>
* 25656: Src/params.c: free val only after it may be passed to
diff --git a/Src/builtin.c b/Src/builtin.c
index 8adc7fcb1..8246453f4 100644
--- a/Src/builtin.c
+++ b/Src/builtin.c
@@ -2473,10 +2473,17 @@ bin_typeset(char *name, char **argv, Options ops, int func)
/* Take arguments literally. Don't glob */
while ((asg = getasg(*argv++))) {
- if (!typeset_single(name, asg->name,
- (Param) (paramtab == realparamtab ?
- gethashnode2(paramtab, asg->name) :
- paramtab->getnode(paramtab, asg->name)),
+ HashNode hn = (paramtab == realparamtab ?
+ gethashnode2(paramtab, asg->name) :
+ paramtab->getnode(paramtab, asg->name));
+ if (OPT_ISSET(ops,'p')) {
+ if (hn)
+ printparamnode(hn, printflags);
+ else
+ zwarnnam(name, "no such variable: %s", asg->name);
+ continue;
+ }
+ if (!typeset_single(name, asg->name, (Param)hn,
func, on, off, roff, asg->value, NULL,
ops, 0))
returnval = 1;
diff --git a/Test/B02typeset.ztst b/Test/B02typeset.ztst
index 34e2dab26..abb549ed6 100644
--- a/Test/B02typeset.ztst
+++ b/Test/B02typeset.ztst
@@ -444,3 +444,12 @@
0:Lower case conversion, does not apply to values used internally
>lower
>value of $lower
+
+ typeset -a array
+ array=(foo bar)
+ fn() { typeset -p array nonexistent; }
+ fn
+0:declare -p shouldn't create scoped values
+>typeset -a array
+>array=(foo bar)
+?fn:typeset: no such variable: nonexistent