mirror of
https://github.com/golang/go
synced 2024-11-21 19:14:44 -07:00
gc: top-level closure bug
Fixes #2055. R=ken2 CC=golang-dev https://golang.org/cl/4816059
This commit is contained in:
parent
f91eb3c2f9
commit
890bdc5339
@ -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);
|
||||
|
@ -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,9 +274,10 @@ 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)
|
||||
if(l->n->op == ONAME)
|
||||
|
18
test/fixedbugs/bug355.go
Normal file
18
test/fixedbugs/bug355.go
Normal file
@ -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")
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user