Closed
Description
What version of Go are you using (go version
)?
$ go version go version devel go1.20-9088c69 Tue Jan 17 18:21:06 2023 +0000 linux/amd64
Does this issue reproduce with the latest release?
Yes, tip. Not in Go 1.19 given the parallel subtest check is new in Go 1.20.
What operating system and processor architecture are you using (go env
)?
go env
Output
$ go env
What did you do?
Ran many public modules through vet as part of testing #57173 and the related https://go.dev/cl/455195.
What did you see?
The new Go 1.20 parallel subtest check in the loopclosure pass can panic in the rare case of t.Run with a single argument, such as this simplified example:
fn := func() (string, func(t *testing.T)) { return "", nil }
t.Run(fn())
A real-world example:
I saw this in a public module, then backed up to observe that this particular panic is in the 1.20 release candidate / tip.
git clone https://github.com/go-spatial/geom
cd geom/planar
go vet .
Error:
# github.com/go-spatial/geom/planar
panic: runtime error: index out of range [1] with length 1
Stack:
goroutine 54 [running]: [64/269]
cmd/vendor/golang.org/x/tools/go/analysis/passes/loopclosure.parallelSubtest(0xc0001dd810, 0xc0001e3840)
/home/thepudds1460/sdk/gotip/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/loopclosure/loopclo
sure.go:306 +0x55b
cmd/vendor/golang.org/x/tools/go/analysis/passes/loopclosure.run.func1({0x767eb0?, 0xc00006df80?})
/home/thepudds1460/sdk/gotip/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/loopclosure/loopclo
sure.go:164 +0x55d
cmd/vendor/golang.org/x/tools/go/ast/inspector.(*Inspector).Preorder(0xc00021a0c0, {0xc00038fcb8?, 0x2?, 0xc0
0004e400?}, 0xc00038fca8)
/home/thepudds1460/sdk/gotip/src/cmd/vendor/golang.org/x/tools/go/ast/inspector/inspector.go:77 +0x8b
cmd/vendor/golang.org/x/tools/go/analysis/passes/loopclosure.run(0xc00069e0f0)
/home/thepudds1460/sdk/gotip/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/loopclosure/loopclo
sure.go:92 +0xa5
cmd/vendor/golang.org/x/tools/go/analysis/unitchecker.run.func5.1()
/home/thepudds1460/sdk/gotip/src/cmd/vendor/golang.org/x/tools/go/analysis/unitchecker/unitchecker.go
:355 +0x904
sync.(*Once).doSlow(0x6b83c0?, 0xc00041b440?)
/home/thepudds1460/sdk/gotip/src/sync/once.go:74 +0xc2
sync.(*Once).Do(...)
/home/thepudds1460/sdk/gotip/src/sync/once.go:65
cmd/vendor/golang.org/x/tools/go/analysis/unitchecker.run.func5(0x8ef7e0)
/home/thepudds1460/sdk/gotip/src/cmd/vendor/golang.org/x/tools/go/analysis/unitchecker/unitchecker.go
:306 +0x1a5
cmd/vendor/golang.org/x/tools/go/analysis/unitchecker.run.func6.1(0x0?)
/home/thepudds1460/sdk/gotip/src/cmd/vendor/golang.org/x/tools/go/analysis/unitchecker/unitchecker.go
:367 +0x29
created by cmd/vendor/golang.org/x/tools/go/analysis/unitchecker.run.func6
/home/thepudds1460/sdk/gotip/src/cmd/vendor/golang.org/x/tools/go/analysis/unitchecker/unitchecker.go
:366 +0x47