Skip to content

cmd/compile: internal compiler error: assertion failed with type aliases #73309

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

Open
cachesdev opened this issue Apr 10, 2025 · 4 comments
Open
Assignees
Labels
compiler/runtime Issues related to the Go compiler and/or runtime. NeedsInvestigation Someone must examine and confirm this is a valid issue and not a duplicate of an existing one.
Milestone

Comments

@cachesdev
Copy link

Go version

go version go1.24.2 linux/amd64

Output of go env in your module/workspace:

AR='ar'
CC='gcc'
CGO_CFLAGS='-O2 -g'
CGO_CPPFLAGS=''
CGO_CXXFLAGS='-O2 -g'
CGO_ENABLED='1'
CGO_FFLAGS='-O2 -g'
CGO_LDFLAGS='-O2 -g'
CXX='g++'
GCCGO='gccgo'
GO111MODULE=''
GOAMD64='v1'
GOARCH='amd64'
GOAUTH='netrc'
GOBIN=''
GOCACHE='/home/caches/.cache/go-build'
GOCACHEPROG=''
GODEBUG=''
GOENV='/home/caches/.config/go/env'
GOEXE=''
GOEXPERIMENT=''
GOFIPS140='off'
GOFLAGS=''
GOGCCFLAGS='-fPIC -m64 -pthread -Wl,--no-gc-sections -fmessage-length=0 -ffile-prefix-map=/tmp/go-build918672315=/tmp/go-build -gno-record-gcc-switches'
GOHOSTARCH='amd64'
GOHOSTOS='linux'
GOINSECURE=''
GOMOD='/home/caches/repos/veritas/go.mod'
GOMODCACHE='/home/caches/go/pkg/mod'
GONOPROXY=''
GONOSUMDB=''
GOOS='linux'
GOPATH='/home/caches/go'
GOPRIVATE=''
GOPROXY='https://proxy.golang.org,direct'
GOROOT='/usr/local/go'
GOSUMDB='sum.golang.org'
GOTELEMETRY='local'
GOTELEMETRYDIR='/home/caches/.config/go/telemetry'
GOTMPDIR=''
GOTOOLCHAIN='auto'
GOTOOLDIR='/usr/local/go/pkg/tool/linux_amd64'
GOVCS=''
GOVERSION='go1.24.2'
GOWORK=''
PKG_CONFIG='pkg-config'

What did you do?

playground link

What did you see happen?

running or trying to build this code causes the following error:

./prog.go:43:6: internal compiler error: assertion failed

Please file a bug report including a short program that triggers the error.
https://go.dev/issue/new

Go build failed.

if importing the code as a package, we see the following error from gopls (package name redacted):

could not import github.com/(...)/validator (missing import github.com/(...)/validator)compilerBrokenImport

removing the type aliases makes the code runnable.
playground link with type aliases removed

What did you expect to see?

a passing test. valid printed in the console.

@cachesdev
Copy link
Author

at some point I also managed to trigger a panic, but I cannot reproduce it anymore. it may have been in an older go version. I did conserve the output:

❯ go test ./...
# github.com/(...)/validator_test [github.com/(...)/validator.test]
fatal error: all goroutines are asleep - deadlock!

goroutine 1 [sync.Mutex.Lock]:
internal/sync.runtime_SemacquireMutex(0x7f30e6065108?, 0xd3?, 0xc000470c88?)
	runtime/sema.go:95 +0x25
internal/sync.(*Mutex).lockSlow(0xc00046c6b8)
	internal/sync/mutex.go:149 +0x15d
internal/sync.(*Mutex).Lock(...)
	internal/sync/mutex.go:70
sync.(*Mutex).Lock(...)
	sync/mutex.go:46
cmd/compile/internal/types2.(*Named).resolve(0xc00046c690)
	cmd/compile/internal/types2/named.go:176 +0x5f
cmd/compile/internal/types2.(*Named).TypeParams(...)
	cmd/compile/internal/types2/named.go:322
cmd/compile/internal/types2.(*subster).typ(0xc0004713c8, {0x102cce8, 0xc00046c700})
	cmd/compile/internal/types2/subst.go:245 +0x82b
