maxbrunsfeld / counterfeiter

A tool for generating self-contained, type-safe test doubles in go
MIT License
931 stars 90 forks source link

go generate broken with go 1.22 #286

Closed philborlin closed 2 months ago

philborlin commented 2 months ago

I picked up a project that I haven't worked on in awhile and ran go generate and got a panic. Here are the relevant files:

tools.go

//go:build tools

package tools

import (
    _ "github.com/maxbrunsfeld/counterfeiter/v6" // counterfeiter
)

cluster.go

package cluster

//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -generate

//counterfeiter:generate . Cluster
type Cluster interface {
    Propose(p []byte) error
}

When I use go 1.20 generate works correctly:

$ /opt/homebrew/opt/go@1.20/bin/go generate ./...
Writing `FakeCluster` to `clusterfakes/fake_cluster.go`... Done

When I use go 1.21 generate works correctly:

$ /opt/homebrew/opt/go@1.21/bin/go generate ./...
Writing `FakeCluster` to `clusterfakes/fake_cluster.go`... Done

When I use go 1.22 generate panics:

$ go version
go version go1.22.3 darwin/arm64
$ go generate ./...
Writing `FakeCluster` to `clusterfakes/fake_cluster.go`... panic: runtime error: invalid memory address or nil pointer dereference [recovered]
        panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x2 addr=0x0 pc=0x1030ee2a4]

goroutine 148 [running]:
go/types.(*Checker).handleBailout(0x140002d0600, 0x140002dfc38)
        /opt/homebrew/Cellar/go/1.22.3/libexec/src/go/types/check.go:367 +0x9c
panic({0x10325e460?, 0x1034b1b10?})
        /opt/homebrew/Cellar/go/1.22.3/libexec/src/runtime/panic.go:770 +0x124
go/types.(*StdSizes).Sizeof(0x0, {0x1032af008, 0x1034b5480})
        /opt/homebrew/Cellar/go/1.22.3/libexec/src/go/types/sizes.go:228 +0x314
go/types.(*Config).sizeof(...)
        /opt/homebrew/Cellar/go/1.22.3/libexec/src/go/types/sizes.go:333
go/types.representableConst.func1({0x1032af008?, 0x1034b5480?})
        /opt/homebrew/Cellar/go/1.22.3/libexec/src/go/types/const.go:76 +0x9c
go/types.representableConst({0x1032b0ef8, 0x1034a91a0}, 0x140002d0600, 0x1034b5480, 0x0)
        /opt/homebrew/Cellar/go/1.22.3/libexec/src/go/types/const.go:92 +0x138
go/types.(*Checker).arrayLength(0x140002d0600, {0x1032b0810, 0x140002af6c0?})
        /opt/homebrew/Cellar/go/1.22.3/libexec/src/go/types/typexpr.go:510 +0x238
go/types.(*Checker).typInternal(0x140002d0600, {0x1032b0090, 0x140002aaed0}, 0x0)
        /opt/homebrew/Cellar/go/1.22.3/libexec/src/go/types/typexpr.go:299 +0x3bc
go/types.(*Checker).definedType(0x140002d0600, {0x1032b0090, 0x140002aaed0}, 0x140002df1f8?)
        /opt/homebrew/Cellar/go/1.22.3/libexec/src/go/types/typexpr.go:180 +0x2c
go/types.(*Checker).varType(0x140002d0600, {0x1032b0090, 0x140002aaed0})
        /opt/homebrew/Cellar/go/1.22.3/libexec/src/go/types/typexpr.go:145 +0x2c
go/types.(*Checker).structType(0x140002d0600, 0x140002ab230, 0x140002ab230?)
        /opt/homebrew/Cellar/go/1.22.3/libexec/src/go/types/struct.go:113 +0x128
go/types.(*Checker).typInternal(0x140002d0600, {0x1032b00c0, 0x1400028d5c0}, 0x140002fa910)
        /opt/homebrew/Cellar/go/1.22.3/libexec/src/go/types/typexpr.go:316 +0xed0
go/types.(*Checker).definedType(0x140002d0600, {0x1032b00c0, 0x1400028d5c0}, 0x102ecae24?)
        /opt/homebrew/Cellar/go/1.22.3/libexec/src/go/types/typexpr.go:180 +0x2c
go/types.(*Checker).typeDecl(0x140002d0600, 0x140002fa910, 0x140002c96c0, 0x0)
        /opt/homebrew/Cellar/go/1.22.3/libexec/src/go/types/decl.go:615 +0x39c
go/types.(*Checker).objDecl(0x140002d0600, {0x1032b4018, 0x140002fa910}, 0x0)
        /opt/homebrew/Cellar/go/1.22.3/libexec/src/go/types/decl.go:197 +0x880
go/types.(*Checker).packageObjects(0x140002d0600)
        /opt/homebrew/Cellar/go/1.22.3/libexec/src/go/types/resolver.go:681 +0x3c0
go/types.(*Checker).checkFiles(0x140002d0600, {0x140002ba380, 0x1, 0x1})
        /opt/homebrew/Cellar/go/1.22.3/libexec/src/go/types/check.go:408 +0x164
go/types.(*Checker).Files(...)
        /opt/homebrew/Cellar/go/1.22.3/libexec/src/go/types/check.go:372
golang.org/x/tools/go/packages.(*loader).loadPackage(0x140001a61c0, 0x14000431cc0)
        /Users/phil/go/pkg/mod/golang.org/x/tools@v0.1.12/go/packages/packages.go:1001 +0x624
golang.org/x/tools/go/packages.(*loader).loadRecursive.func1()
        /Users/phil/go/pkg/mod/golang.org/x/tools@v0.1.12/go/packages/packages.go:838 +0x178
sync.(*Once).doSlow(0x0?, 0x0?)
        /opt/homebrew/Cellar/go/1.22.3/libexec/src/sync/once.go:74 +0x100
sync.(*Once).Do(...)
        /opt/homebrew/Cellar/go/1.22.3/libexec/src/sync/once.go:65
golang.org/x/tools/go/packages.(*loader).loadRecursive(0x0?, 0x0?)
        /Users/phil/go/pkg/mod/golang.org/x/tools@v0.1.12/go/packages/packages.go:826 +0x50
golang.org/x/tools/go/packages.(*loader).loadRecursive.func1.1(0x0?)
        /Users/phil/go/pkg/mod/golang.org/x/tools@v0.1.12/go/packages/packages.go:833 +0x30
created by golang.org/x/tools/go/packages.(*loader).loadRecursive.func1 in goroutine 125
        /Users/phil/go/pkg/mod/golang.org/x/tools@v0.1.12/go/packages/packages.go:832 +0x84
exit status 2
cluster.go:3: running "go": exit status 1
joefitzgerald commented 2 months ago

Please update the version of counterfeiter. You are likely using an old version. Check your go.mod and run go get -u github.com/maxbrunsfeld/counterfeiter/v6to update the version.

philborlin commented 2 months ago

That worked! Sorry that seems pretty obvious in hindsight.

joefitzgerald commented 2 months ago

No problem, I'm glad you got it sorted out!