| // Copyright 2020 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 |
| |
| // All but E2 and E5 provide an "indirection" and break infinite expansion of a type. |
| type E0[P any] []P |
| type E1[P any] *P |
| type E2[P any] struct{ _ P } |
| type E3[P any] struct{ _ *P } |
| type E5[P any] struct{ _ [10]P } |
| |
| type T0 struct { |
| _ E0[T0] |
| } |
| |
| type T0_ struct { |
| E0[T0_] |
| } |
| |
| type T1 struct { |
| _ E1[T1] |
| } |
| |
| type T2 /* ERROR "invalid recursive type" */ struct { |
| _ E2[T2] |
| } |
| |
| type T3 struct { |
| _ E3[T3] |
| } |
| |
| type T4 /* ERROR "invalid recursive type" */ [10]E5[T4] |
| |
| type T5 struct { |
| _ E0[E2[T5]] |
| } |
| |
| type T6 struct { |
| _ E0[E2[E0[E1[E2[[10]T6]]]]] |
| } |
| |
| type T7 struct { |
| _ E0[[10]E2[E0[E2[E2[T7]]]]] |
| } |
| |
| type T8 struct { |
| _ E0[[]E2[E0[E2[E2[T8]]]]] |
| } |
| |
| type T9 /* ERROR "invalid recursive type" */ [10]E2[E5[E2[T9]]] |
| |
| type T10 [10]E2[E5[E2[func(T10)]]] |