diff options
Diffstat (limited to 'Test/K01nameref.ztst')
| -rw-r--r-- | Test/K01nameref.ztst | 1075 |
1 files changed, 711 insertions, 364 deletions
diff --git a/Test/K01nameref.ztst b/Test/K01nameref.ztst index 0b4475827..0e1cc9e4e 100644 --- a/Test/K01nameref.ztst +++ b/Test/K01nameref.ztst @@ -33,44 +33,44 @@ } function g() { - if (($2)); then local -n $1 rs ra rs1 ra1; - else local -n $1 rs=s ra=a rs1="s[1]" ra1="a[1]"; fi; - if (($2 == 1)); then rs=s; ra=a; rs1="s[1]"; ra1="a[1]"; fi; - echo "$0:1: rs=$rs - ra=$ra - rs1=$rs1 - ra1=$ra1"; + if (($2)); then local -n $1 rs ra; + else local -n $1 rs=s ra=a; fi; + if (($2 == 1)); then rs=s; ra=a; fi; + echo "$0:1: rs=$rs - ra=$ra"; local s=$0 a=($0); - if (($2 == 2)); then rs=s; ra=a; rs1="s[1]"; ra1="a[1]"; fi; - echo "$0:2: rs=$rs - ra=$ra - rs1=$rs1 - ra1=$ra1"; + if (($2 == 2)); then rs=s; ra=a; fi; + echo "$0:2: rs=$rs - ra=$ra"; h "$@"; - echo "$0:3: rs=$rs - ra=$ra - rs1=$rs1 - ra1=$ra1"; + echo "$0:3: rs=$rs - ra=$ra"; } function h() { - if (($2 == 3)); then rs=s; ra=a; rs1="s[1]"; ra1="a[1]"; fi; - echo "$0:1: rs=$rs - ra=$ra - rs1=$rs1 - ra1=$ra1"; + if (($2 == 3)); then rs=s; ra=a; fi; + echo "$0:1: rs=$rs - ra=$ra"; local s=$0 a=($0); - if (($2 == 4)); then rs=s; ra=a; rs1="s[1]"; ra1="a[1]"; fi; - echo "$0:2: rs=$rs - ra=$ra - rs1=$rs1 - ra1=$ra1"; + if (($2 == 4)); then rs=s; ra=a; fi; + echo "$0:2: rs=$rs - ra=$ra"; i "$@"; - echo "$0:3: rs=$rs - ra=$ra - rs1=$rs1 - ra1=$ra1"; + echo "$0:3: rs=$rs - ra=$ra"; # Check that re-entering the same scope doesn't undo scope exit k "$@" } function i() { - if (($2 == 5)); then rs=s; ra=a; rs1="s[1]"; ra1="a[1]"; fi; - echo "$0:1: rs=$rs - ra=$ra - rs1=$rs1 - ra1=$ra1"; + if (($2 == 5)); then rs=s; ra=a; fi; + echo "$0:1: rs=$rs - ra=$ra"; local s=$0 a=($0); - if (($2 == 6)); then rs=s; ra=a; rs1="s[1]"; ra1="a[1]"; fi; - echo "$0:2: rs=$rs - ra=$ra - rs1=$rs1 - ra1=$ra1"; + if (($2 == 6)); then rs=s; ra=a; fi; + echo "$0:2: rs=$rs - ra=$ra"; j "$@"; - echo "$0:3: rs=$rs - ra=$ra - rs1=$rs1 - ra1=$ra1"; + echo "$0:3: rs=$rs - ra=$ra"; k "$@"; } function j() { - echo "$0:1: rs=$rs - ra=$ra - rs1=$rs1 - ra1=$ra1"; + echo "$0:1: rs=$rs - ra=$ra"; local s=$0 a=($0); - echo "$0:2: rs=$rs - ra=$ra - rs1=$rs1 - ra1=$ra1"; + echo "$0:2: rs=$rs - ra=$ra"; } functions -c j k @@ -276,94 +276,198 @@ F:note this causes "var" to become set >typeset -n ptr=var >typeset -t var - typeset -n ptr=var[2] - typeset -t ptr -1:change type of referenced array element -*?*var\[2\]: can't change type via subscript reference - typeset -n ptr[1]=var -1:illegal nameref name +1:invalid nameref name *?*reference variable cannot be an array typeset var=value typeset -n ptr=var print $ptr -0:basic nameref expansion, no braces + print $ptr[2,4] +0:nameref expansion, no braces >value +>alu typeset var=value typeset -n ptr=var print ${ptr} -0:basic nameref expansion, braces + print ${(U)ptr} + print ${ptr[2,5][1,3]} + print ${(U)ptr[2,5][1,3]} +0:nameref expansion, braces >value +>VALUE +>alu +>ALU typeset var=(val1 val2) typeset -n ptr=var print $ptr -0:nameref array expansion + print $ptr[2] +0:nameref array expansion, no braces >val1 val2 +>val2 - typeset -A var=(val1 val2) + typeset var=(val1 val2) typeset -n ptr=var - print ${(kv)ptr} -0:nameref hash expansion + print ${ptr} + print ${(O)ptr} + print ${ptr[2]} + print ${(U)ptr[2]} + print ${ptr[2][2,4]} + print ${(U)ptr[2][2,4]} +0:nameref array expansion, braces >val1 val2 +>val2 val1 +>val2 +>VAL2 +>al2 +>AL2 + typeset -A var=(key1 val1 key2 val2) typeset -n ptr=var + print $ptr + print $ptr[key2] +0:nameref hash expansion, no braces +>val1 val2 +>val2 + + typeset -A var=(key1 val1 key2 val2) + typeset -n ptr=var + print ${ptr} + print ${(kv)ptr} + print ${ptr[key2]} + print ${(U)ptr[key2]} + print ${ptr[key2][2,4]} + print ${(U)ptr[key2][2,4]} +0:nameref hash expansion, braces +>val1 val2 +>key1 val1 key2 val2 +>val2 +>VAL2 +>al2 +>AL2 + typeset var=value - typeset -p ptr var + typeset -n ptr=var ptr=newvalue - typeset -p ptr var -0:assign existing scalar via nameref ->typeset -n ptr=var ->typeset var=value ->typeset -n ptr=var + typeset -p var + ptr[3]=xt + typeset -p var + typeset ptr=newvalue + typeset -p var + typeset ptr[3]=xt + typeset -p var +0:assign/typeset existing scalar via nameref >typeset var=newvalue +>typeset var=nextvalue +>typeset var=newvalue +>typeset var=nextvalue + typeset var=(val1 val2) typeset -n ptr=var + ptr=(new1 new2 new3 new4 new5) + typeset -p var + ptr[3]=new6 + typeset -p var + ptr[2,4]=(new7 new8) + typeset -p var + typeset ptr=(new1 new2 new3 new4 new5) + typeset -p var + typeset ptr[3]=new6 + typeset -p var + typeset ptr[2,4]=(new7 new8) + typeset -p var +0:assign/typeset existing array via nameref +>typeset -a var=( new1 new2 new3 new4 new5 ) +>typeset -a var=( new1 new2 new6 new4 new5 ) +>typeset -a var=( new1 new7 new8 new5 ) +>typeset -a var=( new1 new2 new3 new4 new5 ) +>typeset -a var=( new1 new2 new6 new4 new5 ) +>typeset -a var=( new1 new7 new8 new5 ) + + typeset -A var=(key1 val1) + typeset -n ptr=var + ptr=(key2 val2 key3 val3) + typeset -p var + ptr[key3]=VAL3 + ptr[key4]=val4 + typeset -p var + typeset ptr=(key2 val2 key3 val3) + typeset -p var + typeset ptr[key3]=VAL3 + typeset ptr[key4]=val4 + typeset -p var +0:assign/typeset existing array via nameref +>typeset -A var=( [key2]=val2 [key3]=val3 ) +>typeset -A var=( [key2]=val2 [key3]=VAL3 [key4]=val4 ) +>typeset -A var=( [key2]=val2 [key3]=val3 ) +>typeset -A var=( [key2]=val2 [key3]=VAL3 [key4]=val4 ) + + () { + unset var + typeset -n ptr=var + ptr=value + typeset -p var + unset var + typeset ptr=value + typeset -p var + } + typeset -p var +1:assign/typeset new scalar via nameref +>typeset -g var=value +>typeset var=value +*?*no such variable: var + + () { + unset var + typeset -n ptr=var + ptr=(val1 val2) + typeset -p var + unset var + typeset ptr=(val1 val2) + typeset -p var + } + typeset -p var +1:assign/typeset new array via nameref +>typeset -g -a var=( val1 val2 ) +>typeset -a var=( val1 val2 ) +*?*no such variable: var + typeset var=value + typeset -n ptr=var + unset "ptr[3]" + typeset -p var + unset "ptr[2,3]" + typeset -p var + unset ptr + typeset -p var + typeset var=(val1 val2 val3 val4 val5) + unset "ptr[3]" + typeset -p var + unset "ptr[2,4]" + typeset -p var + unset ptr + typeset -p var + typeset -A var=(key1 val1 key2 val2) + unset "ptr[key2]" + typeset -p var unset ptr typeset -p var 0:unset via nameref +>typeset var=vaue +>typeset var=ve +>typeset -a var=( val1 val2 '' val4 val5 ) +>typeset -a var=( val1 '' val5 ) +>typeset -A var=( [key1]=val1 ) - typeset -n ptr=var typeset var=value + typeset -n ptr=var unset -n ptr typeset -p var ptr 0:unset of the nameref itself -F:If earlier tests change, might get "no such variable" here >typeset var=value - typeset -n ptr=var - typeset var=value - typeset -p ptr var - typeset ptr=newvalue - typeset -p ptr var -0:typeset existing scalar via nameref ->typeset -n ptr=var ->typeset var=value ->typeset -n ptr=var ->typeset var=newvalue - - typeset -n ptr=var - ptr=value - typeset -p var ptr -0:assign new scalar via nameref ->typeset -g var=value ->typeset -n ptr=var - - unset var - typeset -n ptr=var - typeset var=(val1 val2) - typeset -p ptr var - ptr=(new1 new2) - typeset -p ptr var -0:assign existing array via nameref ->typeset -n ptr=var ->typeset -a var=( val1 val2 ) ->typeset -n ptr=var ->typeset -a var=( new1 new2 ) - typeset -p ptr ptr1 ptr2 var 1:check state of paramtab ONE F:unexpected side-effects of previous tests @@ -372,13 +476,6 @@ F:unexpected side-effects of previous tests *?*no such variable: ptr2 *?*no such variable: var - typeset -n ptr=var - ptr=(val1 val2) - typeset -p var ptr -0:assign new array via nameref ->typeset -g -a var=( val1 val2 ) ->typeset -n ptr=var - unset var typeset -n ptr2=var typeset -n ptr1=ptr2 @@ -540,81 +637,10 @@ F:unexpected side-effects of previous tests } 0:regression: not a self reference (test 3) - - unset -n ptr2 - typeset -n ptr2='path[2]' - print -r -- $ptr2 -0q:nameref to array element, no braces ->${path[2]} - - unset -n ptr2 - typeset -n ptr2='path[2]' - print -r -- ${ptr2} -0q:nameref to array element, with braces ->${path[2]} - - unset -n ptr1 - typeset -A hash=(x MISS y HIT) - typeset -n ptr1='hash[y]' - print -r -- $ptr1 -0:nameref to hash element, no braces ->HIT - - unset -n ptr1 - typeset -A hash=(x MISS y HIT) - typeset -n ptr1='hash[y]' - print -r -- ${ptr1} -0:nameref to hash element, with braces ->HIT - - unset -n ptr2 - typeset -a ary=(1 2) - typeset -n ptr2='ary[2]' - ptr2=TWO - typeset -p ary -0:assign array element by nameref ->typeset -a ary=( 1 TWO ) - - unset -n ptr2 - typeset -n ptr2='ary[2]' - ptr2=TWO - typeset -p ary -0f:create array element by nameref -F:ksh93 does not implement this either ->typeset -a ary=( '' TWO ) - - unset -n ptr1 - typeset -A hash=(x MISS y MISS) - typeset -n ptr1='hash[y]' - ptr1=HIT - typeset -p hash -0:assign to hash element by nameref ->typeset -A hash=( [x]=MISS [y]=HIT ) - - unset -n ptr1 - typeset -A hash - typeset -n ptr1='hash[y]' - ptr1=HIT - typeset -p hash -0f:create hash by element nameref -F:ksh93 does not implement this either ->typeset -A hash=( [y]=HIT ) - unset -n ptr1 typeset -n ptr1='not[2]good' 1:invalid nameref -*?*invalid name reference: not\[2\]good - - unset -n ptr1 - unset hash - typeset -A hash - typeset -n ptr1='hash[y]' - print ${ptr1::=HIT} - typeset -p ptr1 hash -0f:create hash by element substitution ->HIT ->typeset -n ptr1='hash[y]' ->typeset -A hash=( [y]=HIT ) +*?*invalid variable name: not\[2\]good unset -n ptr unset gval @@ -683,9 +709,9 @@ F:unexpected side-effects of previous tests typeset -A var=(myself outside) () { - typeset -n myself=var[myself] + typeset -n myself=var local -h var - print -r -- $myself + print -r -- $myself[myself] typeset -p var } 0:up-reference part 3, hidden global @@ -800,15 +826,15 @@ F:Same test, should part 5 output look like this? if zmodload zsh/parameter; then () { zmodload -u zsh/parameter - typeset -n myself=parameters[myself] + typeset -n myself=parameters local -h parameters - print -r -- $myself + print -r -- $myself[myself] typeset -p parameters } else ZTST_skip='Cannot zmodload zsh/parameter, skipping autoload test' fi 0:up-reference part 9, autoloading with hidden special ->nameref-local-nameref-local +>nameref-local-association-readonly-hide-hideval-special >typeset -h parameters ( @@ -909,15 +935,6 @@ F:Checking for a bug in zmodload that affects later tests 0:named references with (P), as ${(P)nameref} >value - ary=( 'bry[1]' 'bry[2]' ) - bry=( lorem ipsum ) - typeset -n ptr='ary[2]' - print -r -- ${ptr} - print -r -- ${(P)ptr} -0:named references with (P), array element to array element ->bry[2] ->ipsum - unset -n ref unset var typeset -n ref=var @@ -1026,15 +1043,15 @@ F:Checking for a bug in zmodload that affects later tests typeset -p .K01.{scalar,assoc,array,integer,double,float,readonly} unset .K01.{scalar,assoc,array,integer,double,float} 0:unset various types via nameref, including a readonly special ->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 *?*read-only variable: ARGC *?*read-only variable: .K01.readonly +*?*no such variable: .K01.scalar +*?*no such variable: .K01.assoc +*?*no such variable: .K01.array +*?*no such variable: .K01.integer +*?*no such variable: .K01.double +*?*no such variable: .K01.float unset -n ref unset one @@ -1053,6 +1070,19 @@ F:Checking for a bug in zmodload that affects later tests > *?*reference ref*to local variable one + typeset -n ref=var + { + for ref in valid1 inv@lid valid2; do typeset -p ref; done + } always { TRY_BLOCK_ERROR=0 } + typeset -nr ref=var + { + for ref in valid3 valid4; do typeset -p ref; done + } always { TRY_BLOCK_ERROR=0 } +1:for-loop variable is a reference, part 5, errors +>typeset -n ref=valid1 +*?*invalid variable name: inv@lid +*?*read-only reference: ref + unset -n ref typeset -n ref () { @@ -1065,13 +1095,6 @@ F:Checking for a bug in zmodload that affects later tests >typeset -n ref=inner *?*reference ref*to local variable inner - typeset -n ptr='ary[$(echo 2)]' - typeset -a ary=(one two three) - print $ptr -1:attempt deferred command substitution in subscript -F:runs in `setopt noexec` so $(...) returns nothing -*?*bad math expression: empty string - unset -n ref typeset -n ref=GLOBAL () { @@ -1155,93 +1178,93 @@ F:previously this could create an infinite recursion and crash e -u 0 0:assignment at different scope than declaration, -u 0 ->g:1: rs=f - ra=f - rs1=f - ra1=f ->g:2: rs=f - ra=f - rs1=f - ra1=f ->h:1: rs=f - ra=f - rs1=f - ra1=f ->h:2: rs=f - ra=f - rs1=f - ra1=f ->i:1: rs=f - ra=f - rs1=f - ra1=f ->i:2: rs=f - ra=f - rs1=f - ra1=f ->j:1: rs=f - ra=f - rs1=f - ra1=f ->j:2: rs=f - ra=f - rs1=f - ra1=f ->i:3: rs=f - ra=f - rs1=f - ra1=f ->k:1: rs=f - ra=f - rs1=f - ra1=f ->k:2: rs=f - ra=f - rs1=f - ra1=f ->h:3: rs=f - ra=f - rs1=f - ra1=f ->k:1: rs=f - ra=f - rs1=f - ra1=f ->k:2: rs=f - ra=f - rs1=f - ra1=f ->g:3: rs=f - ra=f - rs1=f - ra1=f +>g:1: rs=f - ra=f +>g:2: rs=f - ra=f +>h:1: rs=f - ra=f +>h:2: rs=f - ra=f +>i:1: rs=f - ra=f +>i:2: rs=f - ra=f +>j:1: rs=f - ra=f +>j:2: rs=f - ra=f +>i:3: rs=f - ra=f +>k:1: rs=f - ra=f +>k:2: rs=f - ra=f +>h:3: rs=f - ra=f +>k:1: rs=f - ra=f +>k:2: rs=f - ra=f +>g:3: rs=f - ra=f e '' 0 0:assignment at different scope than declaration, '' 0 ->g:1: rs=f - ra=f - rs1=f - ra1=f ->g:2: rs=f - ra=f - rs1=f - ra1=f ->h:1: rs=f - ra=f - rs1=f - ra1=f ->h:2: rs=f - ra=f - rs1=f - ra1=f ->i:1: rs=f - ra=f - rs1=f - ra1=f ->i:2: rs=f - ra=f - rs1=f - ra1=f ->j:1: rs=f - ra=f - rs1=f - ra1=f ->j:2: rs=f - ra=f - rs1=f - ra1=f ->i:3: rs=f - ra=f - rs1=f - ra1=f ->k:1: rs=f - ra=f - rs1=f - ra1=f ->k:2: rs=f - ra=f - rs1=f - ra1=f ->h:3: rs=f - ra=f - rs1=f - ra1=f ->k:1: rs=f - ra=f - rs1=f - ra1=f ->k:2: rs=f - ra=f - rs1=f - ra1=f ->g:3: rs=f - ra=f - rs1=f - ra1=f +>g:1: rs=f - ra=f +>g:2: rs=f - ra=f +>h:1: rs=f - ra=f +>h:2: rs=f - ra=f +>i:1: rs=f - ra=f +>i:2: rs=f - ra=f +>j:1: rs=f - ra=f +>j:2: rs=f - ra=f +>i:3: rs=f - ra=f +>k:1: rs=f - ra=f +>k:2: rs=f - ra=f +>h:3: rs=f - ra=f +>k:1: rs=f - ra=f +>k:2: rs=f - ra=f +>g:3: rs=f - ra=f e -u 2 0:assignment at different scope than declaration, -u 2 ->g:1: rs= - ra= - rs1= - ra1= ->g:2: rs=f - ra=f - rs1=f - ra1=f ->h:1: rs=f - ra=f - rs1=f - ra1=f ->h:2: rs=f - ra=f - rs1=f - ra1=f ->i:1: rs=f - ra=f - rs1=f - ra1=f ->i:2: rs=f - ra=f - rs1=f - ra1=f ->j:1: rs=f - ra=f - rs1=f - ra1=f ->j:2: rs=f - ra=f - rs1=f - ra1=f ->i:3: rs=f - ra=f - rs1=f - ra1=f ->k:1: rs=f - ra=f - rs1=f - ra1=f ->k:2: rs=f - ra=f - rs1=f - ra1=f ->h:3: rs=f - ra=f - rs1=f - ra1=f ->k:1: rs=f - ra=f - rs1=f - ra1=f ->k:2: rs=f - ra=f - rs1=f - ra1=f ->g:3: rs=f - ra=f - rs1=f - ra1=f +>g:1: rs= - ra= +>g:2: rs=f - ra=f +>h:1: rs=f - ra=f +>h:2: rs=f - ra=f +>i:1: rs=f - ra=f +>i:2: rs=f - ra=f +>j:1: rs=f - ra=f +>j:2: rs=f - ra=f +>i:3: rs=f - ra=f +>k:1: rs=f - ra=f +>k:2: rs=f - ra=f +>h:3: rs=f - ra=f +>k:1: rs=f - ra=f +>k:2: rs=f - ra=f +>g:3: rs=f - ra=f e -u 6 0:assignment at different scope than declaration, -u 6 ->g:1: rs= - ra= - rs1= - ra1= ->g:2: rs= - ra= - rs1= - ra1= ->h:1: rs= - ra= - rs1= - ra1= ->h:2: rs= - ra= - rs1= - ra1= ->i:1: rs= - ra= - rs1= - ra1= ->i:2: rs=f - ra=f - rs1=f - ra1=f ->j:1: rs=f - ra=f - rs1=f - ra1=f ->j:2: rs=f - ra=f - rs1=f - ra1=f ->i:3: rs=f - ra=f - rs1=f - ra1=f ->k:1: rs=f - ra=f - rs1=f - ra1=f ->k:2: rs=f - ra=f - rs1=f - ra1=f ->h:3: rs=f - ra=f - rs1=f - ra1=f ->k:1: rs=f - ra=f - rs1=f - ra1=f ->k:2: rs=f - ra=f - rs1=f - ra1=f ->g:3: rs=f - ra=f - rs1=f - ra1=f +>g:1: rs= - ra= +>g:2: rs= - ra= +>h:1: rs= - ra= +>h:2: rs= - ra= +>i:1: rs= - ra= +>i:2: rs=f - ra=f +>j:1: rs=f - ra=f +>j:2: rs=f - ra=f +>i:3: rs=f - ra=f +>k:1: rs=f - ra=f +>k:2: rs=f - ra=f +>h:3: rs=f - ra=f +>k:1: rs=f - ra=f +>k:2: rs=f - ra=f +>g:3: rs=f - ra=f e '' 6 0:assignment at different scope than declaration, '' 6 ->g:1: rs= - ra= - rs1= - ra1= ->g:2: rs= - ra= - rs1= - ra1= ->h:1: rs= - ra= - rs1= - ra1= ->h:2: rs= - ra= - rs1= - ra1= ->i:1: rs= - ra= - rs1= - ra1= ->i:2: rs=i - ra=i - rs1=i - ra1=i ->j:1: rs=i - ra=i - rs1=i - ra1=i ->j:2: rs=i - ra=i - rs1=i - ra1=i ->i:3: rs=i - ra=i - rs1=i - ra1=i ->k:1: rs=i - ra=i - rs1=i - ra1=i ->k:2: rs=i - ra=i - rs1=i - ra1=i ->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=g - ra=g - rs1=g - ra1=g +>g:1: rs= - ra= +>g:2: rs= - ra= +>h:1: rs= - ra= +>h:2: rs= - ra= +>i:1: rs= - ra= +>i:2: rs=i - ra=i +>j:1: rs=i - ra=i +>j:2: rs=i - ra=i +>i:3: rs=i - ra=i +>k:1: rs=i - ra=i +>k:2: rs=i - ra=i +>h:3: rs=h - ra=h +>k:1: rs=h - ra=h +>k:2: rs=h - ra=h +>g:3: rs=g - ra=g f1 0:Transitive references with scoping changes @@ -1333,125 +1356,254 @@ F:previously this could create an infinite recursion and crash >B8: ref1=l2 ref2=l2 >B9: ref1=l1 ref2=l1 -# -# The following two tests are linked, do not separate -# + check-valid-referent-name() { + local -n ref=$1 + [[ $ref = $2 ]] || echo "Unexpected expansion result: ref=$1, \$ref=$ref != $2" + } + check-invalid-variable-name() { + { + local -- $1=value-$1 2>/dev/null + echo "Unexpected valid variable name: $1" + } always { + TRY_BLOCK_ERROR=0 + } + } + check-invalid-referent-name() { + { + local -n -- ref=$1 2>/dev/null + echo "Unexpected valid referent name: $1" + } always { + TRY_BLOCK_ERROR=0 + } + } + local name value; + # Test valid variable names. + for name in \ + foo foo. foo.bar foo.456 foo.4ar \ + .foo .foo.bar .foo.456 + do + local $name=value-$name + check-valid-referent-name "$name" value-$name + check-invalid-referent-name "$name"@ + check-invalid-referent-name "$name""[1]" + done + # Test valid builtin variable names + for name value in 123 "" \! 0 \? 0 \$ $$ - 569X _ -n; do + check-valid-referent-name "$name" $value + check-invalid-referent-name "$name"@ + check-invalid-referent-name "$name""[1]" + done + # Test invalid variable names. + for name in \ + .foo. .foo.4ar . foo.. \ + 123. 123.bar 123.456 123.4ar .. .foo.. \ + .123 .123. .123.bar .123.456 .123.4ar \ + 1oo 1oo. 1oo.bar 1oo.456 1oo.4ar \ + .1oo .1oo. .1oo.bar .1oo.456 .1oo.4ar + do + check-invalid-variable-name "$name" + check-invalid-referent-name "$name" + check-invalid-referent-name "$name"@ + check-invalid-referent-name "$name""[1]" + done + # Any variable name with more than one non-leading '.' is invalid. + for name in {,.}{foo,123,1oo}.{bar,456,4ar}.{,baz,789,7az}; do + check-invalid-variable-name "$name" + check-invalid-referent-name "$name" + done + unfunction check-valid-referent-name + unfunction check-invalid-variable-name + unfunction check-invalid-referent-name + unset name value +0:references to invalid variable names edgelocal() ( local -n x=$1; typeset -p x; print -r $x ) edgeupper() ( local -nu x=$1; typeset -p x; print -r $x ) - for edge in argv ARGC \@ \* \# 0 1 01 \! \? - _ + for edge in argv ARGC \@ \* \# 0 00 2 02 \! \? \$ - _ do - edgelocal $edge - edgelocal "$edge""[1]" - edgeupper $edge + edgelocal $edge foo + edgeupper $edge foo done -0:references to builtin specials -F:Subscripting on 1 01 ! ? - should print first character but do not + unfunction edgelocal edgeupper +0q:references to builtin specials >typeset -n x=argv ->argv ->typeset -n x='argv[1]' ->argv[1] +>argv foo >typeset -n x=ARGC ->1 ->typeset -n x='ARGC[1]' ->1 +>2 >typeset -n x=0 >edgelocal ->typeset -n x='0[1]' ->e ->typeset -n x=1 -> ->typeset -n x='1[1]' -> ->typeset -n x=01 -> ->typeset -n x='01[1]' -> +>typeset -n x=00 +>edgelocal +>typeset -n x=2 +>foo +>typeset -n x=02 +>foo >typeset -n x=! >0 ->typeset -n x='![1]' -> >typeset -un x=! >0 >typeset -n x='?' >0 ->typeset -n x='?[1]' -> >typeset -un x='?' >0 +>typeset -n x='$' +>$$ +>typeset -un x='$' +>$$ >typeset -n x=- >569X ->typeset -n x='-[1]' -> >typeset -un x=- >569X >typeset -n x=_ >x ->typeset -n x='_[1]' ->x >typeset -un x=_ >x -?edgeupper: invalid name reference: argv -?edgeupper: invalid name reference: ARGC -?edgelocal: invalid name reference: @ -?edgelocal: invalid name reference: @[1] -?edgeupper: invalid name reference: @ -?edgelocal: invalid name reference: * -?edgelocal: invalid name reference: *[1] -?edgeupper: invalid name reference: * -?edgelocal: invalid name reference: # -?edgelocal: invalid name reference: #[1] -?edgeupper: invalid name reference: # -?edgeupper: invalid name reference: 0 -?edgeupper: invalid name reference: 1 -?edgeupper: invalid name reference: 01 +?edgeupper: invalid variable name: argv +?edgeupper: invalid variable name: ARGC +?edgelocal: invalid variable name: @ +?edgeupper: invalid variable name: @ +?edgelocal: invalid variable name: * +?edgeupper: invalid variable name: * +?edgelocal: invalid variable name: # +?edgeupper: invalid variable name: # +?edgeupper: invalid variable name: 0 +?edgeupper: invalid variable name: 00 +?edgeupper: invalid variable name: 2 +?edgeupper: invalid variable name: 02 - edgelocal \$ - edgelocal '$[1]' - edgeupper \$ - unfunction edgelocal edgeupper -0qf:references to $$ -F:$$[1] reference should print the first digit of $$ but prints nothing ->typeset -n x='$' ->$$ ->typeset -n x='\$[1]' ->$$[1] ->$$ + tst() { + typeset -n ref0=0 2>&1 + typeset -n ref00=00 2>&1 + typeset -n ref2=2 2>&1 + typeset -n ref02=02 2>&1 + echo ${(q)0} ${(q)*} - $ref0 - $ref00 - $ref2 - $ref02 + ref0=TST + ref2=BBB + echo ${(q)0} ${(q)*} - $ref0 - $ref00 - $ref2 - $ref02 + ref00=Tst + ref02=Bbb + echo ${(q)0} ${(q)*} - $ref0 - $ref00 - $ref2 - $ref02; typeset -p -- 0 00 2 02 2>&1 + unset ref0 + unset ref2 + echo ${(q)0} ${(q)*} - $ref0 - $ref00 - $ref2 - $ref02; typeset -p -- 0 00 2 02 2>&1 + ref0=tst + ref2=bbb + echo ${(q)0} ${(q)*} - $ref0 - $ref00 - $ref2 - $ref02; typeset -p -- 0 00 2 02 2>&1 + { ref0=(TST TST) 2>&1 } always { TRY_BLOCK_ERROR=0 } + { ref2=(BBB BBB) 2>&1 } always { TRY_BLOCK_ERROR=0 } + echo ${(q)0} ${(q)*} - $ref0 - $ref00 - $ref2 - $ref02; typeset -p -- 0 00 2 02 2>&1 + typeset -n ref5=5 2>&1 + ref5=zzz + echo ${(q)0} ${(q)*} + unset ref2 + echo ${(q)0} ${(q)*} + unset ref2 + echo ${(q)0} ${(q)*} + unset ref2 + echo ${(q)0} ${(q)*} + unset ref2 + echo ${(q)0} ${(q)*} + unset ref2 + echo ${(q)0} ${(q)*} + } + tst aaa bbb ccc + unfunction tst +0:references to positional parameters +>tst aaa bbb ccc - tst - tst - bbb - bbb +>TST aaa BBB ccc - TST - TST - BBB - BBB +>Tst aaa Bbb ccc - Tst - Tst - Bbb - Bbb +>tst:typeset:11: no such variable: 00 +>tst:typeset:11: no such variable: 2 +>tst:typeset:11: no such variable: 02 +>typeset -g 0=Tst +>Tst aaa ccc - Tst - Tst - ccc - ccc +>tst:typeset:14: no such variable: 00 +>tst:typeset:14: no such variable: 2 +>tst:typeset:14: no such variable: 02 +>typeset -g 0=Tst +>tst aaa bbb - tst - tst - bbb - bbb +>tst:typeset:17: no such variable: 00 +>tst:typeset:17: no such variable: 2 +>tst:typeset:17: no such variable: 02 +>typeset -g 0=tst +>tst:18: 0: attempt to assign array value to non-array +>tst:19: 2: attempt to assign array value to non-array +>tst aaa bbb - tst - tst - bbb - bbb +>tst:typeset:20: no such variable: 00 +>tst:typeset:20: no such variable: 2 +>tst:typeset:20: no such variable: 02 +>typeset -g 0=tst +>tst aaa bbb '' '' zzz +>tst aaa '' '' zzz +>tst aaa '' zzz +>tst aaa zzz +>tst aaa +>tst aaa # -# The following tests are run in interactive mode, using PS1 as an +# The following tests are run in interactive mode, using PS3 as an # assignable special with side-effects. This crashed at one time. # # Note bypassing TYPESET_TO_UNSET here - $ZTST_testdir/../Src/zsh -fis <<<$' - typeset -n p=PS1 - () { - typeset -p p - local p - typeset -p p - p=xx - typeset -p p - } + PS1= PS2= $ZTST_testdir/../Src/zsh -fis <<<' + typeset -n p=PS3 + () { + typeset -p p + local p + typeset -p p + p=xx + typeset -p p + } ' 0:regression: assign to local that shadows global named reference ->typeset -g -n p=PS1 +>typeset -g -n p=PS3 >typeset p='' >typeset p=xx -*?* # Note bypassing TYPESET_TO_UNSET here - $ZTST_testdir/../Src/zsh -fis <<<$' - () { - typeset p=PS1 - typeset -n p - p=zz - } - typeset -p PS1 + PS1= PS2= $ZTST_testdir/../Src/zsh -fis <<<' + () { + typeset p=PS3 + typeset -n p + p=zz + } + typeset -p PS3 ' 0:regression - converting a string into a named reference ->typeset PS1=zz -*?* +>typeset PS3=zz + +# Testing named directories requires to run in interactive mode + + # Use "${(kv)nameddirs}" because "typeset -p nameddirs" prints no value + PS1= $ZTST_testdir/../Src/zsh -fis <<<' + [[ -d Modules/zsh ]] && module_path=( $PWD/Modules ) + typeset v1=/1 v2 + typeset -n r1=v1 r2 + { echo "~v1:" ~v1 } 2>&1 + { echo "~r1:" ~r1 } 2>&1 + echo "nameddirs=( ${(kv)nameddirs} )" + r1=/A + echo "nameddirs=( ${(kv)nameddirs} )" + hash -d v2=/2 r2=/R + echo "nameddirs=( ${(kv)nameddirs} )" + setopt autonamedirs + v2=V2 + echo "nameddirs=( ${(kv)nameddirs} )" + r2=v2 + echo "nameddirs=( ${(kv)nameddirs} )" + r2=/B + echo "nameddirs=( ${(kv)nameddirs} )" + ' +0:Only string parameters are promoted to named directories +>~v1: /1 +>zsh: no such user or named directory: r1 +>nameddirs=( v1 /1 ) +>nameddirs=( v1 /A ) +>nameddirs=( v1 /A v2 /2 r2 /R ) +>nameddirs=( v1 /A r2 /R ) +>nameddirs=( v1 /A r2 /R ) +>nameddirs=( v1 /A v2 /B r2 /R ) unset var1 var2 typeset -n ref1=var1 @@ -1485,22 +1637,7 @@ F:$$[1] reference should print the first digit of $$ but prints nothing zmodload -u zsh/random echo z=${(M)${(f)${ zmodload -ap}}:#*SRANDOM*} echo v=${ref/<->/integer} -0:Referring and dereferring an autoload variable loads it (direct) ->z=SRANDOM (zsh/random) ->z= ->v=integer ->z=SRANDOM (zsh/random) ->v=integer - - zmodload -u zsh/random - echo z=${(M)${(f)${ zmodload -ap}}:#*SRANDOM*} - typeset -n ref=SRANDOM[1,20] - echo z=${(M)${(f)${ zmodload -ap}}:#*SRANDOM*} - echo v=${ref/<->/integer} - zmodload -u zsh/random - echo z=${(M)${(f)${ zmodload -ap}}:#*SRANDOM*} - echo v=${ref/<->/integer} -0:Referring and dereferring an autoload variable loads it (subscript) +0:Referring and dereferring an autoload variable loads it >z=SRANDOM (zsh/random) >z= >v=integer @@ -1514,21 +1651,7 @@ F:$$[1] reference should print the first digit of $$ but prints nothing typeset -h SRANDOM=local-variable echo v=${ref/<->/integer} echo NOT REACHED -1:Dereferring an autoload variable fails to load it if its hidden (direct) ->v=integer ->z=SRANDOM (zsh/random) -?(eval):6: Can't add module parameter `SRANDOM': local parameter exists -?(eval):zsh/random:6: error when adding parameter `SRANDOM' -?(eval):6: autoloading module zsh/random failed to define parameter: SRANDOM - - typeset -n ref=SRANDOM[1,20] - echo v=${ref/<->/integer} - zmodload -u zsh/random - echo z=${(M)${(f)${ zmodload -ap}}:#*SRANDOM*} - typeset -h SRANDOM=local-variable - echo v=${ref/<->/integer} - echo NOT REACHED -1:Dereferring an autoload variable fails to load it if its hidden (subscript) +1:Dereferring an autoload variable fails to load it if its hidden >v=integer >z=SRANDOM (zsh/random) ?(eval):6: Can't add module parameter `SRANDOM': local parameter exists @@ -1747,10 +1870,6 @@ F:converting from association/array to string should work here too 1:regression: reference loop with same name enclosing variable ?(anon):3: ptr2: invalid self reference - typeset -n ref=ref[1] -1:self reference with subscript -*?*: ref: invalid self reference - typeset var=foo typeset -n ref=var () { @@ -1933,6 +2052,220 @@ F:converting from association/array to string should work here too ># d:reference to not-yet-defined - local - ref1 >typeset -i var=42 + test-unset() { + typeset var0=foo + typeset -n ref1=var0 ref2=ref1 + typeset cmd=(unset $@); echo "#" $cmd; $cmd + typeset -p var0 ref1 ref2 + } + test-unset -n ref1 + test-unset -n ref2 + test-unset -n -m ref1 + test-unset -n -m ref2 + unfunction test-unset +0:unsetting references with -n unsets the references +># unset -n ref1 +>typeset var0=foo +>typeset -n ref2=ref1 +># unset -n ref2 +>typeset var0=foo +>typeset -n ref1=var0 +># unset -n -m ref1 +>typeset var0=foo +>typeset -n ref2=ref1 +># unset -n -m ref2 +>typeset var0=foo +>typeset -n ref1=var0 + + 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 +0:unsetting references without -n unsets the referred parameters +># unset ref1 +>typeset -n ref1=var0 +>typeset -n ref2=ref1 +># unset ref2 +>typeset -n ref1=var0 +>typeset -n ref2=ref1 +># unset -m ref1 +>typeset -n ref1=var0 +>typeset -n ref2=ref1 +># unset -m ref2 +>typeset -n ref1=var0 +>typeset -n ref2=ref1 + + test-unset() { + typeset var0=12345 + typeset -n ref1=var0 ref2=ref1 + typeset cmd=(unset $@); echo "#" $cmd; $cmd + typeset -p var0 + } + test-unset ref1"[3]" + test-unset ref2"[3]" + test-unset -n ref1"[3]" + test-unset -n ref2"[3]" + unfunction test-unset +0:unsetting subscripted references unsets the referred elements +># unset ref1[3] +>typeset var0=1245 +># unset ref2[3] +>typeset var0=1245 +># unset -n ref1[3] +>typeset var0=1245 +># unset -n ref2[3] +>typeset var0=1245 + + test-unset() { + typeset -r var=foo + typeset -n ref=var + typeset cmd=(unset $@); echo "#" $cmd; { $cmd 2>&1 } always { TRY_BLOCK_ERROR=0 } + typeset -p var + } + test-unset var + test-unset -m var + test-unset ref + test-unset -m ref + test-unset var"[2]" + test-unset ref"[2]" + test-unset -n ref"[2]" + unfunction test-unset +0:unsetting read-only parameter triggers an error +># unset var +>test-unset:3: read-only variable: var +>typeset -r var=foo +># unset -m var +>test-unset:3: read-only variable: var +>typeset -r var=foo +># unset ref +>test-unset:3: read-only variable: var +>typeset -r var=foo +># unset -m ref +>test-unset:3: read-only variable: var +>typeset -r var=foo +># unset var[2] +>test-unset:3: read-only variable: var +>typeset -r var=foo +># unset ref[2] +>test-unset:3: read-only variable: var +>typeset -r var=foo +># unset -n ref[2] +>test-unset:3: read-only variable: var +>typeset -r var=foo + + 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 +0:unsetting placeholder references or their referents has no effect +># 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 +>typeset -n ref2=ref1 + + test-unset() { + typeset -n ref1=undefined ref2=ref1 + typeset cmd=(unset $@); echo "#" $cmd; $cmd + typeset -p ref1 ref2 + } + typeset -p undefined 2>&1 + test-unset ref1 + test-unset ref2 + test-unset -m ref1 + test-unset -m ref2 + unfunction test-unset +0:unsetting references to not-yet-defined variables or their referents has no effect +>(eval):typeset:6: no such variable: undefined +># unset ref1 +>typeset -n ref1=undefined +>typeset -n ref2=ref1 +># unset ref2 +>typeset -n ref1=undefined +>typeset -n ref2=ref1 +># unset -m ref1 +>typeset -n ref1=undefined +>typeset -n ref2=ref1 +># unset -m ref2 +>typeset -n ref1=undefined +>typeset -n ref2=ref1 + + 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 +0:unsetting references referring to parameters in enclosing scopes unsets the parameters +># unset refg1 refg2 refl1 refl2 +>(anon):typeset:7: no such variable: g1 +>(anon):typeset:7: no such variable: g2 +># unset -m refg1 refg2 refl1 refl2 +>(anon):typeset:7: no such variable: g1 +>(anon):typeset:7: no such variable: g2 + + 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 +0:unsetting references referring to hidden parameters unsets the hidden parameters +># unset refg refl +># inner scope +>typeset g=hide-g +>typeset l=hide-l +># outer scope +>test-unset:typeset:12: no such variable: g +># 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 -n ref1 typeset -n ref2 typeset -n ref3=ref2 @@ -2016,4 +2349,18 @@ F:converting from association/array to string should work here too >B:16#FF >C:16#FF + typeset -n ref1 + setopt allexport + ref1=var + typeset -n ref2 + unsetopt allexport + typeset -p ref1 ref2 +0:references are not exported +>typeset -n ref1=var +>typeset -n ref2 + + typeset -hn ref_h + typeset -Hn ref_H +0:unsusual but legal option combinations + %clean |
