go: go/types, types2: panic: infinite recursion in unification with go1.21.0

gopls version

golang.org/x/tools/gopls v0.13.1
    golang.org/x/tools/gopls@v0.13.1 h1:Q0cfPbEG1WVfgxcRZ9uKTA6/ckIRNXx6Ym7KgT/VFE4=

go env

GO111MODULE=''
GOARCH='arm64'
GOBIN=''
GOCACHE='/Users/lavch/Library/Caches/go-build'
GOENV='/Users/lavch/Library/Application Support/go/env'
GOEXE=''
GOEXPERIMENT=''
GOFLAGS=''
GOHOSTARCH='arm64'
GOHOSTOS='darwin'
GOINSECURE=''
GOMODCACHE='/Users/lavch/go/pkg/mod'
GOOS='darwin'
GOPATH='/Users/lavch/go'
GOROOT='/usr/local/go'
GOSUMDB='sum.golang.google.cn'
GOTMPDIR=''
GOTOOLCHAIN='auto'
GOTOOLDIR='/usr/local/go/pkg/tool/darwin_arm64'
GOVCS=''
GOVERSION='go1.21.0'
GCCGO='gccgo'
AR='ar'
CC='clang'
CXX='clang++'
CGO_ENABLED='0'
GOMOD='/Users/lavch/repo/work/orm/base/go.mod'
GOWORK=''
CGO_CFLAGS='-O2 -g'
CGO_CPPFLAGS=''
CGO_CXXFLAGS='-O2 -g'
CGO_FFLAGS='-O2 -g'
CGO_LDFLAGS='-O2 -g'
PKG_CONFIG='pkg-config'
GOGCCFLAGS='-fPIC -arch arm64 -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -ffile-prefix-map=/var/folders/6d/3ws4l1qx5jn9crwf_j_1x2hw0000gp/T/go-build531596626=/tmp/go-build -gno-record-gcc-switches -fno-common'

What did you do?

Updagrade go version to 1.21.0,and upgrade gopls to v0.13.1

What did you expect to see?

gopls function normally

What did you see instead?

gopls panic

Editor and settings

VSCode

"gopls": {
        // "build.expandWorkspaceToModule": true,
        // "build.experimentalWorkspaceModule": true,
        "ui.semanticTokens": true
}

Logs

[Info  - 11:00:24] 
true
[Info  - 11:00:24] 2023/08/09 11:00:24 go info for /Users/lavch/repo/work/orm/base
(go dir /Users/lavch/repo/work/orm/base)
(go version go version go1.21.0 darwin/arm64)
(valid build configuration = true)
(build flags: [])
(selected go env: [GO111MODULE=, GOCACHE=/Users/lavch/Library/Caches/go-build, GOFLAGS=, GOMODCACHE=/Users/lavch/go/pkg/mod, GOPATH=/Users/lavch/go, GOPRIVATE=*.everphoto.cn,git.smartisan.com, GOROOT=/usr/local/go, GOWORK=])


[Info  - 11:00:25] 2023/08/09 11:00:25 go/packages.Load #1
	snapshot=0
	directory=file:///Users/lavch/repo/work/orm/base
	query=[/Users/lavch/repo/work/orm/base/... builtin]
	packages=216

[Info  - 11:00:25] 2023/08/09 11:00:25 go/packages.Load #1: updating metadata for 2307 packages

panic: unification reached recursion depth limit
	panic: unification reached recursion depth limit
	panic: unification reached recursion depth limit [recovered]
	panic: unification reached recursion depth limit

goroutine 19762 [running]:
go/types.(*Checker).handleBailout(0x14074a750e0, 0x1407ed3f568)
	/usr/local/go/src/go/types/check.go:336 +0x9c
