From: Michael Hudson-Doyle Date: Fri, 10 Feb 2017 00:08:13 +0000 (+1300) Subject: [release-branch.go1.8] reflect: clear ptrToThis in Ptr when allocating result on... X-Git-Tag: go1.8~6 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=7cec9a583d81a3b518795cc2a49cd6296e45c69b;p=gostls13.git [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 TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor Reviewed-by: Russ Cox Reviewed-on: https://go-review.googlesource.com/36718 Run-TryBot: Russ Cox Reviewed-by: Brad Fitzpatrick --- 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.