// 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 invalid recursive type: T1 refers to itself */ T1
	T2 *T2

	T3 /* ERROR invalid recursive type */ T4
	T4 T5
	T5 T3

	T6 T7
	T7 *T8
	T8 T6

	// arrays
	A0 /* ERROR invalid recursive type */ [10]A0
	A1 [10]*A1

	A2 /* ERROR invalid recursive type */ [10]A3
	A3 [10]A4
	A4 A2

	A5 [10]A6
	A6 *A5

	// slices
	L0 []L0

	// structs
	S0 /* ERROR invalid recursive type: S0 refers to itself */ struct{ _ S0 }
	S1 /* ERROR invalid recursive type: S1 refers to itself */ struct{ S1 }
	S2 struct{ _ *S2 }
	S3 struct{ *S3 }

	S4 /* ERROR invalid recursive type */ struct{ S5 }
	S5 struct{ S6 }
	S6 S4

	// pointers
	P0 *P0
	PP *struct{ PP.f /* ERROR PP.f is not a type */ }

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

	// interfaces
	I0 /* ERROR invalid recursive type: I0 refers to itself */ interface{ I0 }

	I1 /* ERROR invalid recursive type */ 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 invalid map key */ ]M0

	// channels
	C0 chan C0
)

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

func _() {
	type (
		t1 /* ERROR invalid recursive type: t1 refers to itself */ t1
		t2 *t2

		t3 t4 /* ERROR undefined */
		t4 t5 /* ERROR undefined */
		t5 t3

		// arrays
		a0 /* ERROR invalid recursive type: a0 refers to itself */ [10]a0
		a1 [10]*a1

		// slices
		l0 []l0

		// structs
		s0 /* ERROR invalid recursive type: s0 refers to itself */ struct{ _ s0 }
		s1 /* ERROR invalid recursive type: s1 refers to itself */ 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 invalid recursive type: i0 refers to itself */ interface{ i0 }

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

		// channels
		c0 chan c0
	)
}

// test cases for issue 6667

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

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

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

type (
	P1 *T9
	T9 /* ERROR invalid recursive type: T9 refers to itself */ T9

	T10 /* ERROR invalid recursive type: T10 refers to itself */ T10
	P2 *T10
)

func (T11) m() {}

type T11 /* ERROR invalid recursive type: T11 refers to itself */ struct{ T11 }

type T12 /* ERROR invalid recursive type: T12 refers to itself */ struct{ T12 }

func (*T12) m() {}

type (
	P3 *T13
	T13 /* ERROR invalid recursive type */ T13
)

// test cases for issue 18643
// (type cycle detection when non-type expressions are involved)
type (
	T14 [len(T14 /* ERROR invalid recursive type */ {})]int
	T15 [][len(T15 /* ERROR invalid recursive type */ {})]int
	T16 map[[len(T16 /* ERROR invalid recursive type */ {1:2})]int]int
	T17 map[int][len(T17 /* ERROR invalid recursive type */ {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 invalid recursive type */ = func(T1)
	type T2 chan [unsafe.Sizeof(func(ch T2){ _ = <-ch })]byte
	type T3 /* ERROR invalid recursive type */ = chan [unsafe.Sizeof(func(ch T3){ _ = <-ch })]byte
}