cmd/compile/internal/types2.(*subster).var_(0xc000471208?, 0xc00046c770)
	cmd/compile/internal/types2/subst.go:288 +0x2c
cmd/compile/internal/types2.substList[...](...)
	cmd/compile/internal/types2/subst.go:317
cmd/compile/internal/types2.(*subster).tuple(0x0?, 0xc000406528)
	cmd/compile/internal/types2/subst.go:304 +0xa3
cmd/compile/internal/types2.(*subster).typ(0xc0004713c8, {0x102ccc0, 0xc000465280})
	cmd/compile/internal/types2/subst.go:164 +0x44a
cmd/compile/internal/types2.(*Checker).subst(0x0, {0x0?, 0x0?, 0x0?}, {0x102ccc0, 0xc000465280}, 0xc0004668d0, 0x0, 0xc000113400)
	cmd/compile/internal/types2/subst.go:78 +0x1ac
cmd/compile/internal/types2.(*Checker).newAliasInstance(0x0, {0x0?, 0xe5e04491?, 0x7f30?}, 0xc0004652c0, {0xc000039b50, 0x1, 0x1}, 0x0, 0xc000113400)
	cmd/compile/internal/types2/alias.go:165 +0x1c5
cmd/compile/internal/types2.(*Checker).instance(0x0, {0x0, 0x0, 0x0}, {0x102e3d8, 0xc0004652c0}, {0xc000039b50, 0x1, 0x1}, 0x0, ...)
	cmd/compile/internal/types2/instantiate.go:150 +0x4b0
cmd/compile/internal/types2.Instantiate(0xc000113400, {0x102cd10, 0xc0004652c0}, {0xc000039b50, 0x1, 0x1}, 0x0)
	cmd/compile/internal/types2/instantiate.go:70 +0x326
cmd/compile/internal/importer.(*reader).doTyp(0xc000471800)
	cmd/compile/internal/importer/ureader.go:258 +0xcc
cmd/compile/internal/importer.(*pkgReader).typIdx(0xc000000540, {0x540?, 0xc0?}, 0xc00045cde0)
	cmd/compile/internal/importer/ureader.go:231 +0x18e
cmd/compile/internal/importer.(*reader).typ(0xc000471a28)
	cmd/compile/internal/importer/ureader.go:201 +0x68
cmd/compile/internal/importer.(*reader).doTyp(0xc000471a28)
	cmd/compile/internal/importer/ureader.go:279 +0x15b
cmd/compile/internal/importer.(*pkgReader).typIdx(0xc000000540, {0x540?, 0xc0?}, 0xc00045cde0)
	cmd/compile/internal/importer/ureader.go:231 +0x18e
cmd/compile/internal/importer.(*reader).typ(0xc000471d20)
	cmd/compile/internal/importer/ureader.go:201 +0x68
cmd/compile/internal/importer.(*reader).structType(0xc000471d20)
	cmd/compile/internal/importer/ureader.go:295 +0xe7
cmd/compile/internal/importer.(*reader).doTyp(0xc000471d20)
	cmd/compile/internal/importer/ureader.go:281 +0x3a5
cmd/compile/internal/importer.(*pkgReader).typIdx(0xc000000540, {0x45c300?, 0xc0?}, 0xc00045cde0)
	cmd/compile/internal/importer/ureader.go:231 +0x18e
cmd/compile/internal/importer.(*reader).typ(0xc00045ce40)
	cmd/compile/internal/importer/ureader.go:201 +0x68
cmd/compile/internal/importer.ReadPackage.(*pkgReader).objIdx.func1.1(0x32?)
	cmd/compile/internal/importer/ureader.go:450 +0x3e
cmd/compile/internal/types2.(*Named).resolve(0xc00046c690)
	cmd/compile/internal/types2/named.go:215 +0xf7
cmd/compile/internal/types2.(*Named).TypeParams(...)
	cmd/compile/internal/types2/named.go:322
cmd/compile/internal/types2.(*subster).typ(0xc000472608, {0x102cce8, 0xc00046c700})
	cmd/compile/internal/types2/subst.go:245 +0x82b
cmd/compile/internal/types2.(*subster).var_(0xc000472448?, 0xc00046c770)
	cmd/compile/internal/types2/subst.go:288 +0x2c
