// Package generics contains the new syntax supporting generic ...
PACKAGE generics

IMPORTPATH
	testdata/generics

FILENAMES
	testdata/generics.go

FUNCTIONS
	// AnotherFunc has an implicit constraint interface.  Neither type ...
	func AnotherFunc[T ~struct{ f int }](_ struct{ f int })

	// Func has an instantiated constraint. 
	func Func[T Constraint[string, Type[int]]]()

	// Single is not a factory function. 
	func Single[T any]() *T

	// Slice is not a factory function. 
	func Slice[T any]() []T


TYPES
	// AFuncType demonstrates filtering of parameters and type ...
	type AFuncType[T ~struct{ f int }] func(_ struct{ f int })

	// Constraint is a constraint interface with two type parameters. 
	type Constraint[P, Q interface{ string | ~int | Type[int] }] interface {
		~int | ~byte | Type[string]
		M() P
	}

	// NewEmbeddings demonstrates how we filter the new embedded ...
	type NewEmbeddings interface {
		string	// should not be filtered
		int16
		struct{ f int }
		~struct{ f int }
		*struct{ f int }
		struct{ f int } | ~struct{ f int }
	}

	// Parameterized types should be shown. 
	type Type[P any] struct {
		Field P
	}

	// Variables with an instantiated type should be shown. 
	var X Type[int]

	// Constructors for parameterized types should be shown. 
	func Constructor[lowerCase any]() Type[lowerCase]

	// MethodA uses a different name for its receiver type parameter. 
	func (t Type[A]) MethodA(p A)

	// MethodB has a blank receiver type parameter. 
	func (t Type[_]) MethodB()

	// MethodC has a lower-case receiver type parameter. 
	func (t Type[c]) MethodC()

	// int16 shadows the predeclared type int16. 
	type int16 int

