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:

https://github.com/go-spatial/geom/blob/3cd2f5a9a082dd4f827c9f9b69ba5d736d2dcb12/planar/planar_test.go#L118

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

Comment From: thepudds

I sent https://go.dev/cl/462282, which attempts to fix this.

Comment From: gopherbot

Change https://go.dev/cl/462282 mentions this issue: go/analysis/passes/loopclosure: avoid panic in new parallel subtest check when t.Run has single argument

Comment From: gopherbot

Change https://go.dev/cl/462596 mentions this issue: go/analysis/passes/loopclosure: avoid panic in new parallel subtest check when t.Run has single argument

Comment From: ianlancetaylor

@gopherbot Please open backport to 1.20.

Seems like this affects the 1.20 release.

Comment From: gopherbot

Backport issue(s) opened: #57911 (for 1.20).

Remember to create the cherry-pick CL(s) as soon as the patch is submitted to master, according to https://go.dev/wiki/MinorReleases.