| // Copyright 2023 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package p |
| |
| import ( |
| "io" |
| "os" |
| ) |
| |
| func g[T any](...T) {} |
| |
| // Interface and non-interface types do not match. |
| func _() { |
| var file *os.File |
| g(file, io /* ERROR "type io.Writer of io.Discard does not match inferred type *os.File for T" */ .Discard) |
| g(file, os.Stdout) |
| } |
| |
| func _() { |
| var a *os.File |
| var b any |
| g(a, a) |
| g(a, b /* ERROR "type any of b does not match inferred type *os.File for T" */) |
| } |
| |
| var writer interface { |
| Write(p []byte) (n int, err error) |
| } |
| |
| func _() { |
| var file *os.File |
| g(file, writer /* ERROR "type interface{Write(p []byte) (n int, err error)} of writer does not match inferred type *os.File for T" */) |
| g(writer, file /* ERROR "type *os.File of file does not match inferred type interface{Write(p []byte) (n int, err error)} for T" */) |
| } |
| |
| // Different named interface types do not match. |
| func _() { |
| g(io.ReadWriter(nil), io.ReadWriter(nil)) |
| g(io.ReadWriter(nil), io /* ERROR "does not match" */ .Writer(nil)) |
| g(io.Writer(nil), io /* ERROR "does not match" */ .ReadWriter(nil)) |
| } |
| |
| // Named and unnamed interface types match if they have the same methods. |
| func _() { |
| g(io.Writer(nil), writer) |
| g(io.ReadWriter(nil), writer /* ERROR "does not match" */ ) |
| } |
| |
| // There must be no order dependency for named and unnamed interfaces. |
| func f[T interface{ m(T) }](a, b T) {} |
| |
| type F interface { |
| m(F) |
| } |
| |
| func _() { |
| var i F |
| var j interface { |
| m(F) |
| } |
| |
| // order doesn't matter |
| f(i, j) |
| f(j, i) |
| } |