// The package e is a go/doc test for embedded methods. 
PACKAGE e

IMPORTPATH
	testdata/e

FILENAMES
	testdata/e.go

TYPES
	// T1 has no embedded (level 1) M method due to conflict. 
	type T1 struct {
		// contains filtered or unexported fields
	}

	// T2 has only M as top-level method. 
	type T2 struct {
		// contains filtered or unexported fields
	}

	// T2.M should appear as method of T2. 
	func (T2) M()

	// T3 has only M as top-level method. 
	type T3 struct {
		// contains filtered or unexported fields
	}

	// T3.M should appear as method of T3. 
	func (T3) M()

	// 
	type T4 struct{}

	// T4.M should appear as method of T5 only if AllMethods is set. 
	func (*T4) M()

	// 
	type T5 struct {
		T4
	}

	// 
	type U1 struct {
		*U1
	}

	// U1.M should appear as method of U1. 
	func (*U1) M()

	// 
	type U2 struct {
		*U3
	}

	// U2.M should appear as method of U2 and as method of U3 only if ...
	func (*U2) M()

	// 
	type U3 struct {
		*U2
	}

	// U3.N should appear as method of U3 and as method of U2 only if ...
	func (*U3) N()

	// 
	type U4 struct {
		// contains filtered or unexported fields
	}

	// U4.M should appear as method of U4. 
	func (*U4) M()

	// 
	type V1 struct {
		*V2
		*V5
	}

	// 
	type V2 struct {
		*V3
	}

	// 
	type V3 struct {
		*V4
	}

	// 
	type V4 struct {
		*V5
	}

	// V4.M should appear as method of V2 and V3 if AllMethods is set. 
	func (*V4) M()

	// 
	type V5 struct {
		*V6
	}

	// 
	type V6 struct{}

	// V6.M should appear as method of V1 and V5 if AllMethods is set. 
	func (*V6) M()

