]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/gc: compute initialization order for top-level blank vars too.
authorRémy Oudompheng <oudomphe@phare.normalesup.org>
Tue, 11 Jun 2013 20:21:51 +0000 (22:21 +0200)
committerRémy Oudompheng <oudomphe@phare.normalesup.org>
Tue, 11 Jun 2013 20:21:51 +0000 (22:21 +0200)
Fixes #5244.

R=golang-dev, rsc, iant, r, daniel.morsing
CC=golang-dev
https://golang.org/cl/8601044

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

index b84b3afdc4c1550ab13ee7923e579d496a50f9d4..51c5f7022222ab5200c32c6bb554fc830492748e 100644 (file)
@@ -53,9 +53,7 @@ init1(Node *n, NodeList **out)
                if(isblank(n) && n->curfn == N && n->defn != N && n->defn->initorder == InitNotStarted) {
                        // blank names initialization is part of init() but not
                        // when they are inside a function.
-                       n->defn->initorder = InitDone;
-                       if(debug['%']) dump("nonstatic", n->defn);
-                       *out = list(*out, n->defn);
+                       break;
                }
                return;
        }
@@ -130,7 +128,7 @@ init1(Node *n, NodeList **out)
                                init2(n->defn->right, out);
                                if(debug['j'])
                                        print("%S\n", n->sym);
-                               if(!staticinit(n, out)) {
+                               if(isblank(n) || !staticinit(n, out)) {
                                        if(debug['%']) dump("nonstatic", n->defn);
                                        *out = list(*out, n->defn);
                                }
diff --git a/test/fixedbugs/issue5244.go b/test/fixedbugs/issue5244.go
new file mode 100644 (file)
index 0000000..e26c7b8
--- /dev/null
@@ -0,0 +1,18 @@
+// run
+
+// Copyright 2013 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 5244: the init order computation uses the wrong
+// order for top-level blank identifier assignments.
+// The example used to panic because it tries calling a
+// nil function instead of assigning to f before.
+
+package main
+
+var f = func() int { return 1 }
+var _ = f() + g()
+var g = func() int { return 2 }
+
+func main() {}