Path: csiph.com!3.us.feeder.erje.net!feeder.erje.net!news.linkpendium.com!news.linkpendium.com!panix!usenet.stanford.edu!not-for-mail From: Grisha Levit Newsgroups: gnu.bash.bug Subject: issues with nameref resolution loop in a function Date: Sat, 8 Dec 2018 20:30:42 -0500 Lines: 53 Approved: bug-bash@gnu.org Message-ID: NNTP-Posting-Host: lists.gnu.org Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" X-Trace: usenet.stanford.edu 1544319109 24754 208.118.235.17 (9 Dec 2018 01:31:49 GMT) X-Complaints-To: action@cs.stanford.edu To: bug-bash Envelope-to: bug-bash@gnu.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:from:date:message-id:subject:to; bh=stVGjoXzsRZ0NVdxGk1i7h0IXzPoIf0oPbsFztYGrRU=; b=AAYMvzaIcEPHaF7XtidUEYmmARoKDEW+AMCKUjNUi76FTej288FxzooaboE5ivmgqU /QKSy7UVn/nlD6KTEwfMQmBCJziFhCAtAM7DBuvxs5Mp50UnnBdl4pQr/Jn9XJGOfyn1 gZA2v+mbkiEZtMy4D8LGPA771j1KvV5u8QFlK+JXG6Po7+npi50bdoyqjnFlegg1bEyY wrMsK3HQ9LShVE19rnh+p8rCezDTBgYXHVIlwJTX5EE/rODg7/bzLsOQvhtY1H/eZRWa uJ61Jq7JW3fv0fZhpD+Xjr0SL8Ex4MF8HmOG7WB1OqySEFIEkTs5r/fUdvxjZvJ1y9Ln shrw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=stVGjoXzsRZ0NVdxGk1i7h0IXzPoIf0oPbsFztYGrRU=; b=E+iTLj8cxI1aQza8Wl1rvHE5bYsPKAljzA/qB+tgcO1v5H6WWVrNUlojsszq/6l1vn +zcH+ep4alBpgb5EgY39n4YtXgzMzLRQ21Qqf2rkxm3BngquvVwANe68zBWqH2B9/6oQ AukuOP2/mFZX6ZJvkE6qrDucMsu7BDUXbe6hyariuSYH8TiTw8vJnJR09HV9Zf83jSB2 BEMRQXuxQMIERdxDfLS9gDe9DkaVaAVnqiEBKbB+Hb7FT8Cnp6V7Ia5pkDDbEGQwXwzg Qi3jCOz9HoYf9YrpzUQfLALIxR2HFB3V8Ho6smKukNHhfSeh9qnfAQ+B+3AzqDp7aDl6 NKUg== X-Gm-Message-State: AA+aEWbsqGLSI3dpo7vG/HY2rhBU75cOAnhJUd5/9U+RLHwTogijnxqQ uT280s3WappgT+2+ZeINUslGxO35JAqytI1I0gUOwgCG X-Google-Smtp-Source: AFSGD/W43Rk5p3KDh8Y3UVF4frmUEHrbpUmJ/v9tANI7gmgmJx/fDH30rXYFYEYmlq6o/SsVDxTNSjlVkENzPDtprmU= X-Received: by 2002:ac8:1712:: with SMTP id w18mr7231277qtj.76.1544319052962; Sat, 08 Dec 2018 17:30:52 -0800 (PST) X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::829 X-Content-Filtered-By: Mailman/MimeDel 2.1.21 X-BeenThere: bug-bash@gnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: Bug reports for the GNU Bourne Again SHell List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Xref: csiph.com gnu.bash.bug:14897 There seems to be an issue with the following new bash-5.0 feature: A nameref name resolution loop in a function now resolves to a variable by that name in the global scope. [ Note: "warning: x: circular name reference" messages omitted below. ] While referencing such a nameref works as described, scalar assignment to it modifies the variable from the next higher scope rather than the global one: $ inner() { local -n x=x; x=3; } $ outer() { local x=2; inner; declare -p x; } $ x=1; outer; declare -p x declare -- x="3" # x changed in outer() declare -- x="1" # global x not changed There is odd/broken behavior when `declare' is used to modify such a variable, similar to https://lists.gnu.org/archive/html/bug-bash/2018-07/msg00072.html I think the right thing here would be for `declare' to act as if the `-g` flag had been supplied and modify the variable in the global scope? $ f() { local -n x=x; declare x=(2); x=3; declare -p x; } $ x=1; f; declare -p x declare -an x=([0]="2") # local nameref borked declare -- x="1" # global x not changed $ f() { local -n x=x; declare x=2; }; f -bash: declare: `2': invalid variable name for name reference $ f() { local -n x=x; declare -a x=y; declare -p x; } $ x=1; f; declare -p x declare -an x=() # local nameref borked declare -a x=([0]="y") # global x correct (?) $ unset x; declare -p x declare -- x="1" # original after unset `unset' (no `-n') modifies the nameref: $ f() { local -n x=x; unset x; declare -p x; } $ x=1; f; declare -p x declare -- x declare -- x="1" If the target is an array reference that results in a circular nameref, then neither referencing nor assigning to the nameref works: $ f() { local -n x=x[0]; echo "<$x>"; x=2; } $ x=1; f <> -bash: `x[0]': not a valid identifier