diff options
author | Russ Cox <rsc@golang.org> | 2011-07-27 19:31:11 -0400 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2011-07-27 19:31:11 -0400 |
commit | 890bdc53395676efae78218f5d9d6b6eddf26b76 (patch) | |
tree | a6046a1ef7f4485ba1d0aa7368893e5c7daa66d6 | |
parent | f91eb3c2f9e0621634a9cd16c2e9da903922fc53 (diff) | |
download | go-890bdc53395676efae78218f5d9d6b6eddf26b76.tar.gz go-890bdc53395676efae78218f5d9d6b6eddf26b76.zip |
gc: top-level closure bug
Fixes #2055.
R=ken2
CC=golang-dev
https://golang.org/cl/4816059
-rw-r--r-- | src/cmd/gc/closure.c | 5 | ||||
-rw-r--r-- | src/cmd/gc/lex.c | 5 | ||||
-rw-r--r-- | test/fixedbugs/bug355.go | 18 |
3 files changed, 26 insertions, 2 deletions
diff --git a/src/cmd/gc/closure.c b/src/cmd/gc/closure.c index 7e7b405260..1261eefb7d 100644 --- a/src/cmd/gc/closure.c +++ b/src/cmd/gc/closure.c @@ -84,6 +84,11 @@ typecheckclosure(Node *func, int top) oldfn = curfn; typecheck(&func->ntype, Etype); func->type = func->ntype->type; + if(curfn == nil) { + xtop = list(xtop, func); + return; + } + if(func->type != T) { curfn = func; typechecklist(func->nbody, Etop); diff --git a/src/cmd/gc/lex.c b/src/cmd/gc/lex.c index 6845a8ecd6..24a244e40f 100644 --- a/src/cmd/gc/lex.c +++ b/src/cmd/gc/lex.c @@ -255,7 +255,7 @@ main(int argc, char *argv[]) resumecheckwidth(); for(l=xtop; l; l=l->next) - if(l->n->op == ODCLFUNC) { + if(l->n->op == ODCLFUNC || l->n->op == OCLOSURE) { curfn = l->n; saveerrors(); typechecklist(l->n->nbody, Etop); @@ -274,8 +274,9 @@ main(int argc, char *argv[]) while(closures) { l = closures; closures = nil; - for(; l; l=l->next) + for(; l; l=l->next) { funccompile(l->n, 1); + } } for(l=externdcl; l; l=l->next) diff --git a/test/fixedbugs/bug355.go b/test/fixedbugs/bug355.go new file mode 100644 index 0000000000..a9cf0161b0 --- /dev/null +++ b/test/fixedbugs/bug355.go @@ -0,0 +1,18 @@ +// $G $D/$F.go && $L $F.$A && ./$A.out + +// 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. + +package main + +var f = func() int { + type S int + return 42 +} + +func main() { + if f() != 42 { + panic("BUG: bug355") + } +} |