From 933d7129c07e32ffa403c94634fa0c7045f6b3d8 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Mon, 9 Sep 2013 13:03:59 -0400 Subject: [PATCH] cmd/gc: squelch spurious "invalid recursive type" error R=ken2 CC=golang-dev https://golang.org/cl/13512047 --- src/cmd/gc/align.c | 6 ++++-- src/cmd/gc/typecheck.c | 8 +++++++- test/fixedbugs/issue5581.go | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 3 deletions(-) create mode 100644 test/fixedbugs/issue5581.go diff --git a/src/cmd/gc/align.c b/src/cmd/gc/align.c index 80c65387b3..8e9677e75b 100644 --- a/src/cmd/gc/align.c +++ b/src/cmd/gc/align.c @@ -119,7 +119,8 @@ dowidth(Type *t) if(t->width == -2) { lno = lineno; lineno = t->lineno; - yyerror("invalid recursive type %T", t); + if(!t->broke) + yyerror("invalid recursive type %T", t); t->width = 0; lineno = lno; return; @@ -219,7 +220,8 @@ dowidth(Type *t) checkwidth(t->down); break; case TFORW: // should have been filled in - yyerror("invalid recursive type %T", t); + if(!t->broke) + yyerror("invalid recursive type %T", t); w = 1; // anything will do break; case TANY: diff --git a/src/cmd/gc/typecheck.c b/src/cmd/gc/typecheck.c index e4dd467945..23de614ac0 100644 --- a/src/cmd/gc/typecheck.c +++ b/src/cmd/gc/typecheck.c @@ -3046,7 +3046,7 @@ queuemethod(Node *n) Node* typecheckdef(Node *n) { - int lno; + int lno, nerrors0; Node *e; Type *t; NodeList *l; @@ -3174,7 +3174,13 @@ typecheckdef(Node *n) n->walkdef = 1; n->type = typ(TFORW); n->type->sym = n->sym; + nerrors0 = nerrors; typecheckdeftype(n); + if(n->type->etype == TFORW && nerrors > nerrors0) { + // Something went wrong during type-checking, + // but it was reported. Silence future errors. + n->type->broke = 1; + } if(curfn) resumecheckwidth(); break; diff --git a/test/fixedbugs/issue5581.go b/test/fixedbugs/issue5581.go new file mode 100644 index 0000000000..8c2d597294 --- /dev/null +++ b/test/fixedbugs/issue5581.go @@ -0,0 +1,34 @@ +// errorcheck + +// Used to emit a spurious "invalid recursive type" error. +// See golang.org/issue/5581. + +// Copyright 2013 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 + +import "fmt" + +func NewBar() *Bar { return nil } + +func (x *Foo) Method() (int, error) { + for y := range x.m { + _ = y.A + } + return 0, nil +} + +type Foo struct { + m map[*Bar]int +} + +type Bar struct { + A *Foo + B chan Blah // ERROR "undefined: Blah" +} + +func main() { + fmt.Println("Hello, playground") +}