| // Copyright 2022 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. |
| |
| package p |
| |
| // correctness check: ensure that cycles through generic instantiations are detected |
| type T[P any] struct { |
| _ P |
| } |
| |
| type S /* ERROR invalid recursive type */ struct { |
| _ T[S] |
| } |
| |
| // simplified test 1 |
| |
| var _ A1[A1[string]] |
| |
| type A1[P any] struct { |
| _ B1[P] |
| } |
| |
| type B1[P any] struct { |
| _ P |
| } |
| |
| // simplified test 2 |
| var _ B2[A2] |
| |
| type A2 struct { |
| _ B2[string] |
| } |
| |
| type B2[P any] struct { |
| _ C2[P] |
| } |
| |
| type C2[P any] struct { |
| _ P |
| } |
| |
| // test case from issue |
| type T23 interface { |
| ~struct { |
| Field0 T13[T15] |
| } |
| } |
| |
| type T1[P1 interface { |
| }] struct { |
| Field2 P1 |
| } |
| |
| type T13[P2 interface { |
| }] struct { |
| Field2 T1[P2] |
| } |
| |
| type T15 struct { |
| Field0 T13[string] |
| } |