| // Copyright 2021 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. |
| |
| // This file shows some examples of constraint literals with elided interfaces. |
| // These examples are permitted if proposal issue #48424 is accepted. |
| |
| package p |
| |
| // Constraint type sets of the form T, ~T, or A|B may omit the interface. |
| type ( |
| _[T int] struct{} |
| _[T ~int] struct{} |
| _[T int|string] struct{} |
| _[T ~int|~string] struct{} |
| ) |
| |
| func min[T int|string](x, y T) T { |
| if x < y { |
| return x |
| } |
| return y |
| } |
| |
| func lookup[M ~map[K]V, K comparable, V any](m M, k K) V { |
| return m[k] |
| } |
| |
| func deref[P ~*E, E any](p P) E { |
| return *p |
| } |
| |
| func _() int { |
| p := new(int) |
| return deref(p) |
| } |
| |
| func addrOfCopy[V any, P *V](v V) P { |
| return &v |
| } |
| |
| func _() *int { |
| return addrOfCopy(0) |
| } |
| |
| // A type parameter may not be embedded in an interface; |
| // so it can also not be used as a constraint. |
| func _[A any, B A /* ERROR cannot use a type parameter as constraint */ ]() {} |
| |
| // Error messages refer to the type constraint as it appears in the source. |
| // (No implicit interface should be exposed.) |
| func _[T string](x T) T { |
| return x /* ERROR constrained by string */ * x |
| } |
| |
| func _[T int|string](x T) T { |
| return x /* ERROR constrained by int|string */ * x |
| } |