diff --git a/encode_test.go b/encode_test.go index e71a9992..8d48b17c 100644 --- a/encode_test.go +++ b/encode_test.go @@ -2729,3 +2729,70 @@ func TestIssue459(t *testing.T) { assertErr(t, err) assertEq(t, "unexpected result", "{}", string(b)) } + +func TestIssue576(t *testing.T) { + type ErrOmit struct { + Error string `json:"error,omitempty"` + } + type MyResult struct { + ErrOmit + Data string `json:"data"` + } + type Result struct { + MyResult + } + + b, err := json.Marshal(Result{}) + assertErr(t, err) + assertEq(t, "unexpected result", `{"data":""}`, string(b)) + + b, err = json.Marshal(Result{MyResult{Data: "hi"}}) + assertErr(t, err) + assertEq(t, "unexpected result", `{"data":"hi"}`, string(b)) + + b, err = json.Marshal(Result{MyResult{ErrOmit{Error: "boom"}, "hi"}}) + assertErr(t, err) + assertEq(t, "unexpected result", `{"error":"boom","data":"hi"}`, string(b)) +} + +func TestIssue581(t *testing.T) { + type Reason struct { + Code string `json:"reasonCode,omitempty"` + } + type Cov struct { + Type string `json:"type"` + } + type Inner struct { + Cov + R *Reason `json:"reason,omitempty"` + } + type Outer struct { + Inner + } + + b, err := json.Marshal(Outer{}) + assertErr(t, err) + assertEq(t, "unexpected result", `{"type":""}`, string(b)) + + b, err = json.Marshal(Outer{Inner{R: &Reason{Code: "x"}}}) + assertErr(t, err) + assertEq(t, "unexpected result", `{"type":"","reason":{"reasonCode":"x"}}`, string(b)) +} + +func TestIssue554(t *testing.T) { + type Son struct { + B string `json:"b"` + C string `json:"c"` + } + type Father struct { + Son + A []string `json:"a,omitempty"` + } + type Grandpa struct { + Father + } + + b, err := json.Marshal(&Grandpa{}) + assertErr(t, err) + assertEq(t, "unexpected result", `{"b":"","c":""}`, string(b)) +} diff --git a/internal/encoder/code.go b/internal/encoder/code.go index fec45a4b..119ffdad 100644 --- a/internal/encoder/code.go +++ b/internal/encoder/code.go @@ -515,7 +515,7 @@ func (c *StructCode) ToAnonymousOpcode(ctx *compileContext) Opcodes { firstField.End = lastField } } - prevField = firstField + prevField = c.lastFieldCode(field, firstField) codes = codes.Add(fieldCodes...) } ctx.structTypeToCodes[uintptr(unsafe.Pointer(c.typ))] = codes