--- /dev/null
+package pkg
+
+import (
+ "encoding/json"
+ "encoding/xml"
+)
+
+type T1 struct{}
+type T2 struct{ x int }
+type T3 struct{ X int }
+type T4 struct{ T3 }
+type t5 struct{ X int }
+type T6 struct{ t5 }
+type T7 struct{ x int }
+
+func (T7) MarshalJSON() ([]byte, error) { return nil, nil }
+func (*T7) UnmarshalJSON([]byte) error { return nil }
+
+type T8 struct{ x int }
+
+func (T8) MarshalXML() ([]byte, error) { return nil, nil }
+func (*T8) UnmarshalXML(*xml.Decoder, *xml.StartElement) error { return nil }
+
+type T9 struct{}
+
+func (T9) MarshalText() ([]byte, error) { return nil, nil }
+func (*T9) UnmarshalText([]byte) error { return nil }
+
+type T10 struct{}
+type T11 struct{ T10 }
+type T12 struct{ T7 }
+type t13 struct{}
+
+func (t13) MarshalJSON() ([]byte, error) { return nil, nil }
+
+type T14 struct{ t13 }
+type T15 struct{ *t13 }
+type T16 struct{ *T3 }
+type T17 struct{ *T17 }
+type T18 struct {
+ T17
+ Actual int
+}
+
+func fn() {
+ // don't flag structs with no fields
+ json.Marshal(T1{})
+ // no exported fields
+ json.Marshal(T2{}) // want `struct doesn't have any exported fields, nor custom marshaling`
+ // pointer vs non-pointer makes no difference
+ json.Marshal(&T2{}) // want `struct doesn't have any exported fields, nor custom marshaling`
+ // exported field
+ json.Marshal(T3{})
+ // exported field, pointer makes no difference
+ json.Marshal(&T3{})
+ // embeds struct with exported fields
+ json.Marshal(T4{})
+ // exported field
+ json.Marshal(t5{})
+ // embeds unexported type, but said type does have exported fields
+ json.Marshal(T6{})
+ // MarshalJSON
+ json.Marshal(T7{})
+ // MarshalXML does not apply to JSON
+ json.Marshal(T8{}) // want `struct doesn't have any exported fields, nor custom marshaling`
+ // MarshalText
+ json.Marshal(T9{})
+ // embeds exported struct, but it has no fields
+ json.Marshal(T11{}) // want `struct doesn't have any exported fields, nor custom marshaling`
+ // embeds type with MarshalJSON
+ json.Marshal(T12{})
+ // embeds type with MarshalJSON and type isn't exported
+ json.Marshal(T14{})
+ // embedded pointer with MarshalJSON
+ json.Marshal(T15{})
+ // embedded pointer to struct with exported fields
+ json.Marshal(T16{})
+ // don't recurse forever on recursive data structure
+ json.Marshal(T17{}) // want `struct doesn't have any exported fields, nor custom marshaling`
+ json.Marshal(T18{})
+
+ // MarshalJSON does not apply to JSON
+ xml.Marshal(T7{}) // want `struct doesn't have any exported fields, nor custom marshaling`
+ // MarshalXML
+ xml.Marshal(T8{})
+
+ var t2 T2
+ var t3 T3
+ var t7 T7
+ var t8 T8
+ var t9 T9
+ // check that all other variations of methods also work
+ json.Unmarshal(nil, &t2) // want `struct doesn't have any exported fields, nor custom marshaling`
+ json.Unmarshal(nil, &t3)
+ json.Unmarshal(nil, &t9)
+ xml.Unmarshal(nil, &t2) // want `struct doesn't have any exported fields, nor custom marshaling`
+ xml.Unmarshal(nil, &t3)
+ xml.Unmarshal(nil, &t9)
+ (*json.Decoder)(nil).Decode(&t2) // want `struct doesn't have any exported fields, nor custom marshaling`
+ (*json.Decoder)(nil).Decode(&t3)
+ (*json.Decoder)(nil).Decode(&t9)
+ (*json.Encoder)(nil).Encode(t2) // want `struct doesn't have any exported fields, nor custom marshaling`
+ (*json.Encoder)(nil).Encode(t3)
+ (*json.Encoder)(nil).Encode(t9)
+ (*xml.Decoder)(nil).Decode(&t2) // want `struct doesn't have any exported fields, nor custom marshaling`
+ (*xml.Decoder)(nil).Decode(&t3)
+ (*xml.Decoder)(nil).Decode(&t9)
+ (*xml.Encoder)(nil).Encode(t2) // want `struct doesn't have any exported fields, nor custom marshaling`
+ (*xml.Encoder)(nil).Encode(t3)
+ (*xml.Encoder)(nil).Encode(t9)
+
+ (*json.Decoder)(nil).Decode(&t7)
+ (*json.Decoder)(nil).Decode(&t8) // want `struct doesn't have any exported fields, nor custom marshaling`
+ (*json.Encoder)(nil).Encode(t7)
+ (*json.Encoder)(nil).Encode(t8) // want `struct doesn't have any exported fields, nor custom marshaling`
+ (*xml.Decoder)(nil).Decode(&t7) // want `struct doesn't have any exported fields, nor custom marshaling`
+ (*xml.Decoder)(nil).Decode(&t8)
+ (*xml.Encoder)(nil).Encode(t7) // want `struct doesn't have any exported fields, nor custom marshaling`
+ (*xml.Encoder)(nil).Encode(t8)
+
+}
+
+var _, _ = json.Marshal(T9{})