mirror of
https://github.com/golang/go
synced 2024-11-23 05:10:09 -07:00
cmd/gc: squelch spurious "invalid recursive type" error
R=ken2 CC=golang-dev https://golang.org/cl/13512047
This commit is contained in:
parent
903c2fda18
commit
933d7129c0
@ -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:
|
||||
|
@ -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;
|
||||
|
34
test/fixedbugs/issue5581.go
Normal file
34
test/fixedbugs/issue5581.go
Normal file
@ -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")
|
||||
}
|
Loading…
Reference in New Issue
Block a user