]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.11] encoding/json: recover saved error context when unmarshalling
authorIan Davis <nospam@iandavis.com>
Mon, 3 Sep 2018 10:20:23 +0000 (11:20 +0100)
committerBrad Fitzpatrick <bradfitz@golang.org>
Thu, 3 Jan 2019 17:55:04 +0000 (17:55 +0000)
Fixes #29364

Change-Id: I270c56fd0d5ae8787a1293029aff3072f4f52f33
Reviewed-on: https://go-review.googlesource.com/132955
Reviewed-by: Daniel Martí <mvdan@mvdan.cc>
Run-TryBot: Daniel Martí <mvdan@mvdan.cc>
TryBot-Result: Gobot Gobot <gobot@golang.org>
(cherry picked from commit 22afb3571c4bb6268664ecc5da4416ec58d3e060)
Reviewed-on: https://go-review.googlesource.com/c/155377
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>

src/encoding/json/decode.go
src/encoding/json/decode_test.go

index 7d235087e60f4bb998e4c5e862f27990f1b59034..a563252ce7cca0b8bba283e2492f20fe8a63d173 100644 (file)
@@ -179,7 +179,7 @@ func (d *decodeState) unmarshal(v interface{}) error {
        // test must be applied at the top level of the value.
        err := d.value(rv)
        if err != nil {
-               return err
+               return d.addErrorContext(err)
        }
        return d.savedError
 }
index 5746ddf9861e7e1f672ad92a5b6479331b868aa9..547f718cb164e96eb804bede5096adbada782810 100644 (file)
@@ -41,6 +41,16 @@ type VOuter struct {
        V V
 }
 
+type W struct {
+       S SS
+}
+
+type SS string
+
+func (*SS) UnmarshalJSON(data []byte) error {
+       return &UnmarshalTypeError{Value: "number", Type: reflect.TypeOf(SS(""))}
+}
+
 // ifaceNumAsFloat64/ifaceNumAsNumber are used to test unmarshaling with and
 // without UseNumber
 var ifaceNumAsFloat64 = map[string]interface{}{
@@ -408,6 +418,7 @@ var unmarshalTests = []unmarshalTest{
        {in: `{"X": 23}`, ptr: new(T), out: T{}, err: &UnmarshalTypeError{"number", reflect.TypeOf(""), 8, "T", "X"}}, {in: `{"x": 1}`, ptr: new(tx), out: tx{}},
        {in: `{"x": 1}`, ptr: new(tx), out: tx{}},
        {in: `{"x": 1}`, ptr: new(tx), err: fmt.Errorf("json: unknown field \"x\""), disallowUnknownFields: true},
+       {in: `{"S": 23}`, ptr: new(W), out: W{}, err: &UnmarshalTypeError{"number", reflect.TypeOf(SS("")), 0, "W", "S"}},
        {in: `{"F1":1,"F2":2,"F3":3}`, ptr: new(V), out: V{F1: float64(1), F2: int32(2), F3: Number("3")}},
        {in: `{"F1":1,"F2":2,"F3":3}`, ptr: new(V), out: V{F1: Number("1"), F2: int32(2), F3: Number("3")}, useNumber: true},
        {in: `{"k1":1,"k2":"s","k3":[1,2.0,3e-3],"k4":{"kk1":"s","kk2":2}}`, ptr: new(interface{}), out: ifaceNumAsFloat64},