]> Cypherpunks repositories - gostls13.git/commitdiff
reflect: clear ptrToThis in Ptr when allocating result on heap
authorMichael Hudson-Doyle <michael.hudson@canonical.com>
Fri, 10 Feb 2017 00:08:13 +0000 (13:08 +1300)
committerRuss Cox <rsc@golang.org>
Fri, 10 Feb 2017 17:22:07 +0000 (17:22 +0000)
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>
src/reflect/all_test.go
src/reflect/type.go

index 0be306dc5418e52ff65c57d8fbf072a43210654d..0b81c28a22afaebceaf2c42cf0909541665aac50 100644 (file)
@@ -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))
        }
 }
 
@@ -6053,7 +6060,6 @@ func TestUnaddressableField(t *testing.T) {
        })
 }
 
-
 type Tint int
 
 type Tint2 = Tint
@@ -6086,4 +6092,3 @@ func TestAliasNames(t *testing.T) {
                t.Errorf("Talias2 print:\nhave: %s\nwant: %s", out, want)
        }
 }
-
index fbfda3a363d574555391bf955c855015ab891814..40859093be652672c5eb6bb1be5b15d3709f7375 100644 (file)
@@ -1463,6 +1463,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.