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

go/types: panic "assertion failed" when autocompleting generic test code #47923

Open
jayconrod opened this issue Aug 23, 2021 · 3 comments
Open

go/types: panic "assertion failed" when autocompleting generic test code #47923

jayconrod opened this issue Aug 23, 2021 · 3 comments
Assignees
Milestone

Comments

@jayconrod
Copy link
Contributor

@jayconrod jayconrod commented Aug 23, 2021

What version of Go are you using (go version)?

$ go version
go version devel go1.18-8486ced8b0 Mon Aug 23 17:51:41 2021 +0000 linux/amd64
golang.org/x/tools/gopls v0.7.1
    golang.org/x/tools/gopls@v0.7.1 h1:Mh3Z8Xcoq3Zy7ksSlwDV/nzQSbjFf06A+L+F8YHq55U=

Does this issue reproduce with the latest release?

no, just master as of today

What operating system and processor architecture are you using (go env)?

go env Output
$ go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/jay/.cache/go-build"
GOENV="/home/jay/.config/go/env"
GOEXE=""
GOEXPERIMENT=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOINSECURE=""
GOMODCACHE="/home/jay/.cache/gomodcache"
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/home/jay/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/home/jay/Code/goroot"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/home/jay/Code/goroot/pkg/tool/linux_amd64"
GOVCS=""
GOVERSION="devel go1.18-8486ced8b0 Mon Aug 23 17:51:41 2021 +0000"
GCCGO="gccgo"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/home/jay/Code/goroot/src/cmd/go.mod"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build4033947821=/tmp/go-build -gno-record-gcc-switches"

What did you do?

Started parameterizing cmd/go/internal/par.Cache. See CL 344513.

This happened as I was adding type arguments to the cache variable in cache_test.go. The file looked like this:

// Copyright 2021 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package par

import "testing"

func TestCache(t *testing.T) {
	var cache Cache[int, ]

	n := 1
	v := cache.Do(1, func() interface{} { n++; return n })
	if v != 2 {
		t.Fatalf("cache.Do(1) did not run f")
	}
	v = cache.Do(1, func() interface{} { n++; return n })
	if v != 2 {
		t.Fatalf("cache.Do(1) ran f again!")
	}
	v = cache.Do(2, func() interface{} { n++; return n })
	if v != 3 {
		t.Fatalf("cache.Do(2) did not run f")
	}
	v = cache.Do(1, func() interface{} { n++; return n })
	if v != 2 {
		t.Fatalf("cache.Do(1) did not returned saved value from original cache.Do(1)")
	}
}

What did you expect to see?

nothing exciting

What did you see instead?

gopls crashed with the panic below:

panic: assertion failed [recovered]
	panic: assertion failed

goroutine 12647 [running]:
go/types.(*Checker).handleBailout(0xc00040cb40, 0xc011ef7690)
	/home/jay/Code/goroot/src/go/types/check.go:244 +0x8b
panic({0xc0cca0, 0xe6da40})
	/home/jay/Code/goroot/src/runtime/panic.go:814 +0x214
go/types.assert(...)
	/home/jay/Code/goroot/src/go/types/errors.go:20
go/types.(*unifier).nify(0xc00d87f440, {0xe841d8, 0xc00b6ebd40}, {0xe841d8, 0xc00d87f3b0}, 0x0)
	/home/jay/Code/goroot/src/go/types/unify.go:437 +0xe56
go/types.(*unifier).nify(0xc00d87f440, {0xe84200, 0xc009b0e970}, {0xe84200, 0xc009b0f480}, 0x0)
	/home/jay/Code/goroot/src/go/types/unify.go:325 +0x825
go/types.(*unifier).unify(...)
	/home/jay/Code/goroot/src/go/types/unify.go:60
go/types.(*Checker).infer(0xc00040cb40, {0xe71d20, 0xc01115ef50}, {0xc009b0e960, 0x2, 0x4b018}, {0x0, 0x4b029, 0x40ec8b}, 0xc0107b6408, ...)
	/home/jay/Code/goroot/src/go/types/infer.go:156 +0x688
go/types.(*Checker).selector(0xc00040cb40, 0xc00f6c9880, 0xc00f4453f8)
	/home/jay/Code/goroot/src/go/types/call.go:547 +0x1a93
go/types.(*Checker).exprInternal(0xc00040cb40, 0xc00f6c9880, {0xe867a0, 0xc00f4453f8}, {0x0, 0x0})
	/home/jay/Code/goroot/src/go/types/expr.go:1364 +0xc32
go/types.(*Checker).rawExpr(0xc006024618, 0x0, {0xe867a0, 0xc00f4453f8}, {0x0, 0x0})
	/home/jay/Code/goroot/src/go/types/expr.go:1075 +0x3a
go/types.(*Checker).exprOrType(0x1000000000000d0, 0x7fb11240f668, {0xe867a0, 0xc00f4453f8})
	/home/jay/Code/goroot/src/go/types/expr.go:1557 +0x32
go/types.(*Checker).callExpr(0xc00040cb40, 0xc00f6c9880, 0xc00f4fc200)
	/home/jay/Code/goroot/src/go/types/call.go:88 +0x2e5
