]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/gc: squelch spurious "invalid recursive type" error
authorRuss Cox <rsc@golang.org>
Mon, 9 Sep 2013 17:03:59 +0000 (13:03 -0400)
committerRuss Cox <rsc@golang.org>
Mon, 9 Sep 2013 17:03:59 +0000 (13:03 -0400)
R=ken2
CC=golang-dev
https://golang.org/cl/13512047

src/cmd/gc/align.c
src/cmd/gc/typecheck.c
test/fixedbugs/issue5581.go [new file with mode: 0644]

index 80c65387b38104e6b2eb8c759e0c08068ad88979..8e9677e75b6e73cc69647f6577411fd08bdb0c74 100644 (file)
@@ -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:
index e4dd467945faf55e3f33af8d389f58cd035b8ae8..23de614ac03e70f2e9c39a9b266a8904aa9a05e7 100644 (file)
@@ -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 (file)
index 0000000..8c2d597
--- /dev/null
@@ -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")
+}