fo icon indicating copy to clipboard operation
fo copied to clipboard

Using maps with uncomparable keys

Open go-li opened this issue 7 years ago • 2 comments

Hello, the following does not run https://play.folang.org/p/XhaheZsrxBT

package main

func instantiate[T](p *T) {
	var foo = make(map[T]int)
	foo[*p] = 9
}

func main() {
	instantiate[[0]byte]((*[0]byte)(nil))
}

The expected result that creation of a map with uncomparable keys is either caught at compile time, or it blows up gracefully during map creation time. Currently it does:

panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0xffffffff addr=0x0 pc=0x841cb]

goroutine 1 [running]:
main.instantiate___0_byte(...)
	/tmp/sandbox652760664/main.go:5
main.main()
	/tmp/sandbox652760664/main.go:9 +0x6b

An engineering decision how to handle incomparable map keys is needed.

go-li avatar Aug 01 '18 15:08 go-li

On a second consideration it works as expected

https://play.folang.org/p/-iokGIXkfJ9

go-li avatar Aug 01 '18 16:08 go-li

It might not be obvious, but the second playground link you shared shows an error coming from the Go compiler. Re-opening this because I would like the Fo compiler to catch this type of issue instead of generating invalid code and relying on the Go compiler to catch it.

(The Fo compiler works by transforming the AST into pure Go code and then calling the Go compiler).

albrow avatar Aug 03 '18 20:08 albrow