aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2012-06-13 16:24:49 -0400
committerRuss Cox <rsc@golang.org>2012-06-13 16:24:49 -0400
commita56e41d518a5c49f1eec382c11d6a8d24d11c763 (patch)
tree82c747acc536a2326549e42f7058a1d50a697db1
parent4bc9ddf82f42b3eae7a71faea4a5de373123ea58 (diff)
downloadgo-a56e41d518a5c49f1eec382c11d6a8d24d11c763.tar.gz
go-a56e41d518a5c49f1eec382c11d6a8d24d11c763.zip
[release-branch.go1] cmd/gc: do not crash on struct with _ field
««« backport af07f1cd12dc cmd/gc: do not crash on struct with _ field Fixes #3607. R=ken2 CC=golang-dev https://golang.org/cl/6296052 »»»
-rw-r--r--src/cmd/gc/subr.c4
-rw-r--r--test/fixedbugs/bug442.go27
2 files changed, 29 insertions, 2 deletions
diff --git a/src/cmd/gc/subr.c b/src/cmd/gc/subr.c
index fbff7a36b2..bd53520df9 100644
--- a/src/cmd/gc/subr.c
+++ b/src/cmd/gc/subr.c
@@ -2679,7 +2679,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;
}
@@ -2896,7 +2896,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
index 0000000000..1d1a948161
--- /dev/null
+++ b/test/fixedbugs/bug442.go
@@ -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")
+ }
+}