diff options
author | Russ Cox <rsc@golang.org> | 2015-07-15 00:01:54 -0400 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2015-07-15 05:36:27 +0000 |
commit | 7feb424928605b51979e0bda3bbad139fcf2bb51 (patch) | |
tree | 2503840688720988e43ebd0668971bb6639725b2 | |
parent | bed6326a3c04811f394490b537c07c863b3df6de (diff) | |
download | go-7feb424928605b51979e0bda3bbad139fcf2bb51.tar.gz go-7feb424928605b51979e0bda3bbad139fcf2bb51.zip |
cmd/compile: fix PtrTo(t) for unnamed t with embedded fields
Fixes #8427.
Change-Id: I826a3bc4519845ad30d6dbaf058fe7ed7bee8db0
Reviewed-on: https://go-review.googlesource.com/12233
Reviewed-by: Ian Lance Taylor <iant@golang.org>
-rw-r--r-- | src/cmd/compile/internal/gc/reflect.go | 7 | ||||
-rw-r--r-- | src/reflect/all_test.go | 13 |
2 files changed, 17 insertions, 3 deletions
diff --git a/src/cmd/compile/internal/gc/reflect.go b/src/cmd/compile/internal/gc/reflect.go index 08343e88ee..fcb9b17eee 100644 --- a/src/cmd/compile/internal/gc/reflect.go +++ b/src/cmd/compile/internal/gc/reflect.go @@ -760,10 +760,11 @@ func dcommontype(s *Sym, ot int, t *Type) int { } var sptr *Sym - if t.Sym != nil && !Isptr[t.Etype] { - sptr = dtypesym(Ptrto(t)) + tptr := Ptrto(t) + if !Isptr[t.Etype] && (t.Sym != nil || methods(tptr) != nil) { + sptr = dtypesym(tptr) } else { - sptr = weaktypesym(Ptrto(t)) + sptr = weaktypesym(tptr) } // All (non-reflect-allocated) Types share the same zero object. diff --git a/src/reflect/all_test.go b/src/reflect/all_test.go index 3c6fc9a1a8..ee06b4c9f7 100644 --- a/src/reflect/all_test.go +++ b/src/reflect/all_test.go @@ -4721,3 +4721,16 @@ func TestTypeOfTypeOf(t *testing.T) { check("PtrTo", PtrTo(TypeOf(T{}))) check("SliceOf", SliceOf(TypeOf(T{}))) } + +type XM struct{} + +func (*XM) String() string { return "" } + +func TestPtrToMethods(t *testing.T) { + var y struct{ XM } + yp := New(TypeOf(y)).Interface() + _, ok := yp.(fmt.Stringer) + if !ok { + t.Fatal("does not implement Stringer, but should") + } +} |