aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2011-07-27 18:55:30 -0400
committerRuss Cox <rsc@golang.org>2011-07-27 18:55:30 -0400
commitf91eb3c2f9e0621634a9cd16c2e9da903922fc53 (patch)
tree2c8cda59c81b32f43151ea2190cfedbc9853ae40
parent5ea413e2a0414c4bd6dbf9d00d760b6ed8b156ec (diff)
downloadgo-f91eb3c2f9e0621634a9cd16c2e9da903922fc53.tar.gz
go-f91eb3c2f9e0621634a9cd16c2e9da903922fc53.zip
gc: composite literal double eval bug
Fixes #2086. R=ken2 CC=golang-dev https://golang.org/cl/4803055
-rw-r--r--src/cmd/gc/pgen.c2
-rw-r--r--src/cmd/gc/sinit.c2
-rw-r--r--test/fixedbugs/bug354.go26
3 files changed, 28 insertions, 2 deletions
diff --git a/src/cmd/gc/pgen.c b/src/cmd/gc/pgen.c
index 962324a8bb..abe8ea8925 100644
--- a/src/cmd/gc/pgen.c
+++ b/src/cmd/gc/pgen.c
@@ -189,7 +189,7 @@ compactframe(Prog* ptxt)
continue;
w = n->type->width;
- if((w >= MAXWIDTH) || (w < 0))
+ if(w >= MAXWIDTH || w < 0)
fatal("bad width");
stksize += w;
stksize = rnd(stksize, n->type->align);
diff --git a/src/cmd/gc/sinit.c b/src/cmd/gc/sinit.c
index eb7ef31ecc..917e2ae6d5 100644
--- a/src/cmd/gc/sinit.c
+++ b/src/cmd/gc/sinit.c
@@ -686,7 +686,7 @@ anylit(int ctxt, Node *n, Node *var, NodeList **init)
if(ctxt == 0) {
// lay out static data
vstat = staticname(t, ctxt);
- structlit(1, 1, n, vstat, init);
+ structlit(ctxt, 1, n, vstat, init);
// copy static to var
a = nod(OAS, var, vstat);
diff --git a/test/fixedbugs/bug354.go b/test/fixedbugs/bug354.go
new file mode 100644
index 0000000000..1f6a6dc9f7
--- /dev/null
+++ b/test/fixedbugs/bug354.go
@@ -0,0 +1,26 @@
+// $G $D/$F.go || echo BUG: bug354
+
+// 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.
+
+// issue 2086
+// was calling makeclosure twice on the closure
+
+package main
+
+import (
+ "os"
+)
+
+type Inner struct {
+ F func() os.Error
+}
+
+type Outer struct {
+ Inners []Inner
+}
+
+// calls makeclosure twice on same closure
+
+var Foo = Outer{[]Inner{Inner{func() os.Error{ return nil }}}}