summaryrefslogtreecommitdiff
path: root/src/cmd/8g
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2014-05-28 19:50:19 -0400
committerRuss Cox <rsc@golang.org>2014-05-28 19:50:19 -0400
commit73044738e146bec259f7b8e89ecc816a421921aa (patch)
tree181e98d4a3bba678b89ab4f80452cf58daaeed13 /src/cmd/8g
parent76fe11c57b2efe4c1ffb53730efadcd928e976c2 (diff)
downloadgo-73044738e146bec259f7b8e89ecc816a421921aa.tar.gz
cmd/gc: fix x=x crash
The 'nodarg' function is used to obtain a Node* representing a function argument or result. It returned a brand new Node*, but that violates the guarantee in most places in the compiler that two Node*s refer to the same variable if and only if they are the same Node* pointer. Reestablish that invariant by making nodarg return a preexisting named variable if present. Having fixed that, avoid any copy during x=x in componentgen, because the VARDEF we emit before the copy marks the lhs x as dead incorrectly. The change in walk.c avoids modifying the result of nodarg. This was the only place in the compiler that did so. Fixes issue 8097. LGTM=r, khr R=golang-codereviews, r, khr CC=golang-codereviews, iant https://codereview.appspot.com/102820043
Diffstat (limited to 'src/cmd/8g')
-rw-r--r--src/cmd/8g/cgen.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/src/cmd/8g/cgen.c b/src/cmd/8g/cgen.c
index 1aae7771c..d626c2eb0 100644
--- a/src/cmd/8g/cgen.c
+++ b/src/cmd/8g/cgen.c
@@ -1397,6 +1397,13 @@ componentgen(Node *nr, Node *nl)
}
}
+ // nl and nr are 'cadable' which basically means they are names (variables) now.
+ // If they are the same variable, don't generate any code, because the
+ // VARDEF we generate will mark the old value as dead incorrectly.
+ // (And also the assignments are useless.)
+ if(nr != N && nl->op == ONAME && nr->op == ONAME && nl == nr)
+ goto yes;
+
switch(nl->type->etype) {
case TARRAY:
if(nl->op == ONAME)