diff options
author | Russ Cox <rsc@golang.org> | 2012-06-13 16:24:49 -0400 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2012-06-13 16:24:49 -0400 |
commit | a56e41d518a5c49f1eec382c11d6a8d24d11c763 (patch) | |
tree | 82c747acc536a2326549e42f7058a1d50a697db1 | |
parent | 4bc9ddf82f42b3eae7a71faea4a5de373123ea58 (diff) | |
download | go-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.c | 4 | ||||
-rw-r--r-- | test/fixedbugs/bug442.go | 27 |
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") + } +} |