Commit a4c009f5 authored by Ian Lance Taylor's avatar Ian Lance Taylor

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: 's avatarMatthew Dempsky <mdempsky@google.com>
parent e4a38086
...@@ -960,10 +960,17 @@ func dcommontype(lsym *obj.LSym, ot int, t *types.Type) int { ...@@ -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 { ...@@ -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
......
// 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)
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment