]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/gc: make embedded, unexported fields read-only.
authorChris Manghane <cmang@golang.org>
Thu, 20 Feb 2014 19:32:55 +0000 (11:32 -0800)
committerChris Manghane <cmang@golang.org>
Thu, 20 Feb 2014 19:32:55 +0000 (11:32 -0800)
Fixes #7363.

LGTM=gri
R=gri, rsc, bradfitz
CC=golang-codereviews
https://golang.org/cl/66510044

src/cmd/gc/reflect.c
test/fixedbugs/issue7363.go [new file with mode: 0644]

index f54c4cd39451ee60926ee27efe9a7c761217fb1f..68b21772451c34dfed2b371fd6efd26173de2374 100644 (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);
diff --git a/test/fixedbugs/issue7363.go b/test/fixedbugs/issue7363.go
new file mode 100644 (file)
index 0000000..726396a
--- /dev/null
@@ -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")
+       }
+}