Re: [PATCH] Fix (mainly nameref) issues in builtin "unset"

Bart Schaefer <[email protected]>
Newsgroups gmane.comp.shells.zsh.devel
Message-ID <CAH+w=7ZZCZPVeUP530Ku+WTRweM-jARsUg2ABguMqhc8YS1Qjw@mail.gmail.com>
On Mon, Jun 8, 2026 at 5:48 PM Bart Schaefer <[email protected]> wrote:
>
> On Mon, Jun 8, 2026 at 4:08 PM Bart Schaefer <[email protected]> wrote:
> >
> > Applying this produced rejections in Src/builtin.c.  I tried resolving
> > them by hand, but then got a lot of Test/ errors on K01nameref.ztst
> > referencing restricted mode.  This patch seems to have put back those
> > tests?
>
> I may have applied the wrong version of this patch.  Trying again.

I do seem to have applied the wrong version, but I have different
failures following the more recent patch:

./K01nameref.ztst: starting.
--- /tmp/zsh.ztst.59959/ztst.out    2026-06-08 17:49:48
+++ /tmp/zsh.ztst.59959/ztst.tout    2026-06-08 17:49:48
@@ -1 +1,7 @@
+typeset -g .K01.scalar
+typeset -g -A .K01.assoc
+typeset -g -a .K01.array
+typeset -g -i .K01.integer
+typeset -g -E .K01.double
+typeset -g -F .K01.float
 typeset -g -r .K01.readonly=RO
Test ./K01nameref.ztst failed: output differs from expected as shown above for:
 typeset -g .K01.scalar='RW'
 typeset -gA .K01.assoc=(x y)
 typeset -ga .K01.array=(z)
 typeset -gi .K01.integer=0
 typeset -gE .K01.double=0.0
 typeset -gF .K01.float=0.0
 typeset -gr .K01.readonly='RO'
 typeset -n gref
 for gref in ARGC .K01.{scalar,assoc,array,integer,double,float,readonly}
 do
   { unset gref } always { TRY_BLOCK_ERROR=0 }
 done
 typeset -p .K01.{scalar,assoc,array,integer,double,float,readonly}
 unset .K01.{scalar,assoc,array,integer,double,float}
Error output:
(eval):11: read-only variable: ARGC
(eval):11: read-only variable: .K01.readonly
Was testing: unset various types via nameref, including a readonly special
./K01nameref.ztst: test failed.
--- /tmp/zsh.ztst.59959/ztst.out        2026-06-08 17:49:48
+++ /tmp/zsh.ztst.59959/ztst.tout    2026-06-08 17:49:48
@@ -8,5 +8,6 @@
 typeset -n ref1=var0
 typeset -n ref2=ref1
 # unset -m ref2
+typeset var0=foo
 typeset -n ref1=var0
 typeset -n ref2=ref1
Test ./K01nameref.ztst failed: output differs from expected as shown above for:
 test-unset() {
   typeset var0=foo
   typeset -n ref1=var0 ref2=ref1
   typeset cmd=(unset $@); echo "#" $cmd; $cmd
   typeset -p var0 ref1 ref2
 }
 test-unset    ref1
 test-unset    ref2
 test-unset -m ref1
 test-unset -m ref2
 unfunction test-unset
Was testing: unsetting references without -n unsets the referred parameters
./K01nameref.ztst: test failed.
--- /tmp/zsh.ztst.59959/ztst.out    2026-06-08 17:49:48
+++ /tmp/zsh.ztst.59959/ztst.tout    2026-06-08 17:49:48
@@ -1,11 +1,8 @@
 # unset ref1
-typeset -n ref1
 typeset -n ref2=ref1
 # unset ref2
-typeset -n ref1
 typeset -n ref2=ref1
 # unset -m ref1
-typeset -n ref1
 typeset -n ref2=ref1
 # unset -m ref2
 typeset -n ref1
Test ./K01nameref.ztst failed: output differs from expected as shown above for:
 test-unset() {
   typeset -n ref1 ref2=ref1
   typeset cmd=(unset $@); echo "#" $cmd; $cmd
   typeset -p ref1 ref2
 }
 test-unset    ref1
 test-unset    ref2
 test-unset -m ref1
 test-unset -m ref2
 unfunction test-unset
Was testing: unsetting placeholder references or their referents has no effect
./K01nameref.ztst: test failed.
--- /tmp/zsh.ztst.59959/ztst.out    2026-06-08 17:49:48
+++ /tmp/zsh.ztst.59959/ztst.tout    2026-06-08 17:49:48
@@ -1,6 +1,8 @@
 # unset refg1 refg2 refl1 refl2
-(anon):typeset:7: no such variable: g1
-(anon):typeset:7: no such variable: g2
+typeset -g g1
+typeset -g g2
+typeset l1
+typeset l2
 # unset -m refg1 refg2 refl1 refl2
 (anon):typeset:7: no such variable: g1
 (anon):typeset:7: no such variable: g2
Test ./K01nameref.ztst failed: output differs from expected as shown above for:
 test-unset() {
   typeset -n refg1=g1 refl1=l1
   () {
     typeset -g g1=glb1 g2=glb2
     typeset    l1=lcl1 l2=lcl2
     () {
       typeset -n refg2=g2 refl2=l2
       typeset cmd=(unset $@ refg1 refg2 refl1 refl2); echo "#" $cmd; $cmd
     } $@
     typeset -p g1 g2 l1 l2 2>&1
   } $@
   unset g1 g2
 }
 test-unset
 test-unset -m
 unfunction test-unset
Was testing: unsetting references referring to parameters in enclosing
scopes unsets the parameters
./K01nameref.ztst: test failed.
--- /tmp/zsh.ztst.59959/ztst.out    2026-06-08 17:49:48
+++ /tmp/zsh.ztst.59959/ztst.tout    2026-06-08 17:49:48
@@ -3,10 +3,10 @@
 typeset g=hide-g
 typeset l=hide-l
 # outer scope
-test-unset:typeset:12: no such variable: g
+typeset -g g
+typeset l
 # unset -m refg refl
 # inner scope
-typeset g=hide-g
-typeset l=hide-l
 # outer scope
-test-unset:typeset:12: no such variable: g
+typeset -g g=glb
+typeset l=lcl
Test ./K01nameref.ztst failed: output differs from expected as shown above for:
 test-unset() {
   typeset -g g=glb
   typeset    l=lcl
   typeset -n refg=g refl=l
   () {
     typeset g=hide-g
     typeset l=hide-l
     typeset cmd=(unset $@ refg refl); echo "#" $cmd; $cmd
     echo "# inner scope"
     typeset -p g l 2>&1
   } $@
   echo "# outer scope"
   typeset -p g l 2>&1
   unset g
 }
 test-unset
 test-unset -m
 unfunction test-unset
Was testing: unsetting references referring to hidden parameters
unsets the hidden parameters
./K01nameref.ztst: test failed.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.