Commit c13866db authored by Rémy Oudompheng's avatar Rémy Oudompheng

cmd/5c: fix handling of side effects when assigning a struct literal.

Also undo revision a5b96b602690 used to workaround the bug.

Fixes #4643.

R=rsc, golang-dev, dave, minux.ma, lucio.dere, bradfitz
CC=golang-dev
https://golang.org/cl/7090043
parent dc75670a
......@@ -950,9 +950,9 @@ sugen(Node *n, Node *nn, int32 w)
case OSTRUCT:
/*
* rewrite so lhs has no fn call
* rewrite so lhs has no side effect.
*/
if(nn != Z && nn->complex >= FNX) {
if(nn != Z && side(nn)) {
nod1 = *n;
nod1.type = typ(TIND, n->type);
regret(&nod2, &nod1);
......
......@@ -338,8 +338,7 @@ flushptrbuf(PtrTarget *ptrbuf, PtrTarget **ptrbufpos, Obj **_wp, Workbuf **_wbuf
if((bits & (bitAllocated|bitMarked)) != bitAllocated)
continue;
*bitbufpos = (BitTarget){obj, ti, bitp, shift};
bitbufpos++;
*bitbufpos++ = (BitTarget){obj, ti, bitp, shift};
}
runtime·lock(&lock);
......@@ -542,8 +541,7 @@ scanblock(Workbuf *wbuf, Obj *wp, uintptr nobj, bool keepworking)
// iface->tab
if((void*)iface->tab >= arena_start && (void*)iface->tab < arena_used) {
*ptrbufpos = (PtrTarget){iface->tab, (uintptr)itabtype->gc};
ptrbufpos++;
*ptrbufpos++ = (PtrTarget){iface->tab, (uintptr)itabtype->gc};
if(ptrbufpos == ptrbuf_end)
flushptrbuf(ptrbuf, &ptrbufpos, &wp, &wbuf, &nobj, bitbuf);
}
......@@ -570,8 +568,7 @@ scanblock(Workbuf *wbuf, Obj *wp, uintptr nobj, bool keepworking)
stack_top.b += PtrSize;
obj = *(byte**)i;
if(obj >= arena_start && obj < arena_used) {
*ptrbufpos = (PtrTarget){obj, 0};
ptrbufpos++;
*ptrbufpos++ = (PtrTarget){obj, 0};
if(ptrbufpos == ptrbuf_end)
flushptrbuf(ptrbuf, &ptrbufpos, &wp, &wbuf, &nobj, bitbuf);
}
......@@ -657,8 +654,7 @@ scanblock(Workbuf *wbuf, Obj *wp, uintptr nobj, bool keepworking)
}
if(obj >= arena_start && obj < arena_used) {
*ptrbufpos = (PtrTarget){obj, objti};
ptrbufpos++;
*ptrbufpos++ = (PtrTarget){obj, objti};
if(ptrbufpos == ptrbuf_end)
flushptrbuf(ptrbuf, &ptrbufpos, &wp, &wbuf, &nobj, bitbuf);
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment