diff options
Diffstat (limited to 'src/encoding/xml')
| -rw-r--r-- | src/encoding/xml/marshal_test.go | 17 | ||||
| -rw-r--r-- | src/encoding/xml/read.go | 5 |
2 files changed, 17 insertions, 5 deletions
diff --git a/src/encoding/xml/marshal_test.go b/src/encoding/xml/marshal_test.go index fe8b16fe43..c0c6a0cd9f 100644 --- a/src/encoding/xml/marshal_test.go +++ b/src/encoding/xml/marshal_test.go @@ -317,6 +317,10 @@ func (m *MyMarshalerAttrTest) MarshalXMLAttr(name Name) (Attr, error) { return Attr{name, "hello world"}, nil } +func (m *MyMarshalerAttrTest) UnmarshalXMLAttr(attr Attr) error { + return nil +} + type MarshalerStruct struct { Foo MyMarshalerAttrTest `xml:",attr"` } @@ -1732,7 +1736,7 @@ func TestDecodeEncode(t *testing.T) { in.WriteString(`<?xml version="1.0" encoding="UTF-8"?> <?Target Instruction?> <root> -</root> +</root> `) dec := NewDecoder(&in) enc := NewEncoder(&out) @@ -1823,3 +1827,14 @@ func TestSimpleUseOfEncodeToken(t *testing.T) { t.Errorf("enc.EncodeToken: expected %q; got %q", want, buf.String()) } } + +// Issue 16158. Decoder.unmarshalAttr ignores the return value of copyValue. +func TestIssue16158(t *testing.T) { + const data = `<foo b="HELLOWORLD"></foo>` + err := Unmarshal([]byte(data), &struct { + B byte `xml:"b,attr,omitempty"` + }{}) + if err == nil { + t.Errorf("Unmarshal: expected error, got nil") + } +} diff --git a/src/encoding/xml/read.go b/src/encoding/xml/read.go index 937432e3a7..53c15a2840 100644 --- a/src/encoding/xml/read.go +++ b/src/encoding/xml/read.go @@ -232,7 +232,6 @@ func (p *Decoder) unmarshalAttr(val reflect.Value, attr Attr) error { } val = val.Elem() } - if val.CanInterface() && val.Type().Implements(unmarshalerAttrType) { // This is an unmarshaler with a non-pointer receiver, // so it's likely to be incorrect, but we do what we're told. @@ -257,9 +256,7 @@ func (p *Decoder) unmarshalAttr(val reflect.Value, attr Attr) error { return pv.Interface().(encoding.TextUnmarshaler).UnmarshalText([]byte(attr.Value)) } } - - copyValue(val, []byte(attr.Value)) - return nil + return copyValue(val, []byte(attr.Value)) } var ( |
