1
0
mirror of https://github.com/golang/go synced 2024-11-23 05:50:05 -07:00

cmd/gc: make embedded, unexported fields read-only.

Fixes #7363.

LGTM=gri
R=gri, rsc, bradfitz
CC=golang-codereviews
https://golang.org/cl/66510044
This commit is contained in:
Chris Manghane 2014-02-20 11:32:55 -08:00
parent 15ec569ba9
commit a8a7f18aea
2 changed files with 28 additions and 1 deletions

View File

@ -1127,7 +1127,8 @@ ok:
ot = dgopkgpath(s, ot, t1->sym->pkg);
} else {
ot = dgostringptr(s, ot, nil);
if(t1->type->sym != S && t1->type->sym->pkg == builtinpkg)
if(t1->type->sym != S &&
(t1->type->sym->pkg == builtinpkg || !exportname(t1->type->sym->name)))
ot = dgopkgpath(s, ot, localpkg);
else
ot = dgostringptr(s, ot, nil);

View File

@ -0,0 +1,26 @@
// run
// Copyright 2014 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// issue 7363: CanSet must return false for unexported embedded struct fields.
package main
import "reflect"
type a struct {
}
type B struct {
a
}
func main() {
b := &B{}
v := reflect.ValueOf(b).Elem().Field(0)
if v.CanSet() {
panic("B.a is an unexported embedded struct field")
}
}