Commit 8d0c1054 authored by David Crawshaw's avatar David Crawshaw Committed by Russ Cox

reflect: unexported fields are tied to a package

An unexported field of a struct is not visible outside of the package
that defines it, so the package path is implicitly part of the
definition of any struct with an unexported field.

Change-Id: I17c6aac822bd0c24188ab8ba1cc406d6b5d82771
Reviewed-on: https://go-review.googlesource.com/32820
Run-TryBot: David Crawshaw <crawshaw@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarIan Lance Taylor <iant@golang.org>
parent 9e2c3f4c
......@@ -5913,3 +5913,15 @@ func TestSwapper(t *testing.T) {
}
}
}
func TestInaccessibleField(t *testing.T) {
var b Buffer
var localBuffer struct {
buf []byte
}
lv := ValueOf(&localBuffer).Elem()
rv := ValueOf(b)
shouldPanic(func() {
lv.Set(rv)
})
}
......@@ -113,3 +113,7 @@ func IsExported(t Type) bool {
func ResolveReflectName(s string) {
resolveReflectName(newName(s, "", "", false))
}
type Buffer struct {
buf []byte
}
......@@ -1680,6 +1680,7 @@ func haveIdenticalUnderlyingType(T, V *rtype, cmpTags bool) bool {
if len(t.fields) != len(v.fields) {
return false
}
allExported := true
for i := range t.fields {
tf := &t.fields[i]
vf := &v.fields[i]
......@@ -1695,6 +1696,15 @@ func haveIdenticalUnderlyingType(T, V *rtype, cmpTags bool) bool {
if tf.offset != vf.offset {
return false
}
allExported = allExported && tf.name.isExported()
}
if !allExported && t.pkgPath.name() != v.pkgPath.name() {
// An unexported field of a struct is not
// visible outside of the package that defines
// it, so the package path is implicitly part
// of the definition of any struct with an
// unexported field.
return false
}
return true
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment