aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2015-07-15 00:01:54 -0400
committerRuss Cox <rsc@golang.org>2015-07-15 05:36:27 +0000
commit7feb424928605b51979e0bda3bbad139fcf2bb51 (patch)
tree2503840688720988e43ebd0668971bb6639725b2
parentbed6326a3c04811f394490b537c07c863b3df6de (diff)
downloadgo-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.go7
-rw-r--r--src/reflect/all_test.go13
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")
+ }
+}