Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

x/tools/go/analysis,gopls: infinite recursion in the copylock analyzer #61678

Closed
willdhorn opened this issue Jul 31, 2023 · 7 comments
Closed
Assignees
Labels
FrozenDueToAge gopls Issues related to the Go language server, gopls. Tools This label describes issues relating to any tools in the x/tools repository.
Milestone

Comments

@willdhorn
Copy link

gopls version: (devel) (go1.20.6)
gopls flags:
update flags: proxy
extension version: 0.39.1
go version: 1.20.6
environment: Visual Studio Code darwin
initialization error: undefined
issue timestamp: Mon, 31 Jul 2023 20:31:59 GMT
restart history:
Mon, 31 Jul 2023 03:07:49 GMT: activation (enabled: true)

I'm writing a code generator that makes heavy use of templates, and gopls crashed after I generated an invalid struct like type Thing struct { OtherThing Thing, ...} because I forgot to make those fields a pointer. I managed to fix the generator and it produced a valid result, but within 5 seconds VSCode froze entirely, and after it recovered is when I was prompted with the gopls crash message

I've also attached errors that were sandwiched between the stack traces, since they show up everytime gopls restarts, but they may not be related. The errors are a result of me using the "files.associations" setting in vscode and setting "*.go.gtpl": "go" in order go get better syntax highlighting in go templates that generate go code. Again, this may or may not be related to the crash since it hasn't been a problem for me so far.

Logs (summary)

[Error - 4:31:13 PM] Request textDocument/inlayHint failed.
  Message: getting file for InlayHint: no package metadata for file file:///Users/will/workspace/<my-project>/../<a-template-that-generates-go>.go.gtpl
  Code: 0 
[Error - 4:31:13 PM] Request textDocument/semanticTokens/full failed.
  Message: no package metadata for file file:///Users/will/workspace/<my-project>/../<a-template-that-generates-go>.go.gtpl
  Code: 0 
