From d89fcd9b2cc3783fa6bf0aef4dca3fd3c169c29b Mon Sep 17 00:00:00 2001 From: cce <51567+cce@users.noreply.github.com> Date: Fri, 9 Oct 2026 15:04:01 -0400 Subject: [PATCH 1/2] tests: regenerate anydecl_gen.go after array-decode removal anydecl_gen.go was generated by #39 before #37 landed, so it still contained the struct-from-array decode fallback. --- tests/anydecl_gen.go | 65 ++++++++++++-------------------------------- 1 file changed, 17 insertions(+), 48 deletions(-) diff --git a/tests/anydecl_gen.go b/tests/anydecl_gen.go index 1f79685..948d94c 100644 --- a/tests/anydecl_gen.go +++ b/tests/anydecl_gen.go @@ -66,70 +66,39 @@ func (z *AnyDeclNeighbor) UnmarshalMsgWithState(bts []byte, st msgp.UnmarshalSta var zb0001 int var zb0002 bool zb0001, zb0002, bts, err = msgp.ReadMapHeaderBytes(bts) - if _, ok := err.(msgp.TypeError); ok { - zb0001, zb0002, bts, err = msgp.ReadArrayHeaderBytes(bts) + if err != nil { + err = msgp.WrapError(err) + return + } + if zb0002 { + (*z) = AnyDeclNeighbor{} + } + for zb0001 > 0 { + zb0001-- + field, bts, err = msgp.ReadMapKeyZC(bts) if err != nil { err = msgp.WrapError(err) return } - if zb0001 > 0 { - zb0001-- + switch string(field) { + case "n": (*z).Name, bts, err = msgp.ReadStringBytes(bts) if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Name") + err = msgp.WrapError(err, "Name") return } - } - if zb0001 > 0 { - zb0001-- + case "c": (*z).Count, bts, err = msgp.ReadUint64Bytes(bts) if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Count") + err = msgp.WrapError(err, "Count") return } - } - if zb0001 > 0 { - err = msgp.ErrTooManyArrayFields(zb0001) - if err != nil { - err = msgp.WrapError(err, "struct-from-array") - return - } - } - } else { - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0002 { - (*z) = AnyDeclNeighbor{} - } - for zb0001 > 0 { - zb0001-- - field, bts, err = msgp.ReadMapKeyZC(bts) + default: + err = msgp.ErrNoField(string(field)) if err != nil { err = msgp.WrapError(err) return } - switch string(field) { - case "n": - (*z).Name, bts, err = msgp.ReadStringBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Name") - return - } - case "c": - (*z).Count, bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "Count") - return - } - default: - err = msgp.ErrNoField(string(field)) - if err != nil { - err = msgp.WrapError(err) - return - } - } } } o = bts From 54e8a239430e22080a6fe4f5b36cbd2a3832ed1a Mon Sep 17 00:00:00 2001 From: cce <51567+cce@users.noreply.github.com> Date: Fri, 9 Oct 2026 15:04:09 -0400 Subject: [PATCH 2/2] CI: fail if tests/ generated code is out of date Add a make test-gen target that regenerates tests/ with the msgp built from the tree, and have the Build workflow run it and fail if the working tree is dirty afterwards. --- .github/workflows/build.yml | 9 +++++++++ Makefile | 10 +++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 23489b8..552a325 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -12,3 +12,12 @@ jobs: with: go-version-file: go.mod - run: make test + - name: Check tests/ generated code is up to date + run: | + make test-gen + if [ -n "$(git status --porcelain)" ]; then + echo "::error::Generated code is out of date; run 'make test-gen' and commit the result." + git status --porcelain + git diff + exit 1 + fi diff --git a/Makefile b/Makefile index f601ee0..51c6ea6 100644 --- a/Makefile +++ b/Makefile @@ -11,7 +11,7 @@ SHELL := /bin/bash BIN = $(GOBIN)/msgp -.PHONY: clean wipe install get-deps bench all +.PHONY: clean wipe install get-deps bench all test-gen $(BIN): */*.go @go install ./... @@ -25,6 +25,14 @@ test: all go test -covermode=atomic -coverprofile=cover.out ./... cd tests && go test ./... +# Regenerate tests/*_gen*.go with the msgp built from this tree, rather than +# whatever msgp happens to be on PATH. CI runs this and fails on any diff. +test-gen: + @bindir=$$(mktemp -d) && \ + go build -o "$$bindir/msgp" . && \ + (cd tests && PATH="$$bindir:$$PATH" go generate ./...); \ + status=$$?; rm -rf "$$bindir"; exit $$status + bench: all go test -bench ./...