diff options
author | Michael Hudson-Doyle <michael.hudson@canonical.com> | 2017-02-10 13:08:13 +1300 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2017-02-10 17:53:40 +0000 |
commit | 7cec9a583d81a3b518795cc2a49cd6296e45c69b (patch) | |
tree | 857cceabe31a7025abf3203fc413ea5a489c2542 | |
parent | d84dee069a534bd7a35ec4062a92a04ce9c2806e (diff) | |
download | go-7cec9a583d81a3b518795cc2a49cd6296e45c69b.tar.gz go-7cec9a583d81a3b518795cc2a49cd6296e45c69b.zip |
[release-branch.go1.8] reflect: clear ptrToThis in Ptr when allocating result on heap
Otherwise, calling PtrTo on the result will fail.
Fixes #19003
Change-Id: I8d7d1981a5d0417d5aee52740469d71e90734963
Reviewed-on: https://go-review.googlesource.com/36731
Run-TryBot: Michael Hudson-Doyle <michael.hudson@canonical.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Russ Cox <rsc@golang.org>
Reviewed-on: https://go-review.googlesource.com/36718
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
-rw-r--r-- | src/reflect/all_test.go | 13 | ||||
-rw-r--r-- | src/reflect/type.go | 1 |
2 files changed, 11 insertions, 3 deletions
diff --git a/src/reflect/all_test.go b/src/reflect/all_test.go index 022350b322..3eca293675 100644 --- a/src/reflect/all_test.go +++ b/src/reflect/all_test.go @@ -2478,17 +2478,24 @@ func TestNumMethodOnDDD(t *testing.T) { } func TestPtrTo(t *testing.T) { + // This block of code means that the ptrToThis field of the + // reflect data for *unsafe.Pointer is non zero, see + // https://golang.org/issue/19003 + var x unsafe.Pointer + var y = &x + var z = &y + var i int - typ := TypeOf(i) + typ := TypeOf(z) for i = 0; i < 100; i++ { typ = PtrTo(typ) } for i = 0; i < 100; i++ { typ = typ.Elem() } - if typ != TypeOf(i) { - t.Errorf("after 100 PtrTo and Elem, have %s, want %s", typ, TypeOf(i)) + if typ != TypeOf(z) { + t.Errorf("after 100 PtrTo and Elem, have %s, want %s", typ, TypeOf(z)) } } diff --git a/src/reflect/type.go b/src/reflect/type.go index 9d6e7a6846..5d3c5c612a 100644 --- a/src/reflect/type.go +++ b/src/reflect/type.go @@ -1469,6 +1469,7 @@ func (t *rtype) ptrTo() *rtype { pp := *prototype pp.str = resolveReflectName(newName(s, "", "", false)) + pp.ptrToThis = 0 // For the type structures linked into the binary, the // compiler provides a good hash of the string. |