]> Cypherpunks repositories - gostls13.git/commitdiff
spec: remove cycle restriction for type parameters
authorRobert Griesemer <gri@google.com>
Mon, 13 Oct 2025 23:57:34 +0000 (16:57 -0700)
committerGopher Robot <gobot@golang.org>
Thu, 13 Nov 2025 14:26:25 +0000 (06:26 -0800)
Fixes #75883.

Change-Id: I708c0594ef3182d3aca37a6358aa0a0ef89809b6
Reviewed-on: https://go-review.googlesource.com/c/go/+/711422
Reviewed-by: Robert Griesemer <gri@google.com>
Reviewed-by: Alan Donovan <adonovan@google.com>
Auto-Submit: Robert Griesemer <gri@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>

doc/go_spec.html
src/internal/types/testdata/fixedbugs/issue75883.go [new file with mode: 0644]

index 514f60007b64ef422a421be9819011d3c8a88082..a2f22e31dbfed90fe9a140590aed9cdb87981d3a 100644 (file)
@@ -1,6 +1,6 @@
 <!--{
        "Title": "The Go Programming Language Specification",
-       "Subtitle": "Language version go1.26 (Nov 9, 2025)",
+       "Subtitle": "Language version go1.26 (Nov 12, 2025)",
        "Path": "/ref/spec"
 }-->
 
@@ -2686,22 +2686,6 @@ of a <a href="#Method_declarations">method declaration</a> associated
 with a generic type.
 </p>
 
-<p>
-Within a type parameter list of a generic type <code>T</code>, a type constraint
-may not (directly, or indirectly through the type parameter list of another
-generic type) refer to <code>T</code>.
-</p>
-
-<pre>
-type T1[P T1[P]] …                    // illegal: T1 refers to itself
-type T2[P interface{ T2[int] }] …     // illegal: T2 refers to itself
-type T3[P interface{ m(T3[int])}] …   // illegal: T3 refers to itself
-type T4[P T5[P]] …                    // illegal: T4 refers to T5 and
-type T5[P T4[P]] …                    //          T5 refers to T4
-
-type T6[P int] struct{ f *T6[P] }     // ok: reference to T6 is not in type parameter list
-</pre>
-
 <h4 id="Type_constraints">Type constraints</h4>
 
 <p>
diff --git a/src/internal/types/testdata/fixedbugs/issue75883.go b/src/internal/types/testdata/fixedbugs/issue75883.go
new file mode 100644 (file)
index 0000000..33b2350
--- /dev/null
@@ -0,0 +1,20 @@
+// Copyright 2025 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 cases that were invalid because of cycles before the respective language change.
+// Some are still invalid, but not because of cycles.
+
+package p
+
+type T1[P T1[P]] struct{}
+type T2[P interface {
+       T2[int /* ERROR "int does not satisfy interface{T2[int]}" */]
+}] struct{}
+type T3[P interface {
+       m(T3[int /* ERROR "int does not satisfy interface{m(T3[int])}" */])
+}] struct{}
+type T4[P T5[P /* ERROR "P does not satisfy T4[P]" */]] struct{}
+type T5[P T4[P /* ERROR "P does not satisfy T5[P]" */]] struct{}
+
+type T6[P int] struct{ f *T6[P] }