]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: don't put Noalg types in typelinks
authorIan Lance Taylor <iant@golang.org>
Tue, 7 Nov 2017 02:51:12 +0000 (18:51 -0800)
committerIan Lance Taylor <iant@golang.org>
Tue, 7 Nov 2017 22:29:48 +0000 (22:29 +0000)
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>
src/cmd/compile/internal/gc/reflect.go
test/fixedbugs/issue22605.go [new file with mode: 0644]

index faed5bd9a5f2b7014c28ae42b5d64a335cc829cc..66b1a8e1861c9f56b45bb2a7e139c11844bca93c 100644 (file)
@@ -960,10 +960,17 @@ func dcommontype(lsym *obj.LSym, ot int, t *types.Type) int {
        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 {
        name := t.ShortString()
        // 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
        }
        return name
@@ -1394,6 +1401,10 @@ func dtypesym(t *types.Type) *obj.LSym {
                        keep = true
                }
        }
+       // Do not put Noalg types in typelinks.  See issue #22605.
+       if typeHasNoAlg(t) {
+               keep = false
+       }
        lsym.Set(obj.AttrMakeTypelink, keep)
 
        return lsym
diff --git a/test/fixedbugs/issue22605.go b/test/fixedbugs/issue22605.go
new file mode 100644 (file)
index 0000000..9e726f3
--- /dev/null
@@ -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)
+}