panic({0x102e97de0?, 0x102ff3cb0?})
	/usr/local/go/src/runtime/panic.go:914 +0x218
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff85c8, 0x1407e89fe40}, {0x102ff85c8, 0x1407e89e800}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:311 +0x1770
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff8550, 0x140781bd500}, {0x102ff8550, 0x140781bd3b0}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:510 +0x1724
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff8a50, 0x1407e3f3338}, {0x102ff8a50, 0x1407e3f3728}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:615 +0x1338
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff85c8, 0x1407e89e880}, {0x102ff85c8, 0x1407e89fec0}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:633 +0xb5c
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff8550, 0x140781bd3b0}, {0x102ff8550, 0x140781bd500}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:510 +0x1724
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff8a50, 0x1407e3f3728}, {0x102ff8a50, 0x1407e3f3338}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:615 +0x1338
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff85c8, 0x1407e89fec0}, {0x102ff85c8, 0x1407e89e880}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:633 +0xb5c
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff8550, 0x140781bd500}, {0x102ff8550, 0x140781bd3b0}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:510 +0x1724
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff8a50, 0x1407e3f3338}, {0x102ff8a50, 0x1407e3f3728}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:615 +0x1338
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff85c8, 0x1407e89e880}, {0x102ff85c8, 0x1407e89fec0}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:633 +0xb5c
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff8550, 0x140781bd3b0}, {0x102ff8550, 0x140781bd500}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:510 +0x1724
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff8a50, 0x1407e3f3728}, {0x102ff8a50, 0x1407e3f3338}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:615 +0x1338
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff85c8, 0x1407e89fec0}, {0x102ff85c8, 0x1407e89e880}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:633 +0xb5c
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff8550, 0x140781bd500}, {0x102ff8550, 0x140781bd3b0}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:510 +0x1724
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff8a50, 0x1407e3f3338}, {0x102ff8a50, 0x1407e3f3728}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:615 +0x1338
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff85c8, 0x1407e89e880}, {0x102ff85c8, 0x1407e89fec0}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:633 +0xb5c
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff8550, 0x140781bd3b0}, {0x102ff8550, 0x140781bd500}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:510 +0x1724
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff8a50, 0x1407e3f3728}, {0x102ff8a50, 0x1407e3f3338}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:615 +0x1338
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff85c8, 0x1407e89fec0}, {0x102ff85c8, 0x1407e89e880}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:633 +0xb5c
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff8550, 0x140781bd500}, {0x102ff8550, 0x140781bd3b0}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:510 +0x1724
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff8a50, 0x1407e3f3338}, {0x102ff8a50, 0x1407e3f3728}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:615 +0x1338
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff85c8, 0x1407e89e880}, {0x102ff85c8, 0x1407e89fec0}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:633 +0xb5c
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff8550, 0x140781bd3b0}, {0x102ff8550, 0x140781bd500}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:510 +0x1724
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff8a50, 0x1407e3f3728}, {0x102ff8a50, 0x1407e3f3338}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:615 +0x1338
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff85c8, 0x1407e89fec0}, {0x102ff85c8, 0x1407e89e880}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:633 +0xb5c
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff8550, 0x140781bd500}, {0x102ff8550, 0x140781bd3b0}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:510 +0x1724
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff8a50, 0x1407e3f3338}, {0x102ff8a50, 0x1407e3f3728}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:615 +0x1338
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff85c8, 0x1407e89e880}, {0x102ff85c8, 0x1407e89fec0}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:633 +0xb5c
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff8550, 0x140781bd3b0}, {0x102ff8550, 0x140781bd500}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:510 +0x1724
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff8a50, 0x1407e3f3728}, {0x102ff8a50, 0x1407e3f3338}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:615 +0x1338
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff85c8, 0x1407e89fec0}, {0x102ff85c8, 0x1407e89e880}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:633 +0xb5c
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff8550, 0x140781bd500}, {0x102ff8550, 0x140781bd3b0}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:510 +0x1724
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff8a50, 0x1407e3f3338}, {0x102ff8a50, 0x1407e3f3728}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:615 +0x1338
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff85c8, 0x1407e89e880}, {0x102ff85c8, 0x1407e89fec0}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:633 +0xb5c
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff8550, 0x140781bd3b0}, {0x102ff8550, 0x140781bd500}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:510 +0x1724
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff8a50, 0x1407e3f3728}, {0x102ff8a50, 0x1407e3f3338}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:615 +0x1338
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff85c8, 0x1407e89fec0}, {0x102ff85c8, 0x1407e89e880}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:633 +0xb5c
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff8550, 0x140781bd500}, {0x102ff8550, 0x140781bd3b0}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:510 +0x1724
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff8a50, 0x1407e3f3338}, {0x102ff8a50, 0x1407e3f3728}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:615 +0x1338
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff85c8, 0x1407e89e880}, {0x102ff85c8, 0x1407e89fec0}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:633 +0xb5c
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff8550, 0x140781bd3b0}, {0x102ff8550, 0x140781bd500}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:510 +0x1724
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff8a50, 0x1407e3f3728}, {0x102ff8a50, 0x1407e3f3338}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:615 +0x1338
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff85c8, 0x1407e89fec0}, {0x102ff85c8, 0x1407e89e880}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:633 +0xb5c
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff8550, 0x140781bd500}, {0x102ff8550, 0x140781bd3b0}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:510 +0x1724
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff8a50, 0x1407e3f3338}, {0x102ff8a50, 0x1407e3f3728}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:615 +0x1338
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff85c8, 0x1407e89e880}, {0x102ff85c8, 0x1407e89fec0}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:633 +0xb5c
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff8550, 0x140781bd3b0}, {0x102ff8550, 0x140781bd500}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:510 +0x1724
go/types.(*unifier).nify(0x1407e89ca70, {0x102ff8a50, 0x1407e3f3728}, {0x102ff8a50, 0x1407e3f3338}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:615 +0x1338
...112 frames elided...
go/types.(*unifier).nify(0x1407e89c730, {0x102ff85c8, 0x1407e89f5c0}, {0x102ff85c8, 0x1407e89e880}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:633 +0xb5c
go/types.(*unifier).nify(0x1407e89c730, {0x102ff8550, 0x140781bd420}, {0x102ff8550, 0x140781bd3b0}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:510 +0x1724
go/types.(*unifier).nify(0x1407e89c730, {0x102ff8a50, 0x1407e3f3338}, {0x102ff8a50, 0x1407e3f3548}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:615 +0x1338
go/types.(*unifier).nify(0x1407e89c730, {0x102ff85c8, 0x1407e89e880}, {0x102ff85c8, 0x1407e89f5c0}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:633 +0xb5c
go/types.(*unifier).nify(0x1407e89c730, {0x102ff8550, 0x140781bd3b0}, {0x102ff8550, 0x140781bd420}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:510 +0x1724
go/types.(*unifier).nify(0x1407e89c730, {0x102ff8a50, 0x1407e3f3548}, {0x102ff8a50, 0x1407e3f3338}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:615 +0x1338
go/types.(*unifier).nify(0x1407e89c730, {0x102ff85c8, 0x1407e89f5c0}, {0x102ff85c8, 0x1407e89e880}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:633 +0xb5c
go/types.(*unifier).nify(0x1407e89c730, {0x102ff8550, 0x140781bd420}, {0x102ff8550, 0x140781bd3b0}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:510 +0x1724
go/types.(*unifier).nify(0x1407e89c730, {0x102ff8a50, 0x1407e3f3338}, {0x102ff8a50, 0x1407e3f3548}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:615 +0x1338
go/types.(*unifier).nify(0x1407e89c730, {0x102ff85c8, 0x1407e89e880}, {0x102ff85c8, 0x1407e89f5c0}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:633 +0xb5c
go/types.(*unifier).nify(0x1407e89c730, {0x102ff8550, 0x140781bd3b0}, {0x102ff8550, 0x140781bd420}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:510 +0x1724
go/types.(*unifier).nify(0x1407e89c730, {0x102ff8a50, 0x1407e3f3548}, {0x102ff8a50, 0x1407e3f3338}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:615 +0x1338
go/types.(*unifier).nify(0x1407e89c730, {0x102ff85c8, 0x1407e89f5c0}, {0x102ff85c8, 0x1407e89e880}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:633 +0xb5c
go/types.(*unifier).nify(0x1407e89c730, {0x102ff8550, 0x140781bd420}, {0x102ff8550, 0x140781bd3b0}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:510 +0x1724
go/types.(*unifier).nify(0x1407e89c730, {0x102ff8a50, 0x1407e3f3338}, {0x102ff8a50, 0x1407e3f3548}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:615 +0x1338
go/types.(*unifier).nify(0x1407e89c730, {0x102ff85c8, 0x1407e89e880}, {0x102ff85c8, 0x1407e89f5c0}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:633 +0xb5c
go/types.(*unifier).nify(0x1407e89c730, {0x102ff8550, 0x140781bd3b0}, {0x102ff8550, 0x140781bd420}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:510 +0x1724
go/types.(*unifier).nify(0x1407e89c730, {0x102ff8a50, 0x1407e3f3548}, {0x102ff8a50, 0x1407e3f3338}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:615 +0x1338
go/types.(*unifier).nify(0x1407e89c730, {0x102ff85c8, 0x1407e89f5c0}, {0x102ff85c8, 0x1407e89e880}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:633 +0xb5c
go/types.(*unifier).nify(0x1407e89c730, {0x102ff8550, 0x140781bd420}, {0x102ff8550, 0x140781bd3b0}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:510 +0x1724
go/types.(*unifier).nify(0x1407e89c730, {0x102ff8bb8, 0x1407e3bd4c0}, {0x102ff8bb8, 0x1407e3bd5c0}, 0x0, 0x0)
	/usr/local/go/src/go/types/unify.go:701 +0xcf8
go/types.(*unifier).unify(...)
	/usr/local/go/src/go/types/unify.go:147
go/types.(*Checker).infer(0x14074a750e0, {0x102ff6468, 0x14075bd53c0}, {0x1407e3f34b8?, 0x3, 0x3}, {0x1407e89f380, 0x3, 0x4}, 0x1407e3f3518, ...)
	/usr/local/go/src/go/types/infer.go:235 +0x788
go/types.(*Checker).arguments(0x14074a750e0, 0x14075bd53c0, 0x1401536f800, {0x0, 0x0, 0x0}, {0x0, 0x0, 0x0}, {0x1407e89c620?, ...}, ...)
	/usr/local/go/src/go/types/call.go:606 +0xd68
go/types.(*Checker).callExpr(0x14074a750e0, 0x1407e89f240, 0x14075bd53c0)
	/usr/local/go/src/go/types/call.go:302 +0x6a4
go/types.(*Checker).exprInternal(0x14074a750e0, {0x0, 0x0}, 0x1407e89f240, {0x102ffb660, 0x14075bd53c0?}, {0x0?, 0x0?})
	/usr/local/go/src/go/types/expr.go:1359 +0x12dc
go/types.(*Checker).rawExpr(0x14074a750e0, {0x0, 0x0}, 0x1407e89f240, {0x102ffb660?, 0x14075bd53c0?}, {0x0?, 0x0?}, 0x0)
	/usr/local/go/src/go/types/expr.go:965 +0x134
go/types.(*Checker).multiExpr(0x14066ff8018?, {0x102ffb660?, 0x14075bd53c0}, 0x0)
	/usr/local/go/src/go/types/expr.go:1517 +0x68
go/types.(*Checker).initVars(0x0?, {0x1407e8aa108?, 0x1, 0x1}, {0x14075bcc940?, 0x1, 0x1}, {0x102ffb6f0, 0x14075bd7ac0})
	/usr/local/go/src/go/types/assignments.go:398 +0x100
go/types.(*Checker).stmt(0x14074a750e0, 0x0, {0x102ffb6f0?, 0x14075bd7ac0?})
	/usr/local/go/src/go/types/stmt.go:527 +0xfd8
go/types.(*Checker).stmtList(0x0?, 0x0, {0x14075bcc950?, 0x1025aa964?, 0x14066ff8fe8?})
	/usr/local/go/src/go/types/stmt.go:124 +0x88
go/types.(*Checker).funcBody(0x14074a750e0, 0x140387f48a0, {0x102ba6059?, 0x1400004acd0?}, 0x1407e89f040, 0x14075bd8660, {0x0, 0x0})
	/usr/local/go/src/go/types/stmt.go:44 +0x244
go/types.(*Checker).exprInternal.func1()
	/usr/local/go/src/go/types/expr.go:1073 +0x44
go/types.(*Checker).processDelayed(0x14074a750e0, 0xd8f)
	/usr/local/go/src/go/types/check.go:439 +0x12c
go/types.(*Checker).shortVarDecl(0x14074a750e0, {0x102ff6048, 0x1407e38f308}, {0x14075bcc900, 0x1, 0x102ff8870?}, {0x14075bcc980?, 0x1, 0x1})
	/usr/local/go/src/go/types/assignments.go:549 +0x8b8
go/types.(*Checker).stmt(0x14074a750e0, 0x0, {0x102ffb780?, 0x14075bd54c0?})
	/usr/local/go/src/go/types/stmt.go:476 +0xb70
go/types.(*Checker).simpleStmt(...)
	/usr/local/go/src/go/types/stmt.go:102
go/types.(*Checker).stmt(0x14074a750e0, 0x0, {0x102ffb630?, 0x14075bd55c0?})
	/usr/local/go/src/go/types/stmt.go:571 +0x12e4
go/types.(*Checker).stmtList(0x14038aba060?, 0x0, {0x140758b3200?, 0x0?, 0x8?})
	/usr/local/go/src/go/types/stmt.go:124 +0x88
go/types.(*Checker).funcBody(0x14074a750e0, 0x140387f48a0, {0x14075b98ee8?, 0x14020d9d090?}, 0x1407cec3700, 0x14075bd8840, {0x0, 0x0})
	/usr/local/go/src/go/types/stmt.go:44 +0x244
go/types.(*Checker).funcDecl.func1()
	/usr/local/go/src/go/types/decl.go:826 +0x44
go/types.(*Checker).processDelayed(0x14074a750e0, 0x0)
	/usr/local/go/src/go/types/check.go:439 +0x12c
go/types.(*Checker).checkFiles(0x14074a750e0, {0x1407aab0200, 0x17, 0x20})
	/usr/local/go/src/go/types/check.go:383 +0x1fc
go/types.(*Checker).Files(...)
	/usr/local/go/src/go/types/check.go:341
golang.org/x/tools/gopls/internal/lsp/cache.doTypeCheck({0x102ffccc8, 0x14075134780}, 0x1403fc47f80, {{0x14001c12540, 0x20}, {0x14001c12540, 0x20}, {0x14001bf4c3c, 0x4}, {0x140002c3380, ...}, ...})
	/Users/lavch/go/pkg/mod/golang.org/x/tools/gopls@v0.13.1/internal/lsp/cache/check.go:1559 +0x6d8
golang.org/x/tools/gopls/internal/lsp/cache.typeCheckImpl({0x102ffccc8, 0x14075134600}, 0x1023bc390?, {{0x14001c12540, 0x20}, {0x14001c12540, 0x20}, {0x14001bf4c3c, 0x4}, {0x140002c3380, ...}, ...})
	/Users/lavch/go/pkg/mod/golang.org/x/tools/gopls@v0.13.1/internal/lsp/cache/check.go:1420 +0x16c
golang.org/x/tools/gopls/internal/lsp/cache.(*typeCheckBatch).checkPackage(0x14041e9cec8?, {0x102ffccc8, 0x14017859b30}, 0x14041564900)
	/Users/lavch/go/pkg/mod/golang.org/x/tools/gopls@v0.13.1/internal/lsp/cache/check.go:674 +0x184
golang.org/x/tools/gopls/internal/lsp/cache.(*typeCheckBatch).handleSyntaxPackage(0x1403fc47f80, {0x102ffccc8, 0x14017859b30}, 0x0?, {0x14001c12540, 0x20})
	/Users/lavch/go/pkg/mod/golang.org/x/tools/gopls@v0.13.1/internal/lsp/cache/check.go:532 +0x3e0
golang.org/x/tools/gopls/internal/lsp/cache.(*snapshot).forEachPackageInternal.func2()
	/Users/lavch/go/pkg/mod/golang.org/x/tools/gopls@v0.13.1/internal/lsp/cache/check.go:394 +0x34
golang.org/x/sync/errgroup.(*Group).Go.func1()
	/Users/lavch/go/pkg/mod/golang.org/x/sync@v0.3.0/errgroup/errgroup.go:75 +0x58
created by golang.org/x/sync/errgroup.(*Group).Go in goroutine 9176
	/Users/lavch/go/pkg/mod/golang.org/x/sync@v0.3.0/errgroup/errgroup.go:72 +0x98
[Error - 11:00:26] Connection to server got closed. Server will not be restarted.

About this issue

  • Original URL
  • State: closed
  • Created a year ago
  • Comments: 27 (10 by maintainers)

Commits related to this issue

Most upvoted comments

@LAShZ amazing! That also reproduces via playground compilation: https://go.dev/play/p/S2M6Qm_ExrI

Huge thanks. Tracking down a reproducer is critical to fixing the compiler.

@ttys3 gopls doesn’t depend on types2; that’s only used for the compiler.

@LAShZ can you try with this CL? The easiest way to install go with that CL is to use gotip.

go install golang.org/dl/gotip@latest
gotip download 518259
gotip install golang.org/x/tools/gopls@latest

Then the unification panic should contain more detail, that can help us narrow down a reproducer.

@findleyr yes. gopls doesn’t depend on types2.

we got an ICE. while using go 1.21 compile our program.

but I think it maybe the same to the gopls issue.

I patched src/cmd/compile/internal/types2/unify.go and confirmed that, it’s an ICE

@findleyr Here is the reproducer

type InterfaceA[T comparable] interface {
	setData(string) InterfaceA[T]
}

type ImplA[T comparable] struct {
	data        string
	args        []any
}

func NewInterfaceA[T comparable](args ...any) InterfaceA[T] {
	return &ImplA[T]{
		data:        fmt.Sprintf("%v", args...),
		args:        args,
	}
}

func (k *ImplA[T]) setData(data string) InterfaceA[T] {
	k.data = data
	return k
}

func Foo[M ~map[InterfaceA[T]]V, T comparable, V any](m M) {
	// DO SOMETHING HERE
	return 
}

func Bar() {
	keys := make([]InterfaceA[int], 0, 10)
	m := make(map[InterfaceA[int]]int)
	for i := 0; i < 10; i++ {
		keys = append(keys, NewInterfaceA[int](i))
		m[keys[i]] = i
	}

	Foo(m)	// panic here
}

And I’ve noticed that although [T comparable] is never used in this snippet, it’s neccessary to reproduce this panic

I have located the package that caused the panic. Let me try to provide a reproducer.