cmd/compile/internal/types2.substList[...](...)
	cmd/compile/internal/types2/subst.go:317
cmd/compile/internal/types2.(*subster).tuple(0x7f30e606e170?, 0xc000406528)
	cmd/compile/internal/types2/subst.go:304 +0xa3
cmd/compile/internal/types2.(*subster).typ(0xc000472608, {0x102ccc0, 0xc000465280})
	cmd/compile/internal/types2/subst.go:164 +0x44a
cmd/compile/internal/types2.(*Checker).subst(0x0, {0x0?, 0x0?, 0x0?}, {0x102ccc0, 0xc000465280}, 0xc0004667e0, 0x0, 0xc000113400)
	cmd/compile/internal/types2/subst.go:78 +0x1ac
cmd/compile/internal/types2.(*Checker).newAliasInstance(0x0, {0x0?, 0xe5e04491?, 0x7f30?}, 0xc0004652c0, {0xc000039b20, 0x1, 0x1}, 0x0, 0xc000113400)
	cmd/compile/internal/types2/alias.go:165 +0x1c5
cmd/compile/internal/types2.(*Checker).instance(0x0, {0x0, 0x0, 0x0}, {0x102e3d8, 0xc0004652c0}, {0xc000039b20, 0x1, 0x1}, 0x0, ...)
	cmd/compile/internal/types2/instantiate.go:150 +0x4b0
cmd/compile/internal/types2.Instantiate(0xc000113400, {0x102cd10, 0xc0004652c0}, {0xc000039b20, 0x1, 0x1}, 0x0)
	cmd/compile/internal/types2/instantiate.go:70 +0x326
cmd/compile/internal/importer.(*reader).doTyp(0xc000472a40)
	cmd/compile/internal/importer/ureader.go:258 +0xcc
cmd/compile/internal/importer.(*pkgReader).typIdx(0xc000000540, {0x540?, 0xc0?}, 0xc00045cb40)
	cmd/compile/internal/importer/ureader.go:231 +0x18e
cmd/compile/internal/importer.(*reader).typ(0xc0000a6c68)
	cmd/compile/internal/importer/ureader.go:201 +0x68
cmd/compile/internal/importer.(*reader).doTyp(0xc0000a6c68)
	cmd/compile/internal/importer/ureader.go:279 +0x15b
cmd/compile/internal/importer.(*pkgReader).typIdx(0xc000000540, {0x540?, 0xc0?}, 0xc00045cb40)
	cmd/compile/internal/importer/ureader.go:231 +0x18e
cmd/compile/internal/importer.(*reader).typ(0xc00045cc00)
	cmd/compile/internal/importer/ureader.go:201 +0x68
cmd/compile/internal/importer.(*reader).param(0xc00045cc00)
	cmd/compile/internal/importer/ureader.go:365 +0x65
cmd/compile/internal/importer.(*reader).params(0xc00045cc00)
	cmd/compile/internal/importer/ureader.go:355 +0x74
cmd/compile/internal/importer.(*reader).signature(0xc00045cc00, 0x0, {0x0, 0x0, 0x0}, {0xc0000788a8, 0x1, 0x1})
	cmd/compile/internal/importer/ureader.go:344 +0x65
cmd/compile/internal/importer.ReadPackage.(*pkgReader).objIdx.func1()
	cmd/compile/internal/importer/ureader.go:437 +0x325
cmd/compile/internal/types2.resolve.func1()
	cmd/compile/internal/types2/scope.go:176 +0x39
sync.(*Once).doSlow(0xc0000a70f8?, 0xc0000a7050?)
	sync/once.go:78 +0xab
sync.(*Once).Do(...)
	sync/once.go:69
cmd/compile/internal/types2.resolve({0xc000010dc7?, 0xeb2c949b29a6f35d?}, {0x1035c60?, 0xc0004661e0?})
	cmd/compile/internal/types2/scope.go:175 +0x77
cmd/compile/internal/types2.(*Scope).Lookup(0xe24840?, {0xc000010dc7, 0x5})
	cmd/compile/internal/types2/scope.go:71 +0x4b
