mirror of
https://github.com/golang/go
synced 2024-11-25 19:27:56 -07:00
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
This commit is contained in:
parent
e7657de717
commit
880d869764
@ -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)
|
|||||||
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);
|
||||||
}
|
}
|
||||||
|
18
test/fixedbugs/issue5244.go
Normal file
18
test/fixedbugs/issue5244.go
Normal file
@ -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() {}
|
Loading…
Reference in New Issue
Block a user