summaryrefslogtreecommitdiffstats
path: root/Test
diff options
context:
space:
mode:
authorBart Schaefer <schaefer@zsh.org>2025-05-09 16:38:28 -0700
committerBart Schaefer <schaefer@zsh.org>2025-05-09 16:38:28 -0700
commitabd541e18c1a8c311834ed85d9abd5f3fd27495f (patch)
tree0c4bce8a4860c827e9197e2ee3fab1f3200c67a6 /Test
parent53532: mark --enable-zsh-mem as deprecated. (diff)
downloadzsh-abd541e18c1a8c311834ed85d9abd5f3fd27495f.tar
zsh-abd541e18c1a8c311834ed85d9abd5f3fd27495f.tar.gz
zsh-abd541e18c1a8c311834ed85d9abd5f3fd27495f.tar.bz2
zsh-abd541e18c1a8c311834ed85d9abd5f3fd27495f.tar.lz
zsh-abd541e18c1a8c311834ed85d9abd5f3fd27495f.tar.xz
zsh-abd541e18c1a8c311834ed85d9abd5f3fd27495f.tar.zst
zsh-abd541e18c1a8c311834ed85d9abd5f3fd27495f.zip
53568: fix additional problems with reference scoping, update documentation
Scope exits could miss some scope updates in named reference chains. References declared -u behave like any other reference upon scope exit.
Diffstat (limited to 'Test')
-rw-r--r--Test/K01nameref.ztst74
1 files changed, 72 insertions, 2 deletions
diff --git a/Test/K01nameref.ztst b/Test/K01nameref.ztst
index cc689613b..30b6673e0 100644
--- a/Test/K01nameref.ztst
+++ b/Test/K01nameref.ztst
@@ -77,6 +77,61 @@
local s=T a=(T);
+ function f1() {
+ typeset var=$0;
+ typeset -n ref1 ref2; typeset -n ref3=ref2;
+ function f2() {
+ typeset ref2=XX;
+ function f3() {
+ typeset var=$0;
+ function f4() {
+ typeset var=$0;
+ ref1=var;
+ ref3=var; # Initializes ref2 to var
+ echo "$0: ref1=$ref1 ref2=$ref2 ref3=$ref3";
+ }
+ f4;
+ echo "$0: ref1=$ref1 ref2=$ref2 ref3=$ref3";
+ function g4() {
+ typeset var=$0;
+ function g5() {
+ typeset var=$0;
+ echo "$0: ref1=$ref1 ref2=$ref2 ref3=$ref3";
+ }
+ g5;
+ echo "$0: ref1=$ref1 ref2=$ref2 ref3=$ref3";
+ }
+ g4;
+ echo "$0: ref1=$ref1 ref2=$ref2 ref3=$ref3";
+ }
+ f3;
+ echo "$0: ref1=$ref1 ref2=$ref2 ref3=$ref3";
+ }
+ f2;
+ echo "$0: ref1=$ref1 ref2=$ref2 ref3=$ref3";
+ function h2() {
+ typeset var=$0;
+ function h3() {
+ typeset var=$0;
+ function h4() {
+ typeset var=$0;
+ function h5() {
+ typeset var=$0;
+ echo "$0: ref1=$ref1 ref2=$ref2 ref3=$ref3";
+ }
+ h5;
+ echo "$0: ref1=$ref1 ref2=$ref2 ref3=$ref3";
+ }
+ h4;
+ echo "$0: ref1=$ref1 ref2=$ref2 ref3=$ref3";
+ }
+ h3;
+ echo "$0: ref1=$ref1 ref2=$ref2 ref3=$ref3";
+ }
+ h2;
+ echo "$0: ref1=$ref1 ref2=$ref2 ref3=$ref3";
+ }
+
%test
typeset -n ptr
@@ -1039,10 +1094,10 @@ F:previously this could create an infinite recursion and crash
>i:3: rs=h - ra=h - rs1=h - ra1=h
>k:1: rs=h - ra=h - rs1=h - ra1=h
>k:2: rs=h - ra=h - rs1=h - ra1=h
->h:3: rs=g - ra=g - rs1=g - ra1=g
+>h:3: rs=h - ra=h - rs1=h - ra1=h
>k:1: rs=h - ra=h - rs1=h - ra1=h
>k:2: rs=h - ra=h - rs1=h - ra1=h
->g:3: rs=f - ra=f - rs1=f - ra1=f
+>g:3: rs=g - ra=g - rs1=g - ra1=g
e '' 6
0:assignment at different scope than declaration, '' 6
@@ -1062,6 +1117,21 @@ F:previously this could create an infinite recursion and crash
>k:2: rs=h - ra=h - rs1=h - ra1=h
>g:3: rs=g - ra=g - rs1=g - ra1=g
+ f1
+0:Transitive references with scoping changes
+>f4: ref1=f4 ref2=XX ref3=f4
+>f3: ref1=f3 ref2=XX ref3=f3
+>g5: ref1=f3 ref2=XX ref3=g4
+>g4: ref1=f3 ref2=XX ref3=g4
+>f3: ref1=f3 ref2=XX ref3=f3
+>f2: ref1=f1 ref2=XX ref3=f1
+>f1: ref1=f1 ref2=f1 ref3=f1
+>h5: ref1=f1 ref2=f1 ref3=f1
+>h4: ref1=f1 ref2=f1 ref3=f1
+>h3: ref1=f1 ref2=f1 ref3=f1
+>h2: ref1=f1 ref2=f1 ref3=f1
+>f1: ref1=f1 ref2=f1 ref3=f1
+
#
# The following tests are run in interactive mode, using PS1 as an
# assignable special with side-effects. This crashed at one time.