aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2011-07-27 19:31:11 -0400
committerRuss Cox <rsc@golang.org>2011-07-27 19:31:11 -0400
commit890bdc53395676efae78218f5d9d6b6eddf26b76 (patch)
treea6046a1ef7f4485ba1d0aa7368893e5c7daa66d6
parentf91eb3c2f9e0621634a9cd16c2e9da903922fc53 (diff)
downloadgo-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.c5
-rw-r--r--src/cmd/gc/lex.c5
-rw-r--r--test/fixedbugs/bug355.go18
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")
+ }
+}