cmd/compile/internal/types2.(*Checker).selector(0xc0000036c0, 0xc000465180, 0xc0004039a0, 0x0, 0x0)
	cmd/compile/internal/types2/call.go:720 +0x21f
cmd/compile/internal/types2.(*Checker).exprInternal(0xc0000036c0, 0xc0000a74a8?, 0xc000465180, {0x1030d18, 0xc0004039a0}, {0x0?, 0x0?})
	cmd/compile/internal/types2/expr.go:1052 +0x6cc
cmd/compile/internal/types2.(*Checker).rawExpr(0xc0000036c0, 0x0, 0xc000465180, {0x1030d18?, 0xc0004039a0?}, {0x0?, 0x0?}, 0x1)
	cmd/compile/internal/types2/expr.go:959 +0x194
cmd/compile/internal/types2.(*Checker).exprOrType(0xc0000036c0, 0xc000465180, {0x1030d18?, 0xc0004039a0?}, 0xe0?)
	cmd/compile/internal/types2/expr.go:1335 +0x45
cmd/compile/internal/types2.(*Checker).callExpr(0xc0000036c0, 0xc000465180, 0xc00013d340)
	cmd/compile/internal/types2/call.go:185 +0x105
cmd/compile/internal/types2.(*Checker).exprInternal(0xc0000036c0, 0x167b400?, 0xc000465180, {0x1030d60, 0xc00013d340}, {0x102cce8?, 0xc00046c460?})
	cmd/compile/internal/types2/expr.go:1104 +0x688
cmd/compile/internal/types2.(*Checker).rawExpr(0xc0000036c0, 0x0, 0xc000465180, {0x1030d60?, 0xc00013d340?}, {0x102cce8?, 0xc00046c460?}, 0x0)
	cmd/compile/internal/types2/expr.go:959 +0x194
cmd/compile/internal/types2.(*Checker).exprWithHint(0xc0000036c0, 0xc000465180, {0x1030d60, 0xc00013d340}, {0x102cce8, 0xc00046c460})
	cmd/compile/internal/types2/expr.go:1325 +0x65
cmd/compile/internal/types2.(*Checker).indexedElts(0xc0000036c0, {0xc0000392b0, 0x1, 0xc0000a7e40?}, {0x102cce8, 0xc00046c460}, 0xffffffffffffffff)
	cmd/compile/internal/types2/literals.go:386 +0x13e
cmd/compile/internal/types2.(*Checker).compositeLit(0xc0000036c0, 0xc000465040, 0xc000044780, {0x0?, 0x0?})
	cmd/compile/internal/types2/literals.go:263 +0x251
cmd/compile/internal/types2.(*Checker).exprInternal(0xc0000036c0, 0x41b9c5?, 0xc000465040, {0x1030e38, 0xc000044780}, {0x0?, 0x0?})
	cmd/compile/internal/types2/expr.go:1040 +0x5a5
cmd/compile/internal/types2.(*Checker).rawExpr(0xc0000036c0, 0x0, 0xc000465040, {0x1030e38?, 0xc000044780?}, {0x0?, 0x0?}, 0x0)
	cmd/compile/internal/types2/expr.go:959 +0x194
cmd/compile/internal/types2.(*Checker).expr(0xc0000036c0, 0x0?, 0xc000465040, {0x1030e38?, 0xc000044780?})
	cmd/compile/internal/types2/expr.go:1275 +0x30
cmd/compile/internal/types2.(*Checker).initVars(0xc0000036c0, {0xc000078888, 0x1, 0x1?}, {0xc0004748a8, 0xffffffffffffffff?, 0x7f30e6065108?}, {0x0, 0x0})
	cmd/compile/internal/types2/assignments.go:409 +0x645
cmd/compile/internal/types2.(*Checker).shortVarDecl(...)
	cmd/compile/internal/types2/assignments.go:584
cmd/compile/internal/types2.(*Checker).stmt(0xc0000036c0, 0x0, {0x102ea90, 0xc000405240})
	cmd/compile/internal/types2/stmt.go:508 +0x385c
cmd/compile/internal/types2.(*Checker).stmtList(0xc0000036c0, 0x0, {0xc0001133c0?, 0xc0000a8c90?, 0xc99791?})
	cmd/compile/internal/types2/stmt.go:122 +0x85
