0
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 3 years have passed since last update.

relocation target type not definedが出たとき

Last updated at Posted at 2021-10-23

Goのバージョン: 1.17.2

2021/10/24追記: 最新のmasterブランチで確認したところ、1.18では修正されて正常にビルドできそうです。

Go1.17を使用して、 -gcflags=-G=3 を使ってジェネリクスの機能をonにしてビルドする際に
ジェネリクスな関数の中で、ジェネリクエスな引数を取るジェネリクスな関数を 匿名関数の中で呼ぶ場合に起きる(?)っぽい。

どうするか

問題のコード
package main

func a[T any](t T){}

func b[T any](t T) {
	func () {
		a[T](t)
	}()
}

func main() {
	b[int](0)
}
修正したコード
package main

func a[T any](t T){}

func b[T any](t T) {
	a := a[T]
	func () {
		a(t)
	}()
}

func main() {
	b[int](0)
}

ジェネリクスな関数を呼ぶ前に、変数に型パラメータまで指定した関数を変数として確保して、匿名関数ではその変数を指定して呼び出せば良い。

どういうエラーがでるのか

問題のコード
package main

func a[T any](t T){}

func b[T any](t T) {
	func () {
		a[T](t)
	}()
}

func main() {
	b[int](0)
}
$ go build -gcflags=-G=3 .
main.b[int]: relocation target main.a[T₂] not defined

どういう理由でエラーが起きてるのかちょっとわかりませんが、多分 main.a[T₂] というシンボルを解決できないみたいなエラーだと思います。

ただ、なんでこのエラーが起きてるかはわかりませんでした。

0
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
0
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?