1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

go のコンパイラが死んだ (go 1.18.4)

Last updated at Posted at 2022-07-30

これは何?

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

いずれも治っている。すばらしい。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?