runtime: goroutine stack exceeds 1000000000-byte limit
runtime: sp=0xc024f00410 stack=[0xc024f00000, 0xc044f00000]
fatal error: stack overflow
Full logs (~600 lines) ``` [Error - 4:31:13 PM] Request textDocument/inlayHint failed. Message: getting file for InlayHint: no package metadata for file file:///Users/will/workspace//../.go.gtpl Code: 0 [Error - 4:31:13 PM] Request textDocument/semanticTokens/full failed. Message: no package metadata for file file:///Users/will/workspace//../.go.gtpl Code: 0 runtime: goroutine stack exceeds 1000000000-byte limit runtime: sp=0xc024f00410 stack=[0xc024f00000, 0xc044f00000] fatal error: stack overflow

runtime stack:
runtime.throw({0x100aff1b2?, 0x1012aef00?})
/usr/local/go/src/runtime/panic.go:1047 +0x5d fp=0x700003abbd88 sp=0x700003abbd58 pc=0x100038a7d
runtime.newstack()
/usr/local/go/src/runtime/stack.go:1105 +0x5bd fp=0x700003abbf38 sp=0x700003abbd88 pc=0x100052fbd
runtime.morestack()
/usr/local/go/src/runtime/asm_amd64.s:574 +0x8b fp=0x700003abbf40 sp=0x700003abbf38 pc=0x10006cd4b

goroutine 9647 [running]:
go/types.(*Named).under(0xc0003de0e0)
/usr/local/go/src/go/types/named.go:483 +0x3e5 fp=0xc024f00420 sp=0xc024f00418 pc=0x1002a0305
go/types.under({0x100d70498?, 0xc0003de0e0?})
/usr/local/go/src/go/types/type.go:23 +0x45 fp=0xc024f00438 sp=0xc024f00420 pc=0x1002bbbc5
go/types.lookupFieldOrMethod({0x100d704c0?, 0xc04d9163c0?}, 0x0, 0x100ae2302?, {0x100ae2302, 0x4}, 0x28?)
/usr/local/go/src/go/types/lookup.go:100 +0x10e fp=0xc024f00740 sp=0xc024f00438 pc=0x1002986ae
go/types.(*Checker).missingMethod(0x0, {0x100d704c0?, 0xc04d9163c0?}, 0xc000153ae0, 0x1)
/usr/local/go/src/go/types/lookup.go:350 +0x17a fp=0xc024f007e8 sp=0xc024f00740 pc=0x100299e5a
go/types.(*Checker).implements(0x0, {0x100d704c0?, 0xc04d9163c0}, {0x100d70448?, 0xc000153ae0}, 0x0, 0x0)
/usr/local/go/src/go/types/instantiate.go:244 +0x55c fp=0xc024f009c8 sp=0xc024f007e8 pc=0x10029463c
go/types.Implements({0x100d704c0, 0xc04d9163c0}, 0x0?)
/usr/local/go/src/go/types/api.go:471 +0x91 fp=0xc024f00a18 sp=0xc024f009c8 pc=0x100261771
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:319 +0x44f fp=0xc024f00ba0 sp=0xc024f00a18 pc=0x10057b2af
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f00d28 sp=0xc024f00ba0 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f00eb0 sp=0xc024f00d28 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f01038 sp=0xc024f00eb0 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f011c0 sp=0xc024f01038 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f01348 sp=0xc024f011c0 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f014d0 sp=0xc024f01348 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f01658 sp=0xc024f014d0 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f017e0 sp=0xc024f01658 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f01968 sp=0xc024f017e0 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f01af0 sp=0xc024f01968 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f01c78 sp=0xc024f01af0 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f01e00 sp=0xc024f01c78 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f01f88 sp=0xc024f01e00 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f02110 sp=0xc024f01f88 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f02298 sp=0xc024f02110 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f02420 sp=0xc024f02298 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f025a8 sp=0xc024f02420 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f02730 sp=0xc024f025a8 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f028b8 sp=0xc024f02730 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f02a40 sp=0xc024f028b8 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f02bc8 sp=0xc024f02a40 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f02d50 sp=0xc024f02bc8 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f02ed8 sp=0xc024f02d50 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f03060 sp=0xc024f02ed8 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f031e8 sp=0xc024f03060 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f03370 sp=0xc024f031e8 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f034f8 sp=0xc024f03370 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f03680 sp=0xc024f034f8 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f03808 sp=0xc024f03680 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f03990 sp=0xc024f03808 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f03b18 sp=0xc024f03990 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f03ca0 sp=0xc024f03b18 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f03e28 sp=0xc024f03ca0 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f03fb0 sp=0xc024f03e28 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f04138 sp=0xc024f03fb0 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f042c0 sp=0xc024f04138 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f04448 sp=0xc024f042c0 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f045d0 sp=0xc024f04448 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f04758 sp=0xc024f045d0 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f048e0 sp=0xc024f04758 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f04a68 sp=0xc024f048e0 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f04bf0 sp=0xc024f04a68 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f04d78 sp=0xc024f04bf0 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f04f00 sp=0xc024f04d78 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f05088 sp=0xc024f04f00 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f05210 sp=0xc024f05088 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f05398 sp=0xc024f05210 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f05520 sp=0xc024f05398 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f056a8 sp=0xc024f05520 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f05830 sp=0xc024f056a8 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f059b8 sp=0xc024f05830 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f05b40 sp=0xc024f059b8 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f05cc8 sp=0xc024f05b40 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f05e50 sp=0xc024f05cc8 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f05fd8 sp=0xc024f05e50 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f06160 sp=0xc024f05fd8 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f062e8 sp=0xc024f06160 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f06470 sp=0xc024f062e8 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f065f8 sp=0xc024f06470 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f06780 sp=0xc024f065f8 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f06908 sp=0xc024f06780 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f06a90 sp=0xc024f06908 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f06c18 sp=0xc024f06a90 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f06da0 sp=0xc024f06c18 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f06f28 sp=0xc024f06da0 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f070b0 sp=0xc024f06f28 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f07238 sp=0xc024f070b0 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f073c0 sp=0xc024f07238 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f07548 sp=0xc024f073c0 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f076d0 sp=0xc024f07548 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f07858 sp=0xc024f076d0 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f079e0 sp=0xc024f07858 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f07b68 sp=0xc024f079e0 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f07cf0 sp=0xc024f07b68 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f07e78 sp=0xc024f07cf0 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f08000 sp=0xc024f07e78 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f08188 sp=0xc024f08000 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f08310 sp=0xc024f08188 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f08498 sp=0xc024f08310 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f08620 sp=0xc024f08498 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f087a8 sp=0xc024f08620 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f08930 sp=0xc024f087a8 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f08ab8 sp=0xc024f08930 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f08c40 sp=0xc024f08ab8 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f08dc8 sp=0xc024f08c40 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f08f50 sp=0xc024f08dc8 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f090d8 sp=0xc024f08f50 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f09260 sp=0xc024f090d8 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f093e8 sp=0xc024f09260 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f09570 sp=0xc024f093e8 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f096f8 sp=0xc024f09570 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f09880 sp=0xc024f096f8 pc=0x10057b508
golang.org/x/tools/go/analysis/passes/copylock.lockPath(0x100d704c0?, {0x100d70498?, 0xc0003de0e0?}, 0x0)
/Users/will/workspace/_scratch/tools/go/analysis/passes/copylock/copylock.go:335 +0x6a8 fp=0xc024f09a08 sp=0xc024f09880 pc=0x10057b508
...additional frames elided...
created by golang.org/x/tools/gopls/internal/lsp/cache.execActions
/Users/will/workspace/_scratch/tools/gopls/internal/lsp/cache/analysis.go:1122 +0x3c

goroutine 1 [chan receive]:
runtime.gopark(0xc0000e73e0?, 0x30?, 0x28?, 0x0?, 0x100a6f2a0?)
/usr/local/go/src/runtime/proc.go:381 +0xd6 fp=0xc0008b94c8 sp=0xc0008b94a8 pc=0x10003b756
runtime.chanrecv(0xc00010e480, 0x0, 0x1)
/usr/local/go/src/runtime/chan.go:583 +0x49d fp=0xc0008b9558 sp=0xc0008b94c8 pc=0x10000995d
runtime.chanrecv1(0xc00029a500?, 0x100d73fd8?)
/usr/local/go/src/runtime/chan.go:442 +0x18 fp=0xc0008b9580 sp=0xc0008b9558 pc=0x100009458
golang.org/x/tools/gopls/internal/lsp/lsprpc.(*StreamServer).ServeStream(0xc0000e6ea0, {0x100d73fd8, 0xc0000e7350}, {0x100d76eb0, 0xc00029a500})
/Users/will/workspace/_scratch/tools/gopls/internal/lsp/lsprpc/lsprpc.go:107 +0x6db fp=0xc0008b96d0 sp=0xc0008b9580 pc=0x1008fa85b
golang.org/x/tools/gopls/internal/lsp/cmd.(*Serve).Run(0xc000212540, {0x100d73fd8, 0xc0000e6e10}, {0xc000132010?, 0x0?, 0x0?})
/Users/will/workspace/_scratch/tools/gopls/internal/lsp/cmd/serve.go:141 +0x8fd fp=0xc0008b98a0 sp=0xc0008b96d0 pc=0x1009137dd
golang.org/x/tools/internal/tool.Run({0x100d73fd8, 0xc0000e6e10}, 0xc000281ec0, {0x100d74f20?, 0xc000212540}, {0xc000132010, 0x0, 0x0})
/Users/will/workspace/_scratch/tools/internal/tool/tool.go:192 +0x736 fp=0xc0008b9b10 sp=0xc0008b98a0 pc=0x1007b8136
golang.org/x/tools/gopls/internal/lsp/cmd.(*Application).Run(0xc000212500, {0x100d73f68, 0xc00011e010}, {0xc000132010?, 0x0, 0x0})
/Users/will/workspace/_scratch/tools/gopls/internal/lsp/cmd/cmd.go:227 +0x1c5 fp=0xc0008b9c00 sp=0xc0008b9b10 pc=0x100903805
golang.org/x/tools/internal/tool.Run({0x100d73f68, 0xc00011e010}, 0xc000281c80, {0x100d74ee0?, 0xc000212500}, {0xc000132010, 0x1, 0x1})
/Users/will/workspace/_scratch/tools/internal/tool/tool.go:192 +0x736 fp=0xc0008b9e70 sp=0xc0008b9c00 pc=0x1007b8136
golang.org/x/tools/internal/tool.Main({0x100d73f68, 0xc00011e010}, {0x100d74ee0?, 0xc000212500?}, {0xc000132010, 0x1, 0x1})
/Users/will/workspace/_scratch/tools/internal/tool/tool.go:93 +0x145 fp=0xc0008b9f28 sp=0xc0008b9e70 pc=0x1007b78a5
main.main()
/Users/will/workspace/_scratch/tools/gopls/main.go:27 +0x9c fp=0xc0008b9f80 sp=0xc0008b9f28 pc=0x10091a85c
runtime.main()
/usr/local/go/src/runtime/proc.go:250 +0x207 fp=0xc0008b9fe0 sp=0xc0008b9f80 pc=0x10003b327
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:1598 +0x1 fp=0xc0008b9fe8 sp=0xc0008b9fe0 pc=0x10006ee41

goroutine 2 [force gc (idle)]:
runtime.gopark(0x0?, 0x0?, 0x0?, 0x0?, 0x0?)
/usr/local/go/src/runtime/proc.go:381 +0xd6 fp=0xc00005efb0 sp=0xc00005ef90 pc=0x10003b756
runtime.goparkunlock(...)
/usr/local/go/src/runtime/proc.go:387
runtime.forcegchelper()
/usr/local/go/src/runtime/proc.go:305 +0xb0 fp=0xc00005efe0 sp=0xc00005efb0 pc=0x10003b590
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:1598 +0x1 fp=0xc00005efe8 sp=0xc00005efe0 pc=0x10006ee41
created by runtime.init.6
/usr/local/go/src/runtime/proc.go:293 +0x25

goroutine 3 [GC sweep wait]:
runtime.gopark(0x1?, 0x0?, 0x0?, 0x0?, 0x0?)
/usr/local/go/src/runtime/proc.go:381 +0xd6 fp=0xc00005f780 sp=0xc00005f760 pc=0x10003b756
runtime.goparkunlock(...)
/usr/local/go/src/runtime/proc.go:387
runtime.bgsweep(0x0?)
/usr/local/go/src/runtime/mgcsweep.go:319 +0xde fp=0xc00005f7c8 sp=0xc00005f780 pc=0x10002689e
runtime.gcenable.func1()
/usr/local/go/src/runtime/mgc.go:178 +0x26 fp=0xc00005f7e0 sp=0xc00005f7c8 pc=0x10001bac6
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:1598 +0x1 fp=0xc00005f7e8 sp=0xc00005f7e0 pc=0x10006ee41
created by runtime.gcenable
/usr/local/go/src/runtime/mgc.go:178 +0x6b

goroutine 4 [GC scavenge wait]:
runtime.gopark(0x3b550e6e590db?, 0x4a54a9?, 0x0?, 0x0?, 0x0?)
/usr/local/go/src/runtime/proc.go:381 +0xd6 fp=0xc00005ff70 sp=0xc00005ff50 pc=0x10003b756
runtime.goparkunlock(...)
/usr/local/go/src/runtime/proc.go:387
runtime.(*scavengerState).park(0x10130ff20)
/usr/local/go/src/runtime/mgcscavenge.go:400 +0x53 fp=0xc00005ffa0 sp=0xc00005ff70 pc=0x100024733
runtime.bgscavenge(0x0?)
/usr/local/go/src/runtime/mgcscavenge.go:633 +0x65 fp=0xc00005ffc8 sp=0xc00005ffa0 pc=0x100024d25
runtime.gcenable.func2()
/usr/local/go/src/runtime/mgc.go:179 +0x26 fp=0xc00005ffe0 sp=0xc00005ffc8 pc=0x10001ba66
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:1598 +0x1 fp=0xc00005ffe8 sp=0xc00005ffe0 pc=0x10006ee41
created by runtime.gcenable
/usr/local/go/src/runtime/mgc.go:179 +0xaa

goroutine 18 [finalizer wait]:
runtime.gopark(0x0?, 0x100c61d48?, 0x20?, 0xc0?, 0x2000000020?)
/usr/local/go/src/runtime/proc.go:381 +0xd6 fp=0xc00005e628 sp=0xc00005e608 pc=0x10003b756
runtime.runfinq()
/usr/local/go/src/runtime/mfinal.go:193 +0x107 fp=0xc00005e7e0 sp=0xc00005e628 pc=0x10001ab07
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:1598 +0x1 fp=0xc00005e7e8 sp=0xc00005e7e0 pc=0x10006ee41
created by runtime.createfing
/usr/local/go/src/runtime/mfinal.go:163 +0x45

goroutine 79 [select]:
runtime.gopark(0xc004e2f9f0?, 0x2?, 0x0?, 0x0?, 0xc004e2f9ac?)
/usr/local/go/src/runtime/proc.go:381 +0xd6 fp=0xc004e2f838 sp=0xc004e2f818 pc=0x10003b756
runtime.selectgo(0xc004e2f9f0, 0xc004e2f9a8, 0xc000132060?, 0x0, 0x1009959a0?, 0x1)
/usr/local/go/src/runtime/select.go:327 +0x7be fp=0xc004e2f978 sp=0xc004e2f838 pc=0x10004bc5e
golang.org/x/tools/internal/fakenet.(*connFeeder).do(...)
/Users/will/workspace/_scratch/tools/internal/fakenet/conn.go:103
golang.org/x/tools/internal/fakenet.(*fakeConn).Read(0x0?, {0xc000420000?, 0x0?, 0x0?})
/Users/will/workspace/_scratch/tools/internal/fakenet/conn.go:67 +0x11d fp=0xc004e2fa40 sp=0xc004e2f978 pc=0x1008ff0bd
bufio.(*Reader).fill(0xc000281f20)
/usr/local/go/src/bufio/bufio.go:106 +0xff fp=0xc004e2fa78 sp=0xc004e2fa40 pc=0x1001a781f
bufio.(*Reader).ReadSlice(0xc000281f20, 0x50?)
/usr/local/go/src/bufio/bufio.go:372 +0x2f fp=0xc004e2fac8 sp=0xc004e2fa78 pc=0x1001a840f
bufio.(*Reader).collectFragments(0x30?, 0x60?)
/usr/local/go/src/bufio/bufio.go:447 +0x74 fp=0xc004e2fb88 sp=0xc004e2fac8 pc=0x1001a8854
bufio.(*Reader).ReadString(0x2f?, 0xe0?)
/usr/local/go/src/bufio/bufio.go:494 +0x2b fp=0xc004e2fc60 sp=0xc004e2fb88 pc=0x1001a8c2b
golang.org/x/tools/internal/jsonrpc2.(*headerStream).Read(0xc0002906f0, {0x100d73fd8, 0xc0000e7350})
/Users/will/workspace/_scratch/tools/internal/jsonrpc2/stream.go:110 +0xb8 fp=0xc004e2fcf0 sp=0xc004e2fc60 pc=0x1001b2258
golang.org/x/tools/internal/jsonrpc2.(*conn).run(0xc00029a500, {0x100d73fd8, 0xc0000e7350}, 0xc000290258)
/Users/will/workspace/_scratch/tools/internal/jsonrpc2/conn.go:196 +0xbc fp=0xc004e2ffb0 sp=0xc004e2fcf0 pc=0x1001ae1dc
golang.org/x/tools/internal/jsonrpc2.(*conn).Go.func1()
/Users/will/workspace/_scratch/tools/internal/jsonrpc2/conn.go:189 +0x32 fp=0xc004e2ffe0 sp=0xc004e2ffb0 pc=0x1001ae0f2
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:1598 +0x1 fp=0xc004e2ffe8 sp=0xc004e2ffe0 pc=0x10006ee41
created by golang.org/x/tools/internal/jsonrpc2.(*conn).Go
/Users/will/workspace/_scratch/tools/internal/jsonrpc2/conn.go:189 +0xb0

goroutine 77 [GC worker (idle)]:
runtime.gopark(0x3b552724c79da?, 0x3?, 0x81?, 0x36?, 0x100009399?)
/usr/local/go/src/runtime/proc.go:381 +0xd6 fp=0xc00005b750 sp=0xc00005b730 pc=0x10003b756
runtime.gcBgMarkWorker()
/usr/local/go/src/runtime/mgc.go:1275 +0xf1 fp=0xc00005b7e0 sp=0xc00005b750 pc=0x10001d831
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:1598 +0x1 fp=0xc00005b7e8 sp=0xc00005b7e0 pc=0x10006ee41
created by runtime.gcBgMarkStartWorkers
/usr/local/go/src/runtime/mgc.go:1199 +0x25

goroutine 78 [select]:
runtime.gopark(0xc000073f90?, 0x2?, 0x2?, 0x0?, 0xc000073f74?)
/usr/local/go/src/runtime/proc.go:381 +0xd6 fp=0xc000073df8 sp=0xc000073dd8 pc=0x10003b756
runtime.selectgo(0xc000073f90, 0xc000073f70, 0x0?, 0x0, 0x0?, 0x1)
/usr/local/go/src/runtime/select.go:327 +0x7be fp=0xc000073f38 sp=0xc000073df8 pc=0x10004bc5e
golang.org/x/tools/gopls/internal/lsp/cache.(*parseCache).gc(0xc00029a000)
/Users/will/workspace/_scratch/tools/gopls/internal/lsp/cache/parse_cache.go:261 +0xd0 fp=0xc000073fc8 sp=0xc000073f38 pc=0x10082fd10
golang.org/x/tools/gopls/internal/lsp/cache.newParseCache.func1()
/Users/will/workspace/_scratch/tools/gopls/internal/lsp/cache/parse_cache.go:118 +0x26 fp=0xc000073fe0 sp=0xc000073fc8 pc=0x10082eb26
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:1598 +0x1 fp=0xc000073fe8 sp=0xc000073fe0 pc=0x10006ee41
created by golang.org/x/tools/gopls/internal/lsp/cache.newParseCache
/Users/will/workspace/_scratch/tools/gopls/internal/lsp/cache/parse_cache.go:118 +0xd0

goroutine 119 [runnable]:
syscall.syscall(0xc000517878?, 0x100054c39?, 0x4b?, 0x0?)
/usr/local/go/src/runtime/sys_darwin.go:23 +0x7f fp=0xc000517848 sp=0xc0005177b8 pc=0x10006afbf
syscall.readdir_r(0xc019754300?, 0xc04d89a015?, 0x4b?)
/usr/local/go/src/syscall/zsyscall_darwin_amd64.go:1224 +0x3b fp=0xc000517888 sp=0xc000517848 pc=0x10008247b
os.(*File).readdir(0xc003e94f18, 0xffffffffffffffff, 0x0)
/usr/local/go/src/os/dir_darwin.go:48 +0x305 fp=0xc0005179c0 sp=0xc000517888 pc=0x1000b2565
os.(*File).Readdirnames(0xc000344e70?, 0x2c?)
/usr/local/go/src/os/dir.go:70 +0x25 fp=0xc0005179f8 sp=0xc0005179c0 pc=0x1000b1da5
path/filepath.readDirNames({0xc000344e70?, 0xc000517ab0?})
/usr/local/go/src/path/filepath/path.go:602 +0x45 fp=0xc000517a58 sp=0xc0005179f8 pc=0x1001b8e05
path/filepath.walk({0xc000344e70, 0x2c}, {0x100d77060, 0xc04d897d40}, 0xc000517e80)
/usr/local/go/src/path/filepath/path.go:483 +0x74 fp=0xc000517b20 sp=0xc000517a58 pc=0x1001b8514
path/filepath.walk({0xc00014b560, 0x29}, {0x100d77060, 0xc004b5a270}, 0xc000517e80)
/usr/local/go/src/path/filepath/path.go:504 +0x26f fp=0xc000517be8 sp=0xc000517b20 pc=0x1001b870f
path/filepath.walk({0xc0001300c0, 0x20}, {0x100d77060, 0xc0000cbba0}, 0xc000517e80)
/usr/local/go/src/path/filepath/path.go:504 +0x26f fp=0xc000517cb0 sp=0xc000517be8 pc=0x1001b870f
path/filepath.Walk({0xc0001300c0, 0x20}, 0xc000517e80)
/usr/local/go/src/path/filepath/path.go:571 +0x6c fp=0xc000517d00 sp=0xc000517cb0 pc=0x1001b8acc
golang.org/x/tools/gopls/internal/lsp/filecache.gc({0xc0001300c0, 0x20})
/Users/will/workspace/_scratch/tools/gopls/internal/lsp/filecache/filecache.go:450 +0x1d1 fp=0xc000517fc0 sp=0xc000517d00 pc=0x1007e9c91
golang.org/x/tools/gopls/internal/lsp/filecache.getCacheDir.func1.1()
/Users/will/workspace/_scratch/tools/gopls/internal/lsp/filecache/filecache.go:350 +0x2a fp=0xc000517fe0 sp=0xc000517fc0 pc=0x1007eae8a
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:1598 +0x1 fp=0xc000517fe8 sp=0xc000517fe0 pc=0x10006ee41
created by golang.org/x/tools/gopls/internal/lsp/filecache.getCacheDir.func1
/Users/will/workspace/_scratch/tools/gopls/internal/lsp/filecache/filecache.go:350 +0x1be

goroutine 76 [GC worker (idle)]:
runtime.gopark(0x101340a80?, 0x3?, 0xa0?, 0x69?, 0x100009399?)
/usr/local/go/src/runtime/proc.go:381 +0xd6 fp=0xc00032bf50 sp=0xc00032bf30 pc=0x10003b756
runtime.gcBgMarkWorker()
/usr/local/go/src/runtime/mgc.go:1275 +0xf1 fp=0xc00032bfe0 sp=0xc00032bf50 pc=0x10001d831
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:1598 +0x1 fp=0xc00032bfe8 sp=0xc00032bfe0 pc=0x10006ee41
created by runtime.gcBgMarkStartWorkers
/usr/local/go/src/runtime/mgc.go:1199 +0x25

goroutine 75 [GC worker (idle)]:
runtime.gopark(0x3b551b6335a7d?, 0xc000324680?, 0xa0?, 0xc7?, 0x100009399?)
/usr/local/go/src/runtime/proc.go:381 +0xd6 fp=0xc00032c750 sp=0xc00032c730 pc=0x10003b756
runtime.gcBgMarkWorker()
/usr/local/go/src/runtime/mgc.go:1275 +0xf1 fp=0xc00032c7e0 sp=0xc00032c750 pc=0x10001d831
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:1598 +0x1 fp=0xc00032c7e8 sp=0xc00032c7e0 pc=0x10006ee41
created by runtime.gcBgMarkStartWorkers
/usr/local/go/src/runtime/mgc.go:1199 +0x25

goroutine 87 [GC worker (idle)]:
runtime.gopark(0x3b5527287bfcb?, 0x1?, 0x4b?, 0x75?, 0x100009399?)
/usr/local/go/src/runtime/proc.go:381 +0xd6 fp=0xc00032cf50 sp=0xc00032cf30 pc=0x10003b756
runtime.gcBgMarkWorker()
/usr/local/go/src/runtime/mgc.go:1275 +0xf1 fp=0xc00032cfe0 sp=0xc00032cf50 pc=0x10001d831
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:1598 +0x1 fp=0xc00032cfe8 sp=0xc00032cfe0 pc=0x10006ee41
created by runtime.gcBgMarkStartWorkers
/usr/local/go/src/runtime/mgc.go:1199 +0x25

goroutine 100 [syscall]:
syscall.syscall(0x1?, 0x0?, 0x800000?, 0x7ffff800000?)
/usr/local/go/src/runtime/sys_darwin.go:23 +0x7f fp=0xc000329da8 sp=0xc000329d18 pc=0x10006afbf
syscall.read(0xc000128000?, {0xc000420000?, 0x1000101010000?, 0x0?})
/usr/local/go/src/syscall/zsyscall_darwin_amd64.go:1209 +0x49 fp=0xc000329de8 sp=0xc000329da8 pc=0x100082389
syscall.Read(...)
/usr/local/go/src/syscall/syscall_unix.go:178
internal/poll.ignoringEINTRIO(...)
/usr/local/go/src/internal/poll/fd_unix.go:794
internal/poll.(*FD).Read(0xc000128000?, {0xc000420000?, 0x1000?, 0x1000?})
/usr/local/go/src/internal/poll/fd_unix.go:163 +0x2ce fp=0xc000329e80 sp=0xc000329de8 pc=0x1000aa16e
os.(*File).read(...)
/usr/local/go/src/os/file_posix.go:31
os.(*File).Read(0xc000126000, {0xc000420000?, 0x2?, 0x2?})
/usr/local/go/src/os/file.go:118 +0x5e fp=0xc000329ed8 sp=0xc000329e80 pc=0x1000b42be
io.ReadCloser.Read-fm({0xc000420000?, 0xc000329f40?, 0x0?})
:1 +0x3c fp=0xc000329f08 sp=0xc000329ed8 pc=0x1008ff8bc
golang.org/x/tools/internal/fakenet.(*connFeeder).run(0xc0000e6ed0)
/Users/will/workspace/_scratch/tools/internal/fakenet/conn.go:121 +0xc8 fp=0xc000329fc8 sp=0xc000329f08 pc=0x1008ff5a8
golang.org/x/tools/internal/fakenet.NewConn.func1()
/Users/will/workspace/_scratch/tools/internal/fakenet/conn.go:26 +0x26 fp=0xc000329fe0 sp=0xc000329fc8 pc=0x1008feee6
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:1598 +0x1 fp=0xc000329fe8 sp=0xc000329fe0 pc=0x10006ee41
created by golang.org/x/tools/internal/fakenet.NewConn
/Users/will/workspace/_scratch/tools/internal/fakenet/conn.go:26 +0x38a

goroutine 101 [select]:
runtime.gopark(0xc00032d798?, 0x2?, 0x0?, 0x0?, 0xc00032d744?)
/usr/local/go/src/runtime/proc.go:381 +0xd6 fp=0xc00032d5c8 sp=0xc00032d5a8 pc=0x10003b756
runtime.selectgo(0xc00032d798, 0xc00032d740, 0x0?, 0x0, 0x0?, 0x1)
/usr/local/go/src/runtime/select.go:327 +0x7be fp=0xc00032d708 sp=0xc00032d5c8 pc=0x10004bc5e
golang.org/x/tools/internal/fakenet.(*connFeeder).run(0xc0000e6f00)
/Users/will/workspace/_scratch/tools/internal/fakenet/conn.go:115 +0x9f fp=0xc00032d7c8 sp=0xc00032d708 pc=0x1008ff57f
golang.org/x/tools/internal/fakenet.NewConn.func2()
/Users/will/workspace/_scratch/tools/internal/fakenet/conn.go:27 +0x26 fp=0xc00032d7e0 sp=0xc00032d7c8 pc=0x1008fee86
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:1598 +0x1 fp=0xc00032d7e8 sp=0xc00032d7e0 pc=0x10006ee41
created by golang.org/x/tools/internal/fakenet.NewConn
/Users/will/workspace/_scratch/tools/internal/fakenet/conn.go:27 +0x3d6

goroutine 9398 [semacquire]:
runtime.gopark(0xc00400fa50?, 0x10001517b?, 0x60?, 0x0?, 0x12aa480b8?)
/usr/local/go/src/runtime/proc.go:381 +0xd6 fp=0xc005607a10 sp=0xc0056079f0 pc=0x10003b756
runtime.goparkunlock(...)
/usr/local/go/src/runtime/proc.go:387
runtime.semacquire1(0xc003878c08, 0x18?, 0x1, 0x0, 0x51?)
/usr/local/go/src/runtime/sema.go:160 +0x20f fp=0xc005607a78 sp=0xc005607a10 pc=0x10004cd4f
sync.runtime_Semacquire(0xc003f47b60?)
/usr/local/go/src/runtime/sema.go:62 +0x27 fp=0xc005607ab0 sp=0xc005607a78 pc=0x10006a087
sync.(*WaitGroup).Wait(0xc00400fc48?)
/usr/local/go/src/sync/waitgroup.go:116 +0x4b fp=0xc005607ad8 sp=0xc005607ab0 pc=0x10007ac8b
golang.org/x/tools/gopls/internal/lsp/cache.execActions({0xc002810e00, 0x29, 0xc0041a19f8?})
/Users/will/workspace/_scratch/tools/gopls/internal/lsp/cache/analysis.go:1142 +0xca fp=0xc005607b10 sp=0xc005607ad8 pc=0x10080018a
golang.org/x/tools/gopls/internal/lsp/cache.(*analysisNode).run(0xc000632bb0, {0x100d73fd8?, 0xc00148d470})
/Users/will/workspace/_scratch/tools/gopls/internal/lsp/cache/analysis.go:866 +0x685 fp=0xc005607dd8 sp=0xc005607b10 pc=0x1007fe4e5
golang.org/x/tools/gopls/internal/lsp/cache.(*analysisNode).runCached(0xc000632bb0, {0x100d73fd8?, 0xc00148d470})
/Users/will/workspace/_scratch/tools/gopls/internal/lsp/cache/analysis.go:656 +0x145 fp=0xc005607e68 sp=0xc005607dd8 pc=0x1007fce85
golang.org/x/tools/gopls/internal/lsp/cache.(*snapshot).Analyze.func6.1()
/Users/will/workspace/_scratch/tools/gopls/internal/lsp/cache/analysis.go:383 +0xda fp=0xc005607f78 sp=0xc005607e68 pc=0x1007fae7a
golang.org/x/sync/errgroup.(*Group).Go.func1()
/Users/will/go/pkg/mod/golang.org/x/sync@v0.3.0/errgroup/errgroup.go:75 +0x64 fp=0xc005607fe0 sp=0xc005607f78 pc=0x100562f04
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:1598 +0x1 fp=0xc005607fe8 sp=0xc005607fe0 pc=0x10006ee41
created by golang.org/x/sync/errgroup.(*Group).Go
/Users/will/go/pkg/mod/golang.org/x/sync@v0.3.0/errgroup/errgroup.go:72 +0xa5

goroutine 8030 [semacquire]:
runtime.gopark(0x12a921cd8?, 0x10151ca68?, 0x80?, 0x16?, 0xc000062900?)
/usr/local/go/src/runtime/proc.go:381 +0xd6 fp=0xc0008bfa00 sp=0xc0008bf9e0 pc=0x10003b756
runtime.goparkunlock(...)
/usr/local/go/src/runtime/proc.go:387
runtime.semacquire1(0xc0042eb0f8, 0x50?, 0x1, 0x0, 0x51?)
/usr/local/go/src/runtime/sema.go:160 +0x20f fp=0xc0008bfa68 sp=0xc0008bfa00 pc=0x10004cd4f
sync.runtime_Semacquire(0xc004fc4d70?)
/usr/local/go/src/runtime/sema.go:62 +0x27 fp=0xc0008bfaa0 sp=0xc0008bfa68 pc=0x10006a087
sync.(*WaitGroup).Wait(0x1009d5c40?)
/usr/local/go/src/sync/waitgroup.go:116 +0x4b fp=0xc0008bfac8 sp=0xc0008bfaa0 pc=0x10007ac8b
golang.org/x/tools/gopls/internal/lsp.(*Server).diagnose(0xc000403ce0, {0x100d73fd8, 0xc004aea930}, {0x100d81530, 0xc000437b80}, 0x1)
/Users/will/workspace/_scratch/tools/gopls/internal/lsp/diagnostics.go:392 +0xaf9 fp=0xc0008bfe80 sp=0xc0008bfac8 pc=0x1008d9699
golang.org/x/tools/gopls/internal/lsp.(*Server).diagnoseSnapshot(0xc004a02a20?, {0x100d81530, 0xc000437b80}, {0xc004ab75f0, 0x1, 0x1}, 0x50?, 0x3b9aca00)
/Users/will/workspace/_scratch/tools/gopls/internal/lsp/diagnostics.go:201 +0x1eb fp=0xc0008bff30 sp=0xc0008bfe80 pc=0x1008d868b
golang.org/x/tools/gopls/internal/lsp.(*Server).diagnoseSnapshots.func1({0x100d81530, 0xc000437b80}, {0xc004ab75f0, 0x1, 0x1})
/Users/will/workspace/_scratch/tools/gopls/internal/lsp/diagnostics.go:164 +0xde fp=0xc0008bffa8 sp=0xc0008bff30 pc=0x1008d83be
golang.org/x/tools/gopls/internal/lsp.(*Server).diagnoseSnapshots.func2()
/Users/will/workspace/_scratch/tools/gopls/internal/lsp/diagnostics.go:165 +0x3b fp=0xc0008bffe0 sp=0xc0008bffa8 pc=0x1008d82bb
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:1598 +0x1 fp=0xc0008bffe8 sp=0xc0008bffe0 pc=0x10006ee41
created by golang.org/x/tools/gopls/internal/lsp.(*Server).diagnoseSnapshots
/Users/will/workspace/_scratch/tools/gopls/internal/lsp/diagnostics.go:162 +0x90

goroutine 10246 [select]:
runtime.gopark(0xc00bdffef8?, 0x2?, 0x0?, 0xce?, 0xc00bdffed4?)
/usr/local/go/src/runtime/proc.go:381 +0xd6 fp=0xc00bdffd40 sp=0xc00bdffd20 pc=0x10003b756
runtime.selectgo(0xc00bdffef8, 0xc00bdffed0, 0xc001d6ca80?, 0x0, 0x100d81530?, 0x1)
/usr/local/go/src/runtime/select.go:327 +0x7be fp=0xc00bdffe80 sp=0xc00bdffd40 pc=0x10004bc5e
golang.org/x/tools/gopls/internal/lsp.(*Server).diagnoseSnapshot(0xc0014462a0?, {0x100d81530, 0xc0019b2dc0}, {0xc005a65360, 0x1, 0x1}, 0x18?, 0x3b9aca00)
/Users/will/workspace/_scratch/tools/gopls/internal/lsp/diagnostics.go:194 +0x1b6 fp=0xc00bdfff30 sp=0xc00bdffe80 pc=0x1008d8656
golang.org/x/tools/gopls/internal/lsp.(*Server).diagnoseSnapshots.func1({0x100d81530, 0xc0019b2dc0}, {0xc005a65360, 0x1, 0x1})
/Users/will/workspace/_scratch/tools/gopls/internal/lsp/diagnostics.go:164 +0xde fp=0xc00bdfffa8 sp=0xc00bdfff30 pc=0x1008d83be
golang.org/x/tools/gopls/internal/lsp.(*Server).diagnoseSnapshots.func2()
/Users/will/workspace/_scratch/tools/gopls/internal/lsp/diagnostics.go:165 +0x3b fp=0xc00bdfffe0 sp=0xc00bdfffa8 pc=0x1008d82bb
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:1598 +0x1 fp=0xc00bdfffe8 sp=0xc00bdfffe0 pc=0x10006ee41
created by golang.org/x/tools/gopls/internal/lsp.(*Server).diagnoseSnapshots
/Users/will/workspace/_scratch/tools/gopls/internal/lsp/diagnostics.go:162 +0x90

goroutine 8029 [semacquire]:
runtime.gopark(0xc0028c0d80?, 0x0?, 0x20?, 0xd?, 0x12a987868?)
/usr/local/go/src/runtime/proc.go:381 +0xd6 fp=0xc000328618 sp=0xc0003285f8 pc=0x10003b756
runtime.goparkunlock(...)
/usr/local/go/src/runtime/proc.go:387
runtime.semacquire1(0xc0049fd178, 0x40?, 0x1, 0x0, 0x51?)
/usr/local/go/src/runtime/sema.go:160 +0x20f fp=0xc000328680 sp=0xc000328618 pc=0x10004cd4f
sync.runtime_Semacquire(0xc004aecb80?)
/usr/local/go/src/runtime/sema.go:62 +0x27 fp=0xc0003286b8 sp=0xc000328680 pc=0x10006a087
sync.(*WaitGroup).Wait(0xc000328738?)
/usr/local/go/src/sync/waitgroup.go:116 +0x4b fp=0xc0003286e0 sp=0xc0003286b8 pc=0x10007ac8b
golang.org/x/tools/gopls/internal/lsp.(*Server).diagnoseSnapshots(0xc000403ce0, 0xc002a2a228?, 0x1)
/Users/will/workspace/_scratch/tools/gopls/internal/lsp/diagnostics.go:167 +0x1f6 fp=0xc0003287a8 sp=0xc0003286e0 pc=0x1008d8236
golang.org/x/tools/gopls/internal/lsp.(*Server).didModifyFiles.func2()
/Users/will/workspace/_scratch/tools/gopls/internal/lsp/text_synchronization.go:291 +0x37 fp=0xc0003287e0 sp=0xc0003287a8 pc=0x1008f51f7
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:1598 +0x1 fp=0xc0003287e8 sp=0xc0003287e0 pc=0x10006ee41
created by golang.org/x/tools/gopls/internal/lsp.(*Server).didModifyFiles
/Users/will/workspace/_scratch/tools/gopls/internal/lsp/text_synchronization.go:290 +0x6bf

goroutine 10245 [semacquire]:
runtime.gopark(0xc00f5ffe30?, 0x100806b65?, 0x40?, 0xab?, 0x10006cc4e?)
/usr/local/go/src/runtime/proc.go:381 +0xd6 fp=0xc00f5ffe18 sp=0xc00f5ffdf8 pc=0x10003b756
runtime.goparkunlock(...)
/usr/local/go/src/runtime/proc.go:387
runtime.semacquire1(0xc001dec7b8, 0x40?, 0x1, 0x0, 0x51?)
/usr/local/go/src/runtime/sema.go:160 +0x20f fp=0xc00f5ffe80 sp=0xc00f5ffe18 pc=0x10004cd4f
sync.runtime_Semacquire(0xc001b64e80?)
/usr/local/go/src/runtime/sema.go:62 +0x27 fp=0xc00f5ffeb8 sp=0xc00f5ffe80 pc=0x10006a087
sync.(*WaitGroup).Wait(0xc00f5fff38?)
/usr/local/go/src/sync/waitgroup.go:116 +0x4b fp=0xc00f5ffee0 sp=0xc00f5ffeb8 pc=0x10007ac8b
golang.org/x/tools/gopls/internal/lsp.(*Server).diagnoseSnapshots(0xc000403ce0, 0xc00095cf60?, 0x1)
/Users/will/workspace/_scratch/tools/gopls/internal/lsp/diagnostics.go:167 +0x1f6 fp=0xc00f5fffa8 sp=0xc00f5ffee0 pc=0x1008d8236
golang.org/x/tools/gopls/internal/lsp.(*Server).didModifyFiles.func2()
/Users/will/workspace/_scratch/tools/gopls/internal/lsp/text_synchronization.go:291 +0x37 fp=0xc00f5fffe0 sp=0xc00f5fffa8 pc=0x1008f51f7
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:1598 +0x1 fp=0xc00f5fffe8 sp=0xc00f5fffe0 pc=0x10006ee41
created by golang.org/x/tools/gopls/internal/lsp.(*Server).didModifyFiles
/Users/will/workspace/_scratch/tools/gopls/internal/lsp/text_synchronization.go:290 +0x6bf

goroutine 8177 [semacquire]:
runtime.gopark(0x0?, 0xc000f0fb20?, 0x80?, 0xd?, 0xc00148d2f0?)
/usr/local/go/src/runtime/proc.go:381 +0xd6 fp=0xc005091ab0 sp=0xc005091a90 pc=0x10003b756
runtime.goparkunlock(...)
/usr/local/go/src/runtime/proc.go:387
runtime.semacquire1(0xc0042eb108, 0x50?, 0x1, 0x0, 0x51?)
/usr/local/go/src/runtime/sema.go:160 +0x20f fp=0xc005091b18 sp=0xc005091ab0 pc=0x10004cd4f
sync.runtime_Semacquire(0xc004fc4e10?)
/usr/local/go/src/runtime/sema.go:62 +0x27 fp=0xc005091b50 sp=0xc005091b18 pc=0x10006a087
sync.(*WaitGroup).Wait(0x100d73fd8?)
/usr/local/go/src/sync/waitgroup.go:116 +0x4b fp=0xc005091b78 sp=0xc005091b50 pc=0x10007ac8b
golang.org/x/tools/gopls/internal/lsp.(*Server).diagnosePkgs(0xc000403ce0, {0x100d73fd8, 0xc004fd8060}, {0x100d81530?, 0xc000437b80}, 0xc00148c960, 0xc00148c990)
/Users/will/workspace/_scratch/tools/gopls/internal/lsp/diagnostics.go:472 +0x34a fp=0xc005091f90 sp=0xc005091b78 pc=0x1008da2ca
golang.org/x/tools/gopls/internal/lsp.(*Server).diagnose.func4()
/Users/will/workspace/_scratch/tools/gopls/internal/lsp/diagnostics.go:388 +0x3e fp=0xc005091fe0 sp=0xc005091f90 pc=0x1008d99de
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:1598 +0x1 fp=0xc005091fe8 sp=0xc005091fe0 pc=0x10006ee41
created by golang.org/x/tools/gopls/internal/lsp.(*Server).diagnose
/Users/will/workspace/_scratch/tools/gopls/internal/lsp/diagnostics.go:387 +0xaec

goroutine 8915 [semacquire]:
runtime.gopark(0xc00007e140?, 0x12a93d6f8?, 0x20?, 0xff?, 0x18?)
/usr/local/go/src/runtime/proc.go:381 +0xd6 fp=0xc001fcb570 sp=0xc001fcb550 pc=0x10003b756
runtime.goparkunlock(...)
/usr/local/go/src/runtime/proc.go:387
runtime.semacquire1(0xc001a622d0, 0x40?, 0x1, 0x0, 0x68?)
/usr/local/go/src/runtime/sema.go:160 +0x20f fp=0xc001fcb5d8 sp=0xc001fcb570 pc=0x10004cd4f
sync.runtime_Semacquire(0x100d73fd8?)
/usr/local/go/src/runtime/sema.go:62 +0x27 fp=0xc001fcb610 sp=0xc001fcb5d8 pc=0x10006a087
sync.(*WaitGroup).Wait(0xc0026a25e8?)
/usr/local/go/src/sync/waitgroup.go:116 +0x4b fp=0xc001fcb638 sp=0xc001fcb610 pc=0x10007ac8b
golang.org/x/sync/errgroup.(*Group).Wait(0xc001a622c0)
/Users/will/go/pkg/mod/golang.org/x/sync@v0.3.0/errgroup/errgroup.go:53 +0x27 fp=0xc001fcb658 sp=0xc001fcb638 pc=0x100562d67
golang.org/x/tools/gopls/internal/lsp/cache.(*snapshot).Analyze(0x0, {0x100d73fd8, 0xc00148cea0}, 0xc00148c990, {0xc0050ea800, 0xc7, 0x10004b353?}, 0xc0000e6e40)
/Users/will/workspace/_scratch/tools/gopls/internal/lsp/cache/analysis.go:411 +0xf2d fp=0xc001fcbc60 sp=0xc001fcb658 pc=0x1007fa52d
golang.org/x/tools/gopls/internal/lsp/source.Analyze({0x100d73fd8, 0xc00148cea0}, {0x100d81530, 0xc000437b80}, 0x1?, 0x1?)
/Users/will/workspace/_scratch/tools/gopls/internal/lsp/source/diagnostics.go:49 +0x1bc fp=0xc001fcbd88 sp=0xc001fcbc60 pc=0x1005d48fc
golang.org/x/tools/gopls/internal/lsp.(*Server).diagnosePkgs.func2()
/Users/will/workspace/_scratch/tools/gopls/internal/lsp/diagnostics.go:451 +0xcf fp=0xc001fcbfe0 sp=0xc001fcbd88 pc=0x1008dafaf
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:1598 +0x1 fp=0xc001fcbfe8 sp=0xc001fcbfe0 pc=0x10006ee41
created by golang.org/x/tools/gopls/internal/lsp.(*Server).diagnosePkgs
/Users/will/workspace/_scratch/tools/gopls/internal/lsp/diagnostics.go:449 +0x33d

goroutine 9827 [semacquire]:
runtime.gopark(0x0?, 0xc006dffdd8?, 0x0?, 0xac?, 0xc006dffe98?)
/usr/local/go/src/runtime/proc.go:381 +0xd6 fp=0xc006dffe10 sp=0xc006dffdf0 pc=0x10003b756
runtime.goparkunlock(...)
/usr/local/go/src/runtime/proc.go:387
runtime.semacquire1(0xc000437bc0, 0x10?, 0x1, 0x0, 0x0?)
/usr/local/go/src/runtime/sema.go:160 +0x20f fp=0xc006dffe78 sp=0xc006dffe10 pc=0x10004cd4f
sync.runtime_Semacquire(0x10?)
/usr/local/go/src/runtime/sema.go:62 +0x27 fp=0xc006dffeb0 sp=0xc006dffe78 pc=0x10006a087
sync.(*WaitGroup).Wait(0xc006dfff00?)
/usr/local/go/src/sync/waitgroup.go:116 +0x4b fp=0xc006dffed8 sp=0xc006dffeb0 pc=0x10007ac8b
golang.org/x/tools/gopls/internal/lsp/cache.(*snapshot).destroy(0xc000437b80, {0x100b1348b, 0x16})
/Users/will/workspace/_scratch/tools/gopls/internal/lsp/cache/snapshot.go:242 +0x92 fp=0xc006dfff98 sp=0xc006dffed8 pc=0x100837632
golang.org/x/tools/gopls/internal/lsp/cache.(*View).destroy.func1()
/Users/will/workspace/_scratch/tools/gopls/internal/lsp/cache/snapshot.go:236 +0x6d fp=0xc006dfffe0 sp=0xc006dfff98 pc=0x10083750d
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:1598 +0x1 fp=0xc006dfffe8 sp=0xc006dfffe0 pc=0x10006ee41
created by golang.org/x/tools/gopls/internal/lsp/cache.(*View).destroy
/Users/will/workspace/_scratch/tools/gopls/internal/lsp/cache/snapshot.go:234 +0xc5
[Error - 4:31:21 PM] Connection to server got closed. Server will not be restarted.

</details>
@findleyr
Copy link
Contributor

Thanks, this looks like a bug in the copylock analyzer!

@findleyr findleyr changed the title gopls: automated issue report (crash) x/tools/go/analysis,gopls: infinite recursion in the copylocks analyzer Jul 31, 2023
@findleyr
Copy link
Contributor

Hmm, it doesn't naively reproduce, as the type-checker likely breaks cycles in most cases.

In any case, transferring to the go issue tracker.

@findleyr findleyr transferred this issue from golang/vscode-go Jul 31, 2023
@findleyr findleyr added this to the gopls/v0.14.0 milestone Jul 31, 2023
@gopherbot gopherbot added Tools This label describes issues relating to any tools in the x/tools repository. gopls Issues related to the Go language server, gopls. labels Jul 31, 2023
@findleyr
Copy link
Contributor

Just to be sure: is this reproducible? I would guess it is not, as we should only encounter cyclical types when there are type errors, and you likely don't have any type errors any more. If it is reproducible, please let us know as I'd have more questions.

@willdhorn
Copy link
Author

I can confirm that I'm able to reproduce it, but I can't quite figure out what's causing the issue enough to produce a minimal example. If I generate just the offending type(s), then it errors but doesn't crash. When I generate the rest of the code, it crashes when certain functions (that use those types) are generated, but other functions (that also use the types) don't cause it to crash.

@willdhorn
Copy link
Author

I am able to make gopls crash consistently with the following:

type A struct {
	a A
}

type B struct {
	a A
	b B
}

func okay(x A) {}                  // <- safe
func sure()    { var x A; nop(x) } // <- safe

var fine B     // <-- safe
func what(x B) {}                  // <-- crashes
func bad()     { var x B; nop(x) } // <-- crashes
func good()      { nop(B{}) }                   // <-- safe
func stillgood() { nop(B{b: B{b: B{b: B{}}}}) } // <-- safe
func nope() { nop(B{}.b)}  // <-- crashes

func nop(any) {} // only used to get around unused variable errors

@findleyr findleyr changed the title x/tools/go/analysis,gopls: infinite recursion in the copylocks analyzer x/tools/go/analysis,gopls: infinite recursion in the copylock analyzer Aug 1, 2023
@findleyr
Copy link
Contributor

findleyr commented Aug 1, 2023

Thanks so much for the repro! I've confirmed that this is reproducible with just the analysis framework.

@findleyr findleyr modified the milestones: gopls/v0.14.0, gopls/v0.13.2 Aug 1, 2023
@gopherbot
Copy link
Contributor

Change https://go.dev/cl/514818 mentions this issue: go/analysis/passes/copylock: fix infinite recursion

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
FrozenDueToAge gopls Issues related to the Go language server, gopls. Tools This label describes issues relating to any tools in the x/tools repository.
Projects
None yet
Development

No branches or pull requests

3 participants