cmd/gc: do not crash on struct with _ field

Fixes #3607.

R=ken2
CC=golang-dev
https://golang.org/cl/6296052
This commit is contained in:
Russ Cox 2012-06-07 02:05:08 -04:00
parent ee5f59ab4f
commit 744b23fe48
2 changed files with 29 additions and 2 deletions

View 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;
}

27
test/fixedbugs/bug442.go Normal file
View file

@ -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")
}
}