// Copyright 2013 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 cycles

import "unsafe"

type (
	T0 int
	T1 /* ERROR cycle */ T1
	T2 *T2

	T3 /* ERROR cycle */ T4
	T4 T5
	T5 T3

	T6 T7
	T7 *T8
	T8 T6

	// arrays
	A0 /* ERROR cycle */ [10]A0
	A1 [10]*A1

	A2 /* ERROR cycle */ [10]A3
	A3 [10]A4
	A4 A2

	A5 [10]A6
	A6 *A5

	// slices
	L0 []L0

	// structs
	S0 /* ERROR cycle */ struct{ _ S0 }
	S1 /* ERROR cycle */ struct{ S1 }
	S2 struct{ _ *S2 }
	S3 struct{ *S3 }

	S4 /* ERROR cycle */ struct{ S5 }
	S5 struct{ S6 }
	S6 S4

	// pointers
	P0 *P0

	// functions
	F0 func(F0)
	F1 func() F1
	F2 func(F2) F2

	// interfaces
	I0 /* ERROR cycle */ interface{ I0 }

	I1 /* ERROR cycle */ interface{ I2 }
	I2 interface{ I3 }
	I3 interface{ I1 }

	I4 interface{ f(I4) }

	// testcase for issue 5090
	I5 interface{ f(I6) }
	I6 interface{ I5 }

	// maps
	M0 map[M0 /* ERROR incomparable map key */ ]M0

	// channels
	C0 chan C0
)

// test case for issue #34771
type (
	AA /* ERROR cycle */ B
	B C
	C [10]D
	D E
	E AA
)

func _() {
	type (
		t1 /* ERROR cycle */ t1
		t2 *t2

		t3 t4 /* ERROR undeclared */
		t4 t5 /* ERROR undeclared */
		t5 t3

		// arrays
		a0 /* ERROR cycle */ [10]a0
		a1 [10]*a1

		// slices
		l0 []l0

		// structs
		s0 /* ERROR cycle */ struct{ _ s0 }
		s1 /* ERROR cycle */ struct{ s1 }
		s2 struct{ _ *s2 }
		s3 struct{ *s3 }

		// pointers
		p0 *p0

		// functions
		f0 func(f0)
		f1 func() f1
		f2 func(f2) f2

		// interfaces
		i0 /* ERROR cycle */ interface{ i0 }

		// maps
		m0 map[m0 /* ERROR incomparable map key */ ]m0

		// channels
		c0 chan c0
	)
}

// test cases for issue 6667

type A [10]map[A /* ERROR incomparable map key */ ]bool

type S struct {
	m map[S /* ERROR incomparable map key */ ]bool
}

// test cases for issue 7236
// (cycle detection must not be dependent on starting point of resolution)

type (
	P1 *T9
	T9 /* ERROR cycle */ T9

	T10 /* ERROR cycle */ T10
	P2 *T10
)

func (T11) m() {}

type T11 /* ERROR cycle */ struct{ T11 }

type T12 /* ERROR cycle */ struct{ T12 }

func (*T12) m() {}

type (
	P3 *T13
	T13 /* ERROR cycle */ T13
)

// test cases for issue 18643
// (type cycle detection when non-type expressions are involved)
type (
	T14 [len(T14 /* ERROR cycle */ {})]int
	T15 [][len(T15 /* ERROR cycle */ {})]int
	T16 map[[len(T16 /* ERROR cycle */ {1:2})]int]int
	T17 map[int][len(T17 /* ERROR cycle */ {1:2})]int
)

// Test case for types depending on function literals (see also #22992).
type T20 chan [unsafe.Sizeof(func(ch T20){ _ = <-ch })]byte
type T22 = chan [unsafe.Sizeof(func(ch T20){ _ = <-ch })]byte

func _() {
	type T0 func(T0)
	type T1 /* ERROR cycle */ = func(T1)
	type T2 chan [unsafe.Sizeof(func(ch T2){ _ = <-ch })]byte
	type T3 /* ERROR cycle */ = chan [unsafe.Sizeof(func(ch T3){ _ = <-ch })]byte
}
