Commit e1b1a5fe authored by Luuk van Dijk's avatar Luuk van Dijk

gc: fix use of stackallocated AST node in generation of static initialisation code.

Fixes #2529

R=rsc, rogpeppe
CC=golang-dev
https://golang.org/cl/5483048
parent 5fa18e10
......@@ -302,18 +302,18 @@ staticcopy(Node *l, Node *r, NodeList **out)
n1.type = e->expr->type;
if(e->expr->op == OLITERAL)
gdata(&n1, e->expr, n1.type->width);
else if(staticassign(&n1, e->expr, out)) {
// Done
} else {
// Requires computation, but we're
// copying someone else's computation.
else {
ll = nod(OXXX, N, N);
*ll = n1;
rr = nod(OXXX, N, N);
*rr = *orig;
rr->type = ll->type;
rr->xoffset += e->xoffset;
*out = list(*out, nod(OAS, ll, rr));
if(!staticassign(ll, e->expr, out)) {
// Requires computation, but we're
// copying someone else's computation.
rr = nod(OXXX, N, N);
*rr = *orig;
rr->type = ll->type;
rr->xoffset += e->xoffset;
*out = list(*out, nod(OAS, ll, rr));
}
}
}
return 1;
......@@ -407,12 +407,11 @@ staticassign(Node *l, Node *r, NodeList **out)
n1.type = e->expr->type;
if(e->expr->op == OLITERAL)
gdata(&n1, e->expr, n1.type->width);
else if(staticassign(&n1, e->expr, out)) {
// done
} else {
else {
a = nod(OXXX, N, N);
*a = n1;
*out = list(*out, nod(OAS, a, e->expr));
if(!staticassign(a, e->expr, out))
*out = list(*out, nod(OAS, a, e->expr));
}
}
return 1;
......
// Copyright 2011 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package pkg
type T struct {}
var E T
// $G $D/$F.dir/pkg.go && $G $D/$F.go || echo "Bug 382"
// Issue 2529
package main
import "./pkg"
var x = pkg.E
var fo = struct {F pkg.T}{F: x}
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