On Thu, Jun 9, 2016 at 4:34 AM, Dan Douglas <orm...@gmail.com> wrote: > How about just doing it similar to the way mksh resolves arithmetic > variable loops? As each variable is visited, add it to a list (or hash > set) and check whether that node was already visited. That should work > without having to consider scope issues. > > $ mksh -c 'a=b b=c c=d d=1; echo $((a))' > 1 > $ mksh -c 'a=b b=c c=d d=a; echo $((a))' > mksh: a: expression recurses on parameter 'a' > > This nicely says which variable was to blame. I've noticed bash devel > right now can give messages about "invalid identifiers" which are > technically valid in most contexts so it's tough to track down > problems in complicated reference chains.
Sorry one more follow-up. I should note bash has allowed deep recursion in variable loops for ages using `${!var}` indirection, even for arrays, and so long as you were careful about unbounded recursion that never caused a problem before. This would be a backwards-compatibility breaker if it applied generally. I don't think namerefs need to be fantastically different from the old indirection semantics so long as we're ignoring scope. The only difference between namerefs and old-style indirection is that an individual array element can't be a nameref and a nameref can't be an array, so you need to prevent something like this which bash already does... $ bash -c 'typeset -n a=b b; b=a[1]; a=foo; typeset -p a b' # bash 4.3 declare -a a='([1]="foo")' declare -n b="a[1]" $ ./bash -c 'typeset -n a=b b; b=a[1]; typeset -p a b; a=foo' # 4.4 declare -n a="b" declare -n b="a[1]" ./bash: line 0: `a[1]': not a valid identifier (That's the confusing error mentioned previously btw)