diff --git a/src/cmd/gc/align.c b/src/cmd/gc/align.c index 1b9112d69a..1d68b55a00 100644 --- a/src/cmd/gc/align.c +++ b/src/cmd/gc/align.c @@ -351,8 +351,8 @@ void defercheckwidth(void) { // we get out of sync on syntax errors, so don't be pedantic. - // if(defercalc) - // fatal("defercheckwidth"); + if(defercalc && nerrors == 0) + fatal("defercheckwidth"); defercalc = 1; } diff --git a/src/cmd/gc/walk.c b/src/cmd/gc/walk.c index 2e233bfdd9..8b8096400e 100644 --- a/src/cmd/gc/walk.c +++ b/src/cmd/gc/walk.c @@ -292,10 +292,14 @@ walkdef(Node *n) break; case OTYPE: + if(curfn) + defercheckwidth(); n->walkdef = 1; n->type = typ(TFORW); n->type->sym = n->sym; walkdeftype(n); + if(curfn) + resumecheckwidth(); break; case OPACK: diff --git a/test/bugs/bug286.go b/test/fixedbugs/bug286.go similarity index 100% rename from test/bugs/bug286.go rename to test/fixedbugs/bug286.go diff --git a/test/fixedbugs/bug290.go b/test/fixedbugs/bug290.go new file mode 100644 index 0000000000..80437c7f85 --- /dev/null +++ b/test/fixedbugs/bug290.go @@ -0,0 +1,15 @@ +// $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. + +// http://code.google.com/p/go/issues/detail?id=920 + +package main + +type X struct { x []X } + +func main() { + type Y struct { x []Y } // used to get invalid recursive type +} diff --git a/test/golden.out b/test/golden.out index 82e85340a5..1bed6599a8 100644 --- a/test/golden.out +++ b/test/golden.out @@ -180,10 +180,3 @@ BUG: bug260 failed =========== bugs/bug274.go BUG: errchk: command succeeded unexpectedly - -=========== bugs/bug286.go -test2 called g -panic: wrong method called - -panic PC=xxx -BUG: bug286 failed