]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/gc: do not crash on struct with _ field
authorRuss Cox <rsc@golang.org>
Thu, 7 Jun 2012 06:05:08 +0000 (02:05 -0400)
committerRuss Cox <rsc@golang.org>
Thu, 7 Jun 2012 06:05:08 +0000 (02:05 -0400)
Fixes #3607.

R=ken2
CC=golang-dev
https://golang.org/cl/6296052

src/cmd/gc/subr.c
test/fixedbugs/bug442.go [new file with mode: 0644]

index dfab86864a967832b7938fe24e6cb4db84905d14..1bb83272c9d59c238b6b3cf57f845fa489896936 100644 (file)
@@ -2684,7 +2684,7 @@ genhash(Sym *sym, Type *t)
                first = T;
                for(t1=t->type;; t1=t1->down) {
                        if(t1 != T && (isblanksym(t1->sym) || algtype1(t1->type, nil) == AMEM)) {
-                               if(first == T)
+                               if(first == T && !isblanksym(t1->sym))
                                        first = t1;
                                continue;
                        }
@@ -2901,7 +2901,7 @@ geneq(Sym *sym, Type *t)
                first = T;
                for(t1=t->type;; t1=t1->down) {
                        if(t1 != T && (isblanksym(t1->sym) || algtype1(t1->type, nil) == AMEM)) {
-                               if(first == T)
+                               if(first == T && !isblanksym(t1->sym))
                                        first = t1;
                                continue;
                        }
diff --git a/test/fixedbugs/bug442.go b/test/fixedbugs/bug442.go
new file mode 100644 (file)
index 0000000..1d1a948
--- /dev/null
@@ -0,0 +1,27 @@
+// run
+
+// Copyright 2012 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.
+
+// Used to crash generating hash and == functions for struct
+// with leading _ field.  Issue 3607.
+
+package main
+
+type T struct {
+       _ int
+       X interface{}
+       _ string
+       Y float64
+}
+
+func main() {
+       m := map[T]int{}
+       m[T{X: 1, Y: 2}] = 1
+       m[T{X: 2, Y: 3}] = 2
+       m[T{X: 1, Y: 2}] = 3  // overwrites first entry
+       if len(m) != 2 {
+               println("BUG")
+       }
+}