Commit 880d8697 authored by Rémy Oudompheng's avatar Rémy Oudompheng

cmd/gc: compute initialization order for top-level blank vars too.

Fixes #5244.

R=golang-dev, rsc, iant, r, daniel.morsing
CC=golang-dev
https://golang.org/cl/8601044
parent e7657de7
...@@ -53,9 +53,7 @@ init1(Node *n, NodeList **out) ...@@ -53,9 +53,7 @@ init1(Node *n, NodeList **out)
if(isblank(n) && n->curfn == N && n->defn != N && n->defn->initorder == InitNotStarted) { if(isblank(n) && n->curfn == N && n->defn != N && n->defn->initorder == InitNotStarted) {
// blank names initialization is part of init() but not // blank names initialization is part of init() but not
// when they are inside a function. // when they are inside a function.
n->defn->initorder = InitDone; break;
if(debug['%']) dump("nonstatic", n->defn);
*out = list(*out, n->defn);
} }
return; return;
} }
...@@ -130,7 +128,7 @@ init1(Node *n, NodeList **out) ...@@ -130,7 +128,7 @@ init1(Node *n, NodeList **out)
init2(n->defn->right, out); init2(n->defn->right, out);
if(debug['j']) if(debug['j'])
print("%S\n", n->sym); print("%S\n", n->sym);
if(!staticinit(n, out)) { if(isblank(n) || !staticinit(n, out)) {
if(debug['%']) dump("nonstatic", n->defn); if(debug['%']) dump("nonstatic", n->defn);
*out = list(*out, n->defn); *out = list(*out, n->defn);
} }
......
// 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() {}
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