mirror of
https://github.com/golang/go
synced 2024-07-05 09:50:19 +00:00
These two tests fail with the 1.18 compiler frontend, because of incomplete dictionary support. This CL adds the tests for Unified IR, which currently handles them correctly, to make sure it doesn't repeat the same errors. Updates #53276. Updates #53328. Change-Id: I9f436495d28f2bc5707a17bd2527c86abacf91f1 Reviewed-on: https://go-review.googlesource.com/c/go/+/411695 Auto-Submit: Matthew Dempsky <mdempsky@google.com> Run-TryBot: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: David Chase <drchase@google.com>
111 lines
2.1 KiB
Go
111 lines
2.1 KiB
Go
// run
|
|
|
|
// Copyright 2022 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.
|
|
|
|
// Test that implicit conversions of derived types to interface type
|
|
// in range loops work correctly.
|
|
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"reflect"
|
|
)
|
|
|
|
func main() {
|
|
test{"int", "V"}.match(RangeArrayAny[V]())
|
|
test{"int", "V"}.match(RangeArrayIface[V]())
|
|
test{"V"}.match(RangeChanAny[V]())
|
|
test{"V"}.match(RangeChanIface[V]())
|
|
test{"K", "V"}.match(RangeMapAny[K, V]())
|
|
test{"K", "V"}.match(RangeMapIface[K, V]())
|
|
test{"int", "V"}.match(RangeSliceAny[V]())
|
|
test{"int", "V"}.match(RangeSliceIface[V]())
|
|
}
|
|
|
|
type test []string
|
|
|
|
func (t test) match(args ...any) {
|
|
if len(t) != len(args) {
|
|
fmt.Printf("FAIL: want %v values, have %v\n", len(t), len(args))
|
|
return
|
|
}
|
|
for i, want := range t {
|
|
if have := reflect.TypeOf(args[i]).Name(); want != have {
|
|
fmt.Printf("FAIL: %v: want type %v, have %v\n", i, want, have)
|
|
}
|
|
}
|
|
}
|
|
|
|
type iface interface{ M() int }
|
|
|
|
type K int
|
|
type V int
|
|
|
|
func (K) M() int { return 0 }
|
|
func (V) M() int { return 0 }
|
|
|
|
func RangeArrayAny[V any]() (k, v any) {
|
|
for k, v = range [...]V{zero[V]()} {
|
|
}
|
|
return
|
|
}
|
|
|
|
func RangeArrayIface[V iface]() (k any, v iface) {
|
|
for k, v = range [...]V{zero[V]()} {
|
|
}
|
|
return
|
|
}
|
|
|
|
func RangeChanAny[V any]() (v any) {
|
|
for v = range chanOf(zero[V]()) {
|
|
}
|
|
return
|
|
}
|
|
|
|
func RangeChanIface[V iface]() (v iface) {
|
|
for v = range chanOf(zero[V]()) {
|
|
}
|
|
return
|
|
}
|
|
|
|
func RangeMapAny[K comparable, V any]() (k, v any) {
|
|
for k, v = range map[K]V{zero[K](): zero[V]()} {
|
|
}
|
|
return
|
|
}
|
|
|
|
func RangeMapIface[K interface {
|
|
iface
|
|
comparable
|
|
}, V iface]() (k, v iface) {
|
|
for k, v = range map[K]V{zero[K](): zero[V]()} {
|
|
}
|
|
return
|
|
}
|
|
|
|
func RangeSliceAny[V any]() (k, v any) {
|
|
for k, v = range []V{zero[V]()} {
|
|
}
|
|
return
|
|
}
|
|
|
|
func RangeSliceIface[V iface]() (k any, v iface) {
|
|
for k, v = range []V{zero[V]()} {
|
|
}
|
|
return
|
|
}
|
|
|
|
func chanOf[T any](elems ...T) chan T {
|
|
c := make(chan T, len(elems))
|
|
for _, elem := range elems {
|
|
c <- elem
|
|
}
|
|
close(c)
|
|
return c
|
|
}
|
|
|
|
func zero[T any]() (_ T) { return }
|