]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile/internal/types: add example test for type inference
authorRobert Griesemer <gri@golang.org>
Sun, 11 Apr 2021 01:26:01 +0000 (18:26 -0700)
committerRobert Griesemer <gri@golang.org>
Tue, 13 Apr 2021 16:18:08 +0000 (16:18 +0000)
Follow-up on https://golang.org/cl/308372.

For #44799.

Change-Id: I27d149241d465ee31e9c21d5f0935f31efcb5b60
Reviewed-on: https://go-review.googlesource.com/c/go/+/308973
Trust: Robert Griesemer <gri@golang.org>
Reviewed-by: Robert Findley <rfindley@google.com>
src/cmd/compile/internal/types2/examples/inference.go2 [new file with mode: 0644]

diff --git a/src/cmd/compile/internal/types2/examples/inference.go2 b/src/cmd/compile/internal/types2/examples/inference.go2
new file mode 100644 (file)
index 0000000..b47ce75
--- /dev/null
@@ -0,0 +1,101 @@
+// 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 type inference.
+
+package p
+
+type Ordered interface {
+       type int, float64, string
+}
+
+func min[T Ordered](x, y T) T
+
+func _() {
+       // min can be called with explicit instantiation.
+       _ = min[int](1, 2)
+
+       // Alternatively, the type argument can be inferred from
+       // one of the arguments. Untyped arguments will be considered
+       // last.
+       var x int
+       _ = min(x, x)
+       _ = min(x, 1)
+       _ = min(x, 1.0)
+       _ = min(1, 2)
+       _ = min(1, 2.3 /* ERROR default type float64 .* does not match */ )
+
+       var y float64
+       _ = min(1, y)
+       _ = min(1.2, y)
+       _ = min(1.2, 3.4)
+       _ = min(1.2, 3 /* ERROR default type int .* does not match */ )
+
+       var s string
+       _ = min(s, "foo")
+       _ = min("foo", "bar")
+}
+
+func mixed[T1, T2, T3 any](T1, T2, T3)
+
+func _() {
+       // mixed can be called with explicit instantiation.
+       mixed[int, string, bool](0, "", false)
+
+       // Alternatively, partial type arguments may be provided
+       // (from left to right), and the other may be inferred.
+       mixed[int, string](0, "", false)
+       mixed[int](0, "", false)
+       mixed(0, "", false)
+
+       // Provided type arguments always take precedence over
+       // inferred types.
+       mixed[int, string](1.1 /* ERROR cannot use 1.1 */ , "", false)
+}
+
+func related1[Slice interface{type []Elem}, Elem any](s Slice, e Elem)
+
+func _() {
+       // related1 can be called with explicit instantiation.
+       var si []int
+       related1[[]int, int](si, 0)
+
+       // Alternatively, the 2nd type argument can be inferred
+       // from the first one through constraint type inference.
+       var ss []string
+       _ = related1[[]string]
+       related1[[]string](ss, "foo")
+
+       // A type argument inferred from another explicitly provided
+       // type argument overrides whatever value argument type is given.
+       related1[[]string](ss, 0 /* ERROR cannot use 0 */ )
+
+       // A type argument may be inferred from a value argument
+       // and then help infer another type argument via constraint
+       // type inference.
+       related1(si, 0)
+       related1(si, "foo" /* ERROR cannot use "foo" */ )
+}
+
+func related2[Elem any, Slice interface{type []Elem}](e Elem, s Slice)
+
+func _() {
+       // related2 can be called with explicit instantiation.
+       var si []int
+       related2[int, []int](0, si)
+
+       // Alternatively, the 2nd type argument can be inferred
+       // from the first one through constraint type inference.
+       var ss []string
+       _ = related2[string]
+       related2[string]("foo", ss)
+
+       // A type argument may be inferred from a value argument
+       // and then help infer another type argument via constraint
+       // type inference. Untyped arguments are always considered
+       // last.
+       related2(1.2, []float64{})
+       related2(1.0, []int{})
+       related2( /* ERROR does not satisfy */ float64(1.0), []int{}) // TODO(gri) fix error position
+}