go/types.(*Checker).exprInternal(0xc00040cb40, 0xc00f6c9880, {0xe86200, 0xc00f4fc200}, {0x0, 0x0})
	/home/jay/Code/goroot/src/go/types/expr.go:1408 +0x945
go/types.(*Checker).rawExpr(0xc00f6c9880, 0x0, {0xe86200, 0xc00f4fc200}, {0x0, 0x0})
	/home/jay/Code/goroot/src/go/types/expr.go:1075 +0x3a
go/types.(*Checker).multiExpr(0xd0, 0x203003, {0xe86200, 0xc00f4fc200})
	/home/jay/Code/goroot/src/go/types/expr.go:1538 +0x32
go/types.(*Checker).exprList(0x10, {0xc009b0e240, 0xc0015ec0f8, 0xc0015ec158}, 0x0)
	/home/jay/Code/goroot/src/go/types/call.go:213 +0x97
go/types.(*Checker).initVars(0xc3c940, {0xc002193e60, 0x1, 0x0}, {0xc009b0e240, 0xc00ab3ab40, 0x415545}, 0x0)
	/home/jay/Code/goroot/src/go/types/assignments.go:235 +0x7b
go/types.(*Checker).shortVarDecl(0xc00040cb40, {0xe730a0, 0xc00ef9b158}, {0xc009b0e1e0, 0x1, 0x0}, {0xc009b0e240, 0x3c2b0, 0x1})
	/home/jay/Code/goroot/src/go/types/assignments.go:367 +0x9c5
go/types.(*Checker).stmt(0xc00040cb40, 0x0, {0xe86080, 0xc00f4fc240})
	/home/jay/Code/goroot/src/go/types/stmt.go:429 +0x16a7
go/types.(*Checker).stmtList(0xe84188, 0x0, {0xc00658cc00, 0x0, 0x1})
	/home/jay/Code/goroot/src/go/types/stmt.go:130 +0xc9
go/types.(*Checker).funcBody(0xc00040cb40, 0xc00f1b9260, {0xc00040cb40, 0x7fb1124be998}, 0xc00f4fde80, 0xc00ab3ba10, {0x0, 0x0})
	/home/jay/Code/goroot/src/go/types/stmt.go:46 +0x259
go/types.(*Checker).funcDecl.func1()
	/home/jay/Code/goroot/src/go/types/decl.go:786 +0x45
go/types.(*Checker).processDelayed(0xc00040cb40, 0x0)
	/home/jay/Code/goroot/src/go/types/check.go:298 +0x35
go/types.(*Checker).checkFiles(0xc00040cb40, {0xc00f4fc880, 0xc01b6de370, 0x2})
	/home/jay/Code/goroot/src/go/types/check.go:266 +0xcb
go/types.(*Checker).Files(...)
	/home/jay/Code/goroot/src/go/types/check.go:249
golang.org/x/tools/internal/lsp/cache.doTypeCheck({0xe890d8, 0xc00f2c7ec0}, 0xc010b6c100, 0xc0085fa870, 0x2, 0xc00aebf3b0, 0xc0000320c0)
	/home/jay/.cache/gomodcache/golang.org/x/tools@v0.1.6-0.20210802203754-9b21a8868e16/internal/lsp/cache/check.go:544 +0x893
golang.org/x/tools/internal/lsp/cache.typeCheck({0xe890d8, 0xc00f2c7ec0}, 0xc010b6c100, 0xc0085fa870, 0x2, 0xc00aebf3b0)
	/home/jay/.cache/gomodcache/golang.org/x/tools@v0.1.6-0.20210802203754-9b21a8868e16/internal/lsp/cache/check.go:321 +0xe5
golang.org/x/tools/internal/lsp/cache.(*snapshot).buildPackageHandle.func1({0xe890d8, 0xc00f2c7ec0}, {0xe72060, 0xc010b6c100})
	/home/jay/.cache/gomodcache/golang.org/x/tools@v0.1.6-0.20210802203754-9b21a8868e16/internal/lsp/cache/check.go:124 +0x23e
golang.org/x/tools/internal/memoize.(*Handle).run.func1()
	/home/jay/.cache/gomodcache/golang.org/x/tools@v0.1.6-0.20210802203754-9b21a8868e16/internal/memoize/memoize.go:322 +0xa9
created by golang.org/x/tools/internal/memoize.(*Handle).run
	/home/jay/.cache/gomodcache/golang.org/x/tools@v0.1.6-0.20210802203754-9b21a8868e16/internal/memoize/memoize.go:315 +0x1c5

Full output attached (too big for comment): types-assertion-failed.txt

Unfortunately, I couldn't reproduce this. Everything worked after reloading the editor window.

cc @findleyr

@findleyr
Copy link
Contributor

@findleyr findleyr commented Aug 23, 2021

Thanks for reporting.

CC @griesemer

@jayconrod
Copy link
Contributor Author

@jayconrod jayconrod commented Aug 23, 2021

The compiler didn't like my code either 😭 #47924

@griesemer
Copy link
Contributor

@griesemer griesemer commented Aug 23, 2021

Some of the new type-checker code is probably not as fault-tolerant yet as the old code.

@griesemer griesemer added this to the Go1.18 milestone Aug 23, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Linked pull requests

Successfully merging a pull request may close this issue.

None yet
3 participants