golang / go

The Go programming language
https://go.dev
BSD 3-Clause "New" or "Revised" License
122.95k stars 17.53k forks source link

cmd/compile: ICE compiling code with anonymous, recursive interfaces #56056

Closed mdempsky closed 1 year ago

mdempsky commented 1 year ago
$ cat z.go
package main

func main() {
    type I interface{ m() interface{ I } }
    type J interface{ m() interface{ J } }

    im := interface{ I }.m
    jm := interface{ J }.m

    _ = &im == &jm
}

$ go run z.go |& head -24
# command-line-arguments
runtime: goroutine stack exceeds 1000000000-byte limit
runtime: sp=0xc0207f6370 stack=[0xc0207f6000, 0xc0407f6000]
fatal error: stack overflow

runtime stack:
runtime.throw({0xd83c2f?, 0x133c740?})
    /home/mdempsky/wd/go/src/runtime/panic.go:1047 +0x5d fp=0xc000691e18 sp=0xc000691de8 pc=0x43645d
runtime.newstack()
    /home/mdempsky/wd/go/src/runtime/stack.go:1103 +0x5bd fp=0xc000691fc8 sp=0xc000691e18 pc=0x45031d
runtime.morestack()
    /home/mdempsky/wd/go/src/runtime/asm_amd64.s:570 +0x8b fp=0xc000691fd0 sp=0xc000691fc8 pc=0x46830b

goroutine 7 [running]:
cmd/compile/internal/types.(*Sym).cmpsym(0x0?, 0x0?)
    /home/mdempsky/wd/go/src/cmd/compile/internal/types/type.go:1132 +0x1ae fp=0xc0207f6380 sp=0xc0207f6378 pc=0x5ad06e
cmd/compile/internal/types.(*Type).cmp(0xc000158690, 0xc000411570)
    /home/mdempsky/wd/go/src/cmd/compile/internal/types/type.go:1207 +0x212 fp=0xc0207f64f8 sp=0xc0207f6380 pc=0x5ad292
cmd/compile/internal/types.(*Type).cmp(0xc000158620, 0xc000411500)
    /home/mdempsky/wd/go/src/cmd/compile/internal/types/type.go:1327 +0xa9c fp=0xc0207f6670 sp=0xc0207f64f8 pc=0x5adb1c
cmd/compile/internal/types.(*Type).cmp(0xc000158690, 0xc000411570)
    /home/mdempsky/wd/go/src/cmd/compile/internal/types/type.go:1347 +0xdc5 fp=0xc0207f67e8 sp=0xc0207f6670 pc=0x5ade45
cmd/compile/internal/types.(*Type).cmp(0xc000158620, 0xc000411500)
    /home/mdempsky/wd/go/src/cmd/compile/internal/types/type.go:1327 +0xa9c fp=0xc0207f6960 sp=0xc0207f67e8 pc=0x5adb1c

It looks like somewhere we're trying to sort types, but types.(*Type).cmp doesn't handle anonymous, recursive interfaces.

/cc @golang/compiler

mdempsky commented 1 year ago

Anonymous recursive interfaces are unsupported.

mdempsky commented 1 year ago

Specifically, since Go 1.20, the test case is now rejected with "invalid recursive type: anonymous interface refers to itself".