mirror of https://github.com/golang/go.git
cmd/compile: don't put Noalg types in typelinks
They could get picked up by reflect code, yielding the wrong type. Fixes #22605 Change-Id: Ie11fb361ca7f3255e662037b3407565c8f0a2c4c Reviewed-on: https://go-review.googlesource.com/76315 Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com>
This commit is contained in:
parent
e4a380868d
commit
a4c009f5ae
|
|
@ -960,10 +960,17 @@ func dcommontype(lsym *obj.LSym, ot int, t *types.Type) int {
|
||||||
return ot
|
return ot
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// typeHasNoAlg returns whether t does not have any associated hash/eq
|
||||||
|
// algorithms because t, or some component of t, is marked Noalg.
|
||||||
|
func typeHasNoAlg(t *types.Type) bool {
|
||||||
|
a, bad := algtype1(t)
|
||||||
|
return a == ANOEQ && bad.Noalg()
|
||||||
|
}
|
||||||
|
|
||||||
func typesymname(t *types.Type) string {
|
func typesymname(t *types.Type) string {
|
||||||
name := t.ShortString()
|
name := t.ShortString()
|
||||||
// Use a separate symbol name for Noalg types for #17752.
|
// Use a separate symbol name for Noalg types for #17752.
|
||||||
if a, bad := algtype1(t); a == ANOEQ && bad.Noalg() {
|
if typeHasNoAlg(t) {
|
||||||
name = "noalg." + name
|
name = "noalg." + name
|
||||||
}
|
}
|
||||||
return name
|
return name
|
||||||
|
|
@ -1394,6 +1401,10 @@ func dtypesym(t *types.Type) *obj.LSym {
|
||||||
keep = true
|
keep = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Do not put Noalg types in typelinks. See issue #22605.
|
||||||
|
if typeHasNoAlg(t) {
|
||||||
|
keep = false
|
||||||
|
}
|
||||||
lsym.Set(obj.AttrMakeTypelink, keep)
|
lsym.Set(obj.AttrMakeTypelink, keep)
|
||||||
|
|
||||||
return lsym
|
return lsym
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,26 @@
|
||||||
|
// run
|
||||||
|
|
||||||
|
// Copyright 2017 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.
|
||||||
|
|
||||||
|
// We were picking up a special noalg type from typelinks.
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import "reflect"
|
||||||
|
|
||||||
|
func f(m map[string]int) int {
|
||||||
|
return m["a"]
|
||||||
|
}
|
||||||
|
|
||||||
|
func g(m map[[8]string]int) int {
|
||||||
|
t := reflect.ArrayOf(8, reflect.TypeOf(""))
|
||||||
|
a := reflect.New(t).Elem()
|
||||||
|
return m[a.Interface().([8]string)]
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
m := map[[8]string]int{}
|
||||||
|
g(m)
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue