Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: crash with nameref and local argv
On Tue, Nov 4, 2025 at 9:23 PM Mikael Magnusson <mikachu@xxxxxxxxx> wrote:
>
> Would that break this code (which currently works)?
> % () { local -h argv=hello; () { local argv=( $argv ); typeset -nu
> foo=argv; echo $foo } } noot
> hello
Yes, it would ... but the test for whether "typeset -nu foo=argv" is
valid becomes really ugly in that case, because it's no longer just
syntactic ... it's necessary to instead find out if there actually
exists a local variable "argv" (or "ARGC") at exactly one level less
than the current scope.
The semantics of something like the following is therefore pretty murky:
() {
local -h argv=hello;
() {
: There is an argv in this scope that is not the outer local
() {
typset -nu foo=argv # What does this mean?
}
}
}
Seems like a blanket ban on referencing $argv makes more sense, given
that $@ and $* are also "illegal", even if it breaks your current
example; I don't think it's possible to make the general case of
peeking up the C stack succeed, so the alternative is to have it fail
unpredictably at dereference time.
Messages sorted by:
Reverse Date,
Date,
Thread,
Author