From: Russ Cox Date: Tue, 19 Jan 2010 01:00:38 +0000 (-0800) Subject: gc: multiple return value at top-level invoked multiple times X-Git-Tag: weekly.2010-01-27~81 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=8e996304f36dca1399266b06b460b773e3b6d530;p=gostls13.git gc: multiple return value at top-level invoked multiple times Fixes #402. R=ken2 CC=golang-dev https://golang.org/cl/186214 --- diff --git a/src/cmd/gc/sinit.c b/src/cmd/gc/sinit.c index b1160d3d48..1b618fddb2 100644 --- a/src/cmd/gc/sinit.c +++ b/src/cmd/gc/sinit.c @@ -90,12 +90,18 @@ init1(Node *n, NodeList **out) break; case OAS2FUNC: + if(n->defn->initorder) + break; + n->defn->initorder = 1; for(l=n->defn->rlist; l; l=l->next) init1(l->n, out); *out = list(*out, n->defn); break; case OAS2MAPR: + if(n->defn->initorder) + break; + n->defn->initorder = 1; for(l=n->defn->rlist; l; l=l->next) init1(l->n, out); *out = list(*out, n->defn); diff --git a/test/fixedbugs/bug244.go b/test/fixedbugs/bug244.go new file mode 100644 index 0000000000..26db78777f --- /dev/null +++ b/test/fixedbugs/bug244.go @@ -0,0 +1,30 @@ +// $G $D/$F.go && $L $F.$A && ./$A.out + +// Copyright 2010 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. + +package main + +var nf int +var ng int + +func f() (int, int, int) { + nf++ + return 1, 2, 3 +} + +func g() int { + ng++ + return 4 +} + +var x, y, z = f() +var m = make(map[int]int) +var v, ok = m[g()] + +func main() { + if x != 1 || y != 2 || z != 3 || nf != 1 || v != 0 || ok != false || ng != 1 { + panic("x=", x, " y=", y, " z=", z, " nf=", nf, " v=", v, " ok=", ok, " ng=", ng) + } +}