これは何?
go のコンパイラが死んだので報告。
殺す方法
以下のコードをコンパイルすると死ぬ。
go1.18
package main
import "log"
type Obj interface{ Hoge() string }
type objType struct{}
func Send[T Obj](obj T) {
func() { obj.Hoge() }()
}
func foo(o Obj) { Send(o) }
func (o *objType) Hoge() string {
log.Println("objType.Hoge")
return "objType.Hoge"
}
func main() { foo(&objType{}) }
実行結果はこう
$ go1.18.1 run main.go
2022/07/30 20:12:04 objType.Hoge
$ go1.18.2 run main.go
2022/07/30 20:12:07 objType.Hoge
$ go1.18.3 run main.go
2022/07/30 20:12:10 objType.Hoge
$ go1.18.4 run main.go
# command-line-arguments
./main.go:9:19: internal compiler error: assertion failed
Please file a bug report including a short program that triggers the error.
https://go.dev/issue/new
ご覧のとおり、1.18.1 〜 1.18.3 は OK だったけど、1.18.4 だと死ぬ。
手元は Darwin(AMD64) なんだけど、たぶん x86_64 でも同じ。
ちなみに Send
の定義を
go1.18
func Send[T Obj](obj T) {
obj.Hoge()
}
のようにすると死ななくなる。
なお。
上記のコードだけを見ると、最初っからそうしろよ、という話に見えると思うけど、これは可能な限り単純化した結果。もともとコンパイルしたかったコードは func(){略}
の前にも後にも、 obj.Hoge()
の前にも後にも色々あったりした。
ちなみに
ちなみに
Please file a bug report including a short program that triggers the error.
https://go.dev/issue/new
というメッセージに従い、報告済み。
go 1.18.5 と go 1.19
2022.8.4 追記。
go 1.18.5 と go 1.19 がリリースされたので試した。
$ go1.18.5 run main.go
2022/08/04 19:33:32 objType.Hoge
$ go1.19 run main.go
2022/08/04 19:33:43 objType.Hoge
いずれも治っている。すばらしい。