]> Cypherpunks.ru repositories - gostls13.git/commitdiff
doc/go1.21: document type inference changes
authorRobert Griesemer <gri@golang.org>
Tue, 30 May 2023 22:13:53 +0000 (15:13 -0700)
committerRobert Griesemer <gri@google.com>
Wed, 31 May 2023 21:29:10 +0000 (21:29 +0000)
For #39661.
For #41176.
For #51593.
For #52397.
For #57192.
For #58645.
For #58650.
For #58671.
For #59338.
For #59750.
For #60353.

Change-Id: Ib731c9f2879beb541f44cb10e40c36a8677d3ad4
Reviewed-on: https://go-review.googlesource.com/c/go/+/499282
TryBot-Bypass: Robert Griesemer <gri@google.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
Reviewed-by: Robert Griesemer <gri@google.com>
doc/go1.21.html

index 3f7a73947f8f40f9ceafb8c2e6358cb6c3f24b4e..97ee457a32a575df59c05f9c91fb9d59b547d8be 100644 (file)
@@ -70,8 +70,57 @@ Do not send CLs removing the interior tags from such phrases.
   spec in past releases. The new rule provides an unambiguous definition.
 </p>
 
-<p><!-- https://go.dev/issue/59338 -->
-  TODO: <a href="https://go.dev/issue/59338">https://go.dev/issue/59338</a>: infer type arguments from assignments of generic functions (reverse type inference)
+<p>
+  Multiple improvements that increase the power and precision of type inference have been made.
+</p>
+<ul>
+  <li><!-- https://go.dev/issue/59338 -->
+    A (possibly partially instantiated generic) function may now be called with arguments that are
+    themselves (possibly partially instantiated) generic functions.
+    The compiler will attempt to infer the missing type arguments of the callee (as before) and,
+    for each argument that is a generic function that is not fully instantiated,
+    its missing type arguments (new).
+    Typical use cases are calls to generic functions operating on containers
+    (such as <a href="/pkg/slices#IndexFunc">slices.IndexFunc</a>) where a function argument
+    may also be generic, and where the type argument of the called function and its arguments
+    are inferred from the container type.
+    More generally, a generic function may now be used without explicit instantiation when
+    it is assigned to a variable or returned as a result value if the type arguments can
+    be inferred from the assignment.
+  </li>
+  <li><!-- https://go.dev/issue/60353, https://go.dev/issue/57192, https://go.dev/issue/52397, https://go.dev/issue/41176 -->
+    Type inference now also considers methods when a value is assigned to an interface:
+    type arguments for type parameters used in method signatures may be inferred from
+    the corresponding parameter types of matching methods.
+  </li>
+  <li><!-- https://go.dev/issue/51593 https://go.dev/issue/39661 -->
+    Similarly, since a type argument must implement all the methods of its corresponding constraint,
+    the methods of the type argument and constraint are matched which may lead to the inference of
+    additional type arguments.
+  </li>
+  <li><!-- https://go.dev/issue/58671 -->
+    If multiple untyped constant arguments of different kinds (such as an untyped int and
+    an untyped floating-point constant) are passed to parameters with the same (not otherwise
+    specified) type parameter type, instead of an error, now type inference determines the
+    type using the same approach as an operator with untyped constant operands.
+    This change brings the types inferred from untyped constant arguments in line with the
+    types of constant expressions.
+  </li>
+  <li><!-- https://go.dev/issue/59750 -->
+    Type inference is now precise when matching corresponding types in assignments:
+    component types (such as the the elements of slices, or the parameter types in function signatures)
+    must be identical (given suitable type arguments) to match, otherwise inference fails.
+    This change produces more accurate error messages:
+    where in the past type inference may have succeeded incorrectly and lead to an invalid assignment,
+    the compiler now reports an inference error if two types can't possibly match.
+  </li>
+</ul>
+
+<p><!-- https://go.dev/issue/58650 -->
+  More generally, the description of
+  <a href="https://tip.golang.org/ref/spec#Type_inference">type inference</a>
+  in the language spec has been clarified.
+  Together, all these changes make type inference more powerful and inference failures less surprising.
 </p>
 
 <p><!-- https://go.dev/issue/56986 -->