cmd/compile/internal/types2.(*Checker).funcBody(0xc0000036c0, 0xc0004084e0?, {0xc000010db0?, 0x6954c772387e2e16?}, 0xc000464c40, 0xc000405200, {0x0?, 0x0?})
	cmd/compile/internal/types2/stmt.go:42 +0x310
cmd/compile/internal/types2.(*Checker).objDecl.(*Checker).funcDecl.func4()
	cmd/compile/internal/types2/decl.go:775 +0x3a
cmd/compile/internal/types2.(*Checker).processDelayed(0xc0000036c0, 0x0)
	cmd/compile/internal/types2/check.go:525 +0x211
cmd/compile/internal/types2.(*Checker).checkFiles(0xc0000036c0, {0xc0000786e0?, 0x167b400?, 0x167b928?})
	cmd/compile/internal/types2/check.go:467 +0x814
cmd/compile/internal/types2.(*Checker).Files(0x7ffce26d5fc5?, {0xc0000786e0?, 0x0?, 0x0?})
	cmd/compile/internal/types2/check.go:427 +0x75
cmd/compile/internal/types2.(*Config).Check(0xc00013d420, {0x7ffce26d5fc5?, 0xc0000100e7?}, {0xc0000786e0, 0x1, 0x1}, 0xc000408540)
	cmd/compile/internal/types2/api.go:488 +0x19d
cmd/compile/internal/noder.checkFiles({0x0, {0x0, 0x0}}, {0xc0000786c0, 0x1, 0xe59560?})
	cmd/compile/internal/noder/irgen.go:95 +0x5c9
cmd/compile/internal/noder.writePkgStub({0x0?, {0x0?, 0x0?}}, {0xc0000786c0, 0x1, 0x1})
	cmd/compile/internal/noder/unified.go:319 +0x6a
cmd/compile/internal/noder.unified({0x0?, {0x0?, 0x0?}}, {0xc0000786c0?, 0xddae60?, 0x0?})
	cmd/compile/internal/noder/unified.go:195 +0xb3
cmd/compile/internal/noder.LoadPackage({0xc000020260, 0x1, 0x2})
	cmd/compile/internal/noder/noder.go:77 +0x43a
cmd/compile/internal/gc.Main(0xeee068)
	cmd/compile/internal/gc/main.go:208 +0xcc5
main.main()
	cmd/compile/main.go:57 +0xf9
FAIL	github.com/(...)/validator [build failed]
FAIL

@seankhliao seankhliao changed the title compiler: generic type aliases causes build to fail, gopls imports to break cmd/compile: internal compiler error: assertion failed with type aliases Apr 10, 2025
@gopherbot gopherbot added the compiler/runtime Issues related to the Go compiler and/or runtime. label Apr 10, 2025
@dmitshur
Copy link
Contributor

CC @golang/compiler.

@dmitshur dmitshur added the NeedsInvestigation Someone must examine and confirm this is a valid issue and not a duplicate of an existing one. label Apr 10, 2025
@dmitshur dmitshur added this to the Go1.25 milestone Apr 10, 2025
@JunyangShao
Copy link
Contributor

JunyangShao commented Apr 10, 2025

Thanks for finding the issue! I think the problem might be related to recursive type parameters:
I tried this smaller example and it panics with the same error:

package main

import (
        "fmt"
        "reflect"
)

type B[T any] struct {
        a A[T]
}

type A[T any] = func (B[T]) bool

func main() {
        var s A[int];

        fmt.Println(reflect.TypeOf(s))
}

However, changing the definition of A to be:

type A[T any] = struct {
        b B[T]
}

The compiler will error out with this message:

# command-line-arguments
./test3.go:9:4: invalid recursive type: B refers to itself

I guess the reason of this panic might be that the type recursion checker does not have a case for function types yet.
Looking into this further now...

@cuonglm
Copy link
Member

cuonglm commented Apr 10, 2025

Seems to be duplicated of #63285

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
compiler/runtime Issues related to the Go compiler and/or runtime. NeedsInvestigation Someone must examine and confirm this is a valid issue and not a duplicate of an existing one.
Projects
Development

No branches or pull requests

8 participants