]> Cypherpunks repositories - gostls13.git/commitdiff
gc: composite literal double eval bug
authorRuss Cox <rsc@golang.org>
Wed, 27 Jul 2011 22:55:30 +0000 (18:55 -0400)
committerRuss Cox <rsc@golang.org>
Wed, 27 Jul 2011 22:55:30 +0000 (18:55 -0400)
Fixes #2086.

R=ken2
CC=golang-dev
https://golang.org/cl/4803055

src/cmd/gc/pgen.c
src/cmd/gc/sinit.c
test/fixedbugs/bug354.go [new file with mode: 0644]

index 962324a8bb1e9dad050c37fafff2f05a2a43c04a..abe8ea89253282bdbe5e86e5456fa410cabd5844 100644 (file)
@@ -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);
index eb7ef31ecc78a51ad98236e4954a9a5751eb2be4..917e2ae6d5c7543c21fc037e3b7e6d224f7c31ce 100644 (file)
@@ -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 (file)
index 0000000..1f6a6dc
--- /dev/null
@@ -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 }}}}