aboutsummaryrefslogtreecommitdiff
path: root/src/encoding/json/encode_test.go
diff options
context:
space:
mode:
authorthoeni <thoeni@gmail.com>2016-12-01 21:57:39 +0000
committerRuss Cox <rsc@golang.org>2017-06-14 19:01:08 +0000
commit296b35382c82081d6c90dcec570e6491a2b2598a (patch)
treea86a782db8baddc86c55f001fb6dcbbc9cbd9ae4 /src/encoding/json/encode_test.go
parente2160cc5713e4954b67ec4eabdb893d2880e10a0 (diff)
downloadgo-296b35382c82081d6c90dcec570e6491a2b2598a.tar.xz
encoding/json: don't marshal unexported embedded fields of non struct type
Marshal must process unexported embedded fields of struct type, looking for exported fields in those structs. However, it must not process unexported embedded fields of non-struct type. For example, consider: type t1 struct { X int } type t2 int type T struct { t1 t2 } When considering T, Marshal must process t1 to find t1.X. Marshal must not process t2, but it was. Fix that. Fixes #18009 Change-Id: I62ba0b65ba30fd927990e101a26405a9998787a3 Reviewed-on: https://go-review.googlesource.com/33773 Run-TryBot: Russ Cox <rsc@golang.org> Reviewed-by: Russ Cox <rsc@golang.org>
Diffstat (limited to 'src/encoding/json/encode_test.go')
-rw-r--r--src/encoding/json/encode_test.go53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/encoding/json/encode_test.go b/src/encoding/json/encode_test.go
index 6d574cfc47..d5f5f0a691 100644
--- a/src/encoding/json/encode_test.go
+++ b/src/encoding/json/encode_test.go
@@ -273,6 +273,59 @@ func TestAnonymousNonstruct(t *testing.T) {
}
}
+type unexportedIntType int
+
+type MyStructWithUnexportedIntType struct {
+ unexportedIntType
+}
+
+func TestAnonymousNonstructWithUnexportedType(t *testing.T) {
+ a := MyStructWithUnexportedIntType{11}
+ const want = `{}`
+
+ b, err := Marshal(a)
+ if err != nil {
+ t.Fatalf("Marshal: %v", err)
+ }
+ if got := string(b); got != want {
+ t.Errorf("got %q, want %q", got, want)
+ }
+}
+
+type MyStructContainingUnexportedStruct struct {
+ unexportedStructType1
+ unexportedIntType
+}
+
+type unexportedStructType1 struct {
+ ExportedIntType1
+ unexportedIntType
+ unexportedStructType2
+}
+
+type unexportedStructType2 struct {
+ ExportedIntType2
+ unexportedIntType
+}
+
+type ExportedIntType1 int
+type ExportedIntType2 int
+
+func TestUnexportedAnonymousStructWithExportedType(t *testing.T) {
+ s2 := unexportedStructType2{3, 4}
+ s1 := unexportedStructType1{1, 2, s2}
+ a := MyStructContainingUnexportedStruct{s1, 6}
+ const want = `{"ExportedIntType1":1,"ExportedIntType2":3}`
+
+ b, err := Marshal(a)
+ if err != nil {
+ t.Fatalf("Marshal: %v", err)
+ }
+ if got := string(b); got != want {
+ t.Errorf("got %q, want %q", got, want)
+ }
+}
+
type BugA struct {
S string
}