| // Copyright 2017, 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 teststructs | |
| type InterfaceA interface { | |
| InterfaceA() | |
| } | |
| type ( | |
| StructA struct{ X string } // Equal method on value receiver | |
| StructB struct{ X string } // Equal method on pointer receiver | |
| StructC struct{ X string } // Equal method (with interface argument) on value receiver | |
| StructD struct{ X string } // Equal method (with interface argument) on pointer receiver | |
| StructE struct{ X string } // Equal method (with interface argument on value receiver) on pointer receiver | |
| StructF struct{ X string } // Equal method (with interface argument on pointer receiver) on value receiver | |
| // These embed the above types as a value. | |
| StructA1 struct { | |
| StructA | |
| X string | |
| } | |
| StructB1 struct { | |
| StructB | |
| X string | |
| } | |
| StructC1 struct { | |
| StructC | |
| X string | |
| } | |
| StructD1 struct { | |
| StructD | |
| X string | |
| } | |
| StructE1 struct { | |
| StructE | |
| X string | |
| } | |
| StructF1 struct { | |
| StructF | |
| X string | |
| } | |
| // These embed the above types as a pointer. | |
| StructA2 struct { | |
| *StructA | |
| X string | |
| } | |
| StructB2 struct { | |
| *StructB | |
| X string | |
| } | |
| StructC2 struct { | |
| *StructC | |
| X string | |
| } | |
| StructD2 struct { | |
| *StructD | |
| X string | |
| } | |
| StructE2 struct { | |
| *StructE | |
| X string | |
| } | |
| StructF2 struct { | |
| *StructF | |
| X string | |
| } | |
| StructNo struct{ X string } // Equal method (with interface argument) on non-satisfying receiver | |
| AssignA func() int | |
| AssignB struct{ A int } | |
| AssignC chan bool | |
| AssignD <-chan bool | |
| ) | |
| func (x StructA) Equal(y StructA) bool { return true } | |
| func (x *StructB) Equal(y *StructB) bool { return true } | |
| func (x StructC) Equal(y InterfaceA) bool { return true } | |
| func (x StructC) InterfaceA() {} | |
| func (x *StructD) Equal(y InterfaceA) bool { return true } | |
| func (x *StructD) InterfaceA() {} | |
| func (x *StructE) Equal(y InterfaceA) bool { return true } | |
| func (x StructE) InterfaceA() {} | |
| func (x StructF) Equal(y InterfaceA) bool { return true } | |
| func (x *StructF) InterfaceA() {} | |
| func (x StructNo) Equal(y InterfaceA) bool { return true } | |
| func (x AssignA) Equal(y func() int) bool { return true } | |
| func (x AssignB) Equal(y struct{ A int }) bool { return true } | |
| func (x AssignC) Equal(y chan bool) bool { return true } | |
| func (x AssignD) Equal(y <-chan bool) bool { return true } | |
| var _ = func( | |
| a StructA, b StructB, c StructC, d StructD, e StructE, f StructF, | |
| ap *StructA, bp *StructB, cp *StructC, dp *StructD, ep *StructE, fp *StructF, | |
| a1 StructA1, b1 StructB1, c1 StructC1, d1 StructD1, e1 StructE1, f1 StructF1, | |
| a2 StructA2, b2 StructB2, c2 StructC2, d2 StructD2, e2 StructE2, f2 StructF1, | |
| ) { | |
| a.Equal(a) | |
| b.Equal(&b) | |
| c.Equal(c) | |
| d.Equal(&d) | |
| e.Equal(e) | |
| f.Equal(&f) | |
| ap.Equal(*ap) | |
| bp.Equal(bp) | |
| cp.Equal(*cp) | |
| dp.Equal(dp) | |
| ep.Equal(*ep) | |
| fp.Equal(fp) | |
| a1.Equal(a1.StructA) | |
| b1.Equal(&b1.StructB) | |
| c1.Equal(c1) | |
| d1.Equal(&d1) | |
| e1.Equal(e1) | |
| f1.Equal(&f1) | |
| a2.Equal(*a2.StructA) | |
| b2.Equal(b2.StructB) | |
| c2.Equal(c2) | |
| d2.Equal(&d2) | |
| e2.Equal(e2) | |
| f2.Equal(&f2) | |
| } | |
| type ( | |
| privateStruct struct{ Public, private int } | |
| PublicStruct struct{ Public, private int } | |
| ParentStructA struct{ privateStruct } | |
| ParentStructB struct{ PublicStruct } | |
| ParentStructC struct { | |
| privateStruct | |
| Public, private int | |
| } | |
| ParentStructD struct { | |
| PublicStruct | |
| Public, private int | |
| } | |
| ParentStructE struct { | |
| privateStruct | |
| PublicStruct | |
| } | |
| ParentStructF struct { | |
| privateStruct | |
| PublicStruct | |
| Public, private int | |
| } | |
| ParentStructG struct { | |
| *privateStruct | |
| } | |
| ParentStructH struct { | |
| *PublicStruct | |
| } | |
| ParentStructI struct { | |
| *privateStruct | |
| *PublicStruct | |
| } | |
| ParentStructJ struct { | |
| *privateStruct | |
| *PublicStruct | |
| Public PublicStruct | |
| private privateStruct | |
| } | |
| ) | |
| func NewParentStructG() *ParentStructG { | |
| return &ParentStructG{new(privateStruct)} | |
| } | |
| func NewParentStructH() *ParentStructH { | |
| return &ParentStructH{new(PublicStruct)} | |
| } | |
| func NewParentStructI() *ParentStructI { | |
| return &ParentStructI{new(privateStruct), new(PublicStruct)} | |
| } | |
| func NewParentStructJ() *ParentStructJ { | |
| return &ParentStructJ{ | |
| privateStruct: new(privateStruct), PublicStruct: new(PublicStruct), | |
| } | |
| } | |
| func (s *privateStruct) SetPrivate(i int) { s.private = i } | |
| func (s *PublicStruct) SetPrivate(i int) { s.private = i } | |
| func (s *ParentStructC) SetPrivate(i int) { s.private = i } | |
| func (s *ParentStructD) SetPrivate(i int) { s.private = i } | |
| func (s *ParentStructF) SetPrivate(i int) { s.private = i } | |
| func (s *ParentStructA) PrivateStruct() *privateStruct { return &s.privateStruct } | |
| func (s *ParentStructC) PrivateStruct() *privateStruct { return &s.privateStruct } | |
| func (s *ParentStructE) PrivateStruct() *privateStruct { return &s.privateStruct } | |
| func (s *ParentStructF) PrivateStruct() *privateStruct { return &s.privateStruct } | |
| func (s *ParentStructG) PrivateStruct() *privateStruct { return s.privateStruct } | |
| func (s *ParentStructI) PrivateStruct() *privateStruct { return s.privateStruct } | |
| func (s *ParentStructJ) PrivateStruct() *privateStruct { return s.privateStruct } | |
| func (s *ParentStructJ) Private() *privateStruct { return &s.private } |