]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/gc: be more tolerant with recursive types when checking map types.
authorRémy Oudompheng <oudomphe@phare.normalesup.org>
Wed, 3 Apr 2013 06:18:30 +0000 (08:18 +0200)
committerRémy Oudompheng <oudomphe@phare.normalesup.org>
Wed, 3 Apr 2013 06:18:30 +0000 (08:18 +0200)
A nested TFORW type would push algtype1 into an impossible case.

Fixes #5125.

R=golang-dev, daniel.morsing
CC=golang-dev
https://golang.org/cl/8213043

src/cmd/gc/subr.c
test/fixedbugs/issue5125.dir/bug.go [new file with mode: 0644]
test/fixedbugs/issue5125.dir/main.go [new file with mode: 0644]
test/fixedbugs/issue5125.go [new file with mode: 0644]

index 255f4c73adfb593c6159fc4774c549520bd40c2a..bd78fb0246654f6e7b525fb7c2b014f9e10892f9 100644 (file)
@@ -548,6 +548,12 @@ algtype1(Type *t, Type **bad)
                *bad = T;
 
        switch(t->etype) {
+       case TANY:
+       case TFORW:
+               // will be defined later.
+               *bad = t;
+               return -1;
+
        case TINT8:
        case TUINT8:
        case TINT16:
@@ -665,11 +671,14 @@ Type*
 maptype(Type *key, Type *val)
 {
        Type *t;
+       Type *bad;
+       int atype;
 
        if(key != nil) {
-               switch(key->etype) {
+               atype = algtype1(key, &bad);
+               switch(bad == T ? key->etype : bad->etype) {
                default:
-                       if(algtype1(key, nil) == ANOEQ)
+                       if(atype == ANOEQ)
                                yyerror("invalid map key type %T", key);
                        break;
                case TANY:
diff --git a/test/fixedbugs/issue5125.dir/bug.go b/test/fixedbugs/issue5125.dir/bug.go
new file mode 100644 (file)
index 0000000..2fdf0f9
--- /dev/null
@@ -0,0 +1,17 @@
+// 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 bug
+
+type Node interface {
+       Eval(s *Scene)
+}
+
+type plug struct {
+       node Node
+}
+
+type Scene struct {
+       changed map[plug]bool
+}
diff --git a/test/fixedbugs/issue5125.dir/main.go b/test/fixedbugs/issue5125.dir/main.go
new file mode 100644 (file)
index 0000000..47acdeb
--- /dev/null
@@ -0,0 +1,10 @@
+// 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 _ "./bug"
+
+func main() {
+}
diff --git a/test/fixedbugs/issue5125.go b/test/fixedbugs/issue5125.go
new file mode 100644 (file)
index 0000000..c049df3
--- /dev/null
@@ -0,0 +1,10 @@
+// compiledir
+
+// 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.
+
+// Issue 5125: cyclic dependencies between types confuse
+// the hashability test during import.
+
+package ignored