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

cmd/go: compiler panic on recursive structures #45661

Closed
sisoftrg opened this issue Apr 21, 2021 · 2 comments
Closed

cmd/go: compiler panic on recursive structures #45661

sisoftrg opened this issue Apr 21, 2021 · 2 comments

Comments

@sisoftrg
Copy link

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

$ go version
go version go1.16.3 linux/amd64

Does this issue reproduce with the latest release?

Yes

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

go env Output
$ go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/root/.cache/go-build"
GOENV="/root/.config/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOINSECURE=""
GOMODCACHE="/root/go/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/root/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/lib/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/lib/go/pkg/tool/linux_amd64"
GOVCS=""
GOVERSION="go1.16.3"
GCCGO="/usr/bin/gccgo"
AR="ar"
CC="x86_64-pc-linux-gnu-gcc"
CXX="x86_64-pc-linux-gnu-g++"
CGO_ENABLED="1"
GOMOD="/dev/null"
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-build3022878780=/tmp/go-build -gno-record-gcc-switches"

What did you do?

In case of recursive structures (type X includes Y and type Y includes X) by mistake I got panic in compiler instead of readable error. Minimal example to reproduce:
https://play.golang.org/p/pvO3GSWnExA
So simple in this example, but hard to find such issue origin in big project without descriptive error.

What did you expect to see?

./1.go:7:6: invalid recursive type X
        /home/1.go:7:6: X refers to
        /home/1.go:12:6: Y refers to
        /home/1.go:7:6: X

What did you see instead?

panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x30 pc=0xa43ea5]

goroutine 1 [running]:
cmd/compile/internal/gc.findTypeLoop(0xc0000d2120, 0xc000110788, 0xc00009c240)
        /usr/lib/go/src/cmd/compile/internal/gc/align.go:202 +0x105
cmd/compile/internal/gc.findTypeLoop(0xc0000d2060, 0xc000110788, 0x1)
        /usr/lib/go/src/cmd/compile/internal/gc/align.go:216 +0x2c5
cmd/compile/internal/gc.findTypeLoop(0xc0000d2000, 0xc000110788, 0xc000098110)
        /usr/lib/go/src/cmd/compile/internal/gc/align.go:202 +0x117
cmd/compile/internal/gc.findTypeLoop(0xc0000d8000, 0xc000110788, 0x0)
        /usr/lib/go/src/cmd/compile/internal/gc/align.go:216 +0x2c5
cmd/compile/internal/gc.findTypeLoop(0xc0000d3f80, 0xc000110788, 0x2)
        /usr/lib/go/src/cmd/compile/internal/gc/align.go:202 +0x117
cmd/compile/internal/gc.reportTypeLoop(0xc0000d3f80)
        /usr/lib/go/src/cmd/compile/internal/gc/align.go:240 +0x76
cmd/compile/internal/gc.dowidth(0xc0000d3f80)
        /usr/lib/go/src/cmd/compile/internal/gc/align.go:282 +0x1105
cmd/compile/internal/gc.widstruct(0xc0000d2000, 0xc0000d2000, 0x0, 0x1, 0x8)
        /usr/lib/go/src/cmd/compile/internal/gc/align.go:114 +0xd3
cmd/compile/internal/gc.dowidth(0xc0000d2000)
        /usr/lib/go/src/cmd/compile/internal/gc/align.go:435 +0x4cf
cmd/compile/internal/gc.widstruct(0xc0000d3f80, 0xc0000d3f80, 0x0, 0x1, 0x18)
        /usr/lib/go/src/cmd/compile/internal/gc/align.go:114 +0xd3
cmd/compile/internal/gc.dowidth(0xc0000d3f80)
        /usr/lib/go/src/cmd/compile/internal/gc/align.go:435 +0x4cf
cmd/compile/internal/gc.widstruct(0xc0000d2060, 0xc0000d2060, 0x0, 0x1, 0x8)
        /usr/lib/go/src/cmd/compile/internal/gc/align.go:114 +0xd3
cmd/compile/internal/gc.dowidth(0xc0000d2060)
        /usr/lib/go/src/cmd/compile/internal/gc/align.go:435 +0x4cf
cmd/compile/internal/gc.resumecheckwidth()
        /usr/lib/go/src/cmd/compile/internal/gc/align.go:526 +0x4c
cmd/compile/internal/gc.typecheckdef(0xc0000b9950)
        /usr/lib/go/src/cmd/compile/internal/gc/typecheck.go:3695 +0x8e5
cmd/compile/internal/gc.typecheck1(0xc0000b9950, 0x4, 0x0)
        /usr/lib/go/src/cmd/compile/internal/gc/typecheck.go:343 +0xbace
cmd/compile/internal/gc.typecheck(0xc0000b9950, 0x4, 0x0)
        /usr/lib/go/src/cmd/compile/internal/gc/typecheck.go:299 +0x785
cmd/compile/internal/gc.typecheck1(0xc0000c8280, 0x1, 0x0)
        /usr/lib/go/src/cmd/compile/internal/gc/typecheck.go:2077 +0x4e65
cmd/compile/internal/gc.typecheck(0xc0000c8280, 0x1, 0x0)
        /usr/lib/go/src/cmd/compile/internal/gc/typecheck.go:299 +0x785
cmd/compile/internal/gc.Main(0xcc8d40)
        /usr/lib/go/src/cmd/compile/internal/gc/main.go:603 +0x2aa5
main.main()
        /usr/lib/go/src/cmd/compile/main.go:52 +0xb1
@cuonglm
Copy link
Member

cuonglm commented Apr 21, 2021

Duplicated of #44266

@ALTree
Copy link
Member

ALTree commented Apr 21, 2021

Thanks for reporting this.

As @cuonglm pointed out, this is #44266, and I've confirmed it's already fixed on tip. Closing here since no further action is required.

@ALTree ALTree closed this as completed Apr 21, 2021
@golang golang locked and limited conversation to collaborators Apr 21, 2022
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests

4 participants