Skip to content

cmd/go2go: compiler error after translation #39692

@zeebo

Description

@zeebo

What version of Go are you using (go version)?

go2go playground

What did you do?

https://go2goplay.golang.org/p/LDEr36y6IUr

Source
package main

type Func(type A, B) interface {
	Run(A) B
}

//////

type Pair(type A, B) struct {
	L A
	R B
}

//////

type Compose(type A, B, C) struct {
	L Func(A, B)
	R Func(B, C)
}

func (p Compose(A, B, C)) Run(in A) C {
	return p.R.Run(p.L.Run(in))
}

//////

type Dup(type A) struct{}

func (d Dup(A)) Run(in A) Pair(A, A) {
	return Pair(A, A){
		L: in,
		R: in,
	}
}

//////

func main() {
	_ = Compose(
		int,
		Pair(int, int),
		Pair(Pair(int, int), Pair(int, int)),
	){
		L: Dup(int){},
		R: Dup(Pair(int, int)){},
	}
}

What did you expect to see?

No compiler error and no output

What did you see instead?

A large error message

# play
./prog.go2:45: cannot use instantiate୦୦Dup୦main୮aPair୮8int୮3୮0int୮9 literal (type instantiate୦୦Dup୦main୮aPair୮8int୮3୮0int୮9) as type instantiate୦୦Func୦main୮aPair୮8int୮3୮0int୮9୦main୮aPair୮8main୮aPair୮8int୮3୮0int୮9୮3୮0main୮aPair୮8int୮3୮0int୮9୮9 in field value:
	instantiate୦୦Dup୦main୮aPair୮8int୮3୮0int୮9 does not implement instantiate୦୦Func୦main୮aPair୮8int୮3୮0int୮9୦main୮aPair୮8main୮aPair୮8int୮3୮0int୮9୮3୮0main୮aPair୮8int୮3୮0int୮9୮9 (wrong type for Run method)
		have Run(instantiate୦୦Pair୦int୦int) instantiate୦୦Pair୦main୮aPair୮8int୮3୮0int୮9୦main୮aPair୮8int୮3୮0int୮9
		want Run(instantiate୦୦Pair୦int୦int) instantiate୦୦Pair୦struct୮4L୮0int୮2୮0R୮0int୮5୦struct୮4L୮0int୮2୮0R୮0int୮5

This seemed more important because it happens after translation, which possibly indicates a soundness hole in the type checker? Though, I do believe the program is well typed, so maybe just a bug in the translation.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions