Skip to content

cmd/vet: panic in new parallel subtest check when t.Run has single argument #57908

Closed
@thepudds

Description

@thepudds

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    FrozenDueToAgeNeedsFixThe path to resolution is known, but the work has not been done.

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions