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

$ go version
go version devel go1.21-af8f94e3c5 Tue Jul 11 21:30:51 2023 +0000 linux/amd64

Does this issue reproduce with the latest release?

Yes

What operating system and processor architecture are you using (go env)?

N/A

What did you do?

https://go.dev/play/p/WWBorJLIgwe?v=gotip

package main

func main() {}

func New[T any](x any) {
    f(x.(I[T]))
}

func f[T I[T]](t T) {}

type I[T any] interface {
    M(t T)
}

What did you expect to see?

A more helpful error message.

What did you see instead?

./prog.go:6:3: T (type I[T]) does not satisfy I[T] (wrong type for method M)
        have M(T)
        want M(T)

AIUI, the actual error stems from the fact that the receiver type does not match the type in the method argument, but the error message only includes the method signature, which makes it hard to see what the actual problem is, particular in the context of a much larger program.

Comment From: rogpeppe

@griesemer

Comment From: griesemer

Manually instantiating (rather than relying on type inference) the call of f exposes the problem:

func New[T any](x any) {
    f[I[T]](x.(I[T])) // <<< manual instantiation
}

func f[T I[T]](t T) {}

type I[T any] interface {
    M(t T)
}

The error is:

testdata/manual.go:11:4: I[T] does not satisfy I[I[T]] (wrong type for method M)
                        have M(T)
                        want M(I[T])

Agreed that we need to find a better way to report this.

Comment From: gopherbot

Change https://go.dev/cl/549296 mentions this issue: go/types, types2: avoid confusing error message "have m(T), want m(T)"

Comment From: griesemer

Stop-gap solution in place for now. Moving to 1.23.

Comment From: griesemer

Too late for 1.23. Moving to 1.24.

Comment From: griesemer

Too late for 1.24. Moving to 1.25.