Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
[PATCH] Perform cumulative typesetting also on parameters with no value
- X-seq: zsh-workers 55020
- From: Philippe Altherr <philippe.altherr@xxxxxxxxx>
- To: Zsh hackers list <zsh-workers@xxxxxxx>
- Subject: [PATCH] Perform cumulative typesetting also on parameters with no value
- Date: Thu, 23 Jul 2026 00:01:02 +0200
- Arc-authentication-results: i=1; mx.google.com; arc=none
- Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20260327; h=to:subject:message-id:date:from:mime-version:dkim-signature; bh=rtRHBvF8d9evqdLKebEm3OS2PKJlZkvpMbYJ550NC+A=; fh=BgAYDYpL6Ne/A5nWEMVJiHiBtrz8Imz3uf26RDwgQX4=; b=m8RIBqZMC+PCAoRuEP/UN8JirhbiMcBJ5lj55nbfRwgi4wlbwuE+prCLVw2Vpft/hP huVVuC0mpweW+4lf4owfx7wI2EYg3T08aipyUU9A2QmlTuMNGsrZXJBmhp7NegWri/D0 EZK53sBqYUaWMoIDotQ81POc+mztbY/Em5S30Z3PTDQmSAPvVGd4JXpFJvmFd9Urtogk U/5cb5MTM6I5hF+Ng42ZMxqrny0KK0ogMgE+54PSUmjqEggTSXt14l6NW8OC8+wR2tka egtzNIwITzSYZJqjAc/SpayX7X/ZU5GNVmfmNkDD5TLznkr2SUtDPuw8Yy7ngQ5AsMzO ErrA==; darn=zsh.org
- Arc-seal: i=1; a=rsa-sha256; t=1784757675; cv=none; d=google.com; s=arc-20260327; b=YKIiH81TJbTft2w2Kz7Od9my8nruJeEvTmSDP/ONF7x0aJ76+rHrfGwixvM7ScgbRF A7/nVSawcuhzghl5SKzy+4sESX/nKE3oWEZeBvpcuxvys7EgxByHACpX3k3DfdMlfV0g HMBWzYKS8fKxM1393htcCI275qu25mVHs7uRSd1NSuE+7lxgg4miGD4xNB+oywFS8Ao/ DQe6Zcocx7MaxOUMAg6z1mD1zMzybsV/fvwGSzd/boESM7U8W5BPEhWZEJ+0MCHaE6V8 1vUVwACCEVwjYGdhWVdvIWLMARvMQ7XBq5WaR/w7v16gT8GtfGG/mxGahlvSRi1VkMEh 1IbQ==
- Archived-at: <https://zsh.org/workers/55020>
- List-id: <zsh-workers.zsh.org>
Typesetting multiple times the same parameter with different flags but without changing its type should be cumulative. This currently fails for parameters declared with no value when TYPESET_TO_UNSET is enabled.
% setopt TYPESET_TO_UNSET
% typeset -u var1=foo var2
% typeset -p var1 var2
typeset -u var1=foo
typeset -u var2
% typeset -x var1 var2
% typeset -p var1 var2
export -u var1=foo
export var2
The last line should include -u, like the previous one.
Philippe
diff --git a/Src/builtin.c b/Src/builtin.c
index 2e3e5752a..61d2a2730 100644
--- a/Src/builtin.c
+++ b/Src/builtin.c
@@ -2055,7 +2055,8 @@ typeset_single(char *cname, char *pname, Param pm, int func,
* POSIXBUILTINS horror: we need to retain the 'readonly' or 'export'
* flags of an unset parameter.
*/
- usepm = pm && (!(pm->node.flags & PM_UNSET) || OPT_ISSET(ops, 'p') ||
+ usepm = pm && (!(pm->node.flags & PM_UNSET) ||
+ (pm->node.flags & PM_DECLARED) || OPT_ISSET(ops, 'p') ||
(isset(POSIXBUILTINS) &&
(pm->node.flags & (PM_READONLY|PM_EXPORTED))));
@@ -2279,7 +2280,8 @@ typeset_single(char *cname, char *pname, Param pm, int func,
/*
* Keep unset if using readonly in POSIX mode unless specified otherwise.
*/
- if ((usepm != 2) && !((on & PM_READONLY) && isset(POSIXBUILTINS)))
+ if ((usepm != 2) && !((on & PM_READONLY) && isset(POSIXBUILTINS)) &&
+ !(pm->node.flags & PM_DECLARED))
off |= PM_UNSET;
pm->node.flags = (pm->node.flags | (on & ~PM_READONLY)) & ~off;
if (on & (PM_LEFT | PM_RIGHT_B | PM_RIGHT_Z)) {
diff --git a/Test/B02typeset.ztst b/Test/B02typeset.ztst
index 32e79ced2..7bc44dbdc 100644
--- a/Test/B02typeset.ztst
+++ b/Test/B02typeset.ztst
@@ -174,6 +174,34 @@
>inner
>outer
+ addflags() {
+ setopt localoptions typeset_to_unset
+ if ((ARGC == 2)); then typeset $1=$2; else typeset $1; fi
+ typeset -p $1
+ typeset -R5 $1
+ typeset -p $1
+ typeset -u $1
+ typeset -p $1
+ typeset -x $1
+ typeset -p $1
+ }
+ addflags var1 foo
+ addflags var2 ""
+ addflags var3
+0:Typesetting is cumulative
+>typeset var1=foo
+>typeset -R5 var1=foo
+>typeset -R5 -u var1=foo
+>local -R5 -ux var1=foo
+>typeset var2=''
+>typeset -R5 var2=''
+>typeset -R5 -u var2=''
+>local -R5 -ux var2=''
+>typeset var3
+>typeset -R5 var3
+>typeset -R5 -u var3
+>local -R5 -ux var3
+
float f=3.14159
typeset +m f
float -E3 f
Messages sorted by:
Reverse Date,
Date,
Thread,
Author