diff --git a/doc/go1.15.html b/doc/go1.15.html index bb5628cb19..e2c90f5ad2 100644 --- a/doc/go1.15.html +++ b/doc/go1.15.html @@ -177,6 +177,18 @@ TODO +
reflect
+
+

+ Package reflect now disallows accessing methods of all + non-exported fields, whereas previously it allowed accessing + those of non-exported, embedded fields. Code that relies on the + previous behavior should be updated to instead access the + corresponding promoted method of the enclosing variable. +

+
+
+
runtime

diff --git a/src/reflect/all_test.go b/src/reflect/all_test.go index cb0c8344f3..3129ff8e5d 100644 --- a/src/reflect/all_test.go +++ b/src/reflect/all_test.go @@ -3567,7 +3567,7 @@ func TestCallPanic(t *testing.T) { i := timp(0) v := ValueOf(T{i, i, i, i, T2{i, i}, i, i, T2{i, i}}) - ok(func() { call(v.Field(0).Method(0)) }) // .t0.W + badCall(func() { call(v.Field(0).Method(0)) }) // .t0.W badCall(func() { call(v.Field(0).Elem().Method(0)) }) // .t0.W badCall(func() { call(v.Field(0).Method(1)) }) // .t0.w badMethod(func() { call(v.Field(0).Elem().Method(2)) }) // .t0.w @@ -3588,7 +3588,7 @@ func TestCallPanic(t *testing.T) { ok(func() { call(v.Field(4).Field(0).Method(0)) }) // .NamedT2.T1.Y ok(func() { call(v.Field(4).Field(0).Elem().Method(0)) }) // .NamedT2.T1.W - ok(func() { call(v.Field(4).Field(1).Method(0)) }) // .NamedT2.t0.W + badCall(func() { call(v.Field(4).Field(1).Method(0)) }) // .NamedT2.t0.W badCall(func() { call(v.Field(4).Field(1).Elem().Method(0)) }) // .NamedT2.t0.W badCall(func() { call(v.Field(5).Method(0)) }) // .namedT0.W diff --git a/src/reflect/value.go b/src/reflect/value.go index 57ac65e084..de6f22b5b3 100644 --- a/src/reflect/value.go +++ b/src/reflect/value.go @@ -1315,7 +1315,7 @@ func (v Value) Method(i int) Value { if v.typ.Kind() == Interface && v.IsNil() { panic("reflect: Method on nil interface value") } - fl := v.flag & (flagStickyRO | flagIndir) // Clear flagEmbedRO + fl := v.flag.ro() | (v.flag & flagIndir) fl |= flag(Func) fl |= flag(i)<