Closed
Description
What version of Go are you using (go version
)?
$ go version /tmp/golang-tip/bin/go version go version devel go1.18-986f8ea6b4 Tue Sep 21 00:59:42 2021 +0000 linux/amd64
Does this issue reproduce with the latest release?
No, it is a generics issue, therefore tested with a recent tip only.
What operating system and processor architecture are you using (go env
)?
linux/amd64
go env
Output
$ go env GO111MODULE="" GOARCH="amd64" GOBIN="" GOCACHE="/home/me/.cache/go-build" GOENV="/home/me/.config/go/env" GOEXE="" GOEXPERIMENT="" GOFLAGS="" GOHOSTARCH="amd64" GOHOSTOS="linux" GOINSECURE="" GOMODCACHE="/home/me/src/go/pkg/mod" GONOPROXY="k8s.io/*" GONOSUMDB="" GOOS="linux" GOPATH="/home/me/src/go" GOPRIVATE="" GOPROXY="" GOROOT="/tmp/golang-tip" GOSUMDB="off" GOTMPDIR="" GOTOOLDIR="/tmp/golang-tip/pkg/tool/linux_amd64" GOVCS="" GOVERSION="devel go1.18-986f8ea6b4 Tue Sep 21 00:59:42 2021 +0000" GCCGO="gccgo" GOAMD64="v1" AR="ar" CC="gcc" CXX="g++" CGO_ENABLED="1" GOMOD="/home/me/src/gocrtp/go.mod" CGO_CFLAGS="-g -O2" CGO_CPPFLAGS="" CGO_CXXFLAGS="-g -O2" CGO_FFLAGS="-g -O2" CGO_LDFLAGS="-g -O2" PKG_CONFIG="pkg-config" GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build1474680903=/tmp/go-build -gno-record-gcc-switches"
What did you do?
I tried to compile this program (crtp.go) with generics:
package main
import "fmt"
type Point struct {
X, Y int
}
type Rect struct {
X, Y, W, H int
}
type Elli struct {
X, Y, W, H int
}
func GetX[P interface { Point | Rect | Elli }] (p P) int {
return p.X
}
func main() {
p := Point { 1, 2}
r := Rect {2, 3, 7, 8}
e := Elli {4, 5, 9, 10}
fmt.Printf("X: %d %d %d\n", GetX(p), GetX(r), GetX(e))
}
with tmp/golang-tip/bin/go build
What did you expect to see?
Program compiles, runs and outputs X: 1 2 4
What did you see instead?
./crtp.go:19:11: p.X undefined (type bound for P has no method X)
All three structs in the type bound have an identical X /field/, so I think this is wrong. Of course there is no method but I don't think that matters here. I feel I should be able to use the public field X of p since p can only be one of the three Point, Rect, or Elli.