From: Robert Griesemer Date: Mon, 13 Oct 2025 23:57:34 +0000 (-0700) Subject: spec: remove cycle restriction for type parameters X-Git-Tag: go1.26rc1~304 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=4684a26c26;p=gostls13.git spec: remove cycle restriction for type parameters Fixes #75883. Change-Id: I708c0594ef3182d3aca37a6358aa0a0ef89809b6 Reviewed-on: https://go-review.googlesource.com/c/go/+/711422 Reviewed-by: Robert Griesemer Reviewed-by: Alan Donovan Auto-Submit: Robert Griesemer LUCI-TryBot-Result: Go LUCI --- diff --git a/doc/go_spec.html b/doc/go_spec.html index 514f60007b..a2f22e31db 100644 --- a/doc/go_spec.html +++ b/doc/go_spec.html @@ -1,6 +1,6 @@ @@ -2686,22 +2686,6 @@ of a method declaration associated with a generic type.

-

-Within a type parameter list of a generic type T, a type constraint -may not (directly, or indirectly through the type parameter list of another -generic type) refer to T. -

- -
-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
-
-

Type constraints

diff --git a/src/internal/types/testdata/fixedbugs/issue75883.go b/src/internal/types/testdata/fixedbugs/issue75883.go new file mode 100644 index 0000000000..33b23505f4 --- /dev/null +++ b/src/internal/types/testdata/fixedbugs/issue75883.go @@ -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] }