From 17f90c68c6059a10228d76fee36049d69b165f69 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Thu, 15 Jul 2010 14:25:50 -0700 Subject: [PATCH] gc: fix handling of types inside function bodies Fixes #849. Fixes #920. R=ken2 CC=golang-dev https://golang.org/cl/1841042 --- src/cmd/gc/align.c | 4 ++-- src/cmd/gc/walk.c | 4 ++++ test/{bugs => fixedbugs}/bug286.go | 0 test/fixedbugs/bug290.go | 15 +++++++++++++++ test/golden.out | 7 ------- 5 files changed, 21 insertions(+), 9 deletions(-) rename test/{bugs => fixedbugs}/bug286.go (100%) create mode 100644 test/fixedbugs/bug290.go 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