1
0
mirror of https://github.com/golang/go synced 2024-11-21 18:24:46 -07:00

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
This commit is contained in:
Luuk van Dijk 2011-12-13 09:09:10 +01:00
parent 5fa18e1061
commit e1b1a5fea2
3 changed files with 30 additions and 14 deletions

View File

@ -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;

View File

@ -0,0 +1,7 @@
// 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

10
test/fixedbugs/bug382.go Normal file
View File

@ -0,0 +1,10 @